From 88cd75e51933d98e2cd013f1e0cc8d607dea8032 Mon Sep 17 00:00:00 2001 From: Alex Tighe Date: Wed, 17 Jul 2019 23:13:41 -0400 Subject: [PATCH 001/396] commits for BAEL-2076 - Created core-java-io2 module - added resource loading example code - added core-java-io2 to tutorials pom.xml --- core-java-modules/core-java-io2/.gitignore | 5 + core-java-modules/core-java-io2/README.md | 6 + core-java-modules/core-java-io2/pom.xml | 143 ++++++++++++++++++ .../baeldung/resource/MyResourceLoader.java | 42 +++++ .../src/main/resources/input.txt | 3 + .../src/test/resources/.gitignore | 13 ++ pom.xml | 1 + 7 files changed, 213 insertions(+) create mode 100644 core-java-modules/core-java-io2/.gitignore create mode 100644 core-java-modules/core-java-io2/README.md create mode 100644 core-java-modules/core-java-io2/pom.xml create mode 100644 core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java create mode 100644 core-java-modules/core-java-io2/src/main/resources/input.txt create mode 100644 core-java-modules/core-java-io2/src/test/resources/.gitignore diff --git a/core-java-modules/core-java-io2/.gitignore b/core-java-modules/core-java-io2/.gitignore new file mode 100644 index 0000000000..c61d35324d --- /dev/null +++ b/core-java-modules/core-java-io2/.gitignore @@ -0,0 +1,5 @@ +0.* + +# Files generated by integration tests +# *.txt +/temp \ No newline at end of file diff --git a/core-java-modules/core-java-io2/README.md b/core-java-modules/core-java-io2/README.md new file mode 100644 index 0000000000..d4b417e30e --- /dev/null +++ b/core-java-modules/core-java-io2/README.md @@ -0,0 +1,6 @@ +========= + +## Core Java IO Cookbooks and Examples + +### Relevant Articles: +- [Reading Files Versus Loading Resources](http://www.baeldung.com/reading-files-versus-loading-resources) \ No newline at end of file diff --git a/core-java-modules/core-java-io2/pom.xml b/core-java-modules/core-java-io2/pom.xml new file mode 100644 index 0000000000..8ac7b2975f --- /dev/null +++ b/core-java-modules/core-java-io2/pom.xml @@ -0,0 +1,143 @@ + + 4.0.0 + core-java-io2 + 0.1.0-SNAPSHOT + core-java-io2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + + commons-io + commons-io + 2.6 + + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + log4j + log4j + ${log4j.version} + + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + + + + + + + + core-java-io2 + + + src/main/resources + true + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + com.baeldung.resource.MyResourceLoader + + + + + + + + + + integration + + + + org.codehaus.mojo + exec-maven-plugin + + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + + + + + + 4.1 + + + 3.1.0 + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java new file mode 100644 index 0000000000..1c5b52e18b --- /dev/null +++ b/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java @@ -0,0 +1,42 @@ +package com.baeldung.resource; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.stream.Collectors; + +public class MyResourceLoader { + + private void loadFileWithReader() throws IOException { + + FileReader fileReader = new FileReader("src/main/resources/input.txt"); + BufferedReader reader = new BufferedReader(fileReader); + String contents = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + reader.close(); + System.out.println(contents); + + } + + private void loadFileAsResource() throws IOException { + + InputStream inputStream = getClass().getResourceAsStream("/input.txt"); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); + String contents = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + System.out.println(contents); + + } + + public static void main(String[] args) throws IOException { + + MyResourceLoader resourceLoader = new MyResourceLoader(); + + resourceLoader.loadFileWithReader(); + resourceLoader.loadFileAsResource(); + + } + +} diff --git a/core-java-modules/core-java-io2/src/main/resources/input.txt b/core-java-modules/core-java-io2/src/main/resources/input.txt new file mode 100644 index 0000000000..8670fb3460 --- /dev/null +++ b/core-java-modules/core-java-io2/src/main/resources/input.txt @@ -0,0 +1,3 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. +In lacus enim, scelerisque id sapien ut, semper euismod quam. +Nunc ullamcorper semper blandit. \ No newline at end of file diff --git a/core-java-modules/core-java-io2/src/test/resources/.gitignore b/core-java-modules/core-java-io2/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-io2/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/pom.xml b/pom.xml index 3fd1bcf5fb..af5cf4ff03 100644 --- a/pom.xml +++ b/pom.xml @@ -396,6 +396,7 @@ core-java-modules/core-java-concurrency-basic core-java-modules/core-java-concurrency-collections core-java-modules/core-java-io + core-java-modules/core-java-io2 core-java-modules/core-java-nio core-java-modules/core-java-security core-java-modules/core-java-lang-syntax From 3867574cd78a7fef2a38762fed8d93ac49a0c80b Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 21 Jul 2019 10:09:49 +0200 Subject: [PATCH 002/396] BAEL-3084 remove xmlunit-2 ref from 'integration-lite-second' profile --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index b888994a43..21a42f89d6 100644 --- a/pom.xml +++ b/pom.xml @@ -1456,7 +1456,6 @@ wicket xml - xmlunit-2 xstream From 4f77aa59cd6acbf3c82f771d73d4c96165f542e3 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 28 Jul 2019 10:50:15 +0530 Subject: [PATCH 003/396] [BAEL-15393] - Initial commit to change to boot 2 --- spring-mvc-java/pom.xml | 37 +++++++++++-------- .../com/baeldung/SpringMVCApplication.java | 11 ++++++ .../baeldung/spring/web/config/WebConfig.java | 13 ++----- .../src/main/resources/application.properties | 21 +++++++++++ 4 files changed, 57 insertions(+), 25 deletions(-) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java create mode 100644 spring-mvc-java/src/main/resources/application.properties diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index cb16e91bc4..da9bd04d3d 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -8,17 +8,24 @@ war - parent-spring-5 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-boot-2 - org.springframework - spring-webmvc - ${spring.version} + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + org.springframework.boot + spring-boot-starter-jdbc javax.servlet @@ -106,9 +113,8 @@ 2.4.0 - org.springframework - spring-test - ${spring.version} + org.springframework.boot + spring-boot-starter-test test @@ -134,16 +140,15 @@ 2.8.5 - org.springframework - spring-websocket - ${spring.version} + org.springframework.boot + spring-boot-starter-websocket - - org.springframework - spring-messaging - ${spring.version} - + + + + + org.glassfish javax.el diff --git a/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java b/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java new file mode 100644 index 0000000000..ee263aaab2 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java @@ -0,0 +1,11 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringMVCApplication { + public static void main(String[] args) { + SpringApplication.run(SpringMVCApplication.class, args); + } +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java index 44fef92917..7aa9d6c5b5 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java @@ -3,9 +3,6 @@ package com.baeldung.spring.web.config; import java.util.ArrayList; import java.util.List; -import javax.servlet.ServletContext; - -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.MessageSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; @@ -26,8 +23,9 @@ import org.springframework.web.servlet.view.InternalResourceViewResolver; import org.springframework.web.servlet.view.JstlView; import org.springframework.web.util.UrlPathHelper; import org.thymeleaf.spring4.SpringTemplateEngine; +import org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver; import org.thymeleaf.spring4.view.ThymeleafViewResolver; -import org.thymeleaf.templateresolver.ServletContextTemplateResolver; +import org.thymeleaf.templateresolver.ITemplateResolver; import com.baeldung.excel.ExcelPOIHelper; @@ -35,9 +33,6 @@ import com.baeldung.excel.ExcelPOIHelper; @Configuration @ComponentScan(basePackages = { "com.baeldung.web.controller" }) public class WebConfig implements WebMvcConfigurer { - - @Autowired - private ServletContext ctx; @Override public void addViewControllers(final ViewControllerRegistry registry) { @@ -64,8 +59,8 @@ public class WebConfig implements WebMvcConfigurer { @Bean @Description("Thymeleaf template resolver serving HTML 5") - public ServletContextTemplateResolver templateResolver() { - final ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(ctx); + public ITemplateResolver templateResolver() { + final SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); templateResolver.setTemplateMode("HTML5"); diff --git a/spring-mvc-java/src/main/resources/application.properties b/spring-mvc-java/src/main/resources/application.properties new file mode 100644 index 0000000000..4f618c96a9 --- /dev/null +++ b/spring-mvc-java/src/main/resources/application.properties @@ -0,0 +1,21 @@ +spring.servlet.multipart.max-file-size=10MB +spring.servlet.multipart.max-request-size=10MB +spring.http.multipart.enabled=true +spring.servlet.multipart.location=${java.io.tmpdir} + +logging.level.org.springframework=DEBUG +logging.level.com.baeldung=DEBUG + +#output to a temp_folder/file +logging.file=${java.io.tmpdir}/application.log + +# Logging pattern for the console +logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} - %msg%n + +# Logging pattern for file +logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg% +spring.http.encoding.charset=UTF-8 +# Enable http encoding support. +spring.http.encoding.enabled=true +# Force the encoding to the configured charset on HTTP requests and responses. +spring.http.encoding.force=true \ No newline at end of file From 07cd60e8438f247c37d449f009f3168a4b9bddce Mon Sep 17 00:00:00 2001 From: Nikunj Gandhi Date: Tue, 30 Jul 2019 16:44:46 -0400 Subject: [PATCH 004/396] Selection sort implementation --- .../selectionsort/SelectionSort.java | 72 +++++++++++++++++++ .../selectionsort/SelectionSortUnitTest.java | 25 +++++++ 2 files changed, 97 insertions(+) create mode 100644 algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java create mode 100644 algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java new file mode 100644 index 0000000000..1b160a492d --- /dev/null +++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java @@ -0,0 +1,72 @@ +package com.baeldung.algorithms.selectionsort; + +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class SelectionSort { + + /*public static void main(final String args[]) { + int[] a = { 5, 4, 1, 6, 2 }; + + System.out.println("Unsorted array"); + System.out.println(IntStream.of(a) + .mapToObj(String::valueOf) + .collect(Collectors.joining(","))); + + a = sortAscending(a); + System.out.println("Ascending Sorted array"); + System.out.println(IntStream.of(a) + .mapToObj(String::valueOf) + .collect(Collectors.joining(","))); + + a = sortDescending(a); + System.out.println("Descending Sorted array"); + System.out.println(IntStream.of(a) + .mapToObj(String::valueOf) + .collect(Collectors.joining(","))); + }*/ + + public static void sortAscending(final int[] arr) { + for (int i = 0; i < arr.length - 1; i++) { + int minElementIndex = i; + for (int j = i + 1; j < arr.length; j++) { + if (arr[minElementIndex] > arr[j]) { + minElementIndex = j; + } + } + + if (minElementIndex != i) { + int temp = arr[i]; + arr[i] = arr[minElementIndex]; + arr[minElementIndex] = temp; + } + System.out.println("Iteration No. " + (i + 1)); + System.out.println(IntStream.of(arr) + .mapToObj(String::valueOf) + .collect(Collectors.joining(","))); + + } + } + + public static void sortDescending(final int[] arr) { + for (int i = 0; i < arr.length - 1; i++) { + int maxElementIndex = i; + for (int j = i + 1; j < arr.length; j++) { + if (arr[maxElementIndex] < arr[j]) { + maxElementIndex = j; + } + } + + if (maxElementIndex != i) { + int temp = arr[i]; + arr[i] = arr[maxElementIndex]; + arr[maxElementIndex] = temp; + } + System.out.println("Iteration No. " + (i + 1)); + System.out.println(IntStream.of(arr) + .mapToObj(String::valueOf) + .collect(Collectors.joining(","))); + + } + } +} \ No newline at end of file diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java new file mode 100644 index 0000000000..85efd1d3da --- /dev/null +++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/selectionsort/SelectionSortUnitTest.java @@ -0,0 +1,25 @@ +package com.baeldung.algorithms.selectionsort; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertArrayEquals; + +import org.junit.Test; + +public class SelectionSortUnitTest { + + @Test + public void givenUnsortedArray_whenSelectionSort_SortAscending_thenSortedAsc() { + int[] input = { 5, 4, 1, 6, 2 }; + SelectionSort.sortAscending(input); + int[] expected = {1, 2, 4, 5, 6}; + assertArrayEquals("the two arrays are not equal", expected, input); + } + + @Test + public void givenUnsortedArray_whenSelectionSort_SortDescending_thenSortedDesc() { + int[] input = { 5, 4, 1, 6, 2 }; + SelectionSort.sortDescending(input); + int[] expected = {6, 5, 4, 2, 1}; + assertArrayEquals("the two arrays are not equal", expected, input); + } +} From 01cd19d427b08bd26c27c4e0687e1d842f6a1b59 Mon Sep 17 00:00:00 2001 From: Nikunj Gandhi Date: Tue, 30 Jul 2019 16:46:22 -0400 Subject: [PATCH 005/396] Selection sort implementation --- .../selectionsort/SelectionSort.java | 34 ------------------- 1 file changed, 34 deletions(-) diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java index 1b160a492d..17e95edf06 100644 --- a/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java +++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/selectionsort/SelectionSort.java @@ -1,31 +1,7 @@ package com.baeldung.algorithms.selectionsort; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - public class SelectionSort { - /*public static void main(final String args[]) { - int[] a = { 5, 4, 1, 6, 2 }; - - System.out.println("Unsorted array"); - System.out.println(IntStream.of(a) - .mapToObj(String::valueOf) - .collect(Collectors.joining(","))); - - a = sortAscending(a); - System.out.println("Ascending Sorted array"); - System.out.println(IntStream.of(a) - .mapToObj(String::valueOf) - .collect(Collectors.joining(","))); - - a = sortDescending(a); - System.out.println("Descending Sorted array"); - System.out.println(IntStream.of(a) - .mapToObj(String::valueOf) - .collect(Collectors.joining(","))); - }*/ - public static void sortAscending(final int[] arr) { for (int i = 0; i < arr.length - 1; i++) { int minElementIndex = i; @@ -40,11 +16,6 @@ public class SelectionSort { arr[i] = arr[minElementIndex]; arr[minElementIndex] = temp; } - System.out.println("Iteration No. " + (i + 1)); - System.out.println(IntStream.of(arr) - .mapToObj(String::valueOf) - .collect(Collectors.joining(","))); - } } @@ -62,11 +33,6 @@ public class SelectionSort { arr[i] = arr[maxElementIndex]; arr[maxElementIndex] = temp; } - System.out.println("Iteration No. " + (i + 1)); - System.out.println(IntStream.of(arr) - .mapToObj(String::valueOf) - .collect(Collectors.joining(","))); - } } } \ No newline at end of file From 674db8bd0ebd9dc23d6641c179f69013ac0c1fcd Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Wed, 31 Jul 2019 22:29:31 +0300 Subject: [PATCH 006/396] added StreamTokenizer examples --- .../streamtokenizer/StreamTokenizerDemo.java | 76 +++++++++++++++++++ .../resources/stream-tokenizer-example.txt | 3 + .../StreamTokenizerDemoUnitTest.java | 34 +++++++++ 3 files changed, 113 insertions(+) create mode 100644 java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java create mode 100644 java-strings-2/src/main/resources/stream-tokenizer-example.txt create mode 100644 java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java diff --git a/java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java b/java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java new file mode 100644 index 0000000000..3bb0ff5b77 --- /dev/null +++ b/java-strings-2/src/main/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemo.java @@ -0,0 +1,76 @@ +package com.baeldung.string.streamtokenizer; + +import java.io.*; +import java.util.ArrayList; +import java.util.List; + +public class StreamTokenizerDemo { + + private static final String INPUT_FILE = "/stream-tokenizer-example.txt"; + private static final int QUOTE_CHARACTER = '\''; + private static final int DOUBLE_QUOTE_CHARACTER = '"'; + + public static List streamTokenizerWithDefaultConfiguration(Reader reader) throws IOException { + StreamTokenizer streamTokenizer = new StreamTokenizer(reader); + List tokens = new ArrayList<>(); + + int currentToken = streamTokenizer.nextToken(); + while (currentToken != StreamTokenizer.TT_EOF) { + + if (streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) { + tokens.add(streamTokenizer.nval); + } else if (streamTokenizer.ttype == StreamTokenizer.TT_WORD + || streamTokenizer.ttype == QUOTE_CHARACTER + || streamTokenizer.ttype == DOUBLE_QUOTE_CHARACTER) { + tokens.add(streamTokenizer.sval); + } else { + tokens.add((char) currentToken); + } + + currentToken = streamTokenizer.nextToken(); + } + + return tokens; + } + + public static List streamTokenizerWithCustomConfiguration(Reader reader) throws IOException { + StreamTokenizer streamTokenizer = new StreamTokenizer(reader); + List tokens = new ArrayList<>(); + + streamTokenizer.wordChars('!', '-'); + streamTokenizer.ordinaryChar('/'); + streamTokenizer.commentChar('#'); + streamTokenizer.eolIsSignificant(true); + + int currentToken = streamTokenizer.nextToken(); + while (currentToken != StreamTokenizer.TT_EOF) { + + if (streamTokenizer.ttype == StreamTokenizer.TT_NUMBER) { + tokens.add(streamTokenizer.nval); + } else if (streamTokenizer.ttype == StreamTokenizer.TT_WORD + || streamTokenizer.ttype == QUOTE_CHARACTER + || streamTokenizer.ttype == DOUBLE_QUOTE_CHARACTER) { + tokens.add(streamTokenizer.sval); + } else { + tokens.add((char) currentToken); + } + currentToken = streamTokenizer.nextToken(); + } + + return tokens; + } + + public static Reader createReaderFromFile() throws FileNotFoundException { + String inputFile = StreamTokenizerDemo.class.getResource(INPUT_FILE).getFile(); + return new FileReader(inputFile); + } + + public static void main(String[] args) throws IOException { + List tokens1 = streamTokenizerWithDefaultConfiguration(createReaderFromFile()); + List tokens2 = streamTokenizerWithCustomConfiguration(createReaderFromFile()); + + System.out.println(tokens1); + System.out.println(tokens2); + } + +} \ No newline at end of file diff --git a/java-strings-2/src/main/resources/stream-tokenizer-example.txt b/java-strings-2/src/main/resources/stream-tokenizer-example.txt new file mode 100644 index 0000000000..6efe4fdc81 --- /dev/null +++ b/java-strings-2/src/main/resources/stream-tokenizer-example.txt @@ -0,0 +1,3 @@ +3 quick brown foxes jump over the "lazy" dog! +#test1 +//test2 \ No newline at end of file diff --git a/java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java b/java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java new file mode 100644 index 0000000000..01091ec629 --- /dev/null +++ b/java-strings-2/src/test/java/com/baeldung/string/streamtokenizer/StreamTokenizerDemoUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.string.streamtokenizer; + +import org.junit.Test; + +import java.io.IOException; +import java.io.Reader; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertArrayEquals; + +public class StreamTokenizerDemoUnitTest { + + @Test + public void whenStreamTokenizerWithDefaultConfigurationIsCalled_ThenCorrectTokensAreReturned() throws IOException { + Reader reader = StreamTokenizerDemo.createReaderFromFile(); + List expectedTokens = Arrays.asList(3.0, "quick", "brown", "foxes", "jump", "over", "the", "lazy", "dog", '!', '#', "test1"); + + List actualTokens = StreamTokenizerDemo.streamTokenizerWithDefaultConfiguration(reader); + + assertArrayEquals(expectedTokens.toArray(), actualTokens.toArray()); + } + + @Test + public void whenStreamTokenizerWithCustomConfigurationIsCalled_ThenCorrectTokensAreReturned() throws IOException { + Reader reader = StreamTokenizerDemo.createReaderFromFile(); + List expectedTokens = Arrays.asList(3.0, "quick", "brown", "foxes", "jump", "over", "the", "\"lazy\"", "dog!", '\n', '\n', '/', '/', "test2"); + + List actualTokens = StreamTokenizerDemo.streamTokenizerWithCustomConfiguration(reader); + + assertArrayEquals(expectedTokens.toArray(), actualTokens.toArray()); + } + +} From 13da8b8cee14838b28593e55a1878f806ce83c1a Mon Sep 17 00:00:00 2001 From: dupirefr Date: Fri, 2 Aug 2019 08:07:39 +0200 Subject: [PATCH 007/396] [BAEL-3117] XOR implementations --- .../baeldung/java/booleanoperators/Car.java | 20 ++++++ .../java/booleanoperators/XorUnitTest.java | 64 +++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java create mode 100644 core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java b/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java new file mode 100644 index 0000000000..8043b6dd93 --- /dev/null +++ b/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java @@ -0,0 +1,20 @@ +package com.baeldung.java.booleanoperators; + +public class Car { + + private boolean diesel; + private boolean manual; + + public Car(boolean diesel, boolean manual) { + this.diesel = diesel; + this.manual = manual; + } + + public boolean isDiesel() { + return diesel; + } + + public boolean isManual() { + return manual; + } +} diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java new file mode 100644 index 0000000000..0654d07f4f --- /dev/null +++ b/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.java.booleanoperators; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +class XorUnitTest { + + @Test + void givenDieselManualCar_whenXorOldSchool_ThenFalse() { + Car car = new Car(true, true); + boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); + assertThat(dieselXorManual).isFalse(); + } + + @Test + void givenDieselAutomaticCar_whenXorOldSchool_ThenTrue() { + Car car = new Car(true, false); + boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); + assertThat(dieselXorManual).isTrue(); + } + + @Test + void givenNonDieselManualCar_whenXorOldSchool_ThenTrue() { + Car car = new Car(false, true); + boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); + assertThat(dieselXorManual).isTrue(); + } + + @Test + void givenNonDieselAutomaticCar_whenXorOldSchool_ThenFalse() { + Car car = new Car(false, false); + boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); + assertThat(dieselXorManual).isFalse(); + } + + @Test + void givenDieselManualCar_whenXor_ThenFalse() { + Car car = new Car(true, true); + boolean dieselXorManual = car.isDiesel() ^ car.isManual(); + assertThat(dieselXorManual).isFalse(); + } + + @Test + void givenDieselAutomaticCar_whenXor_ThenTrue() { + Car car = new Car(true, false); + boolean dieselXorManual = car.isDiesel() ^ car.isManual(); + assertThat(dieselXorManual).isTrue(); + } + + @Test + void givenNonDieselManualCar_whenXor_ThenTrue() { + Car car = new Car(false, true); + boolean dieselXorManual = car.isDiesel() ^ car.isManual(); + assertThat(dieselXorManual).isTrue(); + } + + @Test + void givenNonDieselAutomaticCar_whenXor_ThenFalse() { + Car car = new Car(false, false); + boolean dieselXorManual = car.isDiesel() ^ car.isManual(); + assertThat(dieselXorManual).isFalse(); + } +} From af38c30c0007583aa39420d69ba04e340c8d31de Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sat, 3 Aug 2019 22:48:29 +0200 Subject: [PATCH 008/396] init --- .../core-java-lang-oop-2/pom.xml | 13 ++++++ .../com/baeldung/accessmodifiers/Student.java | 41 +++++++++++++++++++ .../PublicAccessModifierTest.java | 36 ++++++++++++++++ 3 files changed, 90 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java create mode 100644 core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java diff --git a/core-java-modules/core-java-lang-oop-2/pom.xml b/core-java-modules/core-java-lang-oop-2/pom.xml index 669a37b0f5..b7bd72372b 100644 --- a/core-java-modules/core-java-lang-oop-2/pom.xml +++ b/core-java-modules/core-java-lang-oop-2/pom.xml @@ -14,6 +14,19 @@ ../../parent-java + + + com.h2database + h2 + ${h2.version} + test + + + + + 1.4.199 + + core-java-lang-oop-2 diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java new file mode 100644 index 0000000000..8fc6da80fa --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java @@ -0,0 +1,41 @@ +package com.baeldung.accessmodifiers; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class Student { + + private BigDecimal grades; //new representation + private String name; + private int age; + + public int getGrades() { + return grades.intValue(); //Backward compatibility + } + + public Connection getConnection() throws SQLException { + + final String URL = "jdbc:h2:~/test"; + return DriverManager.getConnection(URL, "sa", ""); + + } + + public BigDecimal bigDecimalGrades() { + return grades; + } + + public void setAge(int age) { + if (age < 0 || age > 150) + throw new IllegalArgumentException(); + + this.age = age; + } + + @Override + public String toString() { + return this.name; + } + +} diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java new file mode 100644 index 0000000000..79b31cdae5 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java @@ -0,0 +1,36 @@ +package com.baeldung.accessmodifiers; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.TestInstance; +import org.junit.jupiter.api.TestInstance.Lifecycle; +import static org.junit.Assert.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertEquals; +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +@TestInstance(Lifecycle.PER_CLASS) +public class PublicAccessModifierTest { + + @Test + public void whenUsingIntValue_valuesAreEqual() { + + assertEquals(0, new BigDecimal(0).intValue()); + } + + @Test + public void whenUsingToLowerCase_valuesAreEqual() { + + assertEquals("alex", "ALEX".toLowerCase()); + } + + @Test + public void whenConnectingToH2_connectionInstanceIsReturned() throws SQLException { + + final String URL = "jdbc:h2:~/test"; + Connection conn = DriverManager.getConnection(URL, "sa", ""); + assertNotNull(conn); + } + +} From d5fd9a0d9a06b914d91cae0728b7f01e0c2a11bc Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sat, 3 Aug 2019 23:14:17 +0200 Subject: [PATCH 009/396] correcting unit test class name --- ...ccessModifierTest.java => PublicAccessModifierUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/{PublicAccessModifierTest.java => PublicAccessModifierUnitTest.java} (95%) diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java similarity index 95% rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 79b31cdae5..02cd816515 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -11,7 +11,7 @@ import java.sql.DriverManager; import java.sql.SQLException; @TestInstance(Lifecycle.PER_CLASS) -public class PublicAccessModifierTest { +public class PublicAccessModifierUnitTest { @Test public void whenUsingIntValue_valuesAreEqual() { From b01bd36786e5f78c7ade055b556a84731a19505e Mon Sep 17 00:00:00 2001 From: Andrew Shcherbakov Date: Sun, 4 Aug 2019 16:03:12 +0200 Subject: [PATCH 010/396] Add a code on logistic regression article (BAEL-3081) --- ml/README.md | 5 + ml/pom.xml | 52 ++++++ .../com/baeldung/logreg/DataUtilities.java | 102 +++++++++++ .../com/baeldung/logreg/MnistClassifier.java | 166 ++++++++++++++++++ .../com/baeldung/logreg/MnistPrediction.java | 53 ++++++ ml/src/main/resources/logback.xml | 13 ++ pom.xml | 2 + 7 files changed, 393 insertions(+) create mode 100644 ml/README.md create mode 100644 ml/pom.xml create mode 100644 ml/src/main/java/com/baeldung/logreg/DataUtilities.java create mode 100644 ml/src/main/java/com/baeldung/logreg/MnistClassifier.java create mode 100644 ml/src/main/java/com/baeldung/logreg/MnistPrediction.java create mode 100644 ml/src/main/resources/logback.xml diff --git a/ml/README.md b/ml/README.md new file mode 100644 index 0000000000..14e585cd97 --- /dev/null +++ b/ml/README.md @@ -0,0 +1,5 @@ +### Sample deeplearning4j Project +This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library. + +### Relevant Articles: +- [A Guide to Deeplearning4j](http://www.baeldung.com/deeplearning4j) diff --git a/ml/pom.xml b/ml/pom.xml new file mode 100644 index 0000000000..80afcc24f4 --- /dev/null +++ b/ml/pom.xml @@ -0,0 +1,52 @@ + + 4.0.0 + com.baeldung.deeplearning4j + ml + 1.0-SNAPSHOT + Machine Learning + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + org.nd4j + nd4j-native-platform + ${dl4j.version} + + + org.deeplearning4j + deeplearning4j-core + ${dl4j.version} + + + org.deeplearning4j + deeplearning4j-nn + ${dl4j.version} + + + + org.datavec + datavec-api + ${dl4j.version} + + + org.apache.httpcomponents + httpclient + 4.3.5 + + + + + + + 1.0.0-beta4 + + + \ No newline at end of file diff --git a/ml/src/main/java/com/baeldung/logreg/DataUtilities.java b/ml/src/main/java/com/baeldung/logreg/DataUtilities.java new file mode 100644 index 0000000000..2f18d30219 --- /dev/null +++ b/ml/src/main/java/com/baeldung/logreg/DataUtilities.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (c) 2015-2019 Skymind, Inc. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ******************************************************************************/ + +package com.baeldung.logreg; + +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; + +import java.io.*; + +/** + * Common data utility functions. + * + * @author fvaleri + */ +public class DataUtilities { + + /** + * Download a remote file if it doesn't exist. + * @param remoteUrl URL of the remote file. + * @param localPath Where to download the file. + * @return True if and only if the file has been downloaded. + * @throws Exception IO error. + */ + public static boolean downloadFile(String remoteUrl, String localPath) throws IOException { + boolean downloaded = false; + if (remoteUrl == null || localPath == null) + return downloaded; + File file = new File(localPath); + if (!file.exists()) { + file.getParentFile().mkdirs(); + HttpClientBuilder builder = HttpClientBuilder.create(); + CloseableHttpClient client = builder.build(); + try (CloseableHttpResponse response = client.execute(new HttpGet(remoteUrl))) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + try (FileOutputStream outstream = new FileOutputStream(file)) { + entity.writeTo(outstream); + outstream.flush(); + outstream.close(); + } + } + } + downloaded = true; + } + if (!file.exists()) + throw new IOException("File doesn't exist: " + localPath); + return downloaded; + } + + /** + * Extract a "tar.gz" file into a local folder. + * @param inputPath Input file path. + * @param outputPath Output directory path. + * @throws IOException IO error. + */ + public static void extractTarGz(String inputPath, String outputPath) throws IOException { + if (inputPath == null || outputPath == null) + return; + final int bufferSize = 4096; + if (!outputPath.endsWith("" + File.separatorChar)) + outputPath = outputPath + File.separatorChar; + try (TarArchiveInputStream tais = new TarArchiveInputStream( + new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(inputPath))))) { + TarArchiveEntry entry; + while ((entry = (TarArchiveEntry) tais.getNextEntry()) != null) { + if (entry.isDirectory()) { + new File(outputPath + entry.getName()).mkdirs(); + } else { + int count; + byte data[] = new byte[bufferSize]; + FileOutputStream fos = new FileOutputStream(outputPath + entry.getName()); + BufferedOutputStream dest = new BufferedOutputStream(fos, bufferSize); + while ((count = tais.read(data, 0, bufferSize)) != -1) { + dest.write(data, 0, count); + } + dest.close(); + } + } + } + } + +} diff --git a/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java new file mode 100644 index 0000000000..395307712d --- /dev/null +++ b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java @@ -0,0 +1,166 @@ +package com.baeldung.logreg; + +import java.io.File; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; + +import org.datavec.api.io.labels.ParentPathLabelGenerator; +import org.datavec.api.split.FileSplit; +import org.datavec.image.loader.NativeImageLoader; +import org.datavec.image.recordreader.ImageRecordReader; +import org.deeplearning4j.datasets.datavec.RecordReaderDataSetIterator; +import org.deeplearning4j.nn.conf.MultiLayerConfiguration; +import org.deeplearning4j.nn.conf.NeuralNetConfiguration; +import org.deeplearning4j.nn.conf.inputs.InputType; +import org.deeplearning4j.nn.conf.layers.ConvolutionLayer; +import org.deeplearning4j.nn.conf.layers.DenseLayer; +import org.deeplearning4j.nn.conf.layers.OutputLayer; +import org.deeplearning4j.nn.conf.layers.SubsamplingLayer; +import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; +import org.deeplearning4j.nn.weights.WeightInit; +import org.deeplearning4j.optimize.listeners.ScoreIterationListener; +import org.deeplearning4j.util.ModelSerializer; +import org.nd4j.evaluation.classification.Evaluation; +import org.nd4j.linalg.activations.Activation; +import org.nd4j.linalg.dataset.api.iterator.DataSetIterator; +import org.nd4j.linalg.dataset.api.preprocessor.DataNormalization; +import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler; +import org.nd4j.linalg.learning.config.Nesterovs; +import org.nd4j.linalg.lossfunctions.LossFunctions; +import org.nd4j.linalg.schedule.MapSchedule; +import org.nd4j.linalg.schedule.ScheduleType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Handwritten digit image classification based on LeNet-5 architecture by Yann LeCun. + * + * This code accompanies the article "Logistic regression in Java" and is heavily based on + * MnistClassifier. + * Some minor changes have been made in order to make article's flow smoother. + * + */ + +public class MnistClassifier { + private static final Logger logger = LoggerFactory.getLogger(MnistClassifier.class); + private static final String basePath = System.getProperty("java.io.tmpdir") + "mnist" + File.separator; + private static final File modelPath = new File(basePath + "mnist-model.zip"); + private static final String dataUrl = "http://github.com/myleott/mnist_png/raw/master/mnist_png.tar.gz"; + + public static void main(String[] args) throws Exception { + // input image sizes in pixels + int height = 28; + int width = 28; + // input image colour depth (1 for gray scale images) + int channels = 1; + // the number of output classes + int outputClasses = 10; + // number of samples that will be propagated through the network in each iteration + int batchSize = 54; + // total number of training epochs + int epochs = 1; + + // initialize a pseudorandom number generator + int seed = 1234; + Random randNumGen = new Random(seed); + + final String path = basePath + "mnist_png" + File.separator; + if (!new File(path).exists()) { + logger.debug("Downloading data {}", dataUrl); + String localFilePath = basePath + "mnist_png.tar.gz"; + logger.info("local file: {}", localFilePath); + if (DataUtilities.downloadFile(dataUrl, localFilePath)) { + DataUtilities.extractTarGz(localFilePath, basePath); + } + } else { + logger.info("local file exists {}", path); + + } + + logger.info("Vectorizing data..."); + // vectorization of train data + File trainData = new File(path + "training"); + FileSplit trainSplit = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen); + // use parent directory name as the image label + ParentPathLabelGenerator labelMaker = new ParentPathLabelGenerator(); + ImageRecordReader trainRR = new ImageRecordReader(height, width, channels, labelMaker); + trainRR.initialize(trainSplit); + DataSetIterator train = new RecordReaderDataSetIterator(trainRR, batchSize, 1, outputClasses); + + // pixel values from 0-255 to 0-1 (min-max scaling) + DataNormalization imageScaler = new ImagePreProcessingScaler(); + imageScaler.fit(train); + train.setPreProcessor(imageScaler); + + // vectorization of test data + File testData = new File(path + "testing"); + FileSplit testSplit = new FileSplit(testData, NativeImageLoader.ALLOWED_FORMATS, randNumGen); + ImageRecordReader testRR = new ImageRecordReader(height, width, channels, labelMaker); + testRR.initialize(testSplit); + DataSetIterator test = new RecordReaderDataSetIterator(testRR, batchSize, 1, outputClasses); + // same normalization for better results + test.setPreProcessor(imageScaler); + + logger.info("Network configuration and training..."); + // reduce the learning rate as the number of training epochs increases + // iteration #, learning rate + Map learningRateSchedule = new HashMap<>(); + learningRateSchedule.put(0, 0.06); + learningRateSchedule.put(200, 0.05); + learningRateSchedule.put(600, 0.028); + learningRateSchedule.put(800, 0.0060); + learningRateSchedule.put(1000, 0.001); + + final ConvolutionLayer layer1 = new ConvolutionLayer.Builder(5, 5).nIn(channels) + .stride(1, 1) + .nOut(20) + .activation(Activation.IDENTITY) + .build(); + final SubsamplingLayer layer2 = new SubsamplingLayer.Builder(SubsamplingLayer.PoolingType.MAX).kernelSize(2, 2) + .stride(2, 2) + .build(); + // nIn need not specified in later layers + final ConvolutionLayer layer3 = new ConvolutionLayer.Builder(5, 5).stride(1, 1) + .nOut(50) + .activation(Activation.IDENTITY) + .build(); + final DenseLayer layer4 = new DenseLayer.Builder().activation(Activation.RELU) + .nOut(500) + .build(); + final OutputLayer layer5 = new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nOut(outputClasses) + .activation(Activation.SOFTMAX) + .build(); + final MultiLayerConfiguration config = new NeuralNetConfiguration.Builder().seed(seed) + .l2(0.0005) // ridge regression value + .updater(new Nesterovs(new MapSchedule(ScheduleType.ITERATION, learningRateSchedule))) + .weightInit(WeightInit.XAVIER) + .list() + .layer(layer1) + .layer(layer2) + .layer(layer3) + .layer(layer2) + .layer(layer4) + .layer(layer5) + .setInputType(InputType.convolutionalFlat(height, width, channels)) + .build(); + + final MultiLayerNetwork model = new MultiLayerNetwork(config); + model.init(); + model.setListeners(new ScoreIterationListener(100)); + logger.info("Total num of params: {}", model.numParams()); + + // evaluation while training (the score should go down) + for (int i = 0; i < epochs; i++) { + model.fit(train); + logger.info("Completed epoch {}", i); + train.reset(); + test.reset(); + } + Evaluation eval = model.evaluate(test); + logger.info(eval.stats()); + + ModelSerializer.writeModel(model, modelPath, true); + logger.info("The MINIST model has been saved in {}", modelPath.getPath()); + } +} \ No newline at end of file diff --git a/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java new file mode 100644 index 0000000000..5ec1348e07 --- /dev/null +++ b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java @@ -0,0 +1,53 @@ +package com.baeldung.logreg; + +import java.io.File; +import java.io.IOException; + +import javax.swing.JFileChooser; + +import org.datavec.image.loader.NativeImageLoader; +import org.deeplearning4j.nn.multilayer.MultiLayerNetwork; +import org.deeplearning4j.util.ModelSerializer; +import org.nd4j.linalg.api.ndarray.INDArray; +import org.nd4j.linalg.dataset.api.preprocessor.ImagePreProcessingScaler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class MnistPrediction { + private static final Logger logger = LoggerFactory.getLogger(MnistPrediction.class); + private static final File modelPath = new File(System.getProperty("java.io.tmpdir") + "mnist" + File.separator + "mnist-model.zip"); + private static final int height = 28; + private static final int width = 28; + private static final int channels = 1; + + /** + * Opens a popup that allows to select a file from the filesystem. + * @return + */ + public static String fileChose() { + JFileChooser fc = new JFileChooser(); + int ret = fc.showOpenDialog(null); + if (ret == JFileChooser.APPROVE_OPTION) { + File file = fc.getSelectedFile(); + return file.getAbsolutePath(); + } else { + return null; + } + } + + public static void main(String[] args) throws IOException { + String path = fileChose().toString(); + MultiLayerNetwork model = ModelSerializer.restoreMultiLayerNetwork(modelPath); + File file = new File(path); + + INDArray image = new NativeImageLoader(height, width, channels).asMatrix(file); + new ImagePreProcessingScaler(0, 1).transform(image); + + // Pass through to neural Net + INDArray output = model.output(image); + + logger.info("File: {}", path); + logger.info(output.toString()); + } + +} diff --git a/ml/src/main/resources/logback.xml b/ml/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/ml/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index 352da33fee..7e9ce85b50 100644 --- a/pom.xml +++ b/pom.xml @@ -524,6 +524,7 @@ metrics microprofile + ml msf4j mustache @@ -1216,6 +1217,7 @@ metrics microprofile + ml msf4j mustache From 0527d816ccebe352c858c329178517c6d9519649 Mon Sep 17 00:00:00 2001 From: Andrew Shcherbakov Date: Sun, 4 Aug 2019 16:09:01 +0200 Subject: [PATCH 011/396] Update Readme file --- ml/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ml/README.md b/ml/README.md index 14e585cd97..f4712a94da 100644 --- a/ml/README.md +++ b/ml/README.md @@ -1,5 +1,5 @@ -### Sample deeplearning4j Project -This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library. +### Logistic Regression in Java +This is a soft introduction to ML using [deeplearning4j](https://deeplearning4j.org) library ### Relevant Articles: -- [A Guide to Deeplearning4j](http://www.baeldung.com/deeplearning4j) +- [Logistic Regression in Java](http://www.baeldung.com/) From 65e0cdd9dd7f6df8cfba80392c60a8aad48caf02 Mon Sep 17 00:00:00 2001 From: Alex Tighe Date: Mon, 5 Aug 2019 22:53:17 -0400 Subject: [PATCH 012/396] Committing review changes - change to try-with-resources - change the order of main method --- core-java-modules/core-java-io2/README.md | 6 - core-java-modules/core-java-io2/pom.xml | 246 +++++++++--------- .../baeldung/resource/MyResourceLoader.java | 24 +- 3 files changed, 132 insertions(+), 144 deletions(-) delete mode 100644 core-java-modules/core-java-io2/README.md diff --git a/core-java-modules/core-java-io2/README.md b/core-java-modules/core-java-io2/README.md deleted file mode 100644 index d4b417e30e..0000000000 --- a/core-java-modules/core-java-io2/README.md +++ /dev/null @@ -1,6 +0,0 @@ -========= - -## Core Java IO Cookbooks and Examples - -### Relevant Articles: -- [Reading Files Versus Loading Resources](http://www.baeldung.com/reading-files-versus-loading-resources) \ No newline at end of file diff --git a/core-java-modules/core-java-io2/pom.xml b/core-java-modules/core-java-io2/pom.xml index 8ac7b2975f..922403edab 100644 --- a/core-java-modules/core-java-io2/pom.xml +++ b/core-java-modules/core-java-io2/pom.xml @@ -1,143 +1,139 @@ - 4.0.0 - core-java-io2 - 0.1.0-SNAPSHOT - core-java-io2 - jar + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + core-java-io2 + 0.1.0-SNAPSHOT + core-java-io2 + jar - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + - - commons-io - commons-io - 2.6 - + + commons-io + commons-io + 2.6 + - - org.projectlombok - lombok - ${lombok.version} - provided - + + org.projectlombok + lombok + ${lombok.version} + provided + - - log4j - log4j - ${log4j.version} - + + log4j + log4j + ${log4j.version} + - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + - + + + core-java-io2 + + + src/main/resources + true + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + com.baeldung.resource.MyResourceLoader + + + + + + + + + integration + + + + org.codehaus.mojo + exec-maven-plugin + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + - - core-java-io2 - - - src/main/resources - true - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - + - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - true - com.baeldung.resource.MyResourceLoader - - - - - - + + 4.1 - - - integration - - - - org.codehaus.mojo - exec-maven-plugin + + 3.1.0 - - - run-benchmarks - - none - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - - - - - - - - 4.1 - - - 3.1.0 - - + \ No newline at end of file diff --git a/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java index 1c5b52e18b..6cb201b173 100644 --- a/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java +++ b/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java @@ -11,31 +11,29 @@ public class MyResourceLoader { private void loadFileWithReader() throws IOException { - FileReader fileReader = new FileReader("src/main/resources/input.txt"); - BufferedReader reader = new BufferedReader(fileReader); - String contents = reader.lines() - .collect(Collectors.joining(System.lineSeparator())); - reader.close(); - System.out.println(contents); + try (FileReader fileReader = new FileReader("src/main/resources/input.txt"); BufferedReader reader = new BufferedReader(fileReader)) { + String contents = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + System.out.println(contents); + } } private void loadFileAsResource() throws IOException { - InputStream inputStream = getClass().getResourceAsStream("/input.txt"); - BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); - String contents = reader.lines() - .collect(Collectors.joining(System.lineSeparator())); - System.out.println(contents); - + try (InputStream inputStream = getClass().getResourceAsStream("/input.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String contents = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + System.out.println(contents); + } } public static void main(String[] args) throws IOException { MyResourceLoader resourceLoader = new MyResourceLoader(); - resourceLoader.loadFileWithReader(); resourceLoader.loadFileAsResource(); + resourceLoader.loadFileWithReader(); } From 5a1a468c781b24047d0e9b6b208af35bb43323c0 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Tue, 6 Aug 2019 18:34:33 +0200 Subject: [PATCH 013/396] review modifications --- .../publicmodifier/ListOfThree.java | 31 ++++++++++ .../{ => publicmodifier}/Student.java | 16 ++--- .../PublicAccessModifierUnitTest.java | 58 ++++++++++++++++--- 3 files changed, 89 insertions(+), 16 deletions(-) create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java rename core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/{ => publicmodifier}/Student.java (71%) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java new file mode 100644 index 0000000000..54e2c35d22 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java @@ -0,0 +1,31 @@ +package com.baeldung.accessmodifiers.publicmodifier; + +import java.util.AbstractList; + +public class ListOfThree extends AbstractList { + + private static final int MAX_LENGTH = 3; + private int size; + private Object[] elements = new Object[MAX_LENGTH]; + + @Override + @SuppressWarnings("unchecked") + public E get(int index) { + return (E)elements[index]; + } + + @Override + public boolean add(E e) { + + elements[size] = e; + size++; + + return true; + } + + @Override + public int size() { + return size; + } + +} diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java similarity index 71% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java index 8fc6da80fa..50784c6e54 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/Student.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java @@ -1,4 +1,4 @@ -package com.baeldung.accessmodifiers; +package com.baeldung.accessmodifiers.publicmodifier; import java.math.BigDecimal; import java.sql.Connection; @@ -7,12 +7,16 @@ import java.sql.SQLException; public class Student { - private BigDecimal grades; //new representation + private BigDecimal grade; //new representation private String name; private int age; - public int getGrades() { - return grades.intValue(); //Backward compatibility + public int getGrade() { + return grade.intValue(); //Backward compatibility + } + + public BigDecimal bigDecimalGrade() { + return grade; } public Connection getConnection() throws SQLException { @@ -21,10 +25,6 @@ public class Student { return DriverManager.getConnection(URL, "sa", ""); } - - public BigDecimal bigDecimalGrades() { - return grades; - } public void setAge(int age) { if (age < 0 || age > 150) diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 02cd816515..06f20c8610 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -3,34 +3,76 @@ package com.baeldung.accessmodifiers; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; +import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.List; @TestInstance(Lifecycle.PER_CLASS) public class PublicAccessModifierUnitTest { @Test - public void whenUsingIntValue_valuesAreEqual() { - - assertEquals(0, new BigDecimal(0).intValue()); + public void whenUsingBigDecimalIntValueMethod_correspondingIntIsReturned() { + assertEquals(0, new BigDecimal(0).intValue()); //instance member } - + @Test - public void whenUsingToLowerCase_valuesAreEqual() { - + public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() { + assertEquals(2147483647, Integer.MAX_VALUE); //static field + } + + @Test + public void whenUsingStringToLowerCase_stringTurnsToLowerCase() { assertEquals("alex", "ALEX".toLowerCase()); } + @Test + public void whenParsingStringOne_parseIntReturns1() { + assertEquals(1, Integer.parseInt("1")); + } + @Test public void whenConnectingToH2_connectionInstanceIsReturned() throws SQLException { - final String URL = "jdbc:h2:~/test"; - Connection conn = DriverManager.getConnection(URL, "sa", ""); + final String url = "jdbc:h2:~/test"; + Connection conn = DriverManager.getConnection(url, "sa", ""); assertNotNull(conn); } + @Test + public void whenCreatingCustomList_concreteAndInheritedMethodsWork() { + + List list1 = new ListOfThree(); + list1.add("zero"); //inherited implementation + list1.add("one"); + list1.add("two"); + + //our implemented methods + assertEquals("zero", list1.get(0)); + + assertThrows(ArrayIndexOutOfBoundsException.class, () -> { + list1.get(4); + }); + + assertThrows(ArrayIndexOutOfBoundsException.class, () -> { + list1.add("three"); + }); + + assertEquals(3, list1.size()); + + list1.indexOf("one"); //inherited implementation + + List list2 = new ListOfThree(); + list2.add("zero"); + list2.add("one"); + + assertTrue(list1.containsAll(list2)); //inherited implementation + } + } From b43787bca518230b7f2f852d8b02e060c96fbda4 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Tue, 6 Aug 2019 20:49:10 +0200 Subject: [PATCH 014/396] modifying ListOfThree class --- .../publicmodifier/ListOfThree.java | 28 +++++++++---------- .../PublicAccessModifierUnitTest.java | 28 ++++++------------- 2 files changed, 23 insertions(+), 33 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java index 54e2c35d22..2ded0ba5d3 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java @@ -1,31 +1,31 @@ package com.baeldung.accessmodifiers.publicmodifier; import java.util.AbstractList; +import java.util.Arrays; public class ListOfThree extends AbstractList { - private static final int MAX_LENGTH = 3; - private int size; - private Object[] elements = new Object[MAX_LENGTH]; + private static final int LENGTH = 3; + private Object[] elements; + + public ListOfThree(E[] data) { + if(data == null + || data.length != LENGTH) + throw new IllegalArgumentException(); + + this.elements = Arrays.copyOf(data, data.length); //shallow copy + + } @Override @SuppressWarnings("unchecked") - public E get(int index) { + public E get(int index) { return (E)elements[index]; } - - @Override - public boolean add(E e) { - - elements[size] = e; - size++; - - return true; - } @Override public int size() { - return size; + return LENGTH; } } diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 06f20c8610..fa42044aca 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -48,31 +48,21 @@ public class PublicAccessModifierUnitTest { @Test public void whenCreatingCustomList_concreteAndInheritedMethodsWork() { - List list1 = new ListOfThree(); - list1.add("zero"); //inherited implementation - list1.add("one"); - list1.add("two"); + String[] dataSet1 = new String[] {"zero", "one", "two"}; + + List list1 = new ListOfThree(dataSet1); //our implemented methods - assertEquals("zero", list1.get(0)); - - assertThrows(ArrayIndexOutOfBoundsException.class, () -> { - list1.get(4); - }); - - assertThrows(ArrayIndexOutOfBoundsException.class, () -> { - list1.add("three"); - }); - + assertEquals("one", list1.get(1)); assertEquals(3, list1.size()); - list1.indexOf("one"); //inherited implementation + //inherited implementations + assertEquals(1, list1.indexOf("one")); - List list2 = new ListOfThree(); - list2.add("zero"); - list2.add("one"); + String[] dataSet2 = new String[] {"two", "zero", "one"}; + List list2 = new ListOfThree(dataSet2); - assertTrue(list1.containsAll(list2)); //inherited implementation + assertTrue(list1.containsAll(list2)); } } From 4277c2ecf6016597419c9c5bfa68b433eaa6a97f Mon Sep 17 00:00:00 2001 From: Alex Tighe Date: Wed, 7 Aug 2019 23:15:55 -0400 Subject: [PATCH 015/396] Reformatting try-with-resources --- .../main/java/com/baeldung/resource/MyResourceLoader.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java index 6cb201b173..7512b177df 100644 --- a/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java +++ b/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java @@ -11,7 +11,8 @@ public class MyResourceLoader { private void loadFileWithReader() throws IOException { - try (FileReader fileReader = new FileReader("src/main/resources/input.txt"); BufferedReader reader = new BufferedReader(fileReader)) { + try (FileReader fileReader = new FileReader("src/main/resources/input.txt"); + BufferedReader reader = new BufferedReader(fileReader)) { String contents = reader.lines() .collect(Collectors.joining(System.lineSeparator())); System.out.println(contents); @@ -21,7 +22,8 @@ public class MyResourceLoader { private void loadFileAsResource() throws IOException { - try (InputStream inputStream = getClass().getResourceAsStream("/input.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + try (InputStream inputStream = getClass().getResourceAsStream("/input.txt"); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { String contents = reader.lines() .collect(Collectors.joining(System.lineSeparator())); System.out.println(contents); From fc16a4707843e59af9c0fe4a1076a3d2e4ca9546 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Sat, 10 Aug 2019 11:51:15 +0200 Subject: [PATCH 016/396] Added factory methods to create cars --- .../com/baeldung/java/booleanoperators/Car.java | 16 ++++++++++++++++ .../java/booleanoperators/XorUnitTest.java | 16 ++++++++-------- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java b/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java index 8043b6dd93..7394895325 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java @@ -17,4 +17,20 @@ public class Car { public boolean isManual() { return manual; } + + static Car dieselAndManualCar() { + return new Car(true, true); + } + + static Car dieselAndAutomaticCar() { + return new Car(true, false); + } + + static Car oilAndManualCar() { + return new Car(false, true); + } + + static Car oilAndAutomaticCar() { + return new Car(false, false); + } } diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java index 0654d07f4f..70abc0266d 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java @@ -8,56 +8,56 @@ class XorUnitTest { @Test void givenDieselManualCar_whenXorOldSchool_ThenFalse() { - Car car = new Car(true, true); + Car car = Car.dieselAndManualCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isFalse(); } @Test void givenDieselAutomaticCar_whenXorOldSchool_ThenTrue() { - Car car = new Car(true, false); + Car car = Car.dieselAndAutomaticCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isTrue(); } @Test void givenNonDieselManualCar_whenXorOldSchool_ThenTrue() { - Car car = new Car(false, true); + Car car = Car.oilAndManualCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isTrue(); } @Test void givenNonDieselAutomaticCar_whenXorOldSchool_ThenFalse() { - Car car = new Car(false, false); + Car car = Car.oilAndAutomaticCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isFalse(); } @Test void givenDieselManualCar_whenXor_ThenFalse() { - Car car = new Car(true, true); + Car car = Car.dieselAndManualCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isFalse(); } @Test void givenDieselAutomaticCar_whenXor_ThenTrue() { - Car car = new Car(true, false); + Car car = Car.dieselAndAutomaticCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isTrue(); } @Test void givenNonDieselManualCar_whenXor_ThenTrue() { - Car car = new Car(false, true); + Car car = Car.oilAndManualCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isTrue(); } @Test void givenNonDieselAutomaticCar_whenXor_ThenFalse() { - Car car = new Car(false, false); + Car car = Car.oilAndAutomaticCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isFalse(); } From 1e59e56856de7aedfb04f508f9ea43be38941d95 Mon Sep 17 00:00:00 2001 From: Sorin Zamfir Date: Tue, 13 Aug 2019 23:00:00 +0300 Subject: [PATCH 017/396] BAEL-2774: Initial working version --- gradle-java-exec/.gitignore | 6 + gradle-java-exec/build.gradle | 54 ++++++ .../gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 54708 bytes .../gradle/wrapper/gradle-wrapper.properties | 5 + gradle-java-exec/gradlew | 164 ++++++++++++++++++ gradle-java-exec/gradlew.bat | 90 ++++++++++ .../com/baeldung/gradle/exec/MainClass.java | 8 + 7 files changed, 327 insertions(+) create mode 100644 gradle-java-exec/.gitignore create mode 100644 gradle-java-exec/build.gradle create mode 100644 gradle-java-exec/gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle-java-exec/gradle/wrapper/gradle-wrapper.properties create mode 100755 gradle-java-exec/gradlew create mode 100644 gradle-java-exec/gradlew.bat create mode 100644 gradle-java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java diff --git a/gradle-java-exec/.gitignore b/gradle-java-exec/.gitignore new file mode 100644 index 0000000000..7dd8895f4b --- /dev/null +++ b/gradle-java-exec/.gitignore @@ -0,0 +1,6 @@ +/build/ +/bin/ +.settings +.gradle +.project +.classpath \ No newline at end of file diff --git a/gradle-java-exec/build.gradle b/gradle-java-exec/build.gradle new file mode 100644 index 0000000000..a728845dff --- /dev/null +++ b/gradle-java-exec/build.gradle @@ -0,0 +1,54 @@ +plugins { + id "application" +} +apply plugin :"java" + +description = "Java MainClass execution examples" +group = "com.baeldung" +version = "0.0.1" +sourceCompatibility = "1.8" +targetCompatibility = "1.8" + +ext { + javaMainClass = "com.baeldung.gradle.exec.MainClass" +} + +jar { + manifest { + attributes( + "Main-Class": javaMainClass + ) + } +} + +application { + mainClassName = javaMainClass +} + +task runWithJavaExec(type: JavaExec) { + group = "Execution" + description = "Run the main class with JavaExecTask" + classpath = sourceSets.main.runtimeClasspath + main = javaMainClass +} + +task runWithExec(type: Exec) { + dependsOn build + group = "Execution" + description = "Run the main class with ExecTask" + commandLine "java", "-classpath", sourceSets.main.runtimeClasspath.getAsPath(), javaMainClass +} + +task runWithExecJarExecutable(type: Exec) { + dependsOn jar + group = "Execution" + description = "Run the output executable jar with ExecTask" + commandLine "java", "-jar", jar.archiveFile.get() +} + +task runWithExecJarOnClassPath(type: Exec) { + dependsOn jar + group = "Execution" + description = "Run the mainClass from the output jar in classpath with ExecTask" + commandLine "java", "-classpath", jar.archiveFile.get() , javaMainClass +} \ No newline at end of file diff --git a/gradle-java-exec/gradle/wrapper/gradle-wrapper.jar b/gradle-java-exec/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..736fb7d3f94c051b359fc7ae7212d351bc094bdd GIT binary patch literal 54708 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 ZypaY2tb=~UE;0eV1Nd9`dw%@&{{Y^v%e4Ri literal 0 HcmV?d00001 diff --git a/gradle-java-exec/gradle/wrapper/gradle-wrapper.properties b/gradle-java-exec/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000000..b33419deee --- /dev/null +++ b/gradle-java-exec/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-5.5.1-bin.zip diff --git a/gradle-java-exec/gradlew b/gradle-java-exec/gradlew new file mode 100755 index 0000000000..27309d9231 --- /dev/null +++ b/gradle-java-exec/gradlew @@ -0,0 +1,164 @@ +#!/usr/bin/env bash + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules +function splitJvmOpts() { + JVM_OPTS=("$@") +} +eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS +JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME" + +exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@" diff --git a/gradle-java-exec/gradlew.bat b/gradle-java-exec/gradlew.bat new file mode 100644 index 0000000000..832fdb6079 --- /dev/null +++ b/gradle-java-exec/gradlew.bat @@ -0,0 +1,90 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args +if "%@eval[2+2]" == "4" goto 4NT_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* +goto execute + +:4NT_args +@rem Get arguments from the 4NT Shell from JP Software +set CMD_LINE_ARGS=%$ + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/gradle-java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java b/gradle-java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java new file mode 100644 index 0000000000..1e0c05389c --- /dev/null +++ b/gradle-java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java @@ -0,0 +1,8 @@ +package com.baeldung.gradle.exec; + +public class MainClass { + + public static void main(String[] args) { + System.out.println("Goodbye cruel world ..."); + } +} From 99d90bb873d7cf55c05d90c9b865d54ecbb30ac6 Mon Sep 17 00:00:00 2001 From: pazis Date: Wed, 14 Aug 2019 15:06:10 +0000 Subject: [PATCH 018/396] InterpolationSearch --- .../InterpolationSearch.java | 35 +++++++++++++++++++ .../InterpolationSearchUnitTest.java | 29 +++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java create mode 100644 algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java new file mode 100644 index 0000000000..91423eeaa8 --- /dev/null +++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearch.java @@ -0,0 +1,35 @@ +package com.baeldung.algorithms.interpolationsearch; + +public class InterpolationSearch { + + public static int interpolationSearch(int[] data, int item) { + + int highEnd = (data.length - 1); + int lowEnd = 0; + + while (item >= data[lowEnd] && item <= data[highEnd] && lowEnd <= highEnd) { + + int probe = lowEnd + (highEnd - lowEnd) * (item - data[lowEnd]) / (data[highEnd] - data[lowEnd]); + + if (highEnd == lowEnd) { + if (data[lowEnd] == item) { + return lowEnd; + } else { + return -1; + } + } + + if (data[probe] == item) { + return probe; + } + + if (data[probe] < item) { + lowEnd = probe + 1; + } else { + highEnd = probe - 1; + } + } + return -1; + } + +} diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java new file mode 100644 index 0000000000..8ad962055e --- /dev/null +++ b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/interpolationsearch/InterpolationSearchUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.algorithms.interpolationsearch; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.Before; +import org.junit.Test; + +public class InterpolationSearchUnitTest { + + private int[] myData; + + @Before + public void setUp() { + myData = new int[]{13,21,34,55,69,73,84,101}; + } + + @Test + public void givenSortedArray_whenLookingFor84_thenReturn6() { + int pos = InterpolationSearch.interpolationSearch(myData, 84); + assertEquals(6, pos); + } + + @Test + public void givenSortedArray_whenLookingFor19_thenReturnMinusOne() { + int pos = InterpolationSearch.interpolationSearch(myData, 19); + assertEquals(-1, pos); + } + +} From 1a7f21e993ee223c199c89711575e76d99a9ebaa Mon Sep 17 00:00:00 2001 From: Muhammad Asif Anwar Date: Sat, 17 Aug 2019 21:55:34 +0400 Subject: [PATCH 019/396] File deleted as everything now builds on Jenkins --- .travis.yml | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 5e86714a89..0000000000 --- a/.travis.yml +++ /dev/null @@ -1,24 +0,0 @@ -language: java - -before_install: - - echo "MAVEN_OPTS='-Xmx2048M -Xss128M -XX:+CMSClassUnloadingEnabled -XX:+UseG1GC -XX:-UseGCOverheadLimit'" > ~/.mavenrc - -install: skip -script: travis_wait 60 mvn -q install -Pdefault-first,default-second -Dgib.enabled=true - -sudo: required - -jdk: - - oraclejdk8 - -addons: - apt: - packages: - - oracle-java8-installer - -cache: - directories: - - .autoconf - - $HOME/.m2 - - From 04f446b271b0e3f149f35685e0569c71c20f5453 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 17 Aug 2019 23:53:20 +0300 Subject: [PATCH 020/396] Update README.md --- java-math/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-math/README.md b/java-math/README.md index d821348204..244417d1a5 100644 --- a/java-math/README.md +++ b/java-math/README.md @@ -7,4 +7,5 @@ - [Find the Intersection of Two Lines in Java](https://www.baeldung.com/java-intersection-of-two-lines) - [Round Up to the Nearest Hundred](https://www.baeldung.com/java-round-up-nearest-hundred) - [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage) -- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude) \ No newline at end of file +- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude) +- [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging) From 12bc0fcfd9fff10bc6c8b2e8b2d1f2e1141ad72d Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sun, 18 Aug 2019 13:54:19 +0200 Subject: [PATCH 021/396] changing public static final field example --- .../baeldung/accessmodifiers/publicmodifier/Student.java | 5 +++++ .../accessmodifiers/PublicAccessModifierUnitTest.java | 7 ++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java index 50784c6e54..65237fa864 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java @@ -10,6 +10,7 @@ public class Student { private BigDecimal grade; //new representation private String name; private int age; + public static final String GENDER = "male"; public int getGrade() { return grade.intValue(); //Backward compatibility @@ -33,6 +34,10 @@ public class Student { this.age = age; } + public int getAge() { + return age; + } + @Override public String toString() { return this.name; diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index fa42044aca..8b11e3a9ad 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -4,10 +4,10 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; +import com.baeldung.accessmodifiers.publicmodifier.Student; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; @@ -22,6 +22,11 @@ public class PublicAccessModifierUnitTest { assertEquals(0, new BigDecimal(0).intValue()); //instance member } + @Test + public void whenUsingGenderPublicStaticFinalField_getReferenceToStringMale() { + assertEquals("male", Student.GENDER); + } + @Test public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() { assertEquals(2147483647, Integer.MAX_VALUE); //static field From d5528552c53570917d7ebd45a9d3a8e20f4aeb07 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 18 Aug 2019 17:35:53 +0530 Subject: [PATCH 022/396] [BAEL-12749] - Moved articles from persistence-modules/spring-jpa to persistence-modules/spring-hibernate-5 --- .../spring-hibernate-5/README.md | 3 + .../_6.fdt | Bin 0 -> 160 bytes .../_6.fdx | Bin 0 -> 84 bytes .../_6.fnm | Bin 0 -> 532 bytes .../_6.nvd | Bin 0 -> 65 bytes .../_6.nvm | Bin 0 -> 88 bytes .../_6.si | Bin 0 -> 503 bytes .../_6.tvd | Bin 0 -> 392 bytes .../_6.tvx | Bin 0 -> 79 bytes .../_6_Lucene50_0.doc | Bin 0 -> 190 bytes .../_6_Lucene50_0.pos | Bin 0 -> 162 bytes .../_6_Lucene50_0.tim | Bin 0 -> 914 bytes .../_6_Lucene50_0.tip | Bin 0 -> 195 bytes .../_7.cfe | Bin 0 -> 341 bytes .../_7.cfs | Bin 0 -> 2119 bytes .../_7.si | Bin 0 -> 360 bytes .../segments_9 | Bin 0 -> 198 bytes .../write.lock | 0 .../spring-hibernate-5/pom.xml | 5 + .../hibernate/cache/dao/AbstractJpaDAO.java | 46 ++++++++ .../baeldung/hibernate/cache/dao/FooDao.java | 17 +++ .../baeldung/hibernate/cache/dao/IFooDao.java | 21 ++++ .../baeldung/hibernate/cache/model/Bar.java | 102 ++++++++++++++++++ .../baeldung/hibernate/cache/model/Foo.java | 92 ++++++++++++++++ .../hibernate/cache/service/FooService.java | 37 +++++++ .../spring}/PersistenceJNDIConfig.java | 8 +- .../spring}/PersistenceJPAConfigL2Cache.java | 8 +- .../main/resources/persistence-h2.properties | 3 + .../resources/persistence-jndi.properties | 0 .../config/PersistenceJPAConfigDeletion.java | 6 +- .../persistence/deletion/model/Bar.java | 2 +- .../persistence/deletion/model/Baz.java | 2 +- .../persistence/deletion/model/Foo.java | 2 +- .../service/DeletionIntegrationTest.java | 11 +- .../SecondLevelCacheIntegrationTest.java | 29 ++--- persistence-modules/spring-jpa/README.md | 3 - persistence-modules/spring-jpa/pom.xml | 5 - .../main/resources/persistence-h2.properties | 5 +- .../SpringContextIntegrationTest.java | 4 +- .../java/com/baeldung/SpringContextTest.java | 4 +- ...oPaginationPersistenceIntegrationTest.java | 3 +- .../FooServicePersistenceIntegrationTest.java | 3 +- .../FooServiceSortingIntegrationTest.java | 4 +- ...eSortingWitNullsManualIntegrationTest.java | 3 +- 44 files changed, 372 insertions(+), 56 deletions(-) create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdt create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdx create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fnm create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvd create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvm create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.si create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.tvd create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.tvx create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.doc create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.pos create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.tim create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.tip create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.cfe create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.cfs create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.si create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/segments_9 create mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/write.lock create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/AbstractJpaDAO.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/FooDao.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/IFooDao.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/model/Bar.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/model/Foo.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/service/FooService.java rename persistence-modules/{spring-jpa/src/main/java/org/baeldung/config => spring-hibernate-5/src/main/java/com/baeldung/spring}/PersistenceJNDIConfig.java (92%) rename persistence-modules/{spring-jpa/src/main/java/org/baeldung/config => spring-hibernate-5/src/main/java/com/baeldung/spring}/PersistenceJPAConfigL2Cache.java (93%) rename persistence-modules/{spring-jpa => spring-hibernate-5}/src/main/resources/persistence-jndi.properties (100%) rename persistence-modules/{spring-jpa/src/test/java/org => spring-hibernate-5/src/test/java/com}/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java (50%) rename persistence-modules/{spring-jpa/src/test/java/org => spring-hibernate-5/src/test/java/com}/baeldung/persistence/deletion/model/Bar.java (95%) rename persistence-modules/{spring-jpa/src/test/java/org => spring-hibernate-5/src/test/java/com}/baeldung/persistence/deletion/model/Baz.java (94%) rename persistence-modules/{spring-jpa/src/test/java/org => spring-hibernate-5/src/test/java/com}/baeldung/persistence/deletion/model/Foo.java (95%) rename persistence-modules/{spring-jpa/src/test/java/org => spring-hibernate-5/src/test/java/com}/baeldung/persistence/service/DeletionIntegrationTest.java (94%) rename persistence-modules/{spring-jpa/src/test/java/org => spring-hibernate-5/src/test/java/com}/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java (89%) diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md index adfb152afd..7a18761a7b 100644 --- a/persistence-modules/spring-hibernate-5/README.md +++ b/persistence-modules/spring-hibernate-5/README.md @@ -5,3 +5,6 @@ - [JPA Criteria Queries](http://www.baeldung.com/hibernate-criteria-queries) - [Introduction to Hibernate Search](http://www.baeldung.com/hibernate-search) - [@DynamicUpdate with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-dynamicupdate) +- [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache) +- [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate) +- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource) \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdt b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdt new file mode 100644 index 0000000000000000000000000000000000000000..c44ea80ed4835cac6d7c02e0283250eba151a13b GIT binary patch literal 160 zcmcD&o+B>fQ<|KbmuhMdT#{dun&Ot3nv+uOmRMZkl30?+z`($$U=u!Hth|RWNNSI7 zaZmMPhK2@4CI%h`CI_I literal 0 HcmV?d00001 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdx b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdx new file mode 100644 index 0000000000000000000000000000000000000000..77b3c43c2118eeeb99c5a92ce5c2798d92150eb2 GIT binary patch literal 84 zcmcD&o+B>nQ<|KbmuhMdT#{dun&Ot3nv+uOmRMZknU|7U!N9=4s9+O5U#z@`FGy;S hZ*focVg@EgpeTbC5Hs{K9?+Ql0;mcMR=Nh=0042_7#jcp literal 0 HcmV?d00001 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fnm b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fnm new file mode 100644 index 0000000000000000000000000000000000000000..6a5f78d0a0d7f5dd416efcf7902a150f90c4a666 GIT binary patch literal 532 zcmcD&o+B>gQ<|KbmuhO@mYJH9;+dD0U(CS3z^GsoK3}Z7hc8HKk8g2L^ovau*ckr<5j__$B71GBHx$+1x3q#mPmP1tppJdCW90pDi~vH@~Qo Wg^7{sA$~w(@(W;ugTd$P_VWNA*U|t0 literal 0 HcmV?d00001 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvd b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvd new file mode 100644 index 0000000000000000000000000000000000000000..7644ffa79bd8bfde66f6115cfd602d89ab62c4f6 GIT binary patch literal 65 zcmcD&o+B>kQ<|KbmuhP4mtT}y?2=fL$N&TiHsSNd%6s^Nr1tn0_f#)tC@C$eC@(*t PG5G~Z8UzCG{Fn&<$0Zf# literal 0 HcmV?d00001 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvm b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvm new file mode 100644 index 0000000000000000000000000000000000000000..b2eb2c7a525bc3f5ed0c4376a456f7d110a846d2 GIT binary patch literal 88 zcmcD&o+B>mQ<|KbmuhP4mtT}y?3-GWn37nM$N&TiHsSNd%6s^Nr1tn0_f#)tU;>GP bKshrbgu$Tw9|-slXiR z{OL_&hV^F^zAI~77Kb6jd@7rr@*_$RNQiF5_O(DkM4D$@Ot?TQAQ3!Rh+?ZlJh)$}|ab0L1wYzqw?NqjW z*Uz8MZvo7M6+{dFA(Mjd0+r0tGQuh?ETLJ)vZ4~a;ASh@373o0*wP{yn)~_Xo{mj$ kKO_;BeJ&_cfO1Sqr#(I$Rz@`5}>6FQ#L))tdz6ZV^&iM}C^`D|t+RP$S6s~?CBeyAX z+SnF41b|?EZRhk!|8TlJ_kGJAemsY<;XF)0?%CzV8Nm3}r>n5jc~B_$+n3(YdbI#@ zL&&%6>y0<(ZQQBVmctj14|jt^UBZ~j_CzO7d3;VSEjOmdVwGTQ2%YeMm9tqJe%O%VK8 PJpSc7yPv;ri#PuP$%24n literal 0 HcmV?d00001 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.tvx b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.tvx new file mode 100644 index 0000000000000000000000000000000000000000..6b97c002b30e9a9274e680c4086f3dd8af04cd54 GIT binary patch literal 79 zcmcD&o+B>dQ<|KbmuhMdl3J7-mYQ6WUsUXwmy%k+z`($$U=u!Hth|RWNNSI7aZmMP c1|~+JD1!+QGkjw@pfULcP!$-6FJJKz0N;le*Z=?k literal 0 HcmV?d00001 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.doc b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.doc new file mode 100644 index 0000000000000000000000000000000000000000..f86ebad3d109a32f4d3ec9d144cfb7cd5fb20bf3 GIT binary patch literal 190 zcmcD&o+B>lQ<|KbmuhMdkY8MqnU`K1UX)pqTI7lQ<|KbmuhMdkY8MqnU`K1UX)pqS_I@V0D*!{_~)r+}c zs^bkn(hLkdOl)i{JdBLY%plCm!OF_a$i&3Q$-&6U!NtbL&cedP%*4dS%F4|O(ZCD_ iOiWBbE+Y#VFoFOB0}}%i(*cdiFCgj|7)qF>mjM7hq8XY1 literal 0 HcmV?d00001 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.tim b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.tim new file mode 100644 index 0000000000000000000000000000000000000000..3f8b1e4ab0ec3c81c17d458acde3b0b03e775bb1 GIT binary patch literal 914 zcmb7Dy>HYo6!)_e-%*uT6bUFu2NOb6I$f{5qXVc27(uE~rEY*PaTBXf9NCWUDh5#J zPIO>oU_@eIX5g=&I};Q93p^*ij!5-K-nXCM?>XD2`ufTfZIXjsE9I`Vg?pwFPY9uR z9`1d*Ha%W?dGq@Vcl`GA!t*+jr5p`j56Cu#-I~ig#(7m{ZqF(&ZF2_3lmEoO2ex-V zF-3nOq)zKH>*s1BZ7IBTQrIN#7bcauzhg~WC!TUbUp?A5rIFCibVQk2qtaMZm6qKk z7dFH6og|l{l9uDSjaXYNOV4DPM*AX>(Y`fBoLMP+l&dVKD&?xmO)0q!d3~f+DI;yX z-R%C@niyX0;Y}!4<;#CSt+WRb_0bx-(T}YNoC`RaR>09G@zmt8xeg2*XX! z=UfVwc2cCg@d@&F`jikrFUHV7&j(|uYa}GiLN{EfBEWg;i{j-~Scf5Oz$T1fyf{x1 z=+z@AF#=ii#?vAK@s)(X>4rYF;kTAm41!a z)_D6M&pHmAep?DTu?ypol#`#F9a5B<8j@O+TkM&al3KyQz`&$n6Fy(8yoWDHYL9PmPxWFhpVH*i zyi`+zcmsQ&HfFcr5TG(v21aJ)M@$S1j0|X^tn09e@@>K<%Kr|VsL&*^sJU-)Wj`a( UE)ZCHKx6U?2$O*!D{M+F0FU1)Jpcdz literal 0 HcmV?d00001 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.cfe b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.cfe new file mode 100644 index 0000000000000000000000000000000000000000..d1359e482e2d258c59d493f06401eda9938089fe GIT binary patch literal 341 zcmcD&o+B>qQ<|KbmuhO@oS$2eUz(TVnpaYknOe*M1PV6c^To=0_=2SN_!jq6FJ<87 zkB2FbH_$7|EC8tj0zC-DaF|6euPhhJ`3R*WSoBKDQXm{gPpIG&7QM7Qs7l7W5J4sp zpkPV~gu@Ke-iTsnK|a`J3=AwqP?I7-##cZ%ET^G@{vd}y?PQgL3RRFVm`o;4IA n&!h;l9%>SM8B|j+il&tOWQaKXNvM3@0gcHoplk+ipdYA3`(b{p_!w) zLg!&GDc)S>pw2}2YeIB#3bu&|3&JKr2-{$;RdIE{Ro}+GtK0jn2A1sAzA<^>8Rq;U zme)I<|IXba^rkZOjdQ8ZQ|lgQpkRzzl2S@BAm(CD*tz=$QQ^j=E3dwA+Z(P2Ex6aE+Dy6BxG*zF~SX@m}Q{KGj_JDj2_O(~;#f|(#>FCDRRCaK1$ zp-UE>kyDasA|fCzl?Q2^poWbw!AuK?nNcX6WQ7y<#qT63wav^V66!pT5LLk^02@pj zOv%XBxTH~nkDqo>p{8u8X-j3ga02*VjcUwT@DP0L6?gZ<->1uQ-V-g(aZN&pQpG-3 zGb))@$!5)FF+qe}+GI|2$TV_WSZwaH>3 zc7($L@xt^q6rA+s4aW-y3zO~5c~04`>G<-lQ-+~ZxlhIPbzZuiuOQ++8*mr}E_(0z zfoi3g^uWcF1`8GDG4fyt|1=i?5$qvdy#lxxnT?CKj|Fy&tRToQ<|KbmuhMdoSL4SnpfhPmzK}Kz`&?r6Fy(8yoWDHYL9PmPxVru7y~O3 zW@O}I$}i>&&&*57FE3Uw=gvwjOVle%1#*jo{EHHkb5a$Y^NR}dixNvR^YeJ1(nZBU z4yU1>g`PpYp_w5+L^v0y5iG-HWU2=g)=e@r;>!U$3?{>Bst1JZ`NevPMadbgiMc6e zCL&irw;yauZARa`RJC cxtv^sL*j!2TwPrbXiRG*@ literal 0 HcmV?d00001 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/write.lock b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/write.lock new file mode 100644 index 0000000000..e69de29bb2 diff --git a/persistence-modules/spring-hibernate-5/pom.xml b/persistence-modules/spring-hibernate-5/pom.xml index e27775c76f..694ab570a5 100644 --- a/persistence-modules/spring-hibernate-5/pom.xml +++ b/persistence-modules/spring-hibernate-5/pom.xml @@ -51,6 +51,11 @@ hibernate-core ${hibernate.version} + + org.hibernate + hibernate-ehcache + ${hibernate.version} + javax.transaction jta diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/AbstractJpaDAO.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/AbstractJpaDAO.java new file mode 100644 index 0000000000..0d002b8fbb --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/AbstractJpaDAO.java @@ -0,0 +1,46 @@ +package com.baeldung.hibernate.cache.dao; + +import java.io.Serializable; +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +public abstract class AbstractJpaDAO { + + private Class clazz; + + @PersistenceContext + private EntityManager entityManager; + + public final void setClazz(final Class clazzToSet) { + this.clazz = clazzToSet; + } + + public T findOne(final long id) { + return entityManager.find(clazz, id); + } + + @SuppressWarnings("unchecked") + public List findAll() { + return entityManager.createQuery("from " + clazz.getName()).getResultList(); + } + + public void create(final T entity) { + entityManager.persist(entity); + } + + public T update(final T entity) { + return entityManager.merge(entity); + } + + public void delete(final T entity) { + entityManager.remove(entity); + } + + public void deleteById(final long entityId) { + final T entity = findOne(entityId); + delete(entity); + } + +} \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/FooDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/FooDao.java new file mode 100644 index 0000000000..68c94fc0e3 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/FooDao.java @@ -0,0 +1,17 @@ +package com.baeldung.hibernate.cache.dao; + +import com.baeldung.hibernate.cache.model.Foo; +import org.springframework.stereotype.Repository; + +@Repository +public class FooDao extends AbstractJpaDAO implements IFooDao { + + public FooDao() { + super(); + + setClazz(Foo.class); + } + + // API + +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/IFooDao.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/IFooDao.java new file mode 100644 index 0000000000..0a6d4bdbd6 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/dao/IFooDao.java @@ -0,0 +1,21 @@ +package com.baeldung.hibernate.cache.dao; + +import java.util.List; + +import com.baeldung.hibernate.cache.model.Foo; + +public interface IFooDao { + + Foo findOne(long id); + + List findAll(); + + void create(Foo entity); + + Foo update(Foo entity); + + void delete(Foo entity); + + void deleteById(long entityId); + +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/model/Bar.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/model/Bar.java new file mode 100644 index 0000000000..cd8f3a57cc --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/model/Bar.java @@ -0,0 +1,102 @@ +package com.baeldung.hibernate.cache.model; + +import java.io.Serializable; +import java.util.List; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.FetchType; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToMany; +import javax.persistence.OrderBy; + +@Entity +public class Bar implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + @Column(nullable = false) + private String name; + + @OneToMany(mappedBy = "bar", fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @OrderBy("name ASC") + List fooList; + + public Bar() { + super(); + } + + public Bar(final String name) { + super(); + + this.name = name; + } + + // API + + public long getId() { + return id; + } + + public void setId(final long id) { + + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + public List getFooList() { + return fooList; + } + + public void setFooList(final List fooList) { + this.fooList = fooList; + } + + // + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Bar other = (Bar) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Bar [name=").append(name).append("]"); + return builder.toString(); + } + +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/model/Foo.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/model/Foo.java new file mode 100644 index 0000000000..902d76e2cc --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/model/Foo.java @@ -0,0 +1,92 @@ +package com.baeldung.hibernate.cache.model; + +import org.hibernate.annotations.CacheConcurrencyStrategy; + +import javax.persistence.*; +import java.io.Serializable; + +@Entity +@Cacheable +@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE) +public class Foo implements Serializable { + + private static final long serialVersionUID = 1L; + + public Foo() { + super(); + } + + public Foo(final String name) { + super(); + + this.name = name; + } + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "ID") + private Long id; + @Column(name = "NAME") + private String name; + + @ManyToOne(targetEntity = Bar.class, fetch = FetchType.EAGER) + @JoinColumn(name = "BAR_ID") + private Bar bar; + + public Bar getBar() { + return bar; + } + + public void setBar(final Bar bar) { + this.bar = bar; + } + + public Long getId() { + return id; + } + + public void setId(final Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(final String name) { + this.name = name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(final Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + final Foo other = (Foo) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + @Override + public String toString() { + final StringBuilder builder = new StringBuilder(); + builder.append("Foo [name=").append(name).append("]"); + return builder.toString(); + } + +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/service/FooService.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/service/FooService.java new file mode 100644 index 0000000000..222968f98f --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/cache/service/FooService.java @@ -0,0 +1,37 @@ +package com.baeldung.hibernate.cache.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.hibernate.cache.dao.IFooDao; +import com.baeldung.hibernate.cache.model.Foo; + +@Service +@Transactional +public class FooService { + + @Autowired + private IFooDao dao; + + public FooService() { + super(); + } + + // API + + public void create(final Foo entity) { + dao.create(entity); + } + + public Foo findOne(final long id) { + return dao.findOne(id); + } + + public List findAll() { + return dao.findAll(); + } + +} diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceJNDIConfig.java similarity index 92% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceJNDIConfig.java index 56ba68dcbb..5f12dc4f5e 100644 --- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJNDIConfig.java +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceJNDIConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.spring; import java.util.Properties; @@ -24,8 +24,8 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement @PropertySource("classpath:persistence-jndi.properties") -@ComponentScan("org.baeldung.persistence") -@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao") +@ComponentScan("com.baeldung.hibernate.cache") +@EnableJpaRepositories(basePackages = "com.baeldung.hibernate.cache.dao") public class PersistenceJNDIConfig { @Autowired @@ -35,7 +35,7 @@ public class PersistenceJNDIConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws NamingException { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan("org.baeldung.persistence.model"); + em.setPackagesToScan("com.baeldung.hibernate.cache.model"); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; diff --git a/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceJPAConfigL2Cache.java similarity index 93% rename from persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java rename to persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceJPAConfigL2Cache.java index a236cf2331..93bcb30c5f 100644 --- a/persistence-modules/spring-jpa/src/main/java/org/baeldung/config/PersistenceJPAConfigL2Cache.java +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/spring/PersistenceJPAConfigL2Cache.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.spring; import com.google.common.base.Preconditions; import org.springframework.beans.factory.annotation.Autowired; @@ -23,8 +23,8 @@ import java.util.Properties; @Configuration @EnableTransactionManagement @PropertySource({ "classpath:persistence-h2.properties" }) -@ComponentScan({ "org.baeldung.persistence" }) -@EnableJpaRepositories(basePackages = { "org.baeldung.persistence.dao", "org.baeldung.persistence.repository" }) +@ComponentScan({ "com.baeldung.hibernate.cache" }) +@EnableJpaRepositories(basePackages = { "com.baeldung.hibernate.cache.dao"}) public class PersistenceJPAConfigL2Cache { @Autowired @@ -50,7 +50,7 @@ public class PersistenceJPAConfigL2Cache { } protected String[] getPackagesToScan() { - return new String[] { "org.baeldung.persistence.model" }; + return new String[] { "com.baeldung.hibernate.cache.model" }; } @Bean diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties index 5a137e2310..e3544d354a 100644 --- a/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties +++ b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-h2.properties @@ -9,6 +9,9 @@ jdbc.pass= hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=false hibernate.hbm2ddl.auto=create-drop +hibernate.cache.use_second_level_cache=true +hibernate.cache.use_query_cache=true +hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory # hibernate.search.X hibernate.search.default.directory_provider = filesystem diff --git a/persistence-modules/spring-jpa/src/main/resources/persistence-jndi.properties b/persistence-modules/spring-hibernate-5/src/main/resources/persistence-jndi.properties similarity index 100% rename from persistence-modules/spring-jpa/src/main/resources/persistence-jndi.properties rename to persistence-modules/spring-hibernate-5/src/main/resources/persistence-jndi.properties diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java similarity index 50% rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java index e5fb728a0a..3a2f227793 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/config/PersistenceJPAConfigDeletion.java @@ -1,6 +1,6 @@ -package org.baeldung.persistence.deletion.config; +package com.baeldung.persistence.deletion.config; -import org.baeldung.config.PersistenceJPAConfigL2Cache; +import com.baeldung.spring.PersistenceJPAConfigL2Cache; public class PersistenceJPAConfigDeletion extends PersistenceJPAConfigL2Cache { @@ -10,6 +10,6 @@ public class PersistenceJPAConfigDeletion extends PersistenceJPAConfigL2Cache { @Override protected String[] getPackagesToScan() { - return new String[] { "org.baeldung.persistence.deletion.model", "org.baeldung.persistence.model" }; + return new String[] { "com.baeldung.persistence.deletion.model", "com.baeldung.persistence.model" }; } } \ No newline at end of file diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/model/Bar.java similarity index 95% rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/model/Bar.java index 26c4846fd2..85efd573ca 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Bar.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/model/Bar.java @@ -1,4 +1,4 @@ -package org.baeldung.persistence.deletion.model; +package com.baeldung.persistence.deletion.model; import javax.persistence.*; import java.util.ArrayList; diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/model/Baz.java similarity index 94% rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/model/Baz.java index 4fb3f8965e..bea97154d4 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Baz.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/model/Baz.java @@ -1,4 +1,4 @@ -package org.baeldung.persistence.deletion.model; +package com.baeldung.persistence.deletion.model; import javax.persistence.*; diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/model/Foo.java similarity index 95% rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/model/Foo.java index 00fc34c166..f0d57c5b6e 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/deletion/model/Foo.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/deletion/model/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.persistence.deletion.model; +package com.baeldung.persistence.deletion.model; import org.hibernate.annotations.Where; diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/service/DeletionIntegrationTest.java similarity index 94% rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/service/DeletionIntegrationTest.java index 0dbb7dbfe8..dfc944f649 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/DeletionIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/service/DeletionIntegrationTest.java @@ -1,9 +1,5 @@ -package org.baeldung.persistence.service; +package com.baeldung.persistence.service; -import org.baeldung.persistence.deletion.config.PersistenceJPAConfigDeletion; -import org.baeldung.persistence.deletion.model.Bar; -import org.baeldung.persistence.deletion.model.Baz; -import org.baeldung.persistence.deletion.model.Foo; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -15,6 +11,11 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.Transactional; +import com.baeldung.persistence.deletion.config.PersistenceJPAConfigDeletion; +import com.baeldung.persistence.deletion.model.Bar; +import com.baeldung.persistence.deletion.model.Baz; +import com.baeldung.persistence.deletion.model.Foo; + import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java similarity index 89% rename from persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java rename to persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java index 4de8d321d5..e3436d762e 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/persistence/service/SecondLevelCacheIntegrationTest.java @@ -1,9 +1,13 @@ -package org.baeldung.persistence.service; +package com.baeldung.persistence.service; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.Matchers.greaterThan; +import static org.junit.Assert.assertThat; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.persistence.Query; -import net.sf.ehcache.CacheManager; -import org.baeldung.config.PersistenceJPAConfigL2Cache; -import org.baeldung.persistence.model.Bar; -import org.baeldung.persistence.model.Foo; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -15,13 +19,12 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.support.TransactionTemplate; -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; -import javax.persistence.Query; +import com.baeldung.hibernate.cache.model.Bar; +import com.baeldung.hibernate.cache.model.Foo; +import com.baeldung.hibernate.cache.service.FooService; +import com.baeldung.spring.PersistenceJPAConfigL2Cache; -import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; -import static org.hamcrest.Matchers.greaterThan; -import static org.junit.Assert.assertThat; +import net.sf.ehcache.CacheManager; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class) @@ -45,7 +48,7 @@ public class SecondLevelCacheIntegrationTest { final Foo foo = new Foo(randomAlphabetic(6)); fooService.create(foo); fooService.findOne(foo.getId()); - final int size = CacheManager.ALL_CACHE_MANAGERS.get(0).getCache("org.baeldung.persistence.model.Foo").getSize(); + final int size = CacheManager.ALL_CACHE_MANAGERS.get(0).getCache("com.baeldung.hibernate.cache.model.Foo").getSize(); assertThat(size, greaterThan(0)); } @@ -65,7 +68,7 @@ public class SecondLevelCacheIntegrationTest { return nativeQuery.executeUpdate(); }); - final int size = CacheManager.ALL_CACHE_MANAGERS.get(0).getCache("org.baeldung.persistence.model.Foo").getSize(); + final int size = CacheManager.ALL_CACHE_MANAGERS.get(0).getCache("com.baeldung.hibernate.cache.model.Foo").getSize(); assertThat(size, greaterThan(0)); } diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md index e856e4808e..56ce68c126 100644 --- a/persistence-modules/spring-jpa/README.md +++ b/persistence-modules/spring-jpa/README.md @@ -7,9 +7,6 @@ - [The DAO with JPA and Spring](http://www.baeldung.com/spring-dao-jpa) - [JPA Pagination](http://www.baeldung.com/jpa-pagination) - [Sorting with JPA](http://www.baeldung.com/jpa-sort) -- [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache) -- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource) -- [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate) - [Self-Contained Testing Using an In-Memory Database](http://www.baeldung.com/spring-jpa-test-in-memory-database) - [A Guide to Spring AbstractRoutingDatasource](http://www.baeldung.com/spring-abstract-routing-data-source) - [A Guide to Hibernate with Spring 4](http://www.baeldung.com/the-persistence-layer-with-spring-and-jpa) diff --git a/persistence-modules/spring-jpa/pom.xml b/persistence-modules/spring-jpa/pom.xml index 0961cabaff..792f3918b6 100644 --- a/persistence-modules/spring-jpa/pom.xml +++ b/persistence-modules/spring-jpa/pom.xml @@ -44,11 +44,6 @@ hibernate-entitymanager ${hibernate.version} - - org.hibernate - hibernate-ehcache - ${hibernate.version} - xml-apis xml-apis diff --git a/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties b/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties index 716a96fde3..a3060cc796 100644 --- a/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties +++ b/persistence-modules/spring-jpa/src/main/resources/persistence-h2.properties @@ -7,7 +7,4 @@ jdbc.pass= # hibernate.X hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop -hibernate.cache.use_second_level_cache=true -hibernate.cache.use_query_cache=true -hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory \ No newline at end of file +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextIntegrationTest.java index 822cbb8ed5..9b0cdf180f 100644 --- a/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -1,6 +1,6 @@ package com.baeldung; -import org.baeldung.config.PersistenceJPAConfigL2Cache; +import org.baeldung.config.PersistenceJPAConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.annotation.DirtiesContext; @@ -10,7 +10,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class) @WebAppConfiguration @DirtiesContext public class SpringContextIntegrationTest { diff --git a/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextTest.java b/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextTest.java index 291e49d0c4..de333eef91 100644 --- a/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextTest.java +++ b/persistence-modules/spring-jpa/src/test/java/com/baeldung/SpringContextTest.java @@ -1,6 +1,6 @@ package com.baeldung; -import org.baeldung.config.PersistenceJPAConfigL2Cache; +import org.baeldung.config.PersistenceJPAConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.annotation.DirtiesContext; @@ -10,7 +10,7 @@ import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.test.context.web.WebAppConfiguration; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class) @WebAppConfiguration @DirtiesContext public class SpringContextTest { diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java index bf49a431e1..76c34affb9 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooPaginationPersistenceIntegrationTest.java @@ -16,7 +16,6 @@ import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import org.baeldung.config.PersistenceJPAConfig; -import org.baeldung.config.PersistenceJPAConfigL2Cache; import org.baeldung.persistence.model.Foo; import org.junit.Before; import org.junit.Test; @@ -28,7 +27,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class) @DirtiesContext public class FooPaginationPersistenceIntegrationTest { diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java index 45316cf06c..e1b53c8ded 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServicePersistenceIntegrationTest.java @@ -3,7 +3,6 @@ package org.baeldung.persistence.service; import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; import org.baeldung.config.PersistenceJPAConfig; -import org.baeldung.config.PersistenceJPAConfigL2Cache; import org.baeldung.persistence.model.Foo; import org.junit.Assert; import org.junit.Test; @@ -18,7 +17,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class) @DirtiesContext public class FooServicePersistenceIntegrationTest { diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java index 61a3bfd565..40249b4b30 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingIntegrationTest.java @@ -10,7 +10,7 @@ import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; -import org.baeldung.config.PersistenceJPAConfigL2Cache; +import org.baeldung.config.PersistenceJPAConfig; import org.baeldung.persistence.model.Bar; import org.baeldung.persistence.model.Foo; import org.junit.Test; @@ -21,7 +21,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class) @DirtiesContext @SuppressWarnings("unchecked") public class FooServiceSortingIntegrationTest { diff --git a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java index 50fdf5f0f3..c530003ac1 100644 --- a/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java +++ b/persistence-modules/spring-jpa/src/test/java/org/baeldung/persistence/service/FooServiceSortingWitNullsManualIntegrationTest.java @@ -10,7 +10,6 @@ import javax.persistence.PersistenceContext; import javax.persistence.Query; import org.baeldung.config.PersistenceJPAConfig; -import org.baeldung.config.PersistenceJPAConfigL2Cache; import org.baeldung.persistence.model.Foo; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,7 +20,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { PersistenceJPAConfigL2Cache.class }, loader = AnnotationConfigContextLoader.class) +@ContextConfiguration(classes = { PersistenceJPAConfig.class }, loader = AnnotationConfigContextLoader.class) @DirtiesContext public class FooServiceSortingWitNullsManualIntegrationTest { From c1d88b7364162c1a8575b8c1315ee5245ac55a01 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sun, 18 Aug 2019 16:40:13 +0200 Subject: [PATCH 023/396] renaming bigDecimalGrade method + removing the GENDER constant --- .../accessmodifiers/publicmodifier/SpecialCharacters.java | 7 +++++++ .../baeldung/accessmodifiers/publicmodifier/Student.java | 8 ++++---- .../accessmodifiers/PublicAccessModifierUnitTest.java | 8 +------- 3 files changed, 12 insertions(+), 11 deletions(-) create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java new file mode 100644 index 0000000000..5556e9aa57 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java @@ -0,0 +1,7 @@ +package com.baeldung.accessmodifiers.publicmodifier; + +public class SpecialCharacters { + + public static final String SLASH = "/"; + +} diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java index 65237fa864..c4abdfe68d 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java @@ -10,13 +10,12 @@ public class Student { private BigDecimal grade; //new representation private String name; private int age; - public static final String GENDER = "male"; public int getGrade() { return grade.intValue(); //Backward compatibility } - public BigDecimal bigDecimalGrade() { + public BigDecimal getBigDecimalGrade() { return grade; } @@ -28,9 +27,10 @@ public class Student { } public void setAge(int age) { - if (age < 0 || age > 150) + if (age < 0 || age > 150) { throw new IllegalArgumentException(); - + } + this.age = age; } diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 8b11e3a9ad..0eca4b4222 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -4,7 +4,6 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; -import com.baeldung.accessmodifiers.publicmodifier.Student; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -22,16 +21,11 @@ public class PublicAccessModifierUnitTest { assertEquals(0, new BigDecimal(0).intValue()); //instance member } - @Test - public void whenUsingGenderPublicStaticFinalField_getReferenceToStringMale() { - assertEquals("male", Student.GENDER); - } - @Test public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() { assertEquals(2147483647, Integer.MAX_VALUE); //static field } - + @Test public void whenUsingStringToLowerCase_stringTurnsToLowerCase() { assertEquals("alex", "ALEX".toLowerCase()); From d240822154ddd32dcf9d24793f6e99575a6c05ca Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 18 Aug 2019 18:04:33 +0300 Subject: [PATCH 024/396] Create README.md --- oauth2-framework-impl/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 oauth2-framework-impl/README.md diff --git a/oauth2-framework-impl/README.md b/oauth2-framework-impl/README.md new file mode 100644 index 0000000000..60fefe3415 --- /dev/null +++ b/oauth2-framework-impl/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Implementing The OAuth 2.0 Authorization Framework Using Java EE](https://www.baeldung.com/java-ee-oauth2-implementation) From 0b7ceebb66b6b00f83619923881d1c5ef687aca4 Mon Sep 17 00:00:00 2001 From: "anilkivilcim.eray" Date: Sun, 18 Aug 2019 20:02:31 +0300 Subject: [PATCH 025/396] BAEL-3097 init for mapstruct custom mapping method --- .../main/java/com/baeldung/dto/UrlDTO.java | 11 ++++++ .../java/com/baeldung/entity/UrlObject.java | 11 ++++++ .../com/baeldung/mapper/SuffixRemover.java | 13 +++++++ .../java/com/baeldung/mapper/UrlMapper.java | 34 +++++++++++++++++++ .../com/baeldung/mapper/UrlMapperTest.java | 22 ++++++++++++ 5 files changed, 91 insertions(+) create mode 100644 mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java create mode 100644 mapstruct/src/main/java/com/baeldung/entity/UrlObject.java create mode 100644 mapstruct/src/main/java/com/baeldung/mapper/SuffixRemover.java create mode 100644 mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/UrlMapperTest.java diff --git a/mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java b/mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java new file mode 100644 index 0000000000..405473bbd1 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java @@ -0,0 +1,11 @@ +package com.baeldung.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UrlDTO { + private String url; + private String subUrl; +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/entity/UrlObject.java b/mapstruct/src/main/java/com/baeldung/entity/UrlObject.java new file mode 100644 index 0000000000..ceded9e18e --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/entity/UrlObject.java @@ -0,0 +1,11 @@ +package com.baeldung.entity; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class UrlObject { + private String url; + private String subUrl; +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/mapper/SuffixRemover.java b/mapstruct/src/main/java/com/baeldung/mapper/SuffixRemover.java new file mode 100644 index 0000000000..3db963b0e3 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/mapper/SuffixRemover.java @@ -0,0 +1,13 @@ +package com.baeldung.mapper; + +import org.mapstruct.Qualifier; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Qualifier +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.CLASS) +public @interface SuffixRemover {} diff --git a/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java new file mode 100644 index 0000000000..b92c134bde --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java @@ -0,0 +1,34 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.UrlDTO; +import com.baeldung.entity.UrlObject; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; +import org.mapstruct.factory.Mappers; + +import java.net.URI; +import java.net.URISyntaxException; + +@Mapper +public interface UrlMapper { + + UrlMapper INSTANCE = Mappers.getMapper(UrlMapper.class); + + + @Mapping(source = "subUrl", target = "subUrl", qualifiedByName = "protocolRemover") + @Mapping(source = "url", target = "url", qualifiedBy = SuffixRemover.class) + public UrlObject urlObjectDomainMapper(UrlDTO urlDTO); + + @Named("protocolRemover") + public static String protocolRemoverWithCustomMethod(String domain) throws URISyntaxException { + URI uri = new URI(domain); + return uri.getHost(); + } + + @SuffixRemover + public static String protocolRemoverMethod(String domain) throws URISyntaxException { + URI uri = new URI(domain); + return uri.getHost(); + } +} \ No newline at end of file diff --git a/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperTest.java b/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperTest.java new file mode 100644 index 0000000000..1bb0ebcf0c --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperTest.java @@ -0,0 +1,22 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.UrlDTO; +import com.baeldung.entity.UrlObject; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class UrlMapperTest { + + @Test + public void givenDomains_whenCallDomainMapper_thenReturnDomainsWithoutProtocols() { + UrlDTO dto = new UrlDTO(); + dto.setUrl("http://www.baeldung.com"); + dto.setSubUrl("https://www.baeldung.com"); + + UrlObject urlObject = UrlMapper.INSTANCE.urlObjectDomainMapper(dto); + + assertEquals(urlObject.getUrl(), "www.baeldung.com"); + assertEquals(urlObject.getSubUrl(), "www.baeldung.com"); + } +} \ No newline at end of file From 9d108f4e3798be164d3aaa2bf469628dcbcf8f09 Mon Sep 17 00:00:00 2001 From: Sorin Zamfir Date: Mon, 19 Aug 2019 19:37:27 +0300 Subject: [PATCH 026/396] BAEL-2744: Renamed module to gradle-5 --- {gradle-java-exec => gradle-5}/.gitignore | 0 {gradle-java-exec => gradle-5}/build.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 {gradle-java-exec => gradle-5}/gradlew | 0 {gradle-java-exec => gradle-5}/gradlew.bat | 0 .../java/com/baeldung/gradle/exec/MainClass.java | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename {gradle-java-exec => gradle-5}/.gitignore (100%) rename {gradle-java-exec => gradle-5}/build.gradle (100%) rename {gradle-java-exec => gradle-5}/gradle/wrapper/gradle-wrapper.jar (100%) rename {gradle-java-exec => gradle-5}/gradle/wrapper/gradle-wrapper.properties (100%) rename {gradle-java-exec => gradle-5}/gradlew (100%) rename {gradle-java-exec => gradle-5}/gradlew.bat (100%) rename {gradle-java-exec => gradle-5}/src/main/java/com/baeldung/gradle/exec/MainClass.java (100%) diff --git a/gradle-java-exec/.gitignore b/gradle-5/.gitignore similarity index 100% rename from gradle-java-exec/.gitignore rename to gradle-5/.gitignore diff --git a/gradle-java-exec/build.gradle b/gradle-5/build.gradle similarity index 100% rename from gradle-java-exec/build.gradle rename to gradle-5/build.gradle diff --git a/gradle-java-exec/gradle/wrapper/gradle-wrapper.jar b/gradle-5/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from gradle-java-exec/gradle/wrapper/gradle-wrapper.jar rename to gradle-5/gradle/wrapper/gradle-wrapper.jar diff --git a/gradle-java-exec/gradle/wrapper/gradle-wrapper.properties b/gradle-5/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from gradle-java-exec/gradle/wrapper/gradle-wrapper.properties rename to gradle-5/gradle/wrapper/gradle-wrapper.properties diff --git a/gradle-java-exec/gradlew b/gradle-5/gradlew similarity index 100% rename from gradle-java-exec/gradlew rename to gradle-5/gradlew diff --git a/gradle-java-exec/gradlew.bat b/gradle-5/gradlew.bat similarity index 100% rename from gradle-java-exec/gradlew.bat rename to gradle-5/gradlew.bat diff --git a/gradle-java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java b/gradle-5/src/main/java/com/baeldung/gradle/exec/MainClass.java similarity index 100% rename from gradle-java-exec/src/main/java/com/baeldung/gradle/exec/MainClass.java rename to gradle-5/src/main/java/com/baeldung/gradle/exec/MainClass.java From 0630b2dffcb9c2a49c68d7df025dfc7b07308daa Mon Sep 17 00:00:00 2001 From: Gang Date: Tue, 20 Aug 2019 22:53:05 -0600 Subject: [PATCH 027/396] BAEL-3146 Source code for article: Checked and Unchecked Exceptions in Java --- .../CheckedUncheckedExceptions.java | 43 +++++++++++++++ .../IncorrectFileNameException.java | 13 +++++ .../exceptions/NullOrEmptyException.java | 14 +++++ .../CheckedUncheckedExceptionsUnitTest.java | 54 +++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java create mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java create mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java create mode 100644 core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java new file mode 100644 index 0000000000..780189b654 --- /dev/null +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java @@ -0,0 +1,43 @@ +package com.baeldung.exceptions; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; + +public class CheckedUncheckedExceptions { + public static void checkedExceptionWithThrows() throws FileNotFoundException { + File file = new File("not_existing_file.txt"); + FileInputStream stream = new FileInputStream(file); + } + + public static void checkedExceptionWithTryCatch() { + File file = new File("not_existing_file.txt"); + try { + FileInputStream stream = new FileInputStream(file); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } + } + + public static int divideByZero() { + int numerator = 1; + int denominator = 0; + return numerator / denominator; + } + + public static void checkFile(String fileName) throws IncorrectFileNameException { + if (fileName == null || fileName.isEmpty()) { + throw new NullOrEmptyException("The filename is null."); + } + if (!isCorrectFileName(fileName)) { + throw new IncorrectFileNameException("Incorrect filename : " + fileName); + } + } + + private static boolean isCorrectFileName(String fileName) { + if (fileName.equals("wrongFileName.txt")) + return false; + else + return true; + } +} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java new file mode 100644 index 0000000000..9877fe25ca --- /dev/null +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java @@ -0,0 +1,13 @@ +package com.baeldung.exceptions; + +public class IncorrectFileNameException extends Exception { + private static final long serialVersionUID = 1L; + + public IncorrectFileNameException(String errorMessage) { + super(errorMessage); + } + + public IncorrectFileNameException(String errorMessage, Throwable thr) { + super(errorMessage, thr); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java new file mode 100644 index 0000000000..d4ee9c0d6f --- /dev/null +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java @@ -0,0 +1,14 @@ +package com.baeldung.exceptions; + +public class NullOrEmptyException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + public NullOrEmptyException(String errorMessage) { + super(errorMessage); + } + + public NullOrEmptyException(String errorMessage, Throwable thr) { + super(errorMessage, thr); + } +} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java new file mode 100644 index 0000000000..05a01ba97d --- /dev/null +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung.exceptions; + +import static org.junit.jupiter.api.Assertions.assertThrows; + +import java.io.FileNotFoundException; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +/** + * Tests the {@link CheckedUncheckedExceptions}. + */ +public class CheckedUncheckedExceptionsUnitTest { + + @Test + public void whenFileNotExist_thenThrowException() { + assertThrows(FileNotFoundException.class, () -> { + CheckedUncheckedExceptions.checkedExceptionWithThrows(); + }); + } + + public void whenTryCatchExcetpion_thenSuccess() { + try { + CheckedUncheckedExceptions.checkedExceptionWithTryCatch(); + } catch (Exception e) { + Assertions.fail(e.getMessage()); + } + } + + @Test + public void whenDivideByZero_thenThrowException() { + assertThrows(ArithmeticException.class, () -> { + CheckedUncheckedExceptions.divideByZero(); + }); + } + + @Test + public void whenInvalidFile_thenThrowException() { + + assertThrows(IncorrectFileNameException.class, () -> { + CheckedUncheckedExceptions.checkFile("wrongFileName.txt"); + }); + } + + @Test + public void whenNullOrEmptyFile_thenThrowException() { + assertThrows(NullOrEmptyException.class, () -> { + CheckedUncheckedExceptions.checkFile(null); + }); + assertThrows(NullOrEmptyException.class, () -> { + CheckedUncheckedExceptions.checkFile(""); + }); + } +} From 1756cfe00889f525d00c57762fe26cae5cd563d4 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Wed, 21 Aug 2019 16:49:09 +0200 Subject: [PATCH 028/396] nested datatypes example --- .../PublicAccessModifierUnitTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index 0eca4b4222..c9664283a7 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -11,7 +11,9 @@ import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.HashMap; import java.util.List; +import java.util.Map; @TestInstance(Lifecycle.PER_CLASS) public class PublicAccessModifierUnitTest { @@ -25,7 +27,20 @@ public class PublicAccessModifierUnitTest { public void whenUsingIntegerMaxValueField_maxPossibleIntValueIsReturned() { assertEquals(2147483647, Integer.MAX_VALUE); //static field } + + @Test + public void whenUsingEntrySet_keyValuePairsAreReturned() { + Map mapObject = new HashMap(); + mapObject.put("name", "Alex"); + + for(Map.Entry entry : mapObject.entrySet()) { + assertEquals("name", entry.getKey()); + assertEquals("Alex", entry.getValue()); + } + + } + @Test public void whenUsingStringToLowerCase_stringTurnsToLowerCase() { assertEquals("alex", "ALEX".toLowerCase()); From 25e11c23a1d44b99906f65d01344bee47ceeca5a Mon Sep 17 00:00:00 2001 From: "anilkivilcim.eray" Date: Wed, 21 Aug 2019 19:55:07 +0300 Subject: [PATCH 029/396] BAEL-3097 renaming test class to suffix "UnitTest" --- .../mapper/{UrlMapperTest.java => UrlMapperUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename mapstruct/src/test/java/com/baeldung/mapper/{UrlMapperTest.java => UrlMapperUnitTest.java} (94%) diff --git a/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperTest.java b/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java similarity index 94% rename from mapstruct/src/test/java/com/baeldung/mapper/UrlMapperTest.java rename to mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java index 1bb0ebcf0c..455bfe408f 100644 --- a/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperTest.java +++ b/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java @@ -6,7 +6,7 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; -public class UrlMapperTest { +public class UrlMapperUnitTest { @Test public void givenDomains_whenCallDomainMapper_thenReturnDomainsWithoutProtocols() { From 095bd26ff2e4db0e3d599ffdf38ecd39385dbd5a Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 23 Aug 2019 00:49:37 +0300 Subject: [PATCH 030/396] Create README.md --- testing-modules/junit-4/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 testing-modules/junit-4/README.md diff --git a/testing-modules/junit-4/README.md b/testing-modules/junit-4/README.md new file mode 100644 index 0000000000..4d4588912b --- /dev/null +++ b/testing-modules/junit-4/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Guide to JUnit 4 Rules](https://www.baeldung.com/junit-4-rules) From 72a108f960896c282bf1e4dd4dedb6bbfc3c29f5 Mon Sep 17 00:00:00 2001 From: Philippus Baalman Date: Fri, 23 Aug 2019 00:23:46 +0200 Subject: [PATCH 031/396] Drop last 4 bytes of computed SHA-1 hash --- .../src/main/java/com/baeldung/uuid/UUIDGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java index dcf186de93..70217cd556 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java @@ -67,7 +67,7 @@ public class UUIDGenerator { } catch (NoSuchAlgorithmException nsae) { throw new InternalError("MD5 not supported", nsae); } - byte[] bytes = md.digest(name); + byte[] bytes = Arrays.copyOfRange(md.digest(name), 0, 16); bytes[6] &= 0x0f; /* clear version */ bytes[6] |= 0x50; /* set to version 5 */ bytes[8] &= 0x3f; /* clear variant */ From ad54ac6f5e569654f72d29d961bf6f3a16edfb1d Mon Sep 17 00:00:00 2001 From: Philippus Baalman Date: Fri, 23 Aug 2019 00:29:27 +0200 Subject: [PATCH 032/396] Fix message for exception --- .../src/main/java/com/baeldung/uuid/UUIDGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java index 70217cd556..c4663a429c 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java @@ -65,7 +65,7 @@ public class UUIDGenerator { try { md = MessageDigest.getInstance("SHA-1"); } catch (NoSuchAlgorithmException nsae) { - throw new InternalError("MD5 not supported", nsae); + throw new InternalError("SHA-1 not supported", nsae); } byte[] bytes = Arrays.copyOfRange(md.digest(name), 0, 16); bytes[6] &= 0x0f; /* clear version */ From 7c4c816c5635a92f3f729f3cb948cc98fa8b30d9 Mon Sep 17 00:00:00 2001 From: rahul Date: Fri, 23 Aug 2019 08:57:21 +0530 Subject: [PATCH 033/396] Adding System.exit example --- .../system/exit/SystemExitExample.java | 20 ++++++ .../system/exit/SystemExitUnitTest.java | 63 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 core-java-modules/core-java-os/src/main/java/com/baeldung/system/exit/SystemExitExample.java create mode 100644 core-java-modules/core-java-os/src/test/java/com/baeldung/system/exit/SystemExitUnitTest.java diff --git a/core-java-modules/core-java-os/src/main/java/com/baeldung/system/exit/SystemExitExample.java b/core-java-modules/core-java-os/src/main/java/com/baeldung/system/exit/SystemExitExample.java new file mode 100644 index 0000000000..a9738a0448 --- /dev/null +++ b/core-java-modules/core-java-os/src/main/java/com/baeldung/system/exit/SystemExitExample.java @@ -0,0 +1,20 @@ +package com.baeldung.system.exit; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; + +public class SystemExitExample { + + public void readFile() { + try { + BufferedReader br = new BufferedReader(new FileReader("file.txt")); + System.out.println(br.readLine()); + br.close(); + } catch (IOException e) { + System.exit(2); + } finally { + System.out.println("Exiting the program"); + } + } +} diff --git a/core-java-modules/core-java-os/src/test/java/com/baeldung/system/exit/SystemExitUnitTest.java b/core-java-modules/core-java-os/src/test/java/com/baeldung/system/exit/SystemExitUnitTest.java new file mode 100644 index 0000000000..6d5f9c2f34 --- /dev/null +++ b/core-java-modules/core-java-os/src/test/java/com/baeldung/system/exit/SystemExitUnitTest.java @@ -0,0 +1,63 @@ +package com.baeldung.system.exit; + +import static org.junit.Assert.assertEquals; + +import java.security.Permission; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class SystemExitUnitTest { + + protected static class ExitException extends SecurityException { + + private static final long serialVersionUID = 1L; + public final int status; + + public ExitException(int status) { + this.status = status; + } + } + + private static class NoExitSecurityManager extends SecurityManager { + @Override + public void checkPermission(Permission perm) { + } + + @Override + public void checkPermission(Permission perm, Object context) { + } + + @Override + public void checkExit(int status) { + super.checkExit(status); + throw new ExitException(status); + } + } + + private SecurityManager securityManager; + + private SystemExitExample example; + + @Before + public void setUp() throws Exception { + example = new SystemExitExample(); + securityManager = System.getSecurityManager(); + System.setSecurityManager(new NoExitSecurityManager()); + } + + @After + public void tearDown() throws Exception { + System.setSecurityManager(securityManager); + } + + @Test + public void testExit() throws Exception { + try { + example.readFile(); + } catch (ExitException e) { + assertEquals("Exit status", 2, e.status); + } + } +} \ No newline at end of file From a14c19d4e2b70b6cc7a4672919c3601e34b76d5b Mon Sep 17 00:00:00 2001 From: pazis Date: Fri, 23 Aug 2019 21:21:20 +0000 Subject: [PATCH 034/396] stax --- .../com/baeldung/xml/stax/StaxParser.java | 67 +++++++++++++++++++ .../java/com/baeldung/xml/stax/WebSite.java | 40 +++++++++++ .../baeldung/xml/stax/StaxParserUnitTest.java | 31 +++++++++ xml/src/test/resources/xml/websites.xml | 18 +++++ 4 files changed, 156 insertions(+) create mode 100644 xml/src/main/java/com/baeldung/xml/stax/StaxParser.java create mode 100644 xml/src/main/java/com/baeldung/xml/stax/WebSite.java create mode 100644 xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java create mode 100644 xml/src/test/resources/xml/websites.xml diff --git a/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java new file mode 100644 index 0000000000..6c06bfdb17 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java @@ -0,0 +1,67 @@ +package com.baeldung.xml.stax; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.List; +import java.util.ArrayList; + +import javax.xml.stream.events.XMLEvent; +import javax.xml.stream.XMLEventReader; +import javax.xml.stream.XMLInputFactory; +import javax.xml.stream.XMLStreamException; +import javax.xml.stream.events.Attribute; +import javax.xml.stream.events.EndElement; +import javax.xml.stream.events.StartElement; +import javax.xml.namespace.QName; + +public class StaxParser { + + public static List parse(String path) { + List webSites = new ArrayList(); + WebSite webSite = null; + XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); + try { + XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream(path)); + while(reader.hasNext()){ + XMLEvent nextEvent = reader.nextEvent(); + if (nextEvent.isStartElement()){ + StartElement startElement = nextEvent.asStartElement(); + switch (startElement.getName().getLocalPart()) { + case "website": + webSite = new WebSite(); + Attribute url = startElement.getAttributeByName(new QName("url")); + if (url != null) { + webSite.setUrl(url.getValue()); + } + break; + case "name": + nextEvent = reader.nextEvent(); + webSite.setName(nextEvent.asCharacters().getData()); + break; + case "category": + nextEvent = reader.nextEvent(); + webSite.setCategory(nextEvent.asCharacters().getData()); + break; + case "status": + nextEvent = reader.nextEvent(); + webSite.setStatus(nextEvent.asCharacters().getData()); + break; + } + } + if(nextEvent.isEndElement()){ + EndElement endElement = nextEvent.asEndElement(); + if(endElement.getName().getLocalPart().equals("website")){ + webSites.add(webSite); + } + } + } + } catch (XMLStreamException xse){ + System.out.println("XMLStreamException"); + xse.printStackTrace(); + } catch (FileNotFoundException fnfe) { + System.out.println("FileNotFoundException"); + fnfe.printStackTrace(); + } + return webSites; + } + +} diff --git a/xml/src/main/java/com/baeldung/xml/stax/WebSite.java b/xml/src/main/java/com/baeldung/xml/stax/WebSite.java new file mode 100644 index 0000000000..8f7782ab91 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xml/stax/WebSite.java @@ -0,0 +1,40 @@ +package com.baeldung.xml.stax; +public class WebSite { + + private String url; + private String name; + private String category; + private String status; + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } +} diff --git a/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java new file mode 100644 index 0000000000..7629487e11 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java @@ -0,0 +1,31 @@ +package com.baeldung.xml.stax; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; + + +public class StaxParserUnitTest { + + @Test + public void givenWebsitesXML_whenParsed_thenNotNull() { + List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); + assertNotNull(websites); + } + + @Test + public void givenWebsitesXML_whenParsed_thenSizeIsThree() { + List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); + assertTrue(websites.size() == 3); + } + + @Test + public void givenWebsitesXML_whenParsed_thenLocalhostExists() { + List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); + assertEquals(websites.get(2).getName(),"Localhost"); + } +} diff --git a/xml/src/test/resources/xml/websites.xml b/xml/src/test/resources/xml/websites.xml new file mode 100644 index 0000000000..579c13eb94 --- /dev/null +++ b/xml/src/test/resources/xml/websites.xml @@ -0,0 +1,18 @@ + + + + Baeldung + Online Courses + Online + + + Example + Examples + Offline + + + Localhost + Tests + Offline + + \ No newline at end of file From 91d071c43e5e8ddc232c3a61c27743549b0fd2f6 Mon Sep 17 00:00:00 2001 From: "anilkivilcim.eray" Date: Sat, 24 Aug 2019 00:30:29 +0300 Subject: [PATCH 035/396] BAEL-3097 pr fix --- .../main/java/com/baeldung/dto/UrlDTO.java | 3 +-- .../java/com/baeldung/entity/UrlObject.java | 3 +-- ...uffixRemover.java => ProtocolRemover.java} | 2 +- .../java/com/baeldung/mapper/UrlMapper.java | 25 +++++++++++-------- .../baeldung/mapper/UrlMapperUnitTest.java | 20 ++++++++++----- 5 files changed, 32 insertions(+), 21 deletions(-) rename mapstruct/src/main/java/com/baeldung/mapper/{SuffixRemover.java => ProtocolRemover.java} (88%) diff --git a/mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java b/mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java index 405473bbd1..e0d7fd58e9 100644 --- a/mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java +++ b/mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java @@ -6,6 +6,5 @@ import lombok.Setter; @Getter @Setter public class UrlDTO { - private String url; - private String subUrl; + private String address; } \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/entity/UrlObject.java b/mapstruct/src/main/java/com/baeldung/entity/UrlObject.java index ceded9e18e..9d1f4668c2 100644 --- a/mapstruct/src/main/java/com/baeldung/entity/UrlObject.java +++ b/mapstruct/src/main/java/com/baeldung/entity/UrlObject.java @@ -6,6 +6,5 @@ import lombok.Setter; @Getter @Setter public class UrlObject { - private String url; - private String subUrl; + private String address; } \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/mapper/SuffixRemover.java b/mapstruct/src/main/java/com/baeldung/mapper/ProtocolRemover.java similarity index 88% rename from mapstruct/src/main/java/com/baeldung/mapper/SuffixRemover.java rename to mapstruct/src/main/java/com/baeldung/mapper/ProtocolRemover.java index 3db963b0e3..4c22ffd9ee 100644 --- a/mapstruct/src/main/java/com/baeldung/mapper/SuffixRemover.java +++ b/mapstruct/src/main/java/com/baeldung/mapper/ProtocolRemover.java @@ -10,4 +10,4 @@ import java.lang.annotation.Target; @Qualifier @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) -public @interface SuffixRemover {} +public @interface ProtocolRemover {} diff --git a/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java index b92c134bde..22083fabb2 100644 --- a/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java +++ b/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java @@ -9,6 +9,7 @@ import org.mapstruct.factory.Mappers; import java.net.URI; import java.net.URISyntaxException; +import java.net.URL; @Mapper public interface UrlMapper { @@ -16,19 +17,23 @@ public interface UrlMapper { UrlMapper INSTANCE = Mappers.getMapper(UrlMapper.class); - @Mapping(source = "subUrl", target = "subUrl", qualifiedByName = "protocolRemover") - @Mapping(source = "url", target = "url", qualifiedBy = SuffixRemover.class) - public UrlObject urlObjectDomainMapper(UrlDTO urlDTO); + @Mapping(source = "address", target = "address", qualifiedByName = "protocolRemover") + public UrlObject urlObjectNamedMapper(UrlDTO urlDTO); + + @Mapping(source = "address", target = "address", qualifiedBy = ProtocolRemover.class) + public UrlObject urlObjectAnnotatedMapper(UrlDTO urlDTO); @Named("protocolRemover") - public static String protocolRemoverWithCustomMethod(String domain) throws URISyntaxException { - URI uri = new URI(domain); - return uri.getHost(); + public static String protocolRemoverWithCustomMethod(String address) throws URISyntaxException { + URI uri = new URI(address); + + return uri.getHost() + uri.getPath(); } - @SuffixRemover - public static String protocolRemoverMethod(String domain) throws URISyntaxException { - URI uri = new URI(domain); - return uri.getHost(); + @ProtocolRemover + public static String protocolRemoverMethod(String address) throws URISyntaxException { + URI uri = new URI(address); + + return uri.getHost() + uri.getPath(); } } \ No newline at end of file diff --git a/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java index 455bfe408f..567d0aefbc 100644 --- a/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java +++ b/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java @@ -9,14 +9,22 @@ import static org.junit.Assert.assertEquals; public class UrlMapperUnitTest { @Test - public void givenDomains_whenCallDomainMapper_thenReturnDomainsWithoutProtocols() { + public void givenDomain_whenCallNamedMapper_thenReturnDomainWithoutProtocol() { UrlDTO dto = new UrlDTO(); - dto.setUrl("http://www.baeldung.com"); - dto.setSubUrl("https://www.baeldung.com"); + dto.setAddress("http://www.baeldung.com/mapstruct"); - UrlObject urlObject = UrlMapper.INSTANCE.urlObjectDomainMapper(dto); + UrlObject urlObject = UrlMapper.INSTANCE.urlObjectNamedMapper(dto); - assertEquals(urlObject.getUrl(), "www.baeldung.com"); - assertEquals(urlObject.getSubUrl(), "www.baeldung.com"); + assertEquals(urlObject.getAddress(), "www.baeldung.com/mapstruct"); + } + + @Test + public void givenAddress_whenCallAnnotatedMapper_thenReturnDomainWithoutProtocol() { + UrlDTO dto = new UrlDTO(); + dto.setAddress("http://www.baeldung.com/customMappers"); + + UrlObject urlObject = UrlMapper.INSTANCE.urlObjectAnnotatedMapper(dto); + + assertEquals(urlObject.getAddress(), "www.baeldung.com/customMappers"); } } \ No newline at end of file From 02f3d586608c6fb177dd906535d418a7eee6da35 Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sat, 24 Aug 2019 13:46:39 +0200 Subject: [PATCH 036/396] refactoring Student class grade field --- .../publicmodifier/Student.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java index c4abdfe68d..83a0dcb30f 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java @@ -4,19 +4,21 @@ import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; +import java.util.Date; public class Student { - private BigDecimal grade; //new representation + private StudentGrade grade; //new data representation +// private int grade; //old data representation private String name; private int age; + + public void setGrade(int grade) { + this.grade = new StudentGrade(grade); + } public int getGrade() { - return grade.intValue(); //Backward compatibility - } - - public BigDecimal getBigDecimalGrade() { - return grade; + return this.grade.getGrade().intValue(); //int is returned for backward compatibility } public Connection getConnection() throws SQLException { @@ -43,4 +45,23 @@ public class Student { return this.name; } + private class StudentGrade { + private BigDecimal grade = BigDecimal.ZERO; + private Date updatedAt; + + public StudentGrade(int grade) { + this.grade = new BigDecimal(grade); + this.updatedAt = new Date(); + } + + public BigDecimal getGrade() { + return grade; + } + + public Date getDate() { + return updatedAt; + } + + } + } From 4dd44a29d8ac6bd01428587d35c753b617e8edcb Mon Sep 17 00:00:00 2001 From: "m.raheem" Date: Sat, 24 Aug 2019 13:50:24 +0200 Subject: [PATCH 037/396] Adding unit test for Student grade --- .../accessmodifiers/PublicAccessModifierUnitTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index c9664283a7..a2d891ac93 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -4,6 +4,8 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; +import com.baeldung.accessmodifiers.publicmodifier.Student; + import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -28,6 +30,15 @@ public class PublicAccessModifierUnitTest { assertEquals(2147483647, Integer.MAX_VALUE); //static field } + @Test + public void whenChangingStudentInternalRepresentation_clientCodeWillNotBreak() { + + Student student = new Student(); + student.setGrade(100); + + assertEquals(100, student.getGrade()); + } + @Test public void whenUsingEntrySet_keyValuePairsAreReturned() { From 7e1ee8740e8ea464aaef2a9d04e0e231232c5e3d Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 24 Aug 2019 20:29:21 +0530 Subject: [PATCH 038/396] [BAEL-16733] - Update package name and tests in spring-security-core --- .../{org => com}/baeldung/SpringContextIntegrationTest.java | 2 +- .../test/java/{org => com}/baeldung/SpringContextTest.java | 2 +- .../methodsecurity/TestClassLevelSecurityUnitTest.java} | 4 ++-- .../baeldung/methodsecurity/TestMethodSecurityUnitTest.java} | 4 ++-- .../methodsecurity/TestWithMockUserAtClassLevelUnitTest.java} | 4 ++-- .../baeldung/methodsecurity/TestWithUserDetailsUnitTest.java} | 4 ++-- .../baeldung/methodsecurity/WithMockJohnViewer.java | 2 +- .../src/test/java/{org => com}/baeldung/test/LiveTest.java | 2 +- 8 files changed, 12 insertions(+), 12 deletions(-) rename spring-security-core/src/test/java/{org => com}/baeldung/SpringContextIntegrationTest.java (94%) rename spring-security-core/src/test/java/{org => com}/baeldung/SpringContextTest.java (94%) rename spring-security-core/src/test/java/{org/baeldung/methodsecurity/TestClassLevelSecurity.java => com/baeldung/methodsecurity/TestClassLevelSecurityUnitTest.java} (92%) rename spring-security-core/src/test/java/{org/baeldung/methodsecurity/TestMethodSecurity.java => com/baeldung/methodsecurity/TestMethodSecurityUnitTest.java} (96%) rename spring-security-core/src/test/java/{org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java => com/baeldung/methodsecurity/TestWithMockUserAtClassLevelUnitTest.java} (89%) rename spring-security-core/src/test/java/{org/baeldung/methodsecurity/TestWithUserDetails.java => com/baeldung/methodsecurity/TestWithUserDetailsUnitTest.java} (93%) rename spring-security-core/src/test/java/{org => com}/baeldung/methodsecurity/WithMockJohnViewer.java (85%) rename spring-security-core/src/test/java/{org => com}/baeldung/test/LiveTest.java (99%) diff --git a/spring-security-core/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-security-core/src/test/java/com/baeldung/SpringContextIntegrationTest.java similarity index 94% rename from spring-security-core/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-security-core/src/test/java/com/baeldung/SpringContextIntegrationTest.java index 5698afa417..73f735e93a 100644 --- a/spring-security-core/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-security-core/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.baeldung.app.App; import org.junit.Test; diff --git a/spring-security-core/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-core/src/test/java/com/baeldung/SpringContextTest.java similarity index 94% rename from spring-security-core/src/test/java/org/baeldung/SpringContextTest.java rename to spring-security-core/src/test/java/com/baeldung/SpringContextTest.java index 1707c706ae..4a76ea35b5 100644 --- a/spring-security-core/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-core/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.baeldung.app.App; import org.junit.Test; diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java b/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestClassLevelSecurityUnitTest.java similarity index 92% rename from spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java rename to spring-security-core/src/test/java/com/baeldung/methodsecurity/TestClassLevelSecurityUnitTest.java index 502fd50c46..b1d83c162b 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestClassLevelSecurity.java +++ b/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestClassLevelSecurityUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.methodsecurity; +package com.baeldung.methodsecurity; import static org.junit.Assert.*; @@ -15,7 +15,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @ContextConfiguration -public class TestClassLevelSecurity { +public class TestClassLevelSecurityUnitTest { @Autowired SystemService systemService; diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java b/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestMethodSecurityUnitTest.java similarity index 96% rename from spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java rename to spring-security-core/src/test/java/com/baeldung/methodsecurity/TestMethodSecurityUnitTest.java index 009d9af9fc..b320e06a24 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestMethodSecurity.java +++ b/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestMethodSecurityUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.methodsecurity; +package com.baeldung.methodsecurity; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -21,7 +21,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @ContextConfiguration -public class TestMethodSecurity { +public class TestMethodSecurityUnitTest { @Autowired UserRoleService userRoleService; diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java b/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithMockUserAtClassLevelUnitTest.java similarity index 89% rename from spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java rename to spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithMockUserAtClassLevelUnitTest.java index 4df1af8ca9..47a9ddb985 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithMockUserAtClassLevel.java +++ b/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithMockUserAtClassLevelUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.methodsecurity; +package com.baeldung.methodsecurity; import static org.junit.Assert.assertEquals; @@ -15,7 +15,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @ContextConfiguration @WithMockUser(username = "john", roles = { "VIEWER" }) -public class TestWithMockUserAtClassLevel { +public class TestWithMockUserAtClassLevelUnitTest { @Test public void givenRoleViewer_whenCallGetUsername_thenReturnUsername() { diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java b/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithUserDetailsUnitTest.java similarity index 93% rename from spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java rename to spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithUserDetailsUnitTest.java index 3ef5996554..3130e99ddf 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/TestWithUserDetails.java +++ b/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithUserDetailsUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.methodsecurity; +package com.baeldung.methodsecurity; import static org.junit.Assert.assertEquals; @@ -16,7 +16,7 @@ import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @ContextConfiguration -public class TestWithUserDetails { +public class TestWithUserDetailsUnitTest { @Autowired UserRoleService userService; diff --git a/spring-security-core/src/test/java/org/baeldung/methodsecurity/WithMockJohnViewer.java b/spring-security-core/src/test/java/com/baeldung/methodsecurity/WithMockJohnViewer.java similarity index 85% rename from spring-security-core/src/test/java/org/baeldung/methodsecurity/WithMockJohnViewer.java rename to spring-security-core/src/test/java/com/baeldung/methodsecurity/WithMockJohnViewer.java index 5e1e882f3d..f05a6bc20e 100644 --- a/spring-security-core/src/test/java/org/baeldung/methodsecurity/WithMockJohnViewer.java +++ b/spring-security-core/src/test/java/com/baeldung/methodsecurity/WithMockJohnViewer.java @@ -1,4 +1,4 @@ -package org.baeldung.methodsecurity; +package com.baeldung.methodsecurity; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/spring-security-core/src/test/java/org/baeldung/test/LiveTest.java b/spring-security-core/src/test/java/com/baeldung/test/LiveTest.java similarity index 99% rename from spring-security-core/src/test/java/org/baeldung/test/LiveTest.java rename to spring-security-core/src/test/java/com/baeldung/test/LiveTest.java index 7243d3efd5..32d3a9ed74 100644 --- a/spring-security-core/src/test/java/org/baeldung/test/LiveTest.java +++ b/spring-security-core/src/test/java/com/baeldung/test/LiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.test; +package com.baeldung.test; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; From 6a483e6eab472cbfbf6ceea9dfd4fd9814ab1d25 Mon Sep 17 00:00:00 2001 From: eric-martin Date: Sat, 24 Aug 2019 12:16:34 -0500 Subject: [PATCH 039/396] BAEL-2774: Remove gradle-5/.gitignore --- gradle-5/.gitignore | 6 ------ 1 file changed, 6 deletions(-) delete mode 100644 gradle-5/.gitignore diff --git a/gradle-5/.gitignore b/gradle-5/.gitignore deleted file mode 100644 index 7dd8895f4b..0000000000 --- a/gradle-5/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/build/ -/bin/ -.settings -.gradle -.project -.classpath \ No newline at end of file From 4f759b00c1bd016da94e60becff85ad544d81d58 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 24 Aug 2019 22:01:25 +0300 Subject: [PATCH 040/396] Update README.md --- persistence-modules/spring-jpa/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md index 56ce68c126..d04e9f6f41 100644 --- a/persistence-modules/spring-jpa/README.md +++ b/persistence-modules/spring-jpa/README.md @@ -9,7 +9,6 @@ - [Sorting with JPA](http://www.baeldung.com/jpa-sort) - [Self-Contained Testing Using an In-Memory Database](http://www.baeldung.com/spring-jpa-test-in-memory-database) - [A Guide to Spring AbstractRoutingDatasource](http://www.baeldung.com/spring-abstract-routing-data-source) -- [A Guide to Hibernate with Spring 4](http://www.baeldung.com/the-persistence-layer-with-spring-and-jpa) - [Obtaining Auto-generated Keys in Spring JDBC](http://www.baeldung.com/spring-jdbc-autogenerated-keys) - [Transactions with Spring 4 and JPA](http://www.baeldung.com/transaction-configuration-with-jpa-and-spring) - [Use Criteria Queries in a Spring Data Application](https://www.baeldung.com/spring-data-criteria-queries) From 64f32d82ebaaa5aee72f68affffcd57a3f1b4cb9 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 25 Aug 2019 04:27:42 +0530 Subject: [PATCH 041/396] BAEL-16809 Slice 4 | The top 100 articles should have their own package in the module (#7615) --- .../baeldung/{http => httprequest}/FullResponseBuilder.java | 2 +- .../{http => httprequest}/ParameterStringBuilder.java | 2 +- .../baeldung/{http => httprequest}/HttpRequestLiveTest.java | 5 ++++- .../main/java/org/baeldung/{ => autowire}/sample/App.java | 2 +- .../java/org/baeldung/{ => autowire}/sample/AppConfig.java | 4 ++-- .../org/baeldung/{ => autowire}/sample/BarFormatter.java | 2 +- .../src/main/java/org/baeldung/autowire/sample/FooDAO.java | 5 +++++ .../org/baeldung/{ => autowire}/sample/FooFormatter.java | 2 +- .../java/org/baeldung/{ => autowire}/sample/FooService.java | 2 +- .../java/org/baeldung/{ => autowire}/sample/Formatter.java | 2 +- .../org/baeldung/{ => autowire}/sample/FormatterType.java | 2 +- .../org/baeldung/{startup => profiles}/ProfileManager.java | 2 +- spring-all/src/main/java/org/baeldung/sample/FooDAO.java | 5 ----- .../{ => autowire}/sample/FooServiceIntegrationTest.java | 2 +- .../CustomResponseController.java | 2 +- .../CustomResponseWithBuilderController.java | 2 +- 16 files changed, 23 insertions(+), 20 deletions(-) rename core-java-modules/core-java-networking/src/main/java/com/baeldung/{http => httprequest}/FullResponseBuilder.java (98%) rename core-java-modules/core-java-networking/src/main/java/com/baeldung/{http => httprequest}/ParameterStringBuilder.java (95%) rename core-java-modules/core-java-networking/src/test/java/com/baeldung/{http => httprequest}/HttpRequestLiveTest.java (97%) rename spring-all/src/main/java/org/baeldung/{ => autowire}/sample/App.java (90%) rename spring-all/src/main/java/org/baeldung/{ => autowire}/sample/AppConfig.java (66%) rename spring-all/src/main/java/org/baeldung/{ => autowire}/sample/BarFormatter.java (83%) create mode 100644 spring-all/src/main/java/org/baeldung/autowire/sample/FooDAO.java rename spring-all/src/main/java/org/baeldung/{ => autowire}/sample/FooFormatter.java (83%) rename spring-all/src/main/java/org/baeldung/{ => autowire}/sample/FooService.java (88%) rename spring-all/src/main/java/org/baeldung/{ => autowire}/sample/Formatter.java (59%) rename spring-all/src/main/java/org/baeldung/{ => autowire}/sample/FormatterType.java (91%) rename spring-all/src/main/java/org/baeldung/{startup => profiles}/ProfileManager.java (93%) delete mode 100644 spring-all/src/main/java/org/baeldung/sample/FooDAO.java rename spring-all/src/test/java/org/baeldung/{ => autowire}/sample/FooServiceIntegrationTest.java (94%) rename spring-boot-mvc/src/main/java/com/baeldung/{annotations => responseentity}/CustomResponseController.java (98%) rename spring-boot-mvc/src/main/java/com/baeldung/{annotations => responseentity}/CustomResponseWithBuilderController.java (97%) diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java b/core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java similarity index 98% rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java rename to core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java index 394255bd70..cc9d79aa65 100644 --- a/core-java-modules/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java +++ b/core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java @@ -1,4 +1,4 @@ -package com.baeldung.http; +package com.baeldung.httprequest; import java.io.BufferedReader; import java.io.IOException; diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java b/core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java similarity index 95% rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java rename to core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java index bed4195faa..f91ab332c7 100644 --- a/core-java-modules/core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java +++ b/core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java @@ -1,4 +1,4 @@ -package com.baeldung.http; +package com.baeldung.httprequest; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; diff --git a/core-java-modules/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java-modules/core-java-networking/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java similarity index 97% rename from core-java-modules/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java rename to core-java-modules/core-java-networking/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java index bd6c0a4410..77bf9bc8db 100644 --- a/core-java-modules/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java +++ b/core-java-modules/core-java-networking/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java @@ -1,8 +1,11 @@ -package com.baeldung.http; +package com.baeldung.httprequest; import org.apache.commons.lang3.StringUtils; import org.junit.Test; +import com.baeldung.httprequest.FullResponseBuilder; +import com.baeldung.httprequest.ParameterStringBuilder; + import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; diff --git a/spring-all/src/main/java/org/baeldung/sample/App.java b/spring-all/src/main/java/org/baeldung/autowire/sample/App.java similarity index 90% rename from spring-all/src/main/java/org/baeldung/sample/App.java rename to spring-all/src/main/java/org/baeldung/autowire/sample/App.java index 17fc49fc8c..ed0c90d5b1 100644 --- a/spring-all/src/main/java/org/baeldung/sample/App.java +++ b/spring-all/src/main/java/org/baeldung/autowire/sample/App.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package org.baeldung.autowire.sample; import org.springframework.context.annotation.AnnotationConfigApplicationContext; diff --git a/spring-all/src/main/java/org/baeldung/sample/AppConfig.java b/spring-all/src/main/java/org/baeldung/autowire/sample/AppConfig.java similarity index 66% rename from spring-all/src/main/java/org/baeldung/sample/AppConfig.java rename to spring-all/src/main/java/org/baeldung/autowire/sample/AppConfig.java index 8a177d2611..117dfe1027 100644 --- a/spring-all/src/main/java/org/baeldung/sample/AppConfig.java +++ b/spring-all/src/main/java/org/baeldung/autowire/sample/AppConfig.java @@ -1,10 +1,10 @@ -package org.baeldung.sample; +package org.baeldung.autowire.sample; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration -@ComponentScan("org.baeldung.sample") +@ComponentScan("org.baeldung.autowire.sample") public class AppConfig { } diff --git a/spring-all/src/main/java/org/baeldung/sample/BarFormatter.java b/spring-all/src/main/java/org/baeldung/autowire/sample/BarFormatter.java similarity index 83% rename from spring-all/src/main/java/org/baeldung/sample/BarFormatter.java rename to spring-all/src/main/java/org/baeldung/autowire/sample/BarFormatter.java index 8396653970..f7e730fdc6 100644 --- a/spring-all/src/main/java/org/baeldung/sample/BarFormatter.java +++ b/spring-all/src/main/java/org/baeldung/autowire/sample/BarFormatter.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package org.baeldung.autowire.sample; import org.springframework.stereotype.Component; diff --git a/spring-all/src/main/java/org/baeldung/autowire/sample/FooDAO.java b/spring-all/src/main/java/org/baeldung/autowire/sample/FooDAO.java new file mode 100644 index 0000000000..3d3deaa077 --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/autowire/sample/FooDAO.java @@ -0,0 +1,5 @@ +package org.baeldung.autowire.sample; + +public class FooDAO { + +} diff --git a/spring-all/src/main/java/org/baeldung/sample/FooFormatter.java b/spring-all/src/main/java/org/baeldung/autowire/sample/FooFormatter.java similarity index 83% rename from spring-all/src/main/java/org/baeldung/sample/FooFormatter.java rename to spring-all/src/main/java/org/baeldung/autowire/sample/FooFormatter.java index 68cb7f81f2..5fdacbadd4 100644 --- a/spring-all/src/main/java/org/baeldung/sample/FooFormatter.java +++ b/spring-all/src/main/java/org/baeldung/autowire/sample/FooFormatter.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package org.baeldung.autowire.sample; import org.springframework.stereotype.Component; diff --git a/spring-all/src/main/java/org/baeldung/sample/FooService.java b/spring-all/src/main/java/org/baeldung/autowire/sample/FooService.java similarity index 88% rename from spring-all/src/main/java/org/baeldung/sample/FooService.java rename to spring-all/src/main/java/org/baeldung/autowire/sample/FooService.java index 711711f205..a3638960cc 100644 --- a/spring-all/src/main/java/org/baeldung/sample/FooService.java +++ b/spring-all/src/main/java/org/baeldung/autowire/sample/FooService.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package org.baeldung.autowire.sample; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/spring-all/src/main/java/org/baeldung/sample/Formatter.java b/spring-all/src/main/java/org/baeldung/autowire/sample/Formatter.java similarity index 59% rename from spring-all/src/main/java/org/baeldung/sample/Formatter.java rename to spring-all/src/main/java/org/baeldung/autowire/sample/Formatter.java index ab29c2b848..05cd5f1c26 100644 --- a/spring-all/src/main/java/org/baeldung/sample/Formatter.java +++ b/spring-all/src/main/java/org/baeldung/autowire/sample/Formatter.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package org.baeldung.autowire.sample; public interface Formatter { diff --git a/spring-all/src/main/java/org/baeldung/sample/FormatterType.java b/spring-all/src/main/java/org/baeldung/autowire/sample/FormatterType.java similarity index 91% rename from spring-all/src/main/java/org/baeldung/sample/FormatterType.java rename to spring-all/src/main/java/org/baeldung/autowire/sample/FormatterType.java index d4d82dd022..ea1eec055a 100644 --- a/spring-all/src/main/java/org/baeldung/sample/FormatterType.java +++ b/spring-all/src/main/java/org/baeldung/autowire/sample/FormatterType.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package org.baeldung.autowire.sample; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/spring-all/src/main/java/org/baeldung/startup/ProfileManager.java b/spring-all/src/main/java/org/baeldung/profiles/ProfileManager.java similarity index 93% rename from spring-all/src/main/java/org/baeldung/startup/ProfileManager.java rename to spring-all/src/main/java/org/baeldung/profiles/ProfileManager.java index 41db539265..b4cb10e690 100644 --- a/spring-all/src/main/java/org/baeldung/startup/ProfileManager.java +++ b/spring-all/src/main/java/org/baeldung/profiles/ProfileManager.java @@ -1,4 +1,4 @@ -package org.baeldung.startup; +package org.baeldung.profiles; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; diff --git a/spring-all/src/main/java/org/baeldung/sample/FooDAO.java b/spring-all/src/main/java/org/baeldung/sample/FooDAO.java deleted file mode 100644 index 151c0c38de..0000000000 --- a/spring-all/src/main/java/org/baeldung/sample/FooDAO.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.sample; - -public class FooDAO { - -} diff --git a/spring-all/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java b/spring-all/src/test/java/org/baeldung/autowire/sample/FooServiceIntegrationTest.java similarity index 94% rename from spring-all/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java rename to spring-all/src/test/java/org/baeldung/autowire/sample/FooServiceIntegrationTest.java index 6b518395a1..941fc4baff 100644 --- a/spring-all/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java +++ b/spring-all/src/test/java/org/baeldung/autowire/sample/FooServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package org.baeldung.autowire.sample; import org.junit.Assert; import org.junit.Test; diff --git a/spring-boot-mvc/src/main/java/com/baeldung/annotations/CustomResponseController.java b/spring-boot-mvc/src/main/java/com/baeldung/responseentity/CustomResponseController.java similarity index 98% rename from spring-boot-mvc/src/main/java/com/baeldung/annotations/CustomResponseController.java rename to spring-boot-mvc/src/main/java/com/baeldung/responseentity/CustomResponseController.java index a29a6252f2..098c5e4794 100644 --- a/spring-boot-mvc/src/main/java/com/baeldung/annotations/CustomResponseController.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/responseentity/CustomResponseController.java @@ -1,4 +1,4 @@ -package com.baeldung.annotations; +package com.baeldung.responseentity; import java.io.IOException; import java.time.Year; diff --git a/spring-boot-mvc/src/main/java/com/baeldung/annotations/CustomResponseWithBuilderController.java b/spring-boot-mvc/src/main/java/com/baeldung/responseentity/CustomResponseWithBuilderController.java similarity index 97% rename from spring-boot-mvc/src/main/java/com/baeldung/annotations/CustomResponseWithBuilderController.java rename to spring-boot-mvc/src/main/java/com/baeldung/responseentity/CustomResponseWithBuilderController.java index 9a77029128..2e06060e6d 100644 --- a/spring-boot-mvc/src/main/java/com/baeldung/annotations/CustomResponseWithBuilderController.java +++ b/spring-boot-mvc/src/main/java/com/baeldung/responseentity/CustomResponseWithBuilderController.java @@ -1,4 +1,4 @@ -package com.baeldung.annotations; +package com.baeldung.responseentity; import java.time.Year; From d05905664f27ecf0528df4cf7eb2a4ebcd8e648a Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 25 Aug 2019 04:28:47 +0530 Subject: [PATCH 042/396] BAEL-16838 Slice 5 | The top 100 articles should have their own package in the module (#7632) - Moved snippets in correct packages --- .../initialize}/GuavaMapInitializeUnitTest.java | 2 +- .../ConfigProperties.java | 2 +- .../configurationproperties/DemoApplication.java | 13 +++++++++++++ .../Employee.java | 2 +- .../EmployeeConverter.java | 2 +- .../Item.java | 2 +- .../PropertiesConversionApplication.java | 2 +- .../PropertyConversion.java | 2 +- .../properties/ConfigPropertiesDemoApplication.java | 2 ++ .../ConfigPropertiesIntegrationTest.java | 6 +++++- .../PropertiesConversionIntegrationTest.java | 6 +++--- 11 files changed, 30 insertions(+), 11 deletions(-) rename guava-collections/src/test/java/org/baeldung/guava/{ => maps/initialize}/GuavaMapInitializeUnitTest.java (95%) rename spring-boot-properties/src/main/java/com/baeldung/{properties => configurationproperties}/ConfigProperties.java (98%) create mode 100644 spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java rename spring-boot-properties/src/main/java/com/baeldung/{properties/conversion => configurationproperties}/Employee.java (91%) rename spring-boot-properties/src/main/java/com/baeldung/{properties/conversion => configurationproperties}/EmployeeConverter.java (91%) rename spring-boot-properties/src/main/java/com/baeldung/{properties => configurationproperties}/Item.java (90%) rename spring-boot-properties/src/main/java/com/baeldung/{properties/conversion => configurationproperties}/PropertiesConversionApplication.java (91%) rename spring-boot-properties/src/main/java/com/baeldung/{properties/conversion => configurationproperties}/PropertyConversion.java (97%) rename spring-boot-properties/src/test/java/com/baeldung/{properties => configurationproperties}/ConfigPropertiesIntegrationTest.java (91%) rename spring-boot-properties/src/test/java/com/baeldung/{properties/conversion => configurationproperties}/PropertiesConversionIntegrationTest.java (89%) diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java b/guava-collections/src/test/java/org/baeldung/guava/maps/initialize/GuavaMapInitializeUnitTest.java similarity index 95% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java rename to guava-collections/src/test/java/org/baeldung/guava/maps/initialize/GuavaMapInitializeUnitTest.java index 69a7505316..2414afb720 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaMapInitializeUnitTest.java +++ b/guava-collections/src/test/java/org/baeldung/guava/maps/initialize/GuavaMapInitializeUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package org.baeldung.guava.maps.initialize; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.*; diff --git a/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigProperties.java b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java similarity index 98% rename from spring-boot-properties/src/main/java/com/baeldung/properties/ConfigProperties.java rename to spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java index b690c8e305..47df784885 100644 --- a/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigProperties.java +++ b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/ConfigProperties.java @@ -1,4 +1,4 @@ -package com.baeldung.properties; +package com.baeldung.configurationproperties; import java.util.List; import java.util.Map; diff --git a/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java new file mode 100644 index 0000000000..011acaba36 --- /dev/null +++ b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.configurationproperties; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.properties.EnableConfigurationProperties; + +@SpringBootApplication +@EnableConfigurationProperties(ConfigProperties.class) +public class DemoApplication { + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } +} \ No newline at end of file diff --git a/spring-boot-properties/src/main/java/com/baeldung/properties/conversion/Employee.java b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Employee.java similarity index 91% rename from spring-boot-properties/src/main/java/com/baeldung/properties/conversion/Employee.java rename to spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Employee.java index 52c7881dfc..20f4792a8e 100644 --- a/spring-boot-properties/src/main/java/com/baeldung/properties/conversion/Employee.java +++ b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Employee.java @@ -1,4 +1,4 @@ -package com.baeldung.properties.conversion; +package com.baeldung.configurationproperties; public class Employee { diff --git a/spring-boot-properties/src/main/java/com/baeldung/properties/conversion/EmployeeConverter.java b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/EmployeeConverter.java similarity index 91% rename from spring-boot-properties/src/main/java/com/baeldung/properties/conversion/EmployeeConverter.java rename to spring-boot-properties/src/main/java/com/baeldung/configurationproperties/EmployeeConverter.java index 6ec19cae72..83ef22be34 100644 --- a/spring-boot-properties/src/main/java/com/baeldung/properties/conversion/EmployeeConverter.java +++ b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/EmployeeConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.properties.conversion; +package com.baeldung.configurationproperties; import org.springframework.boot.context.properties.ConfigurationPropertiesBinding; import org.springframework.core.convert.converter.Converter; diff --git a/spring-boot-properties/src/main/java/com/baeldung/properties/Item.java b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Item.java similarity index 90% rename from spring-boot-properties/src/main/java/com/baeldung/properties/Item.java rename to spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Item.java index 741bbba144..d0f0d2987a 100644 --- a/spring-boot-properties/src/main/java/com/baeldung/properties/Item.java +++ b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/Item.java @@ -1,4 +1,4 @@ -package com.baeldung.properties; +package com.baeldung.configurationproperties; public class Item { diff --git a/spring-boot-properties/src/main/java/com/baeldung/properties/conversion/PropertiesConversionApplication.java b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/PropertiesConversionApplication.java similarity index 91% rename from spring-boot-properties/src/main/java/com/baeldung/properties/conversion/PropertiesConversionApplication.java rename to spring-boot-properties/src/main/java/com/baeldung/configurationproperties/PropertiesConversionApplication.java index f00a26e9c4..ccfd1d6f6f 100644 --- a/spring-boot-properties/src/main/java/com/baeldung/properties/conversion/PropertiesConversionApplication.java +++ b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/PropertiesConversionApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.properties.conversion; +package com.baeldung.configurationproperties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-properties/src/main/java/com/baeldung/properties/conversion/PropertyConversion.java b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/PropertyConversion.java similarity index 97% rename from spring-boot-properties/src/main/java/com/baeldung/properties/conversion/PropertyConversion.java rename to spring-boot-properties/src/main/java/com/baeldung/configurationproperties/PropertyConversion.java index b9c890306f..52d4925d82 100644 --- a/spring-boot-properties/src/main/java/com/baeldung/properties/conversion/PropertyConversion.java +++ b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/PropertyConversion.java @@ -1,4 +1,4 @@ -package com.baeldung.properties.conversion; +package com.baeldung.configurationproperties; import java.time.Duration; import java.time.temporal.ChronoUnit; diff --git a/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java b/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java index ee9671c755..41f26d51f7 100644 --- a/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java +++ b/spring-boot-properties/src/main/java/com/baeldung/properties/ConfigPropertiesDemoApplication.java @@ -4,6 +4,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.annotation.ComponentScan; +import com.baeldung.configurationproperties.ConfigProperties; + @SpringBootApplication @ComponentScan(basePackageClasses = { ConfigProperties.class, JsonProperties.class, CustomJsonProperties.class }) public class ConfigPropertiesDemoApplication { diff --git a/spring-boot-properties/src/test/java/com/baeldung/properties/ConfigPropertiesIntegrationTest.java b/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java similarity index 91% rename from spring-boot-properties/src/test/java/com/baeldung/properties/ConfigPropertiesIntegrationTest.java rename to spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java index 4777551132..141400b1fe 100644 --- a/spring-boot-properties/src/test/java/com/baeldung/properties/ConfigPropertiesIntegrationTest.java +++ b/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/ConfigPropertiesIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.properties; +package com.baeldung.configurationproperties; import org.junit.Assert; import org.junit.Test; @@ -8,6 +8,10 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.configurationproperties.ConfigProperties; +import com.baeldung.properties.AdditionalProperties; +import com.baeldung.properties.ConfigPropertiesDemoApplication; + @RunWith(SpringRunner.class) @SpringBootTest(classes = ConfigPropertiesDemoApplication.class) @TestPropertySource("classpath:configprops-test.properties") diff --git a/spring-boot-properties/src/test/java/com/baeldung/properties/conversion/PropertiesConversionIntegrationTest.java b/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/PropertiesConversionIntegrationTest.java similarity index 89% rename from spring-boot-properties/src/test/java/com/baeldung/properties/conversion/PropertiesConversionIntegrationTest.java rename to spring-boot-properties/src/test/java/com/baeldung/configurationproperties/PropertiesConversionIntegrationTest.java index 53bad329ea..1bdc8bff9b 100644 --- a/spring-boot-properties/src/test/java/com/baeldung/properties/conversion/PropertiesConversionIntegrationTest.java +++ b/spring-boot-properties/src/test/java/com/baeldung/configurationproperties/PropertiesConversionIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.properties.conversion; +package com.baeldung.configurationproperties; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -12,8 +12,8 @@ import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.unit.DataSize; -import com.baeldung.properties.conversion.PropertiesConversionApplication; -import com.baeldung.properties.conversion.PropertyConversion; +import com.baeldung.configurationproperties.PropertiesConversionApplication; +import com.baeldung.configurationproperties.PropertyConversion; @RunWith(SpringRunner.class) @SpringBootTest(classes = PropertiesConversionApplication.class) From 2ae596d54db6d817dbefc0a50d728e01508227ff Mon Sep 17 00:00:00 2001 From: Laurentiu Delcea Date: Sun, 25 Aug 2019 02:12:29 +0300 Subject: [PATCH 043/396] BAEL-2528 FreeMarker common operations (#7586) * BAEL-2528 FreeMarker common operations * BAEL-2528 FreeMarker common operations * BAEL-2528 FreeMarker common operations --- .../controller/SpringController.java | 17 ++++++++--- .../freemarker/method/LastCharMethod.java | 16 +++++++++++ .../main/webapp/WEB-INF/views/ftl/commons.ftl | 28 +++++++++++++++++++ 3 files changed, 57 insertions(+), 4 deletions(-) create mode 100644 spring-freemarker/src/main/java/com/baeldung/freemarker/method/LastCharMethod.java create mode 100644 spring-freemarker/src/main/webapp/WEB-INF/views/ftl/commons.ftl diff --git a/spring-freemarker/src/main/java/com/baeldung/freemarker/controller/SpringController.java b/spring-freemarker/src/main/java/com/baeldung/freemarker/controller/SpringController.java index 18b42f06ea..6f6b5994f3 100644 --- a/spring-freemarker/src/main/java/com/baeldung/freemarker/controller/SpringController.java +++ b/spring-freemarker/src/main/java/com/baeldung/freemarker/controller/SpringController.java @@ -1,9 +1,10 @@ package com.baeldung.freemarker.controller; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; +import java.util.*; +import com.baeldung.freemarker.method.LastCharMethod; +import freemarker.template.DefaultObjectWrapperBuilder; +import freemarker.template.Version; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.ui.ModelMap; @@ -43,4 +44,12 @@ public class SpringController { return "redirect:/cars"; } -} + @RequestMapping(value = "/commons", method = RequestMethod.GET) + public String showCommonsPage(Model model) { + model.addAttribute("statuses", Arrays.asList("200 OK", "404 Not Found", "500 Internal Server Error")); + model.addAttribute("lastChar", new LastCharMethod()); + model.addAttribute("random", new Random()); + model.addAttribute("statics", new DefaultObjectWrapperBuilder(new Version("2.3.28")).build().getStaticModels()); + return "commons"; + } +} \ No newline at end of file diff --git a/spring-freemarker/src/main/java/com/baeldung/freemarker/method/LastCharMethod.java b/spring-freemarker/src/main/java/com/baeldung/freemarker/method/LastCharMethod.java new file mode 100644 index 0000000000..956a512f56 --- /dev/null +++ b/spring-freemarker/src/main/java/com/baeldung/freemarker/method/LastCharMethod.java @@ -0,0 +1,16 @@ +package com.baeldung.freemarker.method; + +import freemarker.template.TemplateMethodModelEx; +import freemarker.template.TemplateModelException; +import org.springframework.util.StringUtils; + +import java.util.List; + +public class LastCharMethod implements TemplateMethodModelEx { + public Object exec(List arguments) throws TemplateModelException { + if (arguments.size() != 1 || StringUtils.isEmpty(arguments.get(0))) + throw new TemplateModelException("Wrong arguments!"); + String argument = arguments.get(0).toString(); + return argument.charAt(argument.length() - 1); + } +} diff --git a/spring-freemarker/src/main/webapp/WEB-INF/views/ftl/commons.ftl b/spring-freemarker/src/main/webapp/WEB-INF/views/ftl/commons.ftl new file mode 100644 index 0000000000..eea1e6f683 --- /dev/null +++ b/spring-freemarker/src/main/webapp/WEB-INF/views/ftl/commons.ftl @@ -0,0 +1,28 @@ +

Testing is a property exists: ${student???c}

+<#if status??> +

Property value: ${status.reason}

+<#else> +

Missing property

+ + +

Iterating a sequence:

+<#list statuses> +
    + <#items as status> +
  • ${status}
  • + +
+ <#else> +

No statuses available

+ + +

Using static methods

+<#assign MathUtils=statics['java.lang.Math']> +

PI value: ${MathUtils.PI}

+

2*10 is: ${MathUtils.pow(2, 10)}

+ +

Using bean method

+

Random value: ${random.nextInt()}

+ +

Use custom method

+

Last char example: ${lastChar('mystring')}

\ No newline at end of file From ef8c8758c8916ff0ad2dfbbbab081b3fb3c9cb9a Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 25 Aug 2019 04:47:48 +0530 Subject: [PATCH 044/396] BAEL-16792 Slice 3 | The top 100 articles should have their own package in the module (#7596) --- .../{controller => requestparam}/RequestParamController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename spring-mvc-simple/src/main/java/com/baeldung/spring/{controller => requestparam}/RequestParamController.java (96%) diff --git a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestParamController.java b/spring-mvc-simple/src/main/java/com/baeldung/spring/requestparam/RequestParamController.java similarity index 96% rename from spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestParamController.java rename to spring-mvc-simple/src/main/java/com/baeldung/spring/requestparam/RequestParamController.java index a9846f1ba9..bcb1fe5a82 100644 --- a/spring-mvc-simple/src/main/java/com/baeldung/spring/controller/RequestParamController.java +++ b/spring-mvc-simple/src/main/java/com/baeldung/spring/requestparam/RequestParamController.java @@ -1,4 +1,4 @@ -package com.baeldung.spring.controller; +package com.baeldung.spring.requestparam; import java.util.List; import java.util.Map; @@ -47,7 +47,7 @@ public class RequestParamController { @GetMapping("/api/foos4") @ResponseBody public String getFoos4(@RequestParam List id){ - return "ID are " + id; + return "IDs are " + id; } @GetMapping("/foos/{id}") From 50ca18c4ce7487c273ad9eb90edb547515ec6ebe Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 25 Aug 2019 10:14:33 +0530 Subject: [PATCH 045/396] [BAEL-12749] - Moved the Hibernate specific articles out of persistence-modules/spring-jpa module --- .../_6.fdt | Bin 160 -> 0 bytes .../_6.fdx | Bin 84 -> 0 bytes .../_6.fnm | Bin 532 -> 0 bytes .../_6.nvd | Bin 65 -> 0 bytes .../_6.nvm | Bin 88 -> 0 bytes .../_6.si | Bin 503 -> 0 bytes .../_6.tvd | Bin 392 -> 0 bytes .../_6.tvx | Bin 79 -> 0 bytes .../_6_Lucene50_0.doc | Bin 190 -> 0 bytes .../_6_Lucene50_0.pos | Bin 162 -> 0 bytes .../_6_Lucene50_0.tim | Bin 914 -> 0 bytes .../_6_Lucene50_0.tip | Bin 195 -> 0 bytes .../_7.cfe | Bin 341 -> 0 bytes .../_7.cfs | Bin 2119 -> 0 bytes .../_7.si | Bin 360 -> 0 bytes .../segments_9 | Bin 198 -> 0 bytes .../write.lock | 0 17 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdt delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdx delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fnm delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvd delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvm delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.si delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.tvd delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.tvx delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.doc delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.pos delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.tim delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.tip delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.cfe delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.cfs delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.si delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/segments_9 delete mode 100644 persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/write.lock diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdt b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdt deleted file mode 100644 index c44ea80ed4835cac6d7c02e0283250eba151a13b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 160 zcmcD&o+B>fQ<|KbmuhMdT#{dun&Ot3nv+uOmRMZkl30?+z`($$U=u!Hth|RWNNSI7 zaZmMPhK2@4CI%h`CI_I diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdx b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fdx deleted file mode 100644 index 77b3c43c2118eeeb99c5a92ce5c2798d92150eb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 84 zcmcD&o+B>nQ<|KbmuhMdT#{dun&Ot3nv+uOmRMZknU|7U!N9=4s9+O5U#z@`FGy;S hZ*focVg@EgpeTbC5Hs{K9?+Ql0;mcMR=Nh=0042_7#jcp diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fnm b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.fnm deleted file mode 100644 index 6a5f78d0a0d7f5dd416efcf7902a150f90c4a666..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 532 zcmcD&o+B>gQ<|KbmuhO@mYJH9;+dD0U(CS3z^GsoK3}Z7hc8HKk8g2L^ovau*ckr<5j__$B71GBHx$+1x3q#mPmP1tppJdCW90pDi~vH@~Qo Wg^7{sA$~w(@(W;ugTd$P_VWNA*U|t0 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvd b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvd deleted file mode 100644 index 7644ffa79bd8bfde66f6115cfd602d89ab62c4f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmcD&o+B>kQ<|KbmuhP4mtT}y?2=fL$N&TiHsSNd%6s^Nr1tn0_f#)tC@C$eC@(*t PG5G~Z8UzCG{Fn&<$0Zf# diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvm b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.nvm deleted file mode 100644 index b2eb2c7a525bc3f5ed0c4376a456f7d110a846d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88 zcmcD&o+B>mQ<|KbmuhP4mtT}y?3-GWn37nM$N&TiHsSNd%6s^Nr1tn0_f#)tU;>GP bKshrbgu$Tw9|-slXiR z{OL_&hV^F^zAI~77Kb6jd@7rr@*_$RNQiF5_O(DkM4D$@Ot?TQAQ3!Rh+?ZlJh)$}|ab0L1wYzqw?NqjW z*Uz8MZvo7M6+{dFA(Mjd0+r0tGQuh?ETLJ)vZ4~a;ASh@373o0*wP{yn)~_Xo{mj$ kKO_;BeJ&_cfO1Sqr#(I$Rz@`5}>6FQ#L))tdz6ZV^&iM}C^`D|t+RP$S6s~?CBeyAX z+SnF41b|?EZRhk!|8TlJ_kGJAemsY<;XF)0?%CzV8Nm3}r>n5jc~B_$+n3(YdbI#@ zL&&%6>y0<(ZQQBVmctj14|jt^UBZ~j_CzO7d3;VSEjOmdVwGTQ2%YeMm9tqJe%O%VK8 PJpSc7yPv;ri#PuP$%24n diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.tvx b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6.tvx deleted file mode 100644 index 6b97c002b30e9a9274e680c4086f3dd8af04cd54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 79 zcmcD&o+B>dQ<|KbmuhMdl3J7-mYQ6WUsUXwmy%k+z`($$U=u!Hth|RWNNSI7aZmMP c1|~+JD1!+QGkjw@pfULcP!$-6FJJKz0N;le*Z=?k diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.doc b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.doc deleted file mode 100644 index f86ebad3d109a32f4d3ec9d144cfb7cd5fb20bf3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 190 zcmcD&o+B>lQ<|KbmuhMdkY8MqnU`K1UX)pqTI7lQ<|KbmuhMdkY8MqnU`K1UX)pqS_I@V0D*!{_~)r+}c zs^bkn(hLkdOl)i{JdBLY%plCm!OF_a$i&3Q$-&6U!NtbL&cedP%*4dS%F4|O(ZCD_ iOiWBbE+Y#VFoFOB0}}%i(*cdiFCgj|7)qF>mjM7hq8XY1 diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.tim b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_6_Lucene50_0.tim deleted file mode 100644 index 3f8b1e4ab0ec3c81c17d458acde3b0b03e775bb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 914 zcmb7Dy>HYo6!)_e-%*uT6bUFu2NOb6I$f{5qXVc27(uE~rEY*PaTBXf9NCWUDh5#J zPIO>oU_@eIX5g=&I};Q93p^*ij!5-K-nXCM?>XD2`ufTfZIXjsE9I`Vg?pwFPY9uR z9`1d*Ha%W?dGq@Vcl`GA!t*+jr5p`j56Cu#-I~ig#(7m{ZqF(&ZF2_3lmEoO2ex-V zF-3nOq)zKH>*s1BZ7IBTQrIN#7bcauzhg~WC!TUbUp?A5rIFCibVQk2qtaMZm6qKk z7dFH6og|l{l9uDSjaXYNOV4DPM*AX>(Y`fBoLMP+l&dVKD&?xmO)0q!d3~f+DI;yX z-R%C@niyX0;Y}!4<;#CSt+WRb_0bx-(T}YNoC`RaR>09G@zmt8xeg2*XX! z=UfVwc2cCg@d@&F`jikrFUHV7&j(|uYa}GiLN{EfBEWg;i{j-~Scf5Oz$T1fyf{x1 z=+z@AF#=ii#?vAK@s)(X>4rYF;kTAm41!a z)_D6M&pHmAep?DTu?ypol#`#F9a5B<8j@O+TkM&al3KyQz`&$n6Fy(8yoWDHYL9PmPxWFhpVH*i zyi`+zcmsQ&HfFcr5TG(v21aJ)M@$S1j0|X^tn09e@@>K<%Kr|VsL&*^sJU-)Wj`a( UE)ZCHKx6U?2$O*!D{M+F0FU1)Jpcdz diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.cfe b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/_7.cfe deleted file mode 100644 index d1359e482e2d258c59d493f06401eda9938089fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmcD&o+B>qQ<|KbmuhO@oS$2eUz(TVnpaYknOe*M1PV6c^To=0_=2SN_!jq6FJ<87 zkB2FbH_$7|EC8tj0zC-DaF|6euPhhJ`3R*WSoBKDQXm{gPpIG&7QM7Qs7l7W5J4sp zpkPV~gu@Ke-iTsnK|a`J3=AwqP?I7-##cZ%ET^G@{vd}y?PQgL3RRFVm`o;4IA n&!h;l9%>SM8B|j+il&tOWQaKXNvM3@0gcHoplk+ipdYA3`(b{p_!w) zLg!&GDc)S>pw2}2YeIB#3bu&|3&JKr2-{$;RdIE{Ro}+GtK0jn2A1sAzA<^>8Rq;U zme)I<|IXba^rkZOjdQ8ZQ|lgQpkRzzl2S@BAm(CD*tz=$QQ^j=E3dwA+Z(P2Ex6aE+Dy6BxG*zF~SX@m}Q{KGj_JDj2_O(~;#f|(#>FCDRRCaK1$ zp-UE>kyDasA|fCzl?Q2^poWbw!AuK?nNcX6WQ7y<#qT63wav^V66!pT5LLk^02@pj zOv%XBxTH~nkDqo>p{8u8X-j3ga02*VjcUwT@DP0L6?gZ<->1uQ-V-g(aZN&pQpG-3 zGb))@$!5)FF+qe}+GI|2$TV_WSZwaH>3 zc7($L@xt^q6rA+s4aW-y3zO~5c~04`>G<-lQ-+~ZxlhIPbzZuiuOQ++8*mr}E_(0z zfoi3g^uWcF1`8GDG4fyt|1=i?5$qvdy#lxxnT?CKj|Fy&tRToQ<|KbmuhMdoSL4SnpfhPmzK}Kz`&?r6Fy(8yoWDHYL9PmPxVru7y~O3 zW@O}I$}i>&&&*57FE3Uw=gvwjOVle%1#*jo{EHHkb5a$Y^NR}dixNvR^YeJ1(nZBU z4yU1>g`PpYp_w5+L^v0y5iG-HWU2=g)=e@r;>!U$3?{>Bst1JZ`NevPMadbgiMc6e zCL&irw;yauZARa`RJC cxtv^sL*j!2TwPrbXiRG*@ diff --git a/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/write.lock b/persistence-modules/spring-hibernate-5/com.baeldung.hibernatesearch.model.Product/write.lock deleted file mode 100644 index e69de29bb2..0000000000 From b172804fe187593f28e2ef2d235852c03e15fe01 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 25 Aug 2019 10:30:00 +0530 Subject: [PATCH 046/396] [BAEL-16733] - Update package name and tests in spring-security-core --- .../src/main/java/{org => com}/baeldung/app/App.java | 8 ++++---- .../ExposeAttemptedPathAuthorizationAuditListener.java | 2 +- .../baeldung/auditing/LoginAttemptsLogger.java | 2 +- .../{org => com}/baeldung/config/DatabaseLoader.java | 7 ++++--- .../{org => com}/baeldung/config/WebSecurityConfig.java | 2 +- .../{org => com}/baeldung/controller/TaskController.java | 7 ++++--- .../src/main/java/{org => com}/baeldung/entity/Task.java | 2 +- .../java/{org => com}/baeldung/filter/CustomFilter.java | 2 +- .../baeldung/methodsecurity/annotation/IsViewer.java | 2 +- .../methodsecurity/config/MethodSecurityConfig.java | 2 +- .../baeldung/methodsecurity/entity/CustomUser.java | 2 +- .../methodsecurity/repository/UserRoleRepository.java | 5 +++-- .../methodsecurity/service/CustomUserDetailsService.java | 5 +++-- .../baeldung/methodsecurity/service/SystemService.java | 2 +- .../baeldung/methodsecurity/service/UserRoleService.java | 9 +++++---- .../{org => com}/baeldung/repository/TaskRepository.java | 5 +++-- .../java/{org => com}/baeldung/service/TaskService.java | 7 ++++--- .../java/com/baeldung/SpringContextIntegrationTest.java | 3 ++- .../src/test/java/com/baeldung/SpringContextTest.java | 3 ++- ...tTest.java => ClassLevelSecurityIntegrationTest.java} | 7 ++++--- ...yUnitTest.java => MethodSecurityIntegrationTest.java} | 7 ++++--- ...est.java => MockUserAtClassLevelIntegrationTest.java} | 7 ++++--- ...ailsUnitTest.java => UserDetailsIntegrationTest.java} | 9 +++++---- .../src/test/java/com/baeldung/test/LiveTest.java | 3 ++- 24 files changed, 62 insertions(+), 48 deletions(-) rename spring-security-core/src/main/java/{org => com}/baeldung/app/App.java (92%) rename spring-security-core/src/main/java/{org => com}/baeldung/auditing/ExposeAttemptedPathAuthorizationAuditListener.java (98%) rename spring-security-core/src/main/java/{org => com}/baeldung/auditing/LoginAttemptsLogger.java (97%) rename spring-security-core/src/main/java/{org => com}/baeldung/config/DatabaseLoader.java (86%) rename spring-security-core/src/main/java/{org => com}/baeldung/config/WebSecurityConfig.java (98%) rename spring-security-core/src/main/java/{org => com}/baeldung/controller/TaskController.java (90%) rename spring-security-core/src/main/java/{org => com}/baeldung/entity/Task.java (96%) rename spring-security-core/src/main/java/{org => com}/baeldung/filter/CustomFilter.java (97%) rename spring-security-core/src/main/java/{org => com}/baeldung/methodsecurity/annotation/IsViewer.java (85%) rename spring-security-core/src/main/java/{org => com}/baeldung/methodsecurity/config/MethodSecurityConfig.java (91%) rename spring-security-core/src/main/java/{org => com}/baeldung/methodsecurity/entity/CustomUser.java (91%) rename spring-security-core/src/main/java/{org => com}/baeldung/methodsecurity/repository/UserRoleRepository.java (92%) rename spring-security-core/src/main/java/{org => com}/baeldung/methodsecurity/service/CustomUserDetailsService.java (81%) rename spring-security-core/src/main/java/{org => com}/baeldung/methodsecurity/service/SystemService.java (84%) rename spring-security-core/src/main/java/{org => com}/baeldung/methodsecurity/service/UserRoleService.java (92%) rename spring-security-core/src/main/java/{org => com}/baeldung/repository/TaskRepository.java (66%) rename spring-security-core/src/main/java/{org => com}/baeldung/service/TaskService.java (86%) rename spring-security-core/src/test/java/com/baeldung/methodsecurity/{TestClassLevelSecurityUnitTest.java => ClassLevelSecurityIntegrationTest.java} (87%) rename spring-security-core/src/test/java/com/baeldung/methodsecurity/{TestMethodSecurityUnitTest.java => MethodSecurityIntegrationTest.java} (95%) rename spring-security-core/src/test/java/com/baeldung/methodsecurity/{TestWithMockUserAtClassLevelUnitTest.java => MockUserAtClassLevelIntegrationTest.java} (82%) rename spring-security-core/src/test/java/com/baeldung/methodsecurity/{TestWithUserDetailsUnitTest.java => UserDetailsIntegrationTest.java} (87%) diff --git a/spring-security-core/src/main/java/org/baeldung/app/App.java b/spring-security-core/src/main/java/com/baeldung/app/App.java similarity index 92% rename from spring-security-core/src/main/java/org/baeldung/app/App.java rename to spring-security-core/src/main/java/com/baeldung/app/App.java index bf719b3b12..d23df9adef 100644 --- a/spring-security-core/src/main/java/org/baeldung/app/App.java +++ b/spring-security-core/src/main/java/com/baeldung/app/App.java @@ -1,4 +1,4 @@ -package org.baeldung.app; +package com.baeldung.app; import javax.servlet.Filter; @@ -12,9 +12,9 @@ import org.springframework.web.filter.DelegatingFilterProxy; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; @SpringBootApplication -@EnableJpaRepositories("org.baeldung.repository") -@ComponentScan("org.baeldung") -@EntityScan("org.baeldung.entity") +@EnableJpaRepositories("com.baeldung.repository") +@ComponentScan("com.baeldung") +@EntityScan("com.baeldung.entity") public class App extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(App.class, args); diff --git a/spring-security-core/src/main/java/org/baeldung/auditing/ExposeAttemptedPathAuthorizationAuditListener.java b/spring-security-core/src/main/java/com/baeldung/auditing/ExposeAttemptedPathAuthorizationAuditListener.java similarity index 98% rename from spring-security-core/src/main/java/org/baeldung/auditing/ExposeAttemptedPathAuthorizationAuditListener.java rename to spring-security-core/src/main/java/com/baeldung/auditing/ExposeAttemptedPathAuthorizationAuditListener.java index bc36ac08b3..615d14584f 100644 --- a/spring-security-core/src/main/java/org/baeldung/auditing/ExposeAttemptedPathAuthorizationAuditListener.java +++ b/spring-security-core/src/main/java/com/baeldung/auditing/ExposeAttemptedPathAuthorizationAuditListener.java @@ -1,4 +1,4 @@ -package org.baeldung.auditing; +package com.baeldung.auditing; import org.springframework.boot.actuate.audit.AuditEvent; import org.springframework.boot.actuate.security.AbstractAuthorizationAuditListener; diff --git a/spring-security-core/src/main/java/org/baeldung/auditing/LoginAttemptsLogger.java b/spring-security-core/src/main/java/com/baeldung/auditing/LoginAttemptsLogger.java similarity index 97% rename from spring-security-core/src/main/java/org/baeldung/auditing/LoginAttemptsLogger.java rename to spring-security-core/src/main/java/com/baeldung/auditing/LoginAttemptsLogger.java index bf0781bced..d06c3e24e1 100644 --- a/spring-security-core/src/main/java/org/baeldung/auditing/LoginAttemptsLogger.java +++ b/spring-security-core/src/main/java/com/baeldung/auditing/LoginAttemptsLogger.java @@ -1,4 +1,4 @@ -package org.baeldung.auditing; +package com.baeldung.auditing; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/spring-security-core/src/main/java/org/baeldung/config/DatabaseLoader.java b/spring-security-core/src/main/java/com/baeldung/config/DatabaseLoader.java similarity index 86% rename from spring-security-core/src/main/java/org/baeldung/config/DatabaseLoader.java rename to spring-security-core/src/main/java/com/baeldung/config/DatabaseLoader.java index e311f62fff..7f22c3ec99 100644 --- a/spring-security-core/src/main/java/org/baeldung/config/DatabaseLoader.java +++ b/spring-security-core/src/main/java/com/baeldung/config/DatabaseLoader.java @@ -1,11 +1,12 @@ -package org.baeldung.config; +package com.baeldung.config; -import org.baeldung.entity.Task; -import org.baeldung.repository.TaskRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.CommandLineRunner; import org.springframework.stereotype.Component; +import com.baeldung.entity.Task; +import com.baeldung.repository.TaskRepository; + @Component public class DatabaseLoader implements CommandLineRunner { diff --git a/spring-security-core/src/main/java/org/baeldung/config/WebSecurityConfig.java b/spring-security-core/src/main/java/com/baeldung/config/WebSecurityConfig.java similarity index 98% rename from spring-security-core/src/main/java/org/baeldung/config/WebSecurityConfig.java rename to spring-security-core/src/main/java/com/baeldung/config/WebSecurityConfig.java index df7c7d1611..be11a0fde5 100644 --- a/spring-security-core/src/main/java/org/baeldung/config/WebSecurityConfig.java +++ b/spring-security-core/src/main/java/com/baeldung/config/WebSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/spring-security-core/src/main/java/org/baeldung/controller/TaskController.java b/spring-security-core/src/main/java/com/baeldung/controller/TaskController.java similarity index 90% rename from spring-security-core/src/main/java/org/baeldung/controller/TaskController.java rename to spring-security-core/src/main/java/com/baeldung/controller/TaskController.java index d99109c543..91156354b1 100644 --- a/spring-security-core/src/main/java/org/baeldung/controller/TaskController.java +++ b/spring-security-core/src/main/java/com/baeldung/controller/TaskController.java @@ -1,7 +1,5 @@ -package org.baeldung.controller; +package com.baeldung.controller; -import org.baeldung.entity.Task; -import org.baeldung.service.TaskService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -9,6 +7,9 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import com.baeldung.entity.Task; +import com.baeldung.service.TaskService; + @Controller @RequestMapping("api/tasks") public class TaskController { diff --git a/spring-security-core/src/main/java/org/baeldung/entity/Task.java b/spring-security-core/src/main/java/com/baeldung/entity/Task.java similarity index 96% rename from spring-security-core/src/main/java/org/baeldung/entity/Task.java rename to spring-security-core/src/main/java/com/baeldung/entity/Task.java index 5d3321ef2e..9103c342cc 100644 --- a/spring-security-core/src/main/java/org/baeldung/entity/Task.java +++ b/spring-security-core/src/main/java/com/baeldung/entity/Task.java @@ -1,4 +1,4 @@ -package org.baeldung.entity; +package com.baeldung.entity; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-security-core/src/main/java/org/baeldung/filter/CustomFilter.java b/spring-security-core/src/main/java/com/baeldung/filter/CustomFilter.java similarity index 97% rename from spring-security-core/src/main/java/org/baeldung/filter/CustomFilter.java rename to spring-security-core/src/main/java/com/baeldung/filter/CustomFilter.java index 35596eae16..e748b373b7 100644 --- a/spring-security-core/src/main/java/org/baeldung/filter/CustomFilter.java +++ b/spring-security-core/src/main/java/com/baeldung/filter/CustomFilter.java @@ -1,4 +1,4 @@ -package org.baeldung.filter; +package com.baeldung.filter; import java.io.IOException; diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java b/spring-security-core/src/main/java/com/baeldung/methodsecurity/annotation/IsViewer.java similarity index 85% rename from spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java rename to spring-security-core/src/main/java/com/baeldung/methodsecurity/annotation/IsViewer.java index 711784adbb..bde4456f8e 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/annotation/IsViewer.java +++ b/spring-security-core/src/main/java/com/baeldung/methodsecurity/annotation/IsViewer.java @@ -1,4 +1,4 @@ -package org.baeldung.methodsecurity.annotation; +package com.baeldung.methodsecurity.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/config/MethodSecurityConfig.java b/spring-security-core/src/main/java/com/baeldung/methodsecurity/config/MethodSecurityConfig.java similarity index 91% rename from spring-security-core/src/main/java/org/baeldung/methodsecurity/config/MethodSecurityConfig.java rename to spring-security-core/src/main/java/com/baeldung/methodsecurity/config/MethodSecurityConfig.java index 4749c730dc..239f7067a4 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/config/MethodSecurityConfig.java +++ b/spring-security-core/src/main/java/com/baeldung/methodsecurity/config/MethodSecurityConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.methodsecurity.config; +package com.baeldung.methodsecurity.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java b/spring-security-core/src/main/java/com/baeldung/methodsecurity/entity/CustomUser.java similarity index 91% rename from spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java rename to spring-security-core/src/main/java/com/baeldung/methodsecurity/entity/CustomUser.java index fb9174befa..7daaef5984 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/entity/CustomUser.java +++ b/spring-security-core/src/main/java/com/baeldung/methodsecurity/entity/CustomUser.java @@ -1,4 +1,4 @@ -package org.baeldung.methodsecurity.entity; +package com.baeldung.methodsecurity.entity; import java.util.Collection; diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java b/spring-security-core/src/main/java/com/baeldung/methodsecurity/repository/UserRoleRepository.java similarity index 92% rename from spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java rename to spring-security-core/src/main/java/com/baeldung/methodsecurity/repository/UserRoleRepository.java index fc1a32289d..eef39189a7 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/repository/UserRoleRepository.java +++ b/spring-security-core/src/main/java/com/baeldung/methodsecurity/repository/UserRoleRepository.java @@ -1,16 +1,17 @@ -package org.baeldung.methodsecurity.repository; +package com.baeldung.methodsecurity.repository; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; -import org.baeldung.methodsecurity.entity.CustomUser; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import com.baeldung.methodsecurity.entity.CustomUser; + @Service public class UserRoleRepository { diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/CustomUserDetailsService.java b/spring-security-core/src/main/java/com/baeldung/methodsecurity/service/CustomUserDetailsService.java similarity index 81% rename from spring-security-core/src/main/java/org/baeldung/methodsecurity/service/CustomUserDetailsService.java rename to spring-security-core/src/main/java/com/baeldung/methodsecurity/service/CustomUserDetailsService.java index 91171468bb..685621b55f 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/CustomUserDetailsService.java +++ b/spring-security-core/src/main/java/com/baeldung/methodsecurity/service/CustomUserDetailsService.java @@ -1,11 +1,12 @@ -package org.baeldung.methodsecurity.service; +package com.baeldung.methodsecurity.service; -import org.baeldung.methodsecurity.repository.UserRoleRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Service; +import com.baeldung.methodsecurity.repository.UserRoleRepository; + @Service("userDetailService") public class CustomUserDetailsService implements UserDetailsService { diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java b/spring-security-core/src/main/java/com/baeldung/methodsecurity/service/SystemService.java similarity index 84% rename from spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java rename to spring-security-core/src/main/java/com/baeldung/methodsecurity/service/SystemService.java index 5f29d7dee6..623d51d34f 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/SystemService.java +++ b/spring-security-core/src/main/java/com/baeldung/methodsecurity/service/SystemService.java @@ -1,4 +1,4 @@ -package org.baeldung.methodsecurity.service; +package com.baeldung.methodsecurity.service; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Service; diff --git a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java b/spring-security-core/src/main/java/com/baeldung/methodsecurity/service/UserRoleService.java similarity index 92% rename from spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java rename to spring-security-core/src/main/java/com/baeldung/methodsecurity/service/UserRoleService.java index 30bbdbc10f..4d090fd90c 100644 --- a/spring-security-core/src/main/java/org/baeldung/methodsecurity/service/UserRoleService.java +++ b/spring-security-core/src/main/java/com/baeldung/methodsecurity/service/UserRoleService.java @@ -1,13 +1,10 @@ -package org.baeldung.methodsecurity.service; +package com.baeldung.methodsecurity.service; import java.util.List; import java.util.stream.Collectors; import javax.annotation.security.RolesAllowed; -import org.baeldung.methodsecurity.annotation.IsViewer; -import org.baeldung.methodsecurity.entity.CustomUser; -import org.baeldung.methodsecurity.repository.UserRoleRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.annotation.Secured; import org.springframework.security.access.prepost.PostAuthorize; @@ -18,6 +15,10 @@ import org.springframework.security.core.context.SecurityContext; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import com.baeldung.methodsecurity.annotation.IsViewer; +import com.baeldung.methodsecurity.entity.CustomUser; +import com.baeldung.methodsecurity.repository.UserRoleRepository; + @Service public class UserRoleService { diff --git a/spring-security-core/src/main/java/org/baeldung/repository/TaskRepository.java b/spring-security-core/src/main/java/com/baeldung/repository/TaskRepository.java similarity index 66% rename from spring-security-core/src/main/java/org/baeldung/repository/TaskRepository.java rename to spring-security-core/src/main/java/com/baeldung/repository/TaskRepository.java index 651b11684f..afb999719c 100644 --- a/spring-security-core/src/main/java/org/baeldung/repository/TaskRepository.java +++ b/spring-security-core/src/main/java/com/baeldung/repository/TaskRepository.java @@ -1,8 +1,9 @@ -package org.baeldung.repository; +package com.baeldung.repository; -import org.baeldung.entity.Task; import org.springframework.data.repository.CrudRepository; +import com.baeldung.entity.Task; + public interface TaskRepository extends CrudRepository { } diff --git a/spring-security-core/src/main/java/org/baeldung/service/TaskService.java b/spring-security-core/src/main/java/com/baeldung/service/TaskService.java similarity index 86% rename from spring-security-core/src/main/java/org/baeldung/service/TaskService.java rename to spring-security-core/src/main/java/com/baeldung/service/TaskService.java index 4efa3b0294..1269eb4fd0 100644 --- a/spring-security-core/src/main/java/org/baeldung/service/TaskService.java +++ b/spring-security-core/src/main/java/com/baeldung/service/TaskService.java @@ -1,12 +1,13 @@ -package org.baeldung.service; +package com.baeldung.service; -import org.baeldung.entity.Task; -import org.baeldung.repository.TaskRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PostFilter; import org.springframework.security.access.prepost.PreFilter; import org.springframework.stereotype.Service; +import com.baeldung.entity.Task; +import com.baeldung.repository.TaskRepository; + @Service public class TaskService { diff --git a/spring-security-core/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-security-core/src/test/java/com/baeldung/SpringContextIntegrationTest.java index 73f735e93a..1cdff1342c 100644 --- a/spring-security-core/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-security-core/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -1,11 +1,12 @@ package com.baeldung; -import org.baeldung.app.App; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.app.App; + @RunWith(SpringRunner.class) @SpringBootTest(classes = App.class) public class SpringContextIntegrationTest { diff --git a/spring-security-core/src/test/java/com/baeldung/SpringContextTest.java b/spring-security-core/src/test/java/com/baeldung/SpringContextTest.java index 4a76ea35b5..bca6450fb1 100644 --- a/spring-security-core/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-security-core/src/test/java/com/baeldung/SpringContextTest.java @@ -1,11 +1,12 @@ package com.baeldung; -import org.baeldung.app.App; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.app.App; + @RunWith(SpringRunner.class) @SpringBootTest(classes = App.class) public class SpringContextTest { diff --git a/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestClassLevelSecurityUnitTest.java b/spring-security-core/src/test/java/com/baeldung/methodsecurity/ClassLevelSecurityIntegrationTest.java similarity index 87% rename from spring-security-core/src/test/java/com/baeldung/methodsecurity/TestClassLevelSecurityUnitTest.java rename to spring-security-core/src/test/java/com/baeldung/methodsecurity/ClassLevelSecurityIntegrationTest.java index b1d83c162b..943bfda72c 100644 --- a/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestClassLevelSecurityUnitTest.java +++ b/spring-security-core/src/test/java/com/baeldung/methodsecurity/ClassLevelSecurityIntegrationTest.java @@ -2,7 +2,6 @@ package com.baeldung.methodsecurity; import static org.junit.Assert.*; -import org.baeldung.methodsecurity.service.SystemService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -13,15 +12,17 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.methodsecurity.service.SystemService; + @RunWith(SpringRunner.class) @ContextConfiguration -public class TestClassLevelSecurityUnitTest { +public class ClassLevelSecurityIntegrationTest { @Autowired SystemService systemService; @Configuration - @ComponentScan("org.baeldung.methodsecurity.*") + @ComponentScan("com.baeldung.methodsecurity.*") public static class SpringConfig { } diff --git a/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestMethodSecurityUnitTest.java b/spring-security-core/src/test/java/com/baeldung/methodsecurity/MethodSecurityIntegrationTest.java similarity index 95% rename from spring-security-core/src/test/java/com/baeldung/methodsecurity/TestMethodSecurityUnitTest.java rename to spring-security-core/src/test/java/com/baeldung/methodsecurity/MethodSecurityIntegrationTest.java index b320e06a24..81b150f43e 100644 --- a/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestMethodSecurityUnitTest.java +++ b/spring-security-core/src/test/java/com/baeldung/methodsecurity/MethodSecurityIntegrationTest.java @@ -6,7 +6,6 @@ import static org.junit.Assert.assertTrue; import java.util.ArrayList; import java.util.List; -import org.baeldung.methodsecurity.service.UserRoleService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -19,15 +18,17 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.methodsecurity.service.UserRoleService; + @RunWith(SpringRunner.class) @ContextConfiguration -public class TestMethodSecurityUnitTest { +public class MethodSecurityIntegrationTest { @Autowired UserRoleService userRoleService; @Configuration - @ComponentScan("org.baeldung.methodsecurity.*") + @ComponentScan("com.baeldung.methodsecurity.*") public static class SpringConfig { } diff --git a/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithMockUserAtClassLevelUnitTest.java b/spring-security-core/src/test/java/com/baeldung/methodsecurity/MockUserAtClassLevelIntegrationTest.java similarity index 82% rename from spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithMockUserAtClassLevelUnitTest.java rename to spring-security-core/src/test/java/com/baeldung/methodsecurity/MockUserAtClassLevelIntegrationTest.java index 47a9ddb985..fead89f75a 100644 --- a/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithMockUserAtClassLevelUnitTest.java +++ b/spring-security-core/src/test/java/com/baeldung/methodsecurity/MockUserAtClassLevelIntegrationTest.java @@ -2,7 +2,6 @@ package com.baeldung.methodsecurity; import static org.junit.Assert.assertEquals; -import org.baeldung.methodsecurity.service.UserRoleService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -12,10 +11,12 @@ import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.methodsecurity.service.UserRoleService; + @RunWith(SpringRunner.class) @ContextConfiguration @WithMockUser(username = "john", roles = { "VIEWER" }) -public class TestWithMockUserAtClassLevelUnitTest { +public class MockUserAtClassLevelIntegrationTest { @Test public void givenRoleViewer_whenCallGetUsername_thenReturnUsername() { @@ -27,7 +28,7 @@ public class TestWithMockUserAtClassLevelUnitTest { UserRoleService userService; @Configuration - @ComponentScan("org.baeldung.methodsecurity.*") + @ComponentScan("com.baeldung.methodsecurity.*") public static class SpringConfig { } diff --git a/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithUserDetailsUnitTest.java b/spring-security-core/src/test/java/com/baeldung/methodsecurity/UserDetailsIntegrationTest.java similarity index 87% rename from spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithUserDetailsUnitTest.java rename to spring-security-core/src/test/java/com/baeldung/methodsecurity/UserDetailsIntegrationTest.java index 3130e99ddf..d43a26a5ff 100644 --- a/spring-security-core/src/test/java/com/baeldung/methodsecurity/TestWithUserDetailsUnitTest.java +++ b/spring-security-core/src/test/java/com/baeldung/methodsecurity/UserDetailsIntegrationTest.java @@ -2,8 +2,6 @@ package com.baeldung.methodsecurity; import static org.junit.Assert.assertEquals; -import org.baeldung.methodsecurity.entity.CustomUser; -import org.baeldung.methodsecurity.service.UserRoleService; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -14,15 +12,18 @@ import org.springframework.security.test.context.support.WithUserDetails; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.methodsecurity.entity.CustomUser; +import com.baeldung.methodsecurity.service.UserRoleService; + @RunWith(SpringRunner.class) @ContextConfiguration -public class TestWithUserDetailsUnitTest { +public class UserDetailsIntegrationTest { @Autowired UserRoleService userService; @Configuration - @ComponentScan("org.baeldung.methodsecurity.*") + @ComponentScan("com.baeldung.methodsecurity.*") public static class SpringConfig { } diff --git a/spring-security-core/src/test/java/com/baeldung/test/LiveTest.java b/spring-security-core/src/test/java/com/baeldung/test/LiveTest.java index 32d3a9ed74..6bcb2e8f0f 100644 --- a/spring-security-core/src/test/java/com/baeldung/test/LiveTest.java +++ b/spring-security-core/src/test/java/com/baeldung/test/LiveTest.java @@ -5,7 +5,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.baeldung.app.App; import org.junit.Before; import org.junit.FixMethodOrder; import org.junit.Test; @@ -20,6 +19,8 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; +import com.baeldung.app.App; + @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = App.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @FixMethodOrder(MethodSorters.NAME_ASCENDING) From 21f18fcc9f89494377feb0d6e4e7458fec90d74a Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 25 Aug 2019 16:32:30 +0530 Subject: [PATCH 047/396] [BAEL-16824] - Added modules which are not built in the main pom --- pom.xml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/pom.xml b/pom.xml index a4f2a13c28..73d02ad9d5 100644 --- a/pom.xml +++ b/pom.xml @@ -566,6 +566,19 @@ oauth2-framework-impl spring-boot-nashorn + apache-olingo/olingo2 + bazel + cloud-foundry-uaa/cf-uaa-oauth2-client + cloud-foundry-uaa/cf-uaa-oauth2-resource-server + guava-collections-set + java-math + jee-kotlin + spf4j + spring-boot-mvc-2 + spring-boot-performance + spring-boot-properties + + @@ -1259,6 +1272,19 @@ rxjava rxjava-2 oauth2-framework-impl + apache-olingo/olingo2 + bazel + cloud-foundry-uaa/cf-uaa-oauth2-client + cloud-foundry-uaa/cf-uaa-oauth2-resource-server + guava-collections-set + java-math + jee-kotlin + spf4j + spring-boot-mvc-2 + spring-boot-performance + spring-boot-properties + + From 5a2809de8bd23e9129de4010cf82030082153950 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 25 Aug 2019 19:09:24 +0530 Subject: [PATCH 048/396] [BAEL-16822] - Aligned module names, folder names and artifact id --- apache-olingo/olingo2/pom.xml | 4 +- bazel/bazelapp/pom.xml | 7 +- bazel/bazelgreeting/pom.xml | 7 +- bazel/pom.xml | 10 +- core-java-modules/core-java-jndi/pom.xml | 1 + core-java-modules/core-java-lambdas/pom.xml | 2 +- core-java-modules/core-java-optional/pom.xml | 1 + java-streams-2/pom.xml | 4 +- jhipster-5/pom.xml | 2 +- jhipster/pom.xml | 2 +- libraries-2/pom.xml | 4 +- libraries-primitive/pom.xml | 1 + .../oauth2-authorization-server/pom.xml | 1 + oauth2-framework-impl/oauth2-client/pom.xml | 1 + .../oauth2-resource-server/pom.xml | 1 + oauth2-framework-impl/pom.xml | 1 + patterns/backoff-jitter/pom.xml | 1 + persistence-modules/hibernate-mapping/pom.xml | 1 + .../spring-boot-persistence-h2/pom.xml | 4 +- persistence-modules/spring-data-jpa-2/pom.xml | 2 +- quarkus/pom.xml | 2 + spring-boot-di/pom.xml | 4 +- .../apache-spark-job/pom.xml | 1 + .../spring-cloud-data-flow-etl/pom.xml | 2 +- .../pom.xml | 5 +- spring-core-2/pom.xml | 1 + spring-di/pom.xml | 1 + stripe/pom.xml | 2 +- tensorflow-java/pom.xml | 1 + vaadin/pom.xml | 2 +- .../webapp/VAADIN/themes/mytheme/styles.css | 12986 ---------------- wicket/pom.xml | 2 +- 32 files changed, 50 insertions(+), 13016 deletions(-) delete mode 100644 vaadin/src/main/webapp/VAADIN/themes/mytheme/styles.css diff --git a/apache-olingo/olingo2/pom.xml b/apache-olingo/olingo2/pom.xml index 24e7b4e0b2..727e6ca484 100644 --- a/apache-olingo/olingo2/pom.xml +++ b/apache-olingo/olingo2/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.baeldung.examples.olingo2 - olingo2-sample + olingo2 0.0.1-SNAPSHOT - olingo2-sample + olingo2 Sample Olingo 2 Project diff --git a/bazel/bazelapp/pom.xml b/bazel/bazelapp/pom.xml index b8c658eaae..9c9fb59619 100644 --- a/bazel/bazelapp/pom.xml +++ b/bazel/bazelapp/pom.xml @@ -2,14 +2,15 @@ + 4.0.0 + bazelapp + bazelapp + bazel com.baeldung 1.0.0-SNAPSHOT - 4.0.0 - - bazelapp diff --git a/bazel/bazelgreeting/pom.xml b/bazel/bazelgreeting/pom.xml index d02cc02cae..e688a55bd5 100644 --- a/bazel/bazelgreeting/pom.xml +++ b/bazel/bazelgreeting/pom.xml @@ -2,14 +2,15 @@ + 4.0.0 + bazelgreeting + bazelgreeting + bazel com.baeldung 1.0.0-SNAPSHOT - 4.0.0 - - bazelgreeting \ No newline at end of file diff --git a/bazel/pom.xml b/bazel/pom.xml index 7350d1dbe4..cb784ec6e6 100644 --- a/bazel/pom.xml +++ b/bazel/pom.xml @@ -2,15 +2,17 @@ + 4.0.0 + bazel + pom + bazel + parent-modules com.baeldung 1.0.0-SNAPSHOT - 4.0.0 - - bazel - pom + bazelgreeting bazelapp diff --git a/core-java-modules/core-java-jndi/pom.xml b/core-java-modules/core-java-jndi/pom.xml index eb363f8598..7f621af21d 100644 --- a/core-java-modules/core-java-jndi/pom.xml +++ b/core-java-modules/core-java-jndi/pom.xml @@ -7,6 +7,7 @@ com.baeldung.jndi core-java-jndi 1.0-SNAPSHOT + core-java-jndi com.baeldung diff --git a/core-java-modules/core-java-lambdas/pom.xml b/core-java-modules/core-java-lambdas/pom.xml index 9e6e81ed40..433db0a9ca 100644 --- a/core-java-modules/core-java-lambdas/pom.xml +++ b/core-java-modules/core-java-lambdas/pom.xml @@ -5,7 +5,7 @@ 4.0.0 core-java-lambdas 0.1.0-SNAPSHOT - core-java + core-java-lambdas jar diff --git a/core-java-modules/core-java-optional/pom.xml b/core-java-modules/core-java-optional/pom.xml index eb981c0907..ca6158ef5a 100644 --- a/core-java-modules/core-java-optional/pom.xml +++ b/core-java-modules/core-java-optional/pom.xml @@ -3,6 +3,7 @@ core-java-optional 0.1.0-SNAPSHOT jar + core-java-optional com.baeldung.core-java-modules diff --git a/java-streams-2/pom.xml b/java-streams-2/pom.xml index f7a0379ac5..4cebd44427 100644 --- a/java-streams-2/pom.xml +++ b/java-streams-2/pom.xml @@ -2,9 +2,9 @@ 4.0.0 com.baeldung.javastreams2 - javastreams2 + java-streams-2 1.0 - javastreams2 + java-streams-2 jar diff --git a/jhipster-5/pom.xml b/jhipster-5/pom.xml index df60b01317..cebbe25d8b 100644 --- a/jhipster-5/pom.xml +++ b/jhipster-5/pom.xml @@ -5,7 +5,7 @@ com.baeldung.jhipster jhipster-5 1.0.0-SNAPSHOT - JHipster + jhipster-5 pom diff --git a/jhipster/pom.xml b/jhipster/pom.xml index c50aac0c7a..dd16205706 100644 --- a/jhipster/pom.xml +++ b/jhipster/pom.xml @@ -5,7 +5,7 @@ com.baeldung.jhipster jhipster 1.0.0-SNAPSHOT - JHipster + jhipster pom diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index 83adf1e199..708006fa15 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - libraries2 - libraries2 + libraries-2 + libraries-2 com.baeldung diff --git a/libraries-primitive/pom.xml b/libraries-primitive/pom.xml index 9bb58470b2..12fc35c1b5 100644 --- a/libraries-primitive/pom.xml +++ b/libraries-primitive/pom.xml @@ -7,6 +7,7 @@ com.baeldung libraries-primitive 1.0-SNAPSHOT + libraries-primitive diff --git a/oauth2-framework-impl/oauth2-authorization-server/pom.xml b/oauth2-framework-impl/oauth2-authorization-server/pom.xml index 8db2150558..6ab7a60f72 100644 --- a/oauth2-framework-impl/oauth2-authorization-server/pom.xml +++ b/oauth2-framework-impl/oauth2-authorization-server/pom.xml @@ -6,6 +6,7 @@ oauth2-authorization-server war + oauth2-authorization-server com.baeldung.oauth2 diff --git a/oauth2-framework-impl/oauth2-client/pom.xml b/oauth2-framework-impl/oauth2-client/pom.xml index e46a44268e..9b2f05c483 100644 --- a/oauth2-framework-impl/oauth2-client/pom.xml +++ b/oauth2-framework-impl/oauth2-client/pom.xml @@ -5,6 +5,7 @@ 4.0.0 oauth2-client war + oauth2-client com.baeldung.oauth2 diff --git a/oauth2-framework-impl/oauth2-resource-server/pom.xml b/oauth2-framework-impl/oauth2-resource-server/pom.xml index 9b58c33472..e6bc860c67 100644 --- a/oauth2-framework-impl/oauth2-resource-server/pom.xml +++ b/oauth2-framework-impl/oauth2-resource-server/pom.xml @@ -5,6 +5,7 @@ 4.0.0 oauth2-resource-server war + oauth2-resource-server com.baeldung.oauth2 diff --git a/oauth2-framework-impl/pom.xml b/oauth2-framework-impl/pom.xml index 281103660b..47d42eaaea 100644 --- a/oauth2-framework-impl/pom.xml +++ b/oauth2-framework-impl/pom.xml @@ -7,6 +7,7 @@ oauth2-framework-impl 1.0-SNAPSHOT pom + oauth2-framework-impl 1.8 diff --git a/patterns/backoff-jitter/pom.xml b/patterns/backoff-jitter/pom.xml index 6b0d016609..739aa87873 100644 --- a/patterns/backoff-jitter/pom.xml +++ b/patterns/backoff-jitter/pom.xml @@ -7,6 +7,7 @@ backoff-jitter 1.0.0-SNAPSHOT pom + backoff-jitter diff --git a/persistence-modules/hibernate-mapping/pom.xml b/persistence-modules/hibernate-mapping/pom.xml index e90d7463bd..98c946a6e9 100644 --- a/persistence-modules/hibernate-mapping/pom.xml +++ b/persistence-modules/hibernate-mapping/pom.xml @@ -5,6 +5,7 @@ hibernate-mapping 1.0.0-SNAPSHOT 4.0.0 + hibernate-mapping com.baeldung diff --git a/persistence-modules/spring-boot-persistence-h2/pom.xml b/persistence-modules/spring-boot-persistence-h2/pom.xml index 4c8073ddb4..bd36a46144 100644 --- a/persistence-modules/spring-boot-persistence-h2/pom.xml +++ b/persistence-modules/spring-boot-persistence-h2/pom.xml @@ -4,9 +4,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung.h2db - spring-boot-h2-database + spring-boot-persistence-h2 0.0.1-SNAPSHOT - spring-boot-h2-database + spring-boot-persistence-h2 jar Demo Spring Boot applications that starts H2 in memory database diff --git a/persistence-modules/spring-data-jpa-2/pom.xml b/persistence-modules/spring-data-jpa-2/pom.xml index 08be64670b..3616b5ce18 100644 --- a/persistence-modules/spring-data-jpa-2/pom.xml +++ b/persistence-modules/spring-data-jpa-2/pom.xml @@ -6,7 +6,7 @@ com.baeldung spring-data-jpa-2 - spring-data-jpa + spring-data-jpa-2 parent-boot-2 diff --git a/quarkus/pom.xml b/quarkus/pom.xml index ceb2e2c0d4..5190d0932a 100644 --- a/quarkus/pom.xml +++ b/quarkus/pom.xml @@ -5,6 +5,8 @@ com.baeldung.quarkus quarkus 1.0-SNAPSHOT + quarkus + 2.22.0 0.15.0 diff --git a/spring-boot-di/pom.xml b/spring-boot-di/pom.xml index ec40c04566..b07d7c6385 100644 --- a/spring-boot-di/pom.xml +++ b/spring-boot-di/pom.xml @@ -3,8 +3,8 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - spring-boot-mvc - spring-boot-mvc + spring-boot-di + spring-boot-di jar Module For Spring Boot DI diff --git a/spring-cloud-data-flow/apache-spark-job/pom.xml b/spring-cloud-data-flow/apache-spark-job/pom.xml index 671e8ed71a..306b23c60a 100644 --- a/spring-cloud-data-flow/apache-spark-job/pom.xml +++ b/spring-cloud-data-flow/apache-spark-job/pom.xml @@ -4,6 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 apache-spark-job + apache-spark-job spring-cloud-data-flow diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml index ab34271273..0274b5fed1 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-etl/pom.xml @@ -3,7 +3,7 @@ 4.0.0 spring-cloud-data-flow-etl 0.0.1-SNAPSHOT - etl + spring-cloud-data-flow-etl pom diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml index e5c6830393..bcb0ace973 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/pom.xml @@ -1,15 +1,16 @@ 4.0.0 - spring-cloud-data-flow-stream + spring-cloud-data-flow-stream-processing 0.0.1-SNAPSHOT - spring-cloud-data-flow-stream + spring-cloud-data-flow-stream-processing pom com.baeldung parent-modules 1.0.0-SNAPSHOT + ../../ diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index 6b5547aba9..d68beda64a 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -4,6 +4,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-core-2 + spring-core-2 com.baeldung diff --git a/spring-di/pom.xml b/spring-di/pom.xml index 62456ba31c..f3ad380778 100644 --- a/spring-di/pom.xml +++ b/spring-di/pom.xml @@ -6,6 +6,7 @@ spring-di 1.0-SNAPSHOT war + spring-di parent-boot-2 diff --git a/stripe/pom.xml b/stripe/pom.xml index 86c6389f7f..7aa458bfd5 100644 --- a/stripe/pom.xml +++ b/stripe/pom.xml @@ -5,7 +5,7 @@ com.baeldung.stripe stripe 0.0.1-SNAPSHOT - Stripe + stripe Demo project for Stripe API jar diff --git a/tensorflow-java/pom.xml b/tensorflow-java/pom.xml index 84d2f6cf21..1c34fa465b 100644 --- a/tensorflow-java/pom.xml +++ b/tensorflow-java/pom.xml @@ -7,6 +7,7 @@ tensorflow-java 1.0-SNAPSHOT jar + tensorflow-java http://maven.apache.org diff --git a/vaadin/pom.xml b/vaadin/pom.xml index e3d882bbda..0cc6cd5757 100644 --- a/vaadin/pom.xml +++ b/vaadin/pom.xml @@ -5,7 +5,7 @@ org.test vaadin 1.0-SNAPSHOT - Vaadin + vaadin war diff --git a/vaadin/src/main/webapp/VAADIN/themes/mytheme/styles.css b/vaadin/src/main/webapp/VAADIN/themes/mytheme/styles.css deleted file mode 100644 index 75bf26f498..0000000000 --- a/vaadin/src/main/webapp/VAADIN/themes/mytheme/styles.css +++ /dev/null @@ -1,12986 +0,0 @@ -/** - * Checks if a list contains a certain value. - * - * @param {list} $list - the list to check - * @param {value} $var - the value to search for - * @param {bool} $recursive (false) - should any contained lists be checked for the value - * - * @return {bool} true if the value is found from the list, false otherwise - * - * @group lists - */ - -/** - * Cross-browser opacity. - * - * @param {number} $value - opacity value from 0 to 1 - * @param {bool} $important (false) - should the property value be declared with !important - * - * @group util - */ - -@-webkit-keyframes valo-animate-in-fade { - 0% { - opacity: 0; - } - } - -@-moz-keyframes valo-animate-in-fade { - 0% { - opacity: 0; - } - } - -@keyframes valo-animate-in-fade { - 0% { - opacity: 0; - } - } - -@-webkit-keyframes valo-animate-out-fade { - 100% { - opacity: 0; - } - } - -@-moz-keyframes valo-animate-out-fade { - 100% { - opacity: 0; - } - } - -@keyframes valo-animate-out-fade { - 100% { - opacity: 0; - } - } - -@-webkit-keyframes valo-animate-in-slide-down { - 0% { - -webkit-transform: translateY(-100%); - } - } - -@-moz-keyframes valo-animate-in-slide-down { - 0% { - -moz-transform: translateY(-100%); - } - } - -@keyframes valo-animate-in-slide-down { - 0% { - -webkit-transform: translateY(-100%); - -moz-transform: translateY(-100%); - -ms-transform: translateY(-100%); - -o-transform: translateY(-100%); - transform: translateY(-100%); - } - } - -@-webkit-keyframes valo-animate-in-slide-up { - 0% { - -webkit-transform: translateY(100%); - } - } - -@-moz-keyframes valo-animate-in-slide-up { - 0% { - -moz-transform: translateY(100%); - } - } - -@keyframes valo-animate-in-slide-up { - 0% { - -webkit-transform: translateY(100%); - -moz-transform: translateY(100%); - -ms-transform: translateY(100%); - -o-transform: translateY(100%); - transform: translateY(100%); - } - } - -@-webkit-keyframes valo-animate-in-slide-left { - 0% { - -webkit-transform: translateX(100%); - } - } - -@-moz-keyframes valo-animate-in-slide-left { - 0% { - -moz-transform: translateX(100%); - } - } - -@keyframes valo-animate-in-slide-left { - 0% { - -webkit-transform: translateX(100%); - -moz-transform: translateX(100%); - -ms-transform: translateX(100%); - -o-transform: translateX(100%); - transform: translateX(100%); - } - } - -@-webkit-keyframes valo-animate-in-slide-right { - 0% { - -webkit-transform: translateX(-100%); - } - } - -@-moz-keyframes valo-animate-in-slide-right { - 0% { - -moz-transform: translateX(-100%); - } - } - -@keyframes valo-animate-in-slide-right { - 0% { - -webkit-transform: translateX(-100%); - -moz-transform: translateX(-100%); - -ms-transform: translateX(-100%); - -o-transform: translateX(-100%); - transform: translateX(-100%); - } - } - -@-webkit-keyframes valo-animate-out-slide-down { - 100% { - -webkit-transform: translateY(100%); - } - } - -@-moz-keyframes valo-animate-out-slide-down { - 100% { - -moz-transform: translateY(100%); - } - } - -@keyframes valo-animate-out-slide-down { - 100% { - -webkit-transform: translateY(100%); - -moz-transform: translateY(100%); - -ms-transform: translateY(100%); - -o-transform: translateY(100%); - transform: translateY(100%); - } - } - -@-webkit-keyframes valo-animate-out-slide-up { - 100% { - -webkit-transform: translateY(-100%); - } - } - -@-moz-keyframes valo-animate-out-slide-up { - 100% { - -moz-transform: translateY(-100%); - } - } - -@keyframes valo-animate-out-slide-up { - 100% { - -webkit-transform: translateY(-100%); - -moz-transform: translateY(-100%); - -ms-transform: translateY(-100%); - -o-transform: translateY(-100%); - transform: translateY(-100%); - } - } - -@-webkit-keyframes valo-animate-out-slide-left { - 100% { - -webkit-transform: translateX(-100%); - } - } - -@-moz-keyframes valo-animate-out-slide-left { - 100% { - -moz-transform: translateX(-100%); - } - } - -@keyframes valo-animate-out-slide-left { - 100% { - -webkit-transform: translateX(-100%); - -moz-transform: translateX(-100%); - -ms-transform: translateX(-100%); - -o-transform: translateX(-100%); - transform: translateX(-100%); - } - } - -@-webkit-keyframes valo-animate-out-slide-right { - 100% { - -webkit-transform: translateX(100%); - } - } - -@-moz-keyframes valo-animate-out-slide-right { - 100% { - -moz-transform: translateX(100%); - } - } - -@keyframes valo-animate-out-slide-right { - 100% { - -webkit-transform: translateX(100%); - -moz-transform: translateX(100%); - -ms-transform: translateX(100%); - -o-transform: translateX(100%); - transform: translateX(100%); - } - } - -@-webkit-keyframes valo-overlay-animate-in { - 0% { - -webkit-transform: translatey(-4px); - opacity: 0; - } - } - -@-moz-keyframes valo-overlay-animate-in { - 0% { - -moz-transform: translatey(-4px); - opacity: 0; - } - } - -@keyframes valo-overlay-animate-in { - 0% { - -webkit-transform: translatey(-4px); - -moz-transform: translatey(-4px); - -ms-transform: translatey(-4px); - -o-transform: translatey(-4px); - transform: translatey(-4px); - opacity: 0; - } - } - -@-webkit-keyframes valo-animate-out-slide-down-fade { - 100% { - opacity: 0; - -webkit-transform: translatey(30%); - } - } - -@-moz-keyframes valo-animate-out-slide-down-fade { - 100% { - opacity: 0; - -moz-transform: translatey(30%); - } - } - -@keyframes valo-animate-out-slide-down-fade { - 100% { - opacity: 0; - -webkit-transform: translatey(30%); - -moz-transform: translatey(30%); - -ms-transform: translatey(30%); - -o-transform: translatey(30%); - transform: translatey(30%); - } - } - -/** - * Outputs cross-browser Valo-specific linear gradient background-image declarations. - * - * @group style - * - * @param {color} $color ($v-background-color) - The base color for the gradient color stops - * @param {list} $gradient ($v-gradient) - Valo-specific gradient value. See the documentation for $v-gradient. - * @param {color} $fallback (null) - A fallback color for browser which do not support linear gradients (IE8 and IE9 in particular). If null, the base $color is used instead. - * @param {string} $direction (to bottom) - the direction of the linear gradient. The color stops are by default so that a lighter shade is at the start and a darker shade is at the end. - */ - -/** - * Computes a CSS border property value for the given base color. - * - * @group style - * - * @param {list} $border ($v-border) - CSS border value which can contain any of the color keywords - * @param {color} $color ($v-background-color) - the base color to which the color keywords are applied to - * @param {color} $context (null) - context/surrounding color where the border is expected to appear. The color of the final border is the darker of the two parameters passed to this function. - * @param {number} $strength (1) - adjustment for the border contrast - * - * @return {list} The input $border value with any color keyword replaced with the corresponding actual color - */ - -/** - * Ouput selectors and properties to vertically center elements inside their parent. - * - * @param {string} $to-align (()) - The selector to match the elements which you wish to align vertically. The targeted elements should be inline or inline-block elements. - * @param {string} $align (middle) - The vertical-align value, e.g. top, middle, bottom - * @param {string} $pseudo-element (after) - Which pseudo element to use for the vertical align guide - * - * @group util - */ - -@font-face { - font-family: ThemeIcons; - font-weight: normal; - font-style: normal; - src: url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.eot); - src: url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.woff) format("woff"), url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.ttf) format("truetype"), url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.svg#ThemeIcons) format("svg"); -} - -.ThemeIcons { - font-family: ThemeIcons; - font-style: normal; - font-weight: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - display: inline-block; - text-align: center; -} - -@font-face { - font-family: FontAwesome; - font-weight: normal; - font-style: normal; - src: url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.eot); - src: url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.woff) format("woff"), url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.ttf) format("truetype"), url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.svg#FontAwesome) format("svg"); -} - -.FontAwesome { - font-family: FontAwesome; - font-style: normal; - font-weight: normal; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - display: inline-block; - text-align: center; -} - -@font-face { - font-family: "Open Sans"; - src: url(../valo/fonts/open-sans/OpenSans-Light-webfont.eot); - src: url(../valo/fonts/open-sans/OpenSans-Light-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/fonts/open-sans/OpenSans-Light-webfont.woff) format("woff"), url(../valo/fonts/open-sans/OpenSans-Light-webfont.ttf) format("truetype"); - font-weight: 300; - font-style: normal; -} - -@font-face { - font-family: "Open Sans"; - src: url(../valo/fonts/open-sans/OpenSans-Regular-webfont.eot); - src: url(../valo/fonts/open-sans/OpenSans-Regular-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/fonts/open-sans/OpenSans-Regular-webfont.woff) format("woff"), url(../valo/fonts/open-sans/OpenSans-Regular-webfont.ttf) format("truetype"); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: "Open Sans"; - src: url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.eot); - src: url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.woff) format("woff"), url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.ttf) format("truetype"); - font-weight: 600; - font-style: normal; -} - -@-webkit-keyframes v-rotate-360 { - to { - -webkit-transform: rotate(360deg); - } - } - -@-moz-keyframes v-rotate-360 { - to { - -moz-transform: rotate(360deg); - } - } - -@-o-keyframes v-rotate-360 { - to { - -o-transform: rotate(360deg); - } - } - -@keyframes v-rotate-360 { - to { - transform: rotate(360deg); - } - } - -@-webkit-keyframes v-progress-start { - 0% { - width: 0%; - } - 100% { - width: 50%; - } - } - -@-moz-keyframes v-progress-start { - 0% { - width: 0%; - } - 100% { - width: 50%; - } - } - -@keyframes v-progress-start { - 0% { - width: 0%; - } - 100% { - width: 50%; - } - } - -@-webkit-keyframes v-progress-delay { - 0% { - width: 50%; - } - 100% { - width: 90%; - } - } - -@-moz-keyframes v-progress-delay { - 0% { - width: 50%; - } - 100% { - width: 90%; - } - } - -@keyframes v-progress-delay { - 0% { - width: 50%; - } - 100% { - width: 90%; - } - } - -@-webkit-keyframes v-progress-wait { - 0% { - width: 90%; - height: 4px; - } - 3% { - width: 91%; - height: 7px; - } - 100% { - width: 96%; - height: 7px; - } - } - -@-moz-keyframes v-progress-wait { - 0% { - width: 90%; - height: 4px; - } - 3% { - width: 91%; - height: 7px; - } - 100% { - width: 96%; - height: 7px; - } - } - -@keyframes v-progress-wait { - 0% { - width: 90%; - height: 4px; - } - 3% { - width: 91%; - height: 7px; - } - 100% { - width: 96%; - height: 7px; - } - } - -@-webkit-keyframes v-progress-wait-pulse { - 0% { - opacity: 1; - } - 50% { - opacity: 0.1; - } - 100% { - opacity: 1; - } - } - -@-moz-keyframes v-progress-wait-pulse { - 0% { - opacity: 1; - } - 50% { - opacity: 0.1; - } - 100% { - opacity: 1; - } - } - -@keyframes v-progress-wait-pulse { - 0% { - opacity: 1; - } - 50% { - opacity: 0.1; - } - 100% { - opacity: 1; - } - } - -/** - * Outputs the context menu selectors and styles, which is used by Table and Tree for instance. - * - * @requires {mixin} valo-selection-item-style - * @requires {mixin} valo-selection-item-selected-style - */ - -/** - * The background color for overlay elements. - * - * @type color - * @group overlay - */ - -.v-shadow, .v-shadow-window { - display: none; -} - -.v-ie8 .v-shadow, .v-ie8 .v-shadow-window { - display: block; -} - -.v-ie8 .v-shadow .top, .v-ie8 .v-shadow-window .top { - position: absolute; - top: -6px; - right: 10px; - bottom: 6px; - left: -10px; - background: black; - filter: alpha(opacity=5) progid:DXImageTransform.Microsoft.blur(pixelradius=10, makeShadow=false); -} - -.v-ie8 .v-shadow .top-left, .v-ie8 .v-shadow-window .top-left { - position: absolute; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; - background: black; - filter: alpha(opacity=9) progid:DXImageTransform.Microsoft.blur(pixelradius=0, makeShadow=false); -} - -/** - * The backgound color for tooltips. - * - * @type color - * @group tooltip - */ - -/** - * - * - * @param {string} $primary-stylename (v-absolutelayout) - - * - * @group absolutelayout - */ - -/** - * Outputs the selectors and properties for the Accordion component. - * - * @param {string} $primary-stylename (v-accordion) - the primary style name for the selectors - * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component - * @group accordion - */ - -/** - * Outputs the selectors and properties for the Button component. - * - * @param {string} $primary-stylename (v-button) - the primary style name for the selectors - * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component - * - * @group button - */ - -/** - * A list of colors for custom event colors. Can be an empty list of you don't - * need any custom event colors. - * - * @example javascript - * // Java code - * // 'event' is an instance of EditableCalendarEvent - * event.setStyleName("color1"); // 1st color in the list - * event.setStyleName("color2"); // 2nd color in the list - * // etc. - * - * @group calendar - */ - -/** - * Outputs the selectors and properties for the CheckBox component. - * - * @param {string} $primary-stylename (v-checkbox) - the primary style name for the selectors - * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component - * - * @group checkbox - */ - -/** - * Outputs the global selectors and properties for the ColorPicker component - styles which are - * considered mandatory for the component to work properly. - * - * @param {string} $primary-stylename (v-colorpicker) - the primary style name for the selectors - * - * @group colorpicker - */ - -/** - * Outputs the selectors and properties for the ComboBox component. - * - * @param {string} $primary-stylename (v-filterselect) - the primary style name for the selectors - * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component - * - * @group combobox - */ - -/** - * The amount of spacing between different widgets in a component group. - * If null, a computed value is used ($v-border size * -1, or 1px if $v-border size is 0) - * - * @group csslayout - */ - -/** - * - * - * @param {string} $primary-stylename (v-customcomponent) - - * - * @group customcomponent - */ - -/** - * - * - * @param {string} $primary-stylename (v-customlayout) - - * - * @group customlayout - */ - -/** - * Outputs the selectors and properties for the DateField component. - * - * @param {string} $primary-stylename (v-datefield) - the primary style name for the selectors - * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component - * - * @group datefield - */ - -/** - * Outputs the styles and selectors for the DragAndDropWrapper component. - * - * @param {string} $primary-stylename (v-ddwrapper) - the primary style name for the selectors - * - * @group drag-n-drop - */ - -/** - * - * - * @param {string} $primary-stylename (v-form) - - * - * @group form - */ - -/** - * Outputs the selectors and properties for the FormLayout component. - * - * @param {string} $primary-stylename (v-formlayout) - the primary style name for the selectors - * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component - * - * @group formlayout - */ - -/** - * - * @group table - */ - -@-webkit-keyframes valo-grid-editor-footer-animate-in { - 0% { - margin-top: -37px; - } - } - -@-moz-keyframes valo-grid-editor-footer-animate-in { - 0% { - margin-top: -37px; - } - } - -@keyframes valo-grid-editor-footer-animate-in { - 0% { - margin-top: -37px; - } - } - -@-webkit-keyframes valo-grid-editor-footer-animate-in-alt { - 0% { - margin-bottom: -38px; - } - 100% { - margin-bottom: -1px; - } - } - -@-moz-keyframes valo-grid-editor-footer-animate-in-alt { - 0% { - margin-bottom: -38px; - } - 100% { - margin-bottom: -1px; - } - } - -@keyframes valo-grid-editor-footer-animate-in-alt { - 0% { - margin-bottom: -38px; - } - 100% { - margin-bottom: -1px; - } - } - -/** - * - * - * @param {string} $primary-stylename (v-gridlayout) - - * - * @group gridlayout - */ - -/** - * The font weight for headers. - * - * @group label - */ - -/** - * - * @group link - */ - -/** - * - * - * @param {string} $primary-stylename (v-loginform) - - * - * @group loginform - */ - -/** - * - * - * @param {string} $primary-stylename (v-menubar) - - * @param {bool} $include-additional-styles - - * - * @group menubar - */ - -/** - * - * - * @param {string} $primary-stylename (v-nativebutton) - - * - * @group nativebutton - */ - -/** - * - * - * @param {string} $primary-stylename (v-select) - - * - * @group nativeselect - */ - -/** - * - * @group notification - */ - -/** - * - * - * @param {string} $primary-stylename (v-select-optiongroup) - - * @param {bool} $include-additional-styles - - * - * @group optiongroup - */ - -/** - * - * - * - * @group orderedlayout - */ - -/** - * - * @group panel - */ - -@-webkit-keyframes v-popupview-animate-in { - 0% { - -webkit-transform: scale(0); - } - } - -@-moz-keyframes v-popupview-animate-in { - 0% { - -moz-transform: scale(0); - } - } - -@keyframes v-popupview-animate-in { - 0% { - -webkit-transform: scale(0); - -moz-transform: scale(0); - -ms-transform: scale(0); - -o-transform: scale(0); - transform: scale(0); - } - } - -/** - * - * @group progressbar - */ - -/** - * - * @group richtextarea - */ - -/** - * - * @group slider - */ - -/** - * - * - * @param {string} $primary-stylename (v-splitpanel) - - * @param {bool} $include-additional-styles - - * - * @group splitpanel - */ - -/** - * - * @group table - */ - -/** - * Should the tabsheet content changes be animated. - * - * @group tabsheet - */ - -/** - * The background color for text fields. - * @group textfield - */ - -/** - * Outputs the selectors and properties for the TextArea component. - * - * @param {string} $primary-stylename (v-textarea) - the primary style name for the selectors - * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component - * - * @group textarea - */ - -/** - * - * @group tree - */ - -/** - * - * - * @param {string} $primary-stylename (v-treetable) - - * - * @group treetable - */ - -/** - * - * - * @param {string} $primary-stylename (v-select-twincol) - - * - * @group twin-column-select - */ - -/** - * - * - * @param {string} $primary-stylename (v-upload) - - * - * @group upload - */ - -/** - * - */ - -/** - * @group window - */ - -@-webkit-keyframes valo-modal-window-indication { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } - } - -@-moz-keyframes valo-modal-window-indication { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } - } - -@keyframes valo-modal-window-indication { - 0% { - opacity: 0; - } - 100% { - opacity: 1; - } - } - -@-webkit-keyframes valo-animate-out-scale-down-fade { - 100% { - -webkit-transform: scale(0.8); - opacity: 0; - } - } - -@-moz-keyframes valo-animate-out-scale-down-fade { - 100% { - -moz-transform: scale(0.8); - opacity: 0; - } - } - -@keyframes valo-animate-out-scale-down-fade { - 100% { - -webkit-transform: scale(0.8); - -moz-transform: scale(0.8); - -ms-transform: scale(0.8); - -o-transform: scale(0.8); - transform: scale(0.8); - opacity: 0; - } - } - -/** - * @group valo-menu - */ - -.v-vaadin-version:after { - content: "7.7.10"; -} - -.v-widget { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - display: inline-block; - vertical-align: top; - text-align: left; - white-space: normal; -} - -.v-generated-body { - overflow: hidden; - margin: 0; - padding: 0; - border: 0; -} - -.v-app { - height: 100%; - -webkit-tap-highlight-color: transparent; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; - -webkit-text-size-adjust: 100%; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.v-app input[type="text"], .v-app .v-slot > .v-caption, .v-app .v-gridlayout-slot > .v-caption, .v-app .v-has-caption > .v-caption, .v-app .v-formlayout-captioncell > .v-caption, .v-app .v-csslayout > .v-caption { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.v-app input::-ms-clear { - display: none; -} - -.v-ui { - position: relative; -} - -.v-ui.v-ui-embedded { - margin-top: -1px; - border-top: 1px solid transparent; -} - -.v-ui:focus { - outline: none; -} - -.v-overlay-container { - width: 0; - height: 0; -} - -.v-drag-element { - z-index: 60000; - position: absolute !important; - cursor: default; -} - -.v-clip { - overflow: hidden; -} - -.v-scrollable { - overflow: auto; -} - -.v-scrollable > .v-widget { - vertical-align: middle; - overflow: hidden; -} - -.v-ios.v-webkit .v-scrollable { - -webkit-overflow-scrolling: touch; -} - -.v-ios5.v-webkit .v-scrollable { - -webkit-overflow-scrolling: none; -} - -.v-webkit.v-ios .v-browserframe { - -webkit-overflow-scrolling: touch; - overflow: auto; -} - -.v-assistive-device-only { - position: absolute; - top: -2000px; - left: -2000px; - width: 10px; - overflow: hidden; -} - -.v-icon { - cursor: inherit; - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.v-icon, .v-errorindicator, .v-required-field-indicator { - display: inline-block; - line-height: inherit; -} - -.v-caption { - display: inline-block; - white-space: nowrap; - line-height: 1.55; -} - -.v-captiontext { - display: inline-block; - line-height: inherit; -} - -div.v-layout.v-horizontal.v-widget { - white-space: nowrap; -} - -.v-layout.v-vertical > .v-expand, .v-layout.v-horizontal > .v-expand { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - height: 100%; -} - -.v-slot, .v-spacing { - display: inline-block; - white-space: nowrap; - vertical-align: top; -} - -.v-vertical > .v-slot:after { - display: inline-block; - clear: both; - width: 0; - height: 0; - overflow: hidden; -} - -.v-vertical > .v-slot, .v-vertical > .v-expand > .v-slot { - display: block; - clear: both; -} - -.v-horizontal > .v-slot, .v-horizontal > .v-expand > .v-slot { - height: 100%; -} - -.v-horizontal > .v-expand > .v-slot { - position: relative; -} - -.v-vertical > .v-spacing, .v-vertical > .v-expand > .v-spacing { - width: 0 !important; - display: block; - clear: both; -} - -.v-horizontal > .v-spacing, .v-horizontal > .v-expand > .v-spacing { - height: 0 !important; -} - -.v-align-middle:before, .v-align-bottom:before, .v-expand > .v-align-middle:before, .v-expand > .v-align-bottom:before { - content: ""; - display: inline-block; - height: 100%; - vertical-align: middle; - width: 0; -} - -.v-align-middle, .v-align-bottom { - white-space: nowrap; -} - -.v-align-middle > .v-widget, .v-align-bottom > .v-widget { - display: inline-block; -} - -.v-align-middle, .v-align-middle > .v-widget { - vertical-align: middle; -} - -.v-align-bottom, .v-align-bottom > .v-widget { - vertical-align: bottom; -} - -.v-align-center { - text-align: center; -} - -.v-align-center > .v-widget { - margin-left: auto; - margin-right: auto; -} - -.v-align-right { - text-align: right; -} - -.v-align-right > .v-widget { - margin-left: auto; -} - -.v-has-caption, .v-has-caption > .v-caption { - display: inline-block; -} - -.v-caption-on-left, .v-caption-on-right { - white-space: nowrap; -} - -.v-caption-on-top > .v-caption, .v-caption-on-bottom > .v-caption { - display: block; -} - -.v-caption-on-left > .v-caption { - padding-right: 0.5em; -} - -.v-caption-on-left > .v-widget, .v-caption-on-right > .v-widget { - display: inline-block; -} - -.v-has-caption.v-has-width > .v-widget { - width: 100% !important; -} - -.v-has-caption.v-has-height > .v-widget { - height: 100% !important; -} - -.v-gridlayout { - position: relative; -} - -.v-gridlayout-slot { - position: absolute; - line-height: 1.55; -} - -.v-gridlayout-spacing-on { - overflow: hidden; -} - -.v-gridlayout-spacing, .v-gridlayout-spacing-off { - padding-left: 0; - padding-top: 0; -} - -.v-gridlayout-spacing-off { - overflow: hidden; -} - -.v-calendar-month-day-scrollable { - overflow-y: scroll; -} - -.v-calendar-week-wrapper { - position: relative; - overflow: hidden; -} - -.v-calendar-current-time { - position: absolute; - left: 0; - width: 100%; - height: 1px; - background: red; - z-index: 2; -} - -.v-calendar-event-resizetop, .v-calendar-event-resizebottom { - position: absolute; - height: 5%; - min-height: 3px; - width: 100%; - z-index: 1; -} - -.v-calendar-event-resizetop { - cursor: row-resize; - top: 0; -} - -.v-calendar-event-resizebottom { - cursor: row-resize; - bottom: 0; -} - -.v-calendar-header-month td:first-child { - padding-left: 20px; -} - -.v-calendar-month-sizedheight .v-calendar-month-day { - height: 100px; -} - -.v-calendar-month-sizedwidth .v-calendar-month-day { - width: 100px; -} - -.v-calendar-header-month-Hsized .v-calendar-header-day { - width: 101px; -} - -.v-calendar-header-month-Hsized td:first-child { - padding-left: 21px; -} - -.v-calendar-header-day-Hsized { - width: 200px; -} - -.v-calendar-week-numbers-Vsized .v-calendar-week-number { - height: 100px; - line-height: 100px; -} - -.v-calendar-week-wrapper-Vsized { - height: 400px; - overflow-x: hidden !important; -} - -.v-calendar-times-Vsized .v-calendar-time { - height: 38px; -} - -.v-calendar-times-Hsized .v-calendar-time { - width: 42px; -} - -.v-calendar-day-times-Vsized .v-datecellslot, .v-calendar-day-times-Vsized .v-datecellslot-even { - height: 18px; -} - -.v-calendar-day-times-Hsized, .v-calendar-day-times-Hsized .v-datecellslot, .v-calendar-day-times-Hsized .v-datecellslot-even { - width: 200px; -} - -.v-colorpicker-popup.v-window { - min-width: 220px !important; -} - -.v-colorpicker-gradient-container { - overflow: visible !important; -} - -.v-colorpicker-gradient-clicklayer { - opacity: 0; - filter: alpha(opacity=0) ; -} - -.rgb-gradient .v-colorpicker-gradient-background { - background: url(../valo/components/img/colorpicker/gradient2.png); -} - -.hsv-gradient .v-colorpicker-gradient-foreground { - background: url(../valo/components/img/colorpicker/gradient.png); -} - -.v-colorpicker-gradient-higherbox:before { - content: ""; - width: 11px; - height: 11px; - border-radius: 7px; - border: 1px solid #fff; - -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3); - box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3); - position: absolute; - bottom: -6px; - left: -6px; -} - -.v-colorpicker-popup .v-slider.v-slider-red:before { - background-color: red; -} - -.v-colorpicker-popup .v-slider.v-slider-green:before { - background-color: green; -} - -.v-colorpicker-popup .v-slider.v-slider-blue:before { - background-color: blue; -} - -.v-colorpicker-popup .v-slider.hue-slider:before { - background: url(../valo/components/img/colorpicker/slider_hue_bg.png); -} - -.v-colorpicker-popup input.v-textfield-dark { - color: #fff; -} - -.v-colorpicker-popup input.v-textfield-light { - color: #000; -} - -.v-colorpicker-grid { - height: 319px; -} - -.v-colorpicker-popup .colorselect td { - line-height: 15px; -} - -.v-table-header table, .v-table-footer table, .v-table-table { - border-spacing: 0; - border-collapse: separate; - margin: 0; - padding: 0; - border: 0; - line-height: 1.55; -} - -.v-table-resizer, .v-table-sort-indicator { - float: right; -} - -.v-table-caption-container-align-center { - text-align: center; -} - -.v-table-caption-container-align-right { - text-align: right; -} - -.v-table-header td, .v-table-footer td, .v-table-cell-content { - padding: 0; -} - -.v-table-sort-indicator { - width: 0; -} - -.v-tabsheet-hidetabs > .v-tabsheet-tabcontainer, .v-tabsheet-spacertd, .v-disabled .v-tabsheet-scroller, .v-tabsheet .v-disabled .v-tabsheet-caption-close { - display: none; -} - -.v-tabsheet { - overflow: visible !important; - position: relative; -} - -.v-tabsheet-tabcontainer table, .v-tabsheet-tabcontainer tbody, .v-tabsheet-tabcontainer tr { - display: inline-block; - border-spacing: 0; - border-collapse: collapse; - vertical-align: top; -} - -.v-tabsheet-tabcontainer td { - display: inline-block; - padding: 0; -} - -.v-tabsheet-tabs { - white-space: nowrap; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.v-tabsheet-content { - position: relative; -} - -.v-tabsheet-content > div > .v-scrollable > .v-margin-top { - padding-top: 12px; -} - -.v-tabsheet-content > div > .v-scrollable > .v-margin-right { - padding-right: 12px; -} - -.v-tabsheet-content > div > .v-scrollable > .v-margin-bottom { - padding-bottom: 12px; -} - -.v-tabsheet-content > div > .v-scrollable > .v-margin-left { - padding-left: 12px; -} - -.v-splitpanel-vertical, .v-splitpanel-horizontal { - overflow: hidden; - white-space: nowrap; -} - -.v-splitpanel-hsplitter { - z-index: 100; - cursor: e-resize; - cursor: col-resize; -} - -.v-splitpanel-vsplitter { - z-index: 100; - cursor: s-resize; - cursor: row-resize; -} - -.v-splitpanel-hsplitter:after, .v-splitpanel-vsplitter:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.v-splitpanel-hsplitter div, .v-splitpanel-vsplitter div { - width: inherit; - height: inherit; - overflow: hidden; - position: relative; -} - -.v-splitpanel-hsplitter div:before, .v-splitpanel-vsplitter div:before { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.v-disabled [class$="splitter"] div { - cursor: default; -} - -.v-disabled [class$="splitter"] div:before { - display: none; -} - -.v-splitpanel-horizontal > div > .v-splitpanel-second-container { - position: static !important; - display: inline-block; - vertical-align: top; -} - -.v-splitpanel-horizontal > div > .v-splitpanel-first-container { - display: inline-block; - vertical-align: top; -} - -.mytheme.v-app, .mytheme.v-app-loading { - font: 300 16px/1.55 "Open Sans", sans-serif; - color: #464646; - background-color: #fafafa; - cursor: default; -} - -.mytheme .v-app-loading { - width: 100%; - height: 100%; - background: #fafafa; -} - -.mytheme .v-app-loading:before { - content: ""; - position: fixed; - z-index: 100; - top: 45%; - left: 50%; - width: 28px; - height: 28px; - padding: 9px; - margin-top: -24px; - margin-left: -24px; - background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50%; - border-radius: 4px; -} - -.mytheme .v-loading-indicator { - position: fixed !important; - z-index: 99999; - left: 0; - right: auto; - top: 0; - width: 50%; - opacity: 1; - height: 4px; - background-color: #197de1; - pointer-events: none; - -webkit-transition: none; - -moz-transition: none; - transition: none; - -webkit-animation: v-progress-start 1000ms 200ms both; - -moz-animation: v-progress-start 1000ms 200ms both; - animation: v-progress-start 1000ms 200ms both; -} - -.mytheme .v-loading-indicator[style*="none"] { - display: block !important; - width: 100% !important; - opacity: 0; - -webkit-animation: none; - -moz-animation: none; - animation: none; - -webkit-transition: opacity 500ms 300ms, width 300ms; - -moz-transition: opacity 500ms 300ms, width 300ms; - transition: opacity 500ms 300ms, width 300ms; -} - -.mytheme .v-loading-indicator-delay { - width: 90%; - -webkit-animation: v-progress-delay 3.8s forwards; - -moz-animation: v-progress-delay 3.8s forwards; - animation: v-progress-delay 3.8s forwards; -} - -.v-ff .mytheme .v-loading-indicator-delay { - width: 50%; -} - -.mytheme .v-loading-indicator-wait { - width: 96%; - -webkit-animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards; - -moz-animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards; - animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards; -} - -.v-ff .mytheme .v-loading-indicator-wait { - width: 90%; -} - -.v-ie8 .mytheme .v-loading-indicator, .v-ie8 .mytheme .v-loading-indicator-delay, .v-ie8 .mytheme .v-loading-indicator-wait, .v-ie9 .mytheme .v-loading-indicator, .v-ie9 .mytheme .v-loading-indicator-delay, .v-ie9 .mytheme .v-loading-indicator-wait { - width: 28px !important; - height: 28px; - padding: 9px; - background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50%; - border-radius: 4px; - top: 9px; - right: 9px; - left: auto; - filter: alpha(opacity=50); -} - -.v-ie8 .mytheme .v-loading-indicator[style*="none"], .v-ie8 .mytheme .v-loading-indicator-delay[style*="none"], .v-ie8 .mytheme .v-loading-indicator-wait[style*="none"], .v-ie9 .mytheme .v-loading-indicator[style*="none"], .v-ie9 .mytheme .v-loading-indicator-delay[style*="none"], .v-ie9 .mytheme .v-loading-indicator-wait[style*="none"] { - display: none !important; -} - -.v-ie8 .mytheme .v-loading-indicator-wait, .v-ie9 .mytheme .v-loading-indicator-wait { - filter: alpha(opacity=100); -} - -.mytheme .v-scrollable:focus { - outline: none; -} - -.mytheme img.v-icon { - vertical-align: middle; -} - -.mytheme .v-caption { - font-size: 14px; - font-weight: 400; - padding-bottom: 0.3em; - padding-left: 1px; -} - -.mytheme .v-caption-on-left .v-caption, .mytheme .v-caption-on-right .v-caption { - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-icon + .v-captiontext, .mytheme .v-icon + span { - margin-left: 7px; -} - -.mytheme .v-icon + .v-captiontext:empty, .mytheme .v-icon + span:empty { - margin-left: 0; -} - -.mytheme .v-errorindicator { - color: #ed473b; - font-weight: 600; - width: 19px; - text-align: center; -} - -.mytheme .v-errorindicator:before { - content: "!"; -} - -.mytheme .v-required-field-indicator { - color: #ed473b; - padding: 0 0.2em; -} - -.mytheme select { - font: inherit; - font-weight: 400; - line-height: inherit; - padding: 5px; - margin: 0; - border-radius: 4px; - border: 1px solid #c5c5c5; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - color: #464646; -} - -.mytheme select:focus { - outline: none; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme button { - font: inherit; - font-weight: 400; - line-height: 1.55; -} - -.mytheme a { - cursor: pointer; - color: #197de1; - text-decoration: underline; - font-weight: inherit; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme a:hover { - color: #4396ea; -} - -.mytheme a.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-disabled { - cursor: default !important; -} - -.mytheme .v-drag-element { - background: #fafafa; - color: #464646; - -webkit-box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - border-radius: 4px; - overflow: hidden; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-tooltip { - background-color: #323232; - background-color: rgba(50, 50, 50, 0.9); - -webkit-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); - box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); - color: white; - padding: 5px 9px; - border-radius: 3px; - max-width: 35em; - overflow: hidden !important; - font-size: 14px; -} - -.mytheme .v-tooltip div[style*="width"] { - width: auto !important; -} - -.mytheme .v-tooltip .v-errormessage { - background-color: white; - background-color: #fff; - color: #ed473b; - margin: -5px -9px; - padding: 5px 9px; - max-height: 10em; - overflow: auto; - font-weight: 400; -} - -.mytheme .v-tooltip .v-errormessage h2:only-child { - font: inherit; - line-height: inherit; -} - -.mytheme .v-tooltip .v-tooltip-text { - max-height: 10em; - overflow: auto; - margin-top: 10px; -} - -.mytheme .v-tooltip .v-errormessage[aria-hidden="true"] + .v-tooltip-text { - margin-top: 0; -} - -.mytheme .v-tooltip h1, .mytheme .v-tooltip h2, .mytheme .v-tooltip h3, .mytheme .v-tooltip h4 { - color: inherit; -} - -.mytheme .v-contextmenu { - padding: 4px 4px; - border-radius: 4px; - background-color: white; - color: #474747; - -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - padding: 4px 4px; -} - -.mytheme .v-contextmenu[class*="animate-in"] { - -webkit-animation: valo-overlay-animate-in 120ms; - -moz-animation: valo-overlay-animate-in 120ms; - animation: valo-overlay-animate-in 120ms; -} - -.mytheme .v-contextmenu[class*="animate-out"] { - -webkit-animation: valo-animate-out-fade 120ms; - -moz-animation: valo-animate-out-fade 120ms; - animation: valo-animate-out-fade 120ms; -} - -.mytheme .v-contextmenu table { - border-spacing: 0; -} - -.mytheme .v-contextmenu .gwt-MenuItem { - cursor: pointer; - line-height: 27px; - padding: 0 20px 0 10px; - border-radius: 3px; - font-weight: 400; - white-space: nowrap; - position: relative; - display: block; -} - -.mytheme .v-contextmenu .gwt-MenuItem:active:before { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: #0957a6; - opacity: 0.15; - filter: alpha(opacity=15.0) ; - pointer-events: none; - border-radius: inherit; -} - -.mytheme .v-contextmenu .gwt-MenuItem .v-icon { - max-height: 27px; - margin-right: 5px; - min-width: 1em; -} - -.mytheme .v-contextmenu .gwt-MenuItem-selected { - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - color: #ecf2f8; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); -} - -.mytheme .v-reconnect-dialog { - color: white; - top: 12px; - right: 12px; - max-width: 100%; - border-radius: 0; - -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); - padding: 12px 15px; - background-color: #444; - background-color: rgba(68, 68, 68, 0.9); - line-height: 22px; - text-align: center; -} - -.mytheme .v-reconnect-dialog .text { - display: inline-block; - padding-left: 10px; -} - -.mytheme .v-reconnect-dialog .spinner { - height: 24px !important; - width: 24px !important; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - border: 2px solid rgba(25, 125, 225, 0.2); - border-top-color: #197de1; - border-right-color: #197de1; - border-radius: 100%; - -webkit-animation: v-rotate-360 500ms infinite linear; - -moz-animation: v-rotate-360 500ms infinite linear; - animation: v-rotate-360 500ms infinite linear; - pointer-events: none; - display: none; - vertical-align: middle; -} - -.v-ie8 .mytheme .v-reconnect-dialog .spinner, .v-ie9 .mytheme .v-reconnect-dialog .spinner { - border: none; - border-radius: 4px; - background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; - background-size: 80%; -} - -.v-ie8 .mytheme .v-reconnect-dialog .spinner { - min-width: 30px; - min-height: 30px; -} - -.mytheme .v-reconnect-dialog.active .spinner { - display: inline-block; -} - -.mytheme .v-absolutelayout-wrapper { - position: absolute; -} - -.mytheme .v-absolutelayout-margin, .mytheme .v-absolutelayout-canvas { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mytheme .v-absolutelayout.v-has-height > div, .mytheme .v-absolutelayout.v-has-height .v-absolutelayout-margin { - height: 100%; -} - -.mytheme .v-absolutelayout.v-has-height > div, .mytheme .v-absolutelayout.v-has-width .v-absolutelayout-margin { - width: 100%; -} - -.mytheme .v-margin-top { - padding-top: 37px; -} - -.mytheme .v-margin-right { - padding-right: 37px; -} - -.mytheme .v-margin-bottom { - padding-bottom: 37px; -} - -.mytheme .v-margin-left { - padding-left: 37px; -} - -.mytheme .v-spacing { - width: 12px; - height: 12px; -} - -.mytheme .v-verticallayout-well, .mytheme .v-horizontallayout-well { - background: #f5f5f5; - color: #454545; - -webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); - border-radius: 4px; - border: 1px solid #c5c5c5; -} - -.mytheme .v-verticallayout-well > div > [class*="-caption"], .mytheme .v-horizontallayout-well > div > [class*="-caption"] { - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-verticallayout-well > .v-margin-top, .mytheme .v-horizontallayout-well > .v-margin-top { - padding-top: 12px; -} - -.mytheme .v-verticallayout-well > .v-margin-right, .mytheme .v-horizontallayout-well > .v-margin-right { - padding-right: 12px; -} - -.mytheme .v-verticallayout-well > .v-margin-bottom, .mytheme .v-horizontallayout-well > .v-margin-bottom { - padding-bottom: 12px; -} - -.mytheme .v-verticallayout-well > .v-margin-left, .mytheme .v-horizontallayout-well > .v-margin-left { - padding-left: 12px; -} - -.mytheme .v-verticallayout-card, .mytheme .v-horizontallayout-card { - background: white; - color: #474747; - border-radius: 4px; - border: 1px solid #d5d5d5; - -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); -} - -.mytheme .v-verticallayout-card > .v-margin-top, .mytheme .v-horizontallayout-card > .v-margin-top { - padding-top: 12px; -} - -.mytheme .v-verticallayout-card > .v-margin-right, .mytheme .v-horizontallayout-card > .v-margin-right { - padding-right: 12px; -} - -.mytheme .v-verticallayout-card > .v-margin-bottom, .mytheme .v-horizontallayout-card > .v-margin-bottom { - padding-bottom: 12px; -} - -.mytheme .v-verticallayout-card > .v-margin-left, .mytheme .v-horizontallayout-card > .v-margin-left { - padding-left: 12px; -} - -.mytheme .v-horizontallayout-wrapping { - white-space: normal !important; -} - -.mytheme .v-horizontallayout-wrapping > .v-spacing + .v-slot, .mytheme .v-horizontallayout-wrapping > .v-slot:first-child { - margin-bottom: 12px; -} - -.mytheme .v-horizontallayout-wrapping > .v-slot:first-child:last-child { - margin-bottom: 0; -} - -.mytheme .v-button { - position: relative; - text-align: center; - white-space: nowrap; - outline: none; - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - height: 37px; - padding: 0 16px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); -} - -.mytheme .v-button:before { - content: ""; - display: inline-block; - width: 0; - height: 100%; - vertical-align: middle; -} - -.mytheme .v-button > div { - vertical-align: middle; -} - -.v-sa .mytheme .v-button:before { - height: 110%; -} - -.v-ff .mytheme .v-button:before { - height: 107%; -} - -.v-ie .mytheme .v-button:before { - margin-top: 4px; -} - -.mytheme .v-button:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; -} - -.mytheme .v-button:focus:after { - -webkit-transition: none; - -moz-transition: none; - transition: none; -} - -.mytheme .v-button.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-button.v-disabled:after { - display: none; -} - -.mytheme .v-button:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-button:hover:after { - background-color: rgba(186, 186, 186, 0.1); -} - -.mytheme .v-button:focus:after { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-button:active:after { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-button-primary { - height: 37px; - padding: 0 16px; - color: #ecf2f8; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #1362b1; - border-top-color: #156ab3; - border-bottom-color: #1156a8; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - -webkit-box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); - padding: 0 19px; - font-weight: bold; - min-width: 81px; -} - -.mytheme .v-button-primary:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-button-primary:hover:after { - background-color: rgba(90, 163, 237, 0.1); -} - -.mytheme .v-button-primary:focus:after { - border: inherit; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-button-primary:active:after { - background-color: rgba(2, 62, 122, 0.2); -} - -.v-ie8 .mytheme .v-button-primary { - min-width: 43px; -} - -.mytheme .v-button-friendly { - height: 37px; - padding: 0 16px; - color: #eaf4e9; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #227719; - border-top-color: #257d1a; - border-bottom-color: #1e6b15; - background-color: #2c9720; - background-image: -webkit-linear-gradient(top, #2f9f22 2%, #26881b 98%); - background-image: linear-gradient(to bottom,#2f9f22 2%, #26881b 98%); - -webkit-box-shadow: inset 0 1px 0 #46b33a, inset 0 -1px 0 #26811b, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 #46b33a, inset 0 -1px 0 #26811b, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); -} - -.mytheme .v-button-friendly:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-button-friendly:hover:after { - background-color: rgba(65, 211, 48, 0.1); -} - -.mytheme .v-button-friendly:focus:after { - border: inherit; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-button-friendly:active:after { - background-color: rgba(14, 86, 6, 0.2); -} - -.mytheme .v-button-danger { - height: 37px; - padding: 0 16px; - color: #f9f0ef; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #bb382e; - border-top-color: #bc3c31; - border-bottom-color: #b13028; - background-color: #ed473b; - background-image: -webkit-linear-gradient(top, #ee4c3f 2%, #e13e33 98%); - background-image: linear-gradient(to bottom,#ee4c3f 2%, #e13e33 98%); - -webkit-box-shadow: inset 0 1px 0 #ef786f, inset 0 -1px 0 #da3c31, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 #ef786f, inset 0 -1px 0 #da3c31, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); -} - -.mytheme .v-button-danger:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-button-danger:hover:after { - background-color: rgba(243, 137, 129, 0.1); -} - -.mytheme .v-button-danger:focus:after { - border: inherit; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-button-danger:active:after { - background-color: rgba(146, 12, 2, 0.2); -} - -.mytheme .v-button-borderless { - border: none; - -webkit-box-shadow: none; - box-shadow: none; - background: transparent; - color: inherit; -} - -.mytheme .v-button-borderless:hover:after { - background: transparent; -} - -.mytheme .v-button-borderless:active { - opacity: 0.7; - filter: alpha(opacity=70) ; -} - -.mytheme .v-button-borderless:active:after { - background: transparent; -} - -.mytheme .v-button-borderless-colored { - border: none; - -webkit-box-shadow: none; - box-shadow: none; - background: transparent; - color: #197de1; -} - -.mytheme .v-button-borderless-colored:hover { - color: #4396ea; -} - -.mytheme .v-button-borderless-colored:hover:after { - background: transparent; -} - -.mytheme .v-button-borderless-colored:active { - opacity: 0.7; - filter: alpha(opacity=70) ; -} - -.mytheme .v-button-borderless-colored:active:after { - background: transparent; -} - -.mytheme .v-button-quiet { - visibility: hidden; -} - -.mytheme .v-button-quiet:focus, .mytheme .v-button-quiet:hover { - visibility: visible; -} - -.mytheme .v-button-quiet [class*="wrap"] { - visibility: visible; -} - -.mytheme .v-button-quiet [class*="caption"] { - display: inline-block; -} - -.mytheme .v-button-link { - border: none; - -webkit-box-shadow: none; - box-shadow: none; - background: transparent; - color: inherit; - cursor: pointer; - color: #197de1; - text-decoration: underline; - font-weight: inherit; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-button-link:hover:after { - background: transparent; -} - -.mytheme .v-button-link:active { - opacity: 0.7; - filter: alpha(opacity=70) ; -} - -.mytheme .v-button-link:active:after { - background: transparent; -} - -.mytheme .v-button-link:hover { - color: #4396ea; -} - -.mytheme .v-button-link.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-button-tiny { - height: 28px; - padding: 0 13px; - - - font-size: 12px; - - border-radius: 4px; -} - -.mytheme .v-button-tiny:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-button-small { - height: 31px; - padding: 0 14px; - - - font-size: 14px; - - border-radius: 4px; -} - -.mytheme .v-button-small:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-button-large { - height: 44px; - padding: 0 19px; - - - font-size: 20px; - - border-radius: 4px; -} - -.mytheme .v-button-large:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-button-huge { - height: 59px; - padding: 0 26px; - - - font-size: 26px; - - border-radius: 4px; -} - -.mytheme .v-button-huge:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-button-icon-align-right [class*="wrap"] { - display: inline-block; -} - -.mytheme .v-button-icon-align-right .v-icon { - float: right; - margin-left: 13px; -} - -.mytheme .v-button-icon-align-right .v-icon + span:not(:empty) { - margin-left: 0; -} - -.mytheme .v-button-icon-align-top { - height: auto; - padding-top: 5px; - padding-bottom: 5px; -} - -.mytheme .v-button-icon-align-top [class*="wrap"] { - display: inline-block; -} - -.mytheme .v-button-icon-align-top .v-icon { - display: block; - margin-left: auto; - margin-right: auto; -} - -.mytheme .v-button-icon-align-top .v-icon + span:not(:empty) { - margin-top: 7px; - margin-left: 0; -} - -.mytheme .v-button-icon-only { - width: 37px; - padding: 0; -} - -.mytheme .v-button-icon-only.v-button-tiny { - width: 28px; -} - -.mytheme .v-button-icon-only.v-button-small { - width: 31px; -} - -.mytheme .v-button-icon-only.v-button-large { - width: 44px; -} - -.mytheme .v-button-icon-only.v-button-huge { - width: 59px; -} - -.mytheme .v-button-icon-only .v-button-caption { - display: none; -} - -.mytheme .v-checkbox { - position: relative; - line-height: 19px; - white-space: nowrap; -} - -.mytheme .v-checkbox.v-has-width label { - white-space: normal; -} - -:root .mytheme .v-checkbox { - padding-left: 25px; -} - -:root .mytheme .v-checkbox label { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - display: inline-block; -} - -:root .mytheme .v-checkbox > input { - position: absolute; - clip: rect(0, 0, 0, 0); - left: 0.2em; - top: 0.2em; - z-index: 0; - margin: 0; -} - -:root .mytheme .v-checkbox > input:focus ~ label:before { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); -} - -:root .mytheme .v-checkbox > input ~ label:before, :root .mytheme .v-checkbox > input ~ label:after { - content: ""; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 19px; - height: 19px; - position: absolute; - top: 0; - left: 0; - border-radius: 4px; - font-size: 13px; - text-align: center; -} - -:root .mytheme .v-checkbox > input ~ label:before { - height: 18.5px; - padding: 0 9px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - padding: 0; - height: 19px; -} - -:root .mytheme .v-checkbox > input ~ label:after { - content: "\f00c"; - font-family: ThemeIcons; - color: transparent; - -webkit-transition: color 100ms; - -moz-transition: color 100ms; - transition: color 100ms; -} - -:root .mytheme .v-checkbox > input:active ~ label:after { - background-color: rgba(125, 125, 125, 0.2); -} - -:root .mytheme .v-checkbox > input:checked ~ label:after { - color: #197de1; -} - -.mytheme .v-checkbox > .v-icon, .mytheme .v-checkbox > label .v-icon { - margin: 0 6px 0 3px; - min-width: 1em; - cursor: pointer; -} - -.mytheme .v-checkbox.v-disabled > label, .mytheme .v-checkbox.v-disabled > .v-icon { - cursor: default; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-checkbox.v-disabled > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-checkbox.v-disabled > input:active ~ label:after { - background: transparent; -} - -.mytheme .v-checkbox.v-readonly > label, .mytheme .v-checkbox.v-readonly > .v-icon { - cursor: default; -} - -.mytheme .v-checkbox.v-readonly > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-checkbox.v-readonly > input:active ~ label:after { - background: transparent; -} - -:root .mytheme .v-checkbox.v-readonly > input ~ label:after { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-checkbox-small { - position: relative; - line-height: 16px; - white-space: nowrap; - font-size: 14px; -} - -.mytheme .v-checkbox-small.v-has-width label { - white-space: normal; -} - -:root .mytheme .v-checkbox-small { - padding-left: 21px; -} - -:root .mytheme .v-checkbox-small label { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - display: inline-block; -} - -:root .mytheme .v-checkbox-small > input { - position: absolute; - clip: rect(0, 0, 0, 0); - left: 0.2em; - top: 0.2em; - z-index: 0; - margin: 0; -} - -:root .mytheme .v-checkbox-small > input:focus ~ label:before { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); -} - -:root .mytheme .v-checkbox-small > input ~ label:before, :root .mytheme .v-checkbox-small > input ~ label:after { - content: ""; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 16px; - height: 16px; - position: absolute; - top: 0; - left: 0; - border-radius: 4px; - font-size: 11px; - text-align: center; -} - -:root .mytheme .v-checkbox-small > input ~ label:before { - height: 15.5px; - padding: 0 7px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - padding: 0; - height: 16px; -} - -:root .mytheme .v-checkbox-small > input ~ label:after { - content: "\f00c"; - font-family: ThemeIcons; - color: transparent; - -webkit-transition: color 100ms; - -moz-transition: color 100ms; - transition: color 100ms; -} - -:root .mytheme .v-checkbox-small > input:active ~ label:after { - background-color: rgba(125, 125, 125, 0.2); -} - -:root .mytheme .v-checkbox-small > input:checked ~ label:after { - color: #197de1; -} - -.mytheme .v-checkbox-small > .v-icon, .mytheme .v-checkbox-small > label .v-icon { - margin: 0 5px 0 3px; - min-width: 1em; - cursor: pointer; -} - -.mytheme .v-checkbox-small.v-disabled > label, .mytheme .v-checkbox-small.v-disabled > .v-icon { - cursor: default; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-checkbox-small.v-disabled > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-checkbox-small.v-disabled > input:active ~ label:after { - background: transparent; -} - -.mytheme .v-checkbox-small.v-readonly > label, .mytheme .v-checkbox-small.v-readonly > .v-icon { - cursor: default; -} - -.mytheme .v-checkbox-small.v-readonly > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-checkbox-small.v-readonly > input:active ~ label:after { - background: transparent; -} - -:root .mytheme .v-checkbox-small.v-readonly > input ~ label:after { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-checkbox-large { - position: relative; - line-height: 22px; - white-space: nowrap; - font-size: 20px; -} - -.mytheme .v-checkbox-large.v-has-width label { - white-space: normal; -} - -:root .mytheme .v-checkbox-large { - padding-left: 29px; -} - -:root .mytheme .v-checkbox-large label { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - display: inline-block; -} - -:root .mytheme .v-checkbox-large > input { - position: absolute; - clip: rect(0, 0, 0, 0); - left: 0.2em; - top: 0.2em; - z-index: 0; - margin: 0; -} - -:root .mytheme .v-checkbox-large > input:focus ~ label:before { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); -} - -:root .mytheme .v-checkbox-large > input ~ label:before, :root .mytheme .v-checkbox-large > input ~ label:after { - content: ""; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 22px; - height: 22px; - position: absolute; - top: 0; - left: 0; - border-radius: 4px; - font-size: 15px; - text-align: center; -} - -:root .mytheme .v-checkbox-large > input ~ label:before { - height: 22px; - padding: 0 10px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - padding: 0; - height: 22px; -} - -:root .mytheme .v-checkbox-large > input ~ label:after { - content: "\f00c"; - font-family: ThemeIcons; - color: transparent; - -webkit-transition: color 100ms; - -moz-transition: color 100ms; - transition: color 100ms; -} - -:root .mytheme .v-checkbox-large > input:active ~ label:after { - background-color: rgba(125, 125, 125, 0.2); -} - -:root .mytheme .v-checkbox-large > input:checked ~ label:after { - color: #197de1; -} - -.mytheme .v-checkbox-large > .v-icon, .mytheme .v-checkbox-large > label .v-icon { - margin: 0 7px 0 4px; - min-width: 1em; - cursor: pointer; -} - -.mytheme .v-checkbox-large.v-disabled > label, .mytheme .v-checkbox-large.v-disabled > .v-icon { - cursor: default; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-checkbox-large.v-disabled > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-checkbox-large.v-disabled > input:active ~ label:after { - background: transparent; -} - -.mytheme .v-checkbox-large.v-readonly > label, .mytheme .v-checkbox-large.v-readonly > .v-icon { - cursor: default; -} - -.mytheme .v-checkbox-large.v-readonly > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-checkbox-large.v-readonly > input:active ~ label:after { - background: transparent; -} - -:root .mytheme .v-checkbox-large.v-readonly > input ~ label:after { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect { - position: relative; - width: 185px; - height: 37px; - border-radius: 4px; - white-space: nowrap; -} - -.mytheme .v-filterselect [class*="input"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 37px; - border-radius: 4px; - padding: 4px 9px; - border: 1px solid #c5c5c5; - background: white; - color: #474747; - -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - width: 100% !important; - height: 100%; - padding-right: 38px; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-filterselect [class*="input"], .v-ie9 .mytheme .v-filterselect [class*="input"] { - line-height: 37px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-filterselect [class*="input"].v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect [class*="input"]:focus { - outline: none; - -webkit-transition: none; - -moz-transition: none; - transition: none; - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-filterselect [class*="input"][class*="prompt"] { - color: #a3a3a3; -} - -.mytheme .v-filterselect .v-icon + [class*="input"] { - padding-left: 37px; -} - -.mytheme .v-filterselect img.v-icon { - max-height: 37px; - margin-left: 9px; -} - -.mytheme .v-filterselect span.v-icon { - color: #474747; - width: 37px; - line-height: 1; - padding-top: 0.12em; -} - -.mytheme .v-filterselect[class*="prompt"] > [class*="input"] { - color: #a3a3a3; -} - -.mytheme .v-filterselect [class$="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - position: absolute; - width: 37px; - top: 1px; - right: 1px; - bottom: 1px; - border-left: 1px solid #e4e4e4; - color: #a3a3a3; - border-radius: 0 3px 3px 0; -} - -.v-ie8 .mytheme .v-filterselect [class$="button"] { - background-color: white; -} - -.mytheme .v-filterselect [class$="button"]:before { - font-family: ThemeIcons; - content: "\f078"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; - position: absolute; - width: 37px; - text-align: center; - top: 50%; - line-height: 1; - margin-top: -0.47em; -} - -.mytheme .v-filterselect [class$="button"]:hover:before { - color: #474747; -} - -.mytheme .v-filterselect [class$="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; - background-color: rgba(128, 128, 128, 0.2); -} - -.mytheme .v-filterselect.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect.v-disabled [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect.v-disabled [class$="button"]:active:after { - display: none; -} - -.mytheme .v-filterselect.v-readonly [class*="input"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-filterselect.v-readonly [class*="input"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-filterselect.v-readonly [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect.v-readonly [class$="button"]:active:after { - display: none; -} - -.mytheme .v-filterselect .v-icon { - position: absolute; - pointer-events: none; -} - -.mytheme .v-filterselect-error .v-filterselect-input { - border-color: #ed473b !important; - background: #fffbfb; - color: #6c2621; -} - -.mytheme .v-filterselect-error .v-filterselect-button { - color: #ed473b; - border-color: #ed473b; -} - -.mytheme .v-filterselect-suggestpopup { - margin-top: 5px !important; -} - -.mytheme .v-filterselect-suggestpopup[class*="animate-in"] { - -webkit-animation: valo-overlay-animate-in 120ms; - -moz-animation: valo-overlay-animate-in 120ms; - animation: valo-overlay-animate-in 120ms; -} - -.mytheme .v-filterselect-suggestpopup [class$="suggestmenu"] { - padding: 4px 4px; - border-radius: 4px; - background-color: white; - color: #474747; - -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - padding: 4px 4px; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - position: relative; - z-index: 1; - display: block; -} - -.mytheme .v-filterselect-suggestpopup table, .mytheme .v-filterselect-suggestpopup tbody, .mytheme .v-filterselect-suggestpopup tr, .mytheme .v-filterselect-suggestpopup td { - display: block; - width: 100%; - overflow-y: hidden; - float: left; - clear: both; -} - -.mytheme .v-filterselect-suggestpopup .gwt-MenuItem { - cursor: pointer; - line-height: 27px; - padding: 0 20px 0 10px; - border-radius: 3px; - font-weight: 400; - white-space: nowrap; - position: relative; - height: 27px; - box-sizing: border-box; - text-overflow: ellipsis; - overflow-x: hidden; -} - -.mytheme .v-filterselect-suggestpopup .gwt-MenuItem:active:before { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: #0957a6; - opacity: 0.15; - filter: alpha(opacity=15.0) ; - pointer-events: none; - border-radius: inherit; -} - -.mytheme .v-filterselect-suggestpopup .gwt-MenuItem .v-icon { - max-height: 27px; - margin-right: 5px; - min-width: 1em; -} - -.mytheme .v-filterselect-suggestpopup .gwt-MenuItem-selected { - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - color: #ecf2f8; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); -} - -.mytheme .v-filterselect-suggestpopup [class$="status"] { - position: absolute; - right: 4px; - background: rgba(212, 212, 212, 0.9); - color: #3b3b3b; - border-radius: 0 0 4px 4px; - height: 23px; - bottom: -23px; - font-size: 12px; - line-height: 23px; - padding: 0 6px; - cursor: default; - pointer-events: none; - -webkit-animation: valo-animate-in-slide-down 200ms 80ms backwards; - -moz-animation: valo-animate-in-slide-down 200ms 80ms backwards; - animation: valo-animate-in-slide-down 200ms 80ms backwards; -} - -.mytheme .v-filterselect-suggestpopup [class$="status"] > * { - color: #3b3b3b; - text-decoration: none; -} - -.mytheme .v-filterselect-suggestpopup div[class*="page"] { - position: absolute; - z-index: 3; - right: 0; - opacity: 0.2; - filter: alpha(opacity=20) ; - cursor: pointer; - -webkit-transition: all 200ms; - -moz-transition: all 200ms; - transition: all 200ms; - width: 25px; - height: 25px; - line-height: 25px; - text-align: center; - font-family: ThemeIcons; - -webkit-transform: scale(0.8); - -moz-transform: scale(0.8); - -ms-transform: scale(0.8); - -o-transform: scale(0.8); - transform: scale(0.8); - color: #464646; -} - -.mytheme .v-filterselect-suggestpopup div[class*="page"]:after { - content: ""; - position: absolute; - display: block; - border-radius: 50%; -} - -.mytheme .v-filterselect-suggestpopup div[class*="page"]:hover { - opacity: 1; - filter: none ; - background: rgba(250, 250, 250, 0.5); -} - -.mytheme .v-filterselect-suggestpopup div[class*="page"]:hover:after { - top: -10px; - bottom: -10px; - left: -20px; - right: -20px; -} - -.mytheme .v-filterselect-suggestpopup div[class*="page"] span { - display: none; -} - -.mytheme .v-filterselect-suggestpopup:hover div[class*="page"] { - -webkit-transform: scale(1); - -moz-transform: scale(1); - -ms-transform: scale(1); - -o-transform: scale(1); - transform: scale(1); -} - -.mytheme .v-filterselect-suggestpopup div[class*="prev"] { - top: 0; - -webkit-transform-origin: 100% 0%; - -moz-transform-origin: 100% 0%; - -ms-transform-origin: 100% 0%; - -o-transform-origin: 100% 0%; - transform-origin: 100% 0%; - border-radius: 0 4px 0 4px; -} - -.mytheme .v-filterselect-suggestpopup div[class*="prev"]:before { - content: "\f0d8"; -} - -.mytheme .v-filterselect-suggestpopup div[class*="next"] { - bottom: 0; - -webkit-transform-origin: 100% 100%; - -moz-transform-origin: 100% 100%; - -ms-transform-origin: 100% 100%; - -o-transform-origin: 100% 100%; - transform-origin: 100% 100%; - border-radius: 4px 0 4px 0; -} - -.mytheme .v-filterselect-suggestpopup div[class*="next"]:before { - content: "\f0d7"; -} - -.mytheme .v-filterselect-suggestpopup div[class*="-off"] { - display: none; -} - -.mytheme .v-filterselect-no-input { - cursor: pointer; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); -} - -.mytheme .v-filterselect-no-input [class*="input"] { - -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - cursor: inherit; - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - text-shadow: inherit; - text-overflow: ellipsis; - border-radius: inherit; -} - -.mytheme .v-filterselect-no-input [class*="input"]:focus { - outline: none; - -webkit-transition: none; - -moz-transition: none; - transition: none; - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-filterselect-no-input [class$="button"] { - border-left: none !important; -} - -.mytheme .v-filterselect-no-input:hover [class$="button"]:before { - color: inherit; -} - -.mytheme .v-filterselect-borderless .v-filterselect-input { - border: none; - border-radius: 0; - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; - color: inherit; -} - -.mytheme .v-filterselect-borderless .v-filterselect-input:focus { - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-filterselect-borderless .v-filterselect-input[class*="prompt"] { - color: inherit; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect-borderless .v-filterselect-button { - border: none; - color: inherit; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect-borderless.v-filterselect-prompt .v-filterselect-input { - color: inherit; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect-align-right input { - text-align: right; -} - -.mytheme .v-filterselect-align-center input { - text-align: center; -} - -.mytheme .v-filterselect-tiny { - height: 28px; - - font-size: 12px; -} - -.mytheme .v-filterselect-tiny [class*="input"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 28px; - - padding: 3px 5px; - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - width: 100% !important; - height: 100%; - padding-right: 29px; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-filterselect-tiny [class*="input"], .v-ie9 .mytheme .v-filterselect-tiny [class*="input"] { - line-height: 28px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-filterselect-tiny .v-icon + [class*="input"] { - padding-left: 28px; -} - -.mytheme .v-filterselect-tiny img.v-icon { - max-height: 28px; - margin-left: 5px; -} - -.mytheme .v-filterselect-tiny span.v-icon { - - width: 28px; - line-height: 1; - padding-top: 0.12em; -} - -.mytheme .v-filterselect-tiny [class$="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - position: absolute; - width: 28px; - border-radius: 0 4px 4px 0; -} - -.mytheme .v-filterselect-tiny [class$="button"]:before { - font-family: ThemeIcons; - content: "\f078"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; - position: absolute; - width: 28px; - text-align: center; - top: 50%; - line-height: 1; - margin-top: -0.47em; -} - -.mytheme .v-filterselect-tiny [class$="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-filterselect-tiny.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect-tiny.v-disabled [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect-tiny.v-disabled [class$="button"]:active:after { - display: none; -} - -.mytheme .v-filterselect-tiny.v-readonly [class*="input"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-filterselect-tiny.v-readonly [class*="input"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-filterselect-tiny.v-readonly [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect-tiny.v-readonly [class$="button"]:active:after { - display: none; -} - -.mytheme .v-filterselect-compact, .mytheme .v-filterselect-small { - height: 31px; - -} - -.mytheme .v-filterselect-compact [class*="input"], .mytheme .v-filterselect-small [class*="input"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 31px; - - padding: 3px 6px; - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - width: 100% !important; - height: 100%; - padding-right: 32px; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-filterselect-compact [class*="input"], .v-ie9 .mytheme .v-filterselect-compact [class*="input"], .v-ie8 .mytheme .v-filterselect-small [class*="input"], .v-ie9 .mytheme .v-filterselect-small [class*="input"] { - line-height: 31px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-filterselect-compact .v-icon + [class*="input"], .mytheme .v-filterselect-small .v-icon + [class*="input"] { - padding-left: 31px; -} - -.mytheme .v-filterselect-compact img.v-icon, .mytheme .v-filterselect-small img.v-icon { - max-height: 31px; - margin-left: 6px; -} - -.mytheme .v-filterselect-compact span.v-icon, .mytheme .v-filterselect-small span.v-icon { - - width: 31px; - line-height: 1; - padding-top: 0.12em; -} - -.mytheme .v-filterselect-compact [class$="button"], .mytheme .v-filterselect-small [class$="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - position: absolute; - width: 31px; - border-radius: 0 4px 4px 0; -} - -.mytheme .v-filterselect-compact [class$="button"]:before, .mytheme .v-filterselect-small [class$="button"]:before { - font-family: ThemeIcons; - content: "\f078"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; - position: absolute; - width: 31px; - text-align: center; - top: 50%; - line-height: 1; - margin-top: -0.47em; -} - -.mytheme .v-filterselect-compact [class$="button"]:active:after, .mytheme .v-filterselect-small [class$="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-filterselect-compact.v-disabled, .mytheme .v-filterselect-small.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect-compact.v-disabled [class$="button"], .mytheme .v-filterselect-small.v-disabled [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect-compact.v-disabled [class$="button"]:active:after, .mytheme .v-filterselect-small.v-disabled [class$="button"]:active:after { - display: none; -} - -.mytheme .v-filterselect-compact.v-readonly [class*="input"], .mytheme .v-filterselect-small.v-readonly [class*="input"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-filterselect-compact.v-readonly [class*="input"]:focus, .mytheme .v-filterselect-small.v-readonly [class*="input"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-filterselect-compact.v-readonly [class$="button"], .mytheme .v-filterselect-small.v-readonly [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect-compact.v-readonly [class$="button"]:active:after, .mytheme .v-filterselect-small.v-readonly [class$="button"]:active:after { - display: none; -} - -.mytheme .v-filterselect-small { - font-size: 14px; -} - -.mytheme .v-filterselect-large { - height: 44px; - - font-size: 20px; -} - -.mytheme .v-filterselect-large [class*="input"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 44px; - - padding: 5px 8px; - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - width: 100% !important; - height: 100%; - padding-right: 45px; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-filterselect-large [class*="input"], .v-ie9 .mytheme .v-filterselect-large [class*="input"] { - line-height: 44px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-filterselect-large .v-icon + [class*="input"] { - padding-left: 44px; -} - -.mytheme .v-filterselect-large img.v-icon { - max-height: 44px; - margin-left: 8px; -} - -.mytheme .v-filterselect-large span.v-icon { - - width: 44px; - line-height: 1; - padding-top: 0.12em; -} - -.mytheme .v-filterselect-large [class$="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - position: absolute; - width: 44px; - border-radius: 0 4px 4px 0; -} - -.mytheme .v-filterselect-large [class$="button"]:before { - font-family: ThemeIcons; - content: "\f078"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; - position: absolute; - width: 44px; - text-align: center; - top: 50%; - line-height: 1; - margin-top: -0.47em; -} - -.mytheme .v-filterselect-large [class$="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-filterselect-large.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect-large.v-disabled [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect-large.v-disabled [class$="button"]:active:after { - display: none; -} - -.mytheme .v-filterselect-large.v-readonly [class*="input"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-filterselect-large.v-readonly [class*="input"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-filterselect-large.v-readonly [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect-large.v-readonly [class$="button"]:active:after { - display: none; -} - -.mytheme .v-filterselect-huge { - height: 59px; - - font-size: 26px; -} - -.mytheme .v-filterselect-huge [class*="input"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 59px; - - padding: 7px 10px; - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - width: 100% !important; - height: 100%; - padding-right: 60px; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-filterselect-huge [class*="input"], .v-ie9 .mytheme .v-filterselect-huge [class*="input"] { - line-height: 59px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-filterselect-huge .v-icon + [class*="input"] { - padding-left: 59px; -} - -.mytheme .v-filterselect-huge img.v-icon { - max-height: 59px; - margin-left: 10px; -} - -.mytheme .v-filterselect-huge span.v-icon { - - width: 59px; - line-height: 1; - padding-top: 0.12em; -} - -.mytheme .v-filterselect-huge [class$="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - position: absolute; - width: 59px; - border-radius: 0 4px 4px 0; -} - -.mytheme .v-filterselect-huge [class$="button"]:before { - font-family: ThemeIcons; - content: "\f078"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; - position: absolute; - width: 59px; - text-align: center; - top: 50%; - line-height: 1; - margin-top: -0.47em; -} - -.mytheme .v-filterselect-huge [class$="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-filterselect-huge.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-filterselect-huge.v-disabled [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect-huge.v-disabled [class$="button"]:active:after { - display: none; -} - -.mytheme .v-filterselect-huge.v-readonly [class*="input"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-filterselect-huge.v-readonly [class*="input"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-filterselect-huge.v-readonly [class$="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-filterselect-huge.v-readonly [class$="button"]:active:after { - display: none; -} - -.mytheme .v-csslayout-well { - background: #f5f5f5; - color: #454545; - -webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); - border-radius: 4px; - border: 1px solid #c5c5c5; -} - -.mytheme .v-csslayout-well > div > [class*="-caption"] { - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-csslayout-well > .v-margin-top { - padding-top: 12px; -} - -.mytheme .v-csslayout-well > .v-margin-right { - padding-right: 12px; -} - -.mytheme .v-csslayout-well > .v-margin-bottom { - padding-bottom: 12px; -} - -.mytheme .v-csslayout-well > .v-margin-left { - padding-left: 12px; -} - -.mytheme .v-csslayout-card { - background: white; - color: #474747; - border-radius: 4px; - border: 1px solid #d5d5d5; - -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); -} - -.mytheme .v-csslayout-card > .v-margin-top { - padding-top: 12px; -} - -.mytheme .v-csslayout-card > .v-margin-right { - padding-right: 12px; -} - -.mytheme .v-csslayout-card > .v-margin-bottom { - padding-bottom: 12px; -} - -.mytheme .v-csslayout-card > .v-margin-left { - padding-left: 12px; -} - -.mytheme .v-csslayout-v-component-group { - white-space: nowrap; - position: relative; -} - -.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget:not(:last-child) { - border-radius: 0; -} - -.mytheme .v-csslayout-v-component-group .v-widget:last-child { - border-top-left-radius: 0; - border-bottom-left-radius: 0; -} - -.mytheme .v-csslayout-v-component-group .v-widget:first-child, .mytheme .v-csslayout-v-component-group .v-caption:first-child + .v-widget { - border-top-right-radius: 0; - border-bottom-right-radius: 0; -} - -.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget.first.first { - border-radius: 4px 0 0 4px; -} - -.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget.last.last { - border-radius: 0 4px 4px 0; -} - -.mytheme .v-csslayout-v-component-group .v-widget { - vertical-align: middle; - margin-left: -1px; -} - -.mytheme .v-csslayout-v-component-group .v-widget:first-child { - margin-left: 0; -} - -.mytheme .v-csslayout-v-component-group .v-widget:focus, .mytheme .v-csslayout-v-component-group .v-widget[class*="focus"], .mytheme .v-csslayout-v-component-group .v-widget [class*="focus"] { - position: relative; - z-index: 5; -} - -.mytheme .v-form fieldset { - border: none; - padding: 0; - margin: 0; - height: 100%; -} - -.mytheme .v-form-content { - height: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mytheme [class*="spacing"] > tbody > [class*="row"] > td { - padding-top: 12px; -} - -.mytheme [class*="spacing"] > tbody > [class*="firstrow"] > td { - padding-top: 0; -} - -.mytheme [class*="margin-top"] > tbody > [class*="firstrow"] > td { - padding-top: 37px; -} - -.mytheme [class*="margin-bottom"] > tbody > [class*="lastrow"] > td { - padding-bottom: 37px; -} - -.mytheme [class*="margin-left"] > tbody > [class*="row"] > [class*="captioncell"] { - padding-left: 37px; -} - -.mytheme [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { - left: 37px; -} - -.mytheme [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] { - padding-right: 37px; -} - -.mytheme [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { - right: 37px; -} - -.mytheme .v-formlayout > table { - border-spacing: 0; - position: relative; -} - -.mytheme .v-formlayout.v-has-width > table, .mytheme .v-formlayout.v-has-width .v-formlayout-contentcell { - width: 100%; -} - -.mytheme .v-formlayout-error-indicator { - width: 19px; -} - -.mytheme .v-formlayout-captioncell { - vertical-align: top; - line-height: 36px; -} - -.mytheme .v-formlayout-captioncell .v-caption { - padding-bottom: 0; -} - -.mytheme .v-formlayout-captioncell .v-caption-h2, .mytheme .v-formlayout-captioncell .v-caption-h3, .mytheme .v-formlayout-captioncell .v-caption-h4 { - height: 3em; -} - -.mytheme .v-formlayout-contentcell .v-checkbox, .mytheme .v-formlayout-contentcell .v-radiobutton { - font-weight: 400; -} - -.mytheme .v-formlayout-contentcell > .v-label-h2, .mytheme .v-formlayout-contentcell > .v-label-h3, .mytheme .v-formlayout-contentcell > .v-label-h4 { - position: absolute; - left: 0; - right: 0; - width: auto !important; - margin-top: -0.5em; - padding-bottom: 0.5em; - border-bottom: 1px solid #dfdfdf; -} - -.mytheme .v-formlayout.light > table { - padding: 0; -} - -.mytheme .v-formlayout.light > table > tbody > tr > td { - padding-top: 0; - height: 37px; - border-bottom: 1px solid #eaeaea; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="lastrow"] > td { - border-bottom: none; -} - -.mytheme .v-formlayout.light > table > tbody > tr > [class*="captioncell"] { - color: #7d7d7d; - text-align: right; - padding-left: 13px; - line-height: 37px; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] { - padding-right: 0; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect-input, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield-textfield { - width: 100%; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 37px; - border-radius: 0; - padding: 4px 7px; - - -webkit-box-shadow: none; - box-shadow: none; - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - background: transparent; - border: none; - color: inherit; -} - -.v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield, .v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input, .v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input, .v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea { - line-height: 37px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea:focus { - outline: none; - -webkit-transition: none; - -moz-transition: none; - transition: none; - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), none; - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), none; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea:focus { - box-shadow: none; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield-prompt, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea-prompt, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect-prompt input, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield-prompt input { - color: #a3a3a3; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea { - height: auto; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { - border-bottom: none; - left: 0; - right: 0; -} - -.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { - margin-top: 0; -} - -.mytheme .v-formlayout.light .v-richtextarea { - margin: 5px 0; -} - -.mytheme .v-formlayout.light .v-filterselect-button, .mytheme .v-formlayout.light .v-datefield-button { - border: none; -} - -.mytheme .v-formlayout.light .v-filterselect-button:active:after, .mytheme .v-formlayout.light .v-datefield-button:active:after { - display: none; -} - -.mytheme .v-formlayout.light .v-datefield-button { - right: 0; - left: auto; -} - -.mytheme .v-formlayout.light .v-checkbox { - margin-left: 7px; -} - -.mytheme .v-grid { - position: relative; -} - -.mytheme .v-grid-scroller { - position: absolute; - z-index: 1; - outline: none; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mytheme .v-grid-scroller-horizontal { - left: 0; - right: 0; - bottom: 0; - overflow-y: hidden; - -ms-overflow-y: hidden; -} - -.mytheme .v-grid-scroller-vertical { - right: 0; - top: 0; - bottom: 0; - overflow-x: hidden; - -ms-overflow-x: hidden; -} - -.mytheme .v-grid-tablewrapper { - position: absolute; - overflow: hidden; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - z-index: 5; -} - -.mytheme .v-grid-tablewrapper > table { - border-spacing: 0; - table-layout: fixed; - width: inherit; -} - -.mytheme .v-grid-header-deco, .mytheme .v-grid-footer-deco { - position: absolute; - right: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mytheme .v-grid-horizontal-scrollbar-deco { - position: absolute; - bottom: 0; - left: 0; - right: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mytheme .v-grid-header, .mytheme .v-grid-body, .mytheme .v-grid-footer { - position: absolute; - left: 0; - width: inherit; - z-index: 10; -} - -.mytheme .v-grid-header, .mytheme .v-grid-header-deco { - top: 0; -} - -.mytheme .v-grid-footer, .mytheme .v-grid-footer-deco { - bottom: 0; -} - -.mytheme .v-grid-body { - -ms-touch-action: none; - touch-action: none; - z-index: 0; - top: 0; -} - -.mytheme .v-grid-body .v-grid-row { - position: absolute; - top: 0; - left: 0; -} - -.mytheme .v-grid-row { - display: block; -} - -.v-ie8 .mytheme .v-grid-row, .v-ie9 .mytheme .v-grid-row { - float: left; - clear: left; - margin-top: 0; -} - -.mytheme .v-grid-row > td, .mytheme .v-grid-row > th { - background-color: white; -} - -.mytheme .v-grid-row { - width: inherit; -} - -.mytheme .v-grid-cell { - display: block; - float: left; - padding: 2px; - white-space: nowrap; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - overflow: hidden; - font-size: 16px; -} - -.mytheme .v-grid-cell.frozen { - position: relative; - z-index: 1; -} - -.mytheme .v-grid-spacer { - position: absolute; - display: block; - background-color: white; -} - -.mytheme .v-grid-spacer > td { - width: 100%; - height: 100%; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.v-ie8 .mytheme .v-grid-spacer, .v-ie9 .mytheme .v-grid-spacer { - margin-top: 0; -} - -.mytheme .v-grid { - outline: none; -} - -.mytheme .v-grid-scroller-vertical, .mytheme .v-grid-scroller-horizontal { - border: 1px solid #d4d4d4; -} - -.mytheme .v-grid-scroller-vertical { - border-left: none; -} - -.mytheme .v-grid-scroller-horizontal { - border-top: none; -} - -.mytheme .v-grid-tablewrapper { - border: 1px solid #d4d4d4; -} - -.mytheme .v-grid .header-drag-table { - border-spacing: 0; - position: relative; - table-layout: fixed; - width: inherit; -} - -.mytheme .v-grid .header-drag-table .v-grid-header { - position: absolute; -} - -.mytheme .v-grid .header-drag-table .v-grid-header > .v-grid-cell { - border: 1px solid #d4d4d4; - margin-top: -10px; - opacity: 0.9; - filter: alpha(opacity=90); - z-index: 30000; -} - -.mytheme .v-grid .header-drag-table .v-grid-header > .v-grid-drop-marker { - background-color: #197de1; - position: absolute; - width: 3px; -} - -.mytheme .v-grid-sidebar.v-contextmenu { - -webkit-box-shadow: none; - box-shadow: none; - border-radius: 0; - position: absolute; - top: 0; - right: 0; - background-color: #fafafa; - border: 1px solid #d4d4d4; - padding: 0; - z-index: 5; -} - -.mytheme .v-grid-sidebar.v-contextmenu.v-grid-sidebar-popup { - right: auto; -} - -.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button { - background: transparent; - border: none; - color: inherit; - cursor: pointer; - outline: none; - padding: 0 4px; - text-align: right; - line-height: 1; -} - -.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button[disabled] { - cursor: default; -} - -.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button::-moz-focus-inner { - border: 0; -} - -.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button:after { - content: "\f0c9"; - display: block; - font-family: ThemeIcons, sans-serif; - font-size: 14px; -} - -.mytheme .v-grid-sidebar.v-contextmenu.closed { - border-radius: 0; -} - -.mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button { - width: 100%; -} - -.mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button:after { - content: "\f0c9"; - font-size: 14px; - line-height: 1; -} - -.v-ie .mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button { - vertical-align: middle; -} - -.v-ie8 .mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button:after { - vertical-align: middle; - text-align: center; - display: inline; -} - -.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-content { - padding: 4px 0; - overflow-y: auto; - overflow-x: hidden; -} - -.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-content .gwt-MenuBar .gwt-MenuItem .column-hiding-toggle { - text-shadow: none; -} - -.mytheme .v-grid-cell { - background-color: white; - padding: 0 18px; - line-height: 37px; - text-overflow: ellipsis; -} - -.mytheme .v-grid-cell > * { - line-height: 1.55; - vertical-align: middle; -} - -.mytheme .v-grid-cell > div { - display: inline-block; -} - -.mytheme .v-grid-cell.frozen { - -webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1); - box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1); - border-right: 1px solid #d4d4d4; -} - -.mytheme .v-grid-cell.frozen + th, .mytheme .v-grid-cell.frozen + td { - border-left: none; -} - -.mytheme .v-grid-row > td, .mytheme .v-grid-editor-cells > div { - border-left: 1px solid #d4d4d4; - border-bottom: 1px solid #d4d4d4; -} - -.mytheme .v-grid-row > td:first-child, .mytheme .v-grid-editor-cells > div:first-child { - border-left: none; -} - -.mytheme .v-grid-editor-cells.frozen > div { - -webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1); - box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1); - border-right: 1px solid #d4d4d4; - border-left: none; -} - -.mytheme .v-grid-row-stripe > td { - background-color: #f5f5f5; -} - -.mytheme .v-grid-row-selected > td { - background: #197de1; -} - -.mytheme .v-grid-row-focused > td { - -} - -.mytheme .v-grid-header th { - position: relative; - background-color: #fafafa; - font-size: 14px; - font-weight: inherit; - border-left: 1px solid #d4d4d4; - border-bottom: 1px solid #d4d4d4; - - text-align: left; -} - -.mytheme .v-grid-header th:first-child { - border-left: none; -} - -.mytheme .v-grid-header .sort-asc, .mytheme .v-grid-header .sort-desc { - padding-right: 35px; -} - -.mytheme .v-grid-header .sort-asc:after, .mytheme .v-grid-header .sort-desc:after { - font-family: ThemeIcons, sans-serif; - content: "\f0de" " " attr(sort-order); - position: absolute; - right: 18px; - font-size: 12px; -} - -.mytheme .v-grid-header .sort-desc:after { - content: "\f0dd" " " attr(sort-order); -} - -.mytheme .v-grid-column-resize-handle { - position: absolute; - width: 36px; - right: -18px; - top: 0px; - bottom: 0px; - cursor: col-resize; - z-index: 10; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.mytheme .v-grid-column-resize-simple-indicator { - position: absolute; - width: 3px; - top: 0px; - left: 18px; - z-index: 9001; - background: #fff; - box-shadow: 0px 0px 5px #000; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.mytheme .v-grid-footer td { - background-color: #fafafa; - font-size: 14px; - font-weight: inherit; - border-left: 1px solid #d4d4d4; - border-top: 1px solid #d4d4d4; - border-bottom: none; - -} - -.mytheme .v-grid-footer td:first-child { - border-left: none; -} - -.mytheme .v-grid-header .v-grid-cell, .mytheme .v-grid-footer .v-grid-cell { - overflow: visible; -} - -.mytheme .v-grid-column-header-content, .mytheme .v-grid-column-footer-content { - width: 100%; - overflow: hidden; - text-overflow: ellipsis; - line-height: 37px; - vertical-align: baseline; -} - -.mytheme .v-grid-header-deco { - border-top: 1px solid #d4d4d4; - border-right: 1px solid #d4d4d4; - background-color: #fafafa; -} - -.mytheme .v-grid-footer-deco { - border-bottom: 1px solid #d4d4d4; - border-right: 1px solid #d4d4d4; - background-color: #fafafa; -} - -.mytheme .v-grid-horizontal-scrollbar-deco { - background-color: #fafafa; - border: 1px solid #d4d4d4; - border-top: none; -} - -.mytheme .v-grid-cell-focused { - position: relative; -} - -.mytheme .v-grid-cell-focused:before { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border: 2px solid #197de1; - display: none; - pointer-events: none; -} - -.ie8 .mytheme .v-grid-cell-focused:before, .ie9 .mytheme .v-grid-cell-focused:before, .ie10 .mytheme .v-grid-cell-focused:before { - content: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==); -} - -.mytheme .v-grid:focus .v-grid-cell-focused:before { - display: block; -} - -.mytheme .v-grid.v-disabled:focus .v-grid-cell-focused:before { - display: none; -} - -.mytheme .v-grid-editor { - position: absolute; - z-index: 20; - overflow: hidden; - left: 0; - right: 0; - border: 1px solid #d4d4d4; - box-sizing: border-box; - -moz-box-sizing: border-box; - margin-top: -1px; - -webkit-box-shadow: 0 0 9px rgba(0, 0, 0, 0.2); - box-shadow: 0 0 9px rgba(0, 0, 0, 0.2); -} - -.mytheme .v-grid-editor.unbuffered .v-grid-editor-footer { - width: 100%; -} - -.mytheme .v-grid-editor-cells { - position: relative; - white-space: nowrap; -} - -.mytheme .v-grid-editor-cells.frozen { - z-index: 2; -} - -.mytheme .v-grid-editor-cells > div { - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - vertical-align: middle; - background: white; -} - -.mytheme .v-grid-editor-cells > div:first-child { - border-left: none; -} - -.mytheme .v-grid-editor-cells > div > * { - vertical-align: middle; - display: inline-block; -} - -.mytheme .v-grid-editor-cells > div .v-filterselect { - padding-left: 0; -} - -.mytheme .v-grid-editor-cells > div input[type="text"], .mytheme .v-grid-editor-cells > div input[type="text"].v-filterselect-input, .mytheme .v-grid-editor-cells > div input[type="password"] { - padding-left: 18px; -} - -.mytheme .v-grid-editor-cells > div input[type="text"]:not(.v-filterselect-input), .mytheme .v-grid-editor-cells > div input[type="password"] { - padding-right: 9px; -} - -.mytheme .v-grid-editor-cells > div input[type="checkbox"] { - margin-left: 18px; -} - -.mytheme .v-grid-editor-cells > div .v-textfield, .mytheme .v-grid-editor-cells > div .v-datefield, .mytheme .v-grid-editor-cells > div .v-filterselect { - min-width: 100%; - max-width: 100%; - min-height: 100%; - max-height: 100%; -} - -.v-ie8 .mytheme .v-grid-editor-cells > div .v-datefield-button { - margin-left: -37px; -} - -.v-ie8 .mytheme .v-grid-editor-cells > div .v-filterselect-button { - margin-left: -25px; -} - -.mytheme .v-grid-editor-cells > div .v-select, .mytheme .v-grid-editor-cells > div .v-select-select { - min-width: 100%; - max-width: 100%; -} - -.mytheme .v-grid-editor-cells > div.not-editable.v-grid-cell { - float: none; -} - -.mytheme .v-grid-editor-cells .error::before { - position: absolute; - display: block; - height: 0; - width: 0; - content: ""; - border-top: 5px solid red; - border-right: 5px solid transparent; -} - -.mytheme .v-grid-editor-cells .error, .mytheme .v-grid-editor-cells .error > input { - background-color: #fee; -} - -.mytheme .v-grid-editor-footer { - display: table; - height: 37px; - border-top: 1px solid #d4d4d4; - margin-top: -1px; - background: white; - padding: 0 5px; -} - -.mytheme .v-grid-editor-footer + .v-grid-editor-cells > div { - border-bottom: none; - border-top: 1px solid #d4d4d4; -} - -.mytheme .v-grid-editor-footer:first-child { - border-top: none; - margin-top: 0; - border-bottom: 1px solid #d4d4d4; - margin-bottom: -1px; -} - -.mytheme .v-grid-editor-message, .mytheme .v-grid-editor-buttons { - display: table-cell; - white-space: nowrap; - vertical-align: middle; -} - -.mytheme .v-grid-editor-message { - width: 100%; - position: relative; -} - -.mytheme .v-grid-editor-message > div { - position: absolute; - width: 100%; - overflow: hidden; - text-overflow: ellipsis; - line-height: 37px; - top: 0; -} - -.mytheme .v-grid-editor-save { - margin-right: 4px; -} - -.mytheme .v-grid-spacer { - padding-left: 1px; -} - -.mytheme .v-grid-spacer > td { - display: block; - padding: 0; - background-color: white; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #d4d4d4; -} - -.mytheme .v-grid-spacer.stripe > td { - background-color: #f5f5f5; - border-top: 1px solid #e5e5e5; - border-bottom: 1px solid #d4d4d4; -} - -.mytheme .v-grid-spacer-deco-container { - border-top: 1px solid transparent; - position: relative; - top: 0; - z-index: 5; -} - -.mytheme .v-grid-spacer-deco { - top: 0; - left: 0; - width: 2px; - background-color: #197de1; - position: absolute; - height: 100%; - pointer-events: none; -} - -.ie8 .mytheme .v-grid-spacer-deco:before, .ie9 .mytheme .v-grid-spacer-deco:before, .ie10 .mytheme .v-grid-spacer-deco:before { - content: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==); -} - -.mytheme .v-grid-cell > .v-progressbar { - width: 100%; -} - -.mytheme .v-grid { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - background-color: #fafafa; -} - -.mytheme .v-grid.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-grid-header .v-grid-cell { - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); -} - -.mytheme .v-grid-header .v-grid-cell.dragged { - opacity: 0.5; - filter: alpha(opacity=50) ; - -webkit-transition: opacity 0.3s ease-in-out; - -moz-transition: opacity 0.3s ease-in-out; - transition: opacity 0.3s ease-in-out; -} - -.mytheme .v-grid-header .v-grid-cell.dragged-column-header { - margin-top: -19px; -} - -.mytheme .v-grid-footer .v-grid-cell { - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); -} - -.mytheme .v-grid-header-deco { - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); -} - -.mytheme .v-grid-footer-deco, .mytheme .v-grid-horizontal-scrollbar-deco { - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); -} - -.mytheme .v-grid-row-selected > .v-grid-cell { - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - color: #c8dbed; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); - border-color: #1d69b4; -} - -.mytheme .v-grid-row-selected > .v-grid-cell-focused:before { - border-color: #71b0ef; -} - -.mytheme .v-grid-editor { - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - border-color: #197de1; -} - -.mytheme .v-grid-editor-footer { - font-size: 14px; - padding: 0 6px; - background: #fafafa; - -webkit-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards; - -moz-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards; - animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards; -} - -.mytheme .v-grid-editor-footer:first-child { - -webkit-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards; - -moz-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards; - animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards; -} - -.mytheme .v-grid-editor-cells { - z-index: 1; -} - -.mytheme .v-grid-editor-cells > div:before { - content: ""; - display: inline-block; - height: 100%; - vertical-align: middle; -} - -.mytheme .v-grid-editor-cells > div.not-editable.v-grid-cell { - float: none; -} - -.mytheme .v-grid-editor-cells > div .error::before { - border-top: 9px solid #ed473b; - border-right: 9px solid transparent; -} - -.mytheme .v-grid-editor-cells > div .error, .mytheme .v-grid-editor-cells > div .error > input { - background-color: #fffbfb; -} - -.mytheme .v-grid-editor-cells > div .v-textfield, .mytheme .v-grid-editor-cells > div .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-datefield, .mytheme .v-grid-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-filterselect-input, .mytheme .v-grid-editor-cells > div .v-filterselect-input:focus { - border: none; - border-radius: 0; - background: transparent; - -webkit-box-shadow: inset 0 1px 0 #f2f2f2; - box-shadow: inset 0 1px 0 #f2f2f2; -} - -.mytheme .v-grid-editor-cells > div input[type="text"].v-datefield-textfield { - padding-left: 44.4px; -} - -.v-ie8 .mytheme .v-grid-editor-cells > div .v-datefield-button { - margin-left: 0px; -} - -.v-ie8 .mytheme .v-grid-editor-cells > div .v-filterselect-button { - margin-left: 0px; -} - -.mytheme .v-grid-editor-cells > div .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-filterselect-input:focus { - position: relative; -} - -.mytheme .v-grid-editor-cells > div .v-select { - padding-left: 9px; - padding-right: 9px; -} - -.mytheme .v-grid-editor-cells > div .v-checkbox { - margin: 0 9px 0 18px; -} - -.mytheme .v-grid-editor-cells > div .v-checkbox > input[type="checkbox"] { - margin-left: 0; -} - -.mytheme .v-grid-editor-cells > div .v-checkbox > label { - white-space: nowrap; -} - -.mytheme .v-grid-editor-message > div:before { - display: inline-block; - color: #ed473b; - font-weight: 600; - width: 19px; - text-align: center; - content: "!"; -} - -.mytheme .v-grid-editor-save, .mytheme .v-grid-editor-cancel { - cursor: pointer; - color: #197de1; - text-decoration: underline; - font-weight: inherit; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; - font-weight: 400; - text-decoration: none; - border: none; - background: transparent; - padding: 6px 6px; - margin: 0; - outline: none; -} - -.mytheme .v-grid-editor-save:hover, .mytheme .v-grid-editor-cancel:hover { - color: #4396ea; -} - -.mytheme .v-grid-editor-save.v-disabled, .mytheme .v-grid-editor-cancel.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-grid-spacer { - margin-top: -1px; -} - -.mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-content { - margin: 0 0 2px; - padding: 4px 4px 2px; - overflow-y: auto; - overflow-x: hidden; -} - -.mytheme .v-grid-sidebar.v-contextmenu.closed { - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); -} - -.mytheme .v-grid-scroller::-webkit-scrollbar { - border: none; -} - -.mytheme .v-grid-scroller::-webkit-scrollbar-thumb { - border-radius: 10px; - border: 4px solid transparent; - background: rgba(0, 0, 0, 0.3); - -webkit-background-clip: content-box; - background-clip: content-box; -} - -.mytheme .v-grid-scroller-vertical::-webkit-scrollbar-thumb { - min-height: 30px; -} - -.mytheme .v-grid-scroller-horizontal::-webkit-scrollbar-thumb { - min-width: 30px; -} - -.mytheme .v-textfield { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 37px; - border-radius: 4px; - padding: 4px 9px; - border: 1px solid #c5c5c5; - background: white; - color: #474747; - -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - width: 185px; -} - -.v-ie8 .mytheme .v-textfield, .v-ie9 .mytheme .v-textfield { - line-height: 37px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-textfield.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-textfield:focus { - outline: none; - -webkit-transition: none; - -moz-transition: none; - transition: none; - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-textfield[class*="prompt"] { - color: #a3a3a3; -} - -.mytheme .v-textfield-readonly { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-textfield-readonly:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-textfield-error { - border-color: #ed473b !important; - background: #fffbfb; - color: #6c2621; -} - -.mytheme .v-textfield-borderless { - border: none; - border-radius: 0; - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; - color: inherit; -} - -.mytheme .v-textfield-borderless:focus { - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-textfield-borderless[class*="prompt"] { - color: inherit; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-textfield-tiny { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 28px; - border-radius: 4px; - padding: 3px 7px; - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - font-size: 12px; -} - -.v-ie8 .mytheme .v-textfield-tiny, .v-ie9 .mytheme .v-textfield-tiny { - line-height: 28px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-textfield-compact, .mytheme .v-textfield-small { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 31px; - border-radius: 4px; - padding: 3px 8px; - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; -} - -.v-ie8 .mytheme .v-textfield-compact, .v-ie9 .mytheme .v-textfield-compact, .v-ie8 .mytheme .v-textfield-small, .v-ie9 .mytheme .v-textfield-small { - line-height: 31px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-textfield-small { - font-size: 14px; -} - -.mytheme .v-textfield-large { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 44px; - border-radius: 4px; - padding: 5px 10px; - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - font-size: 20px; -} - -.v-ie8 .mytheme .v-textfield-large, .v-ie9 .mytheme .v-textfield-large { - line-height: 44px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-textfield-huge { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 59px; - border-radius: 4px; - padding: 7px 12px; - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - font-size: 26px; -} - -.v-ie8 .mytheme .v-textfield-huge, .v-ie9 .mytheme .v-textfield-huge { - line-height: 59px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-slot-inline-icon { - position: relative; -} - -.mytheme .v-caption-inline-icon { - padding: 0; -} - -.mytheme .v-caption-inline-icon .v-captiontext { - font-size: 14px; - font-weight: 400; - padding-bottom: 0.3em; - padding-left: 1px; - margin: 0; -} - -.mytheme .v-caption-inline-icon .v-icon { - position: absolute; - z-index: 10; -} - -.mytheme .v-caption-inline-icon span.v-icon { - left: 1px; - bottom: 1px; - width: 37px; - line-height: 35px; - text-align: center; - font-size: 16px; -} - -.mytheme .v-caption-inline-icon img.v-icon { - left: 11px; - bottom: 11px; -} - -.mytheme .v-textfield-inline-icon { - padding-left: 37px; -} - -.mytheme .v-slot-inline-icon.v-slot-tiny { - position: relative; -} - -.mytheme .v-caption-inline-icon.v-caption-tiny { - padding: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-tiny .v-captiontext { - font-size: 14px; - font-weight: 400; - padding-bottom: 0.3em; - padding-left: 1px; - margin: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-tiny .v-icon { - position: absolute; - z-index: 10; -} - -.mytheme .v-caption-inline-icon.v-caption-tiny span.v-icon { - left: 1px; - bottom: 1px; - width: 28px; - line-height: 26px; - text-align: center; - font-size: 12px; -} - -.mytheme .v-caption-inline-icon.v-caption-tiny img.v-icon { - left: 6px; - bottom: 6px; -} - -.mytheme .v-textfield-inline-icon.v-textfield-tiny { - padding-left: 28px; -} - -.mytheme .v-slot-inline-icon.v-slot-compact { - position: relative; -} - -.mytheme .v-caption-inline-icon.v-caption-compact { - padding: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-compact .v-captiontext { - font-size: 14px; - font-weight: 400; - padding-bottom: 0.3em; - padding-left: 1px; - margin: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-compact .v-icon { - position: absolute; - z-index: 10; -} - -.mytheme .v-caption-inline-icon.v-caption-compact span.v-icon { - left: 1px; - bottom: 1px; - width: 31px; - line-height: 29px; - text-align: center; - font-size: 16px; -} - -.mytheme .v-caption-inline-icon.v-caption-compact img.v-icon { - left: 8px; - bottom: 8px; -} - -.mytheme .v-textfield-inline-icon.v-textfield-compact { - padding-left: 31px; -} - -.mytheme .v-slot-inline-icon.v-slot-small { - position: relative; -} - -.mytheme .v-caption-inline-icon.v-caption-small { - padding: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-small .v-captiontext { - font-size: 14px; - font-weight: 400; - padding-bottom: 0.3em; - padding-left: 1px; - margin: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-small .v-icon { - position: absolute; - z-index: 10; -} - -.mytheme .v-caption-inline-icon.v-caption-small span.v-icon { - left: 1px; - bottom: 1px; - width: 31px; - line-height: 29px; - text-align: center; - font-size: 14px; -} - -.mytheme .v-caption-inline-icon.v-caption-small img.v-icon { - left: 8px; - bottom: 8px; -} - -.mytheme .v-textfield-inline-icon.v-textfield-small { - padding-left: 31px; -} - -.mytheme .v-slot-inline-icon.v-slot-large { - position: relative; -} - -.mytheme .v-caption-inline-icon.v-caption-large { - padding: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-large .v-captiontext { - font-size: 14px; - font-weight: 400; - padding-bottom: 0.3em; - padding-left: 1px; - margin: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-large .v-icon { - position: absolute; - z-index: 10; -} - -.mytheme .v-caption-inline-icon.v-caption-large span.v-icon { - left: 1px; - bottom: 1px; - width: 44px; - line-height: 42px; - text-align: center; - font-size: 20px; -} - -.mytheme .v-caption-inline-icon.v-caption-large img.v-icon { - left: 14px; - bottom: 14px; -} - -.mytheme .v-textfield-inline-icon.v-textfield-large { - padding-left: 44px; -} - -.mytheme .v-slot-inline-icon.v-slot-huge { - position: relative; -} - -.mytheme .v-caption-inline-icon.v-caption-huge { - padding: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-huge .v-captiontext { - font-size: 14px; - font-weight: 400; - padding-bottom: 0.3em; - padding-left: 1px; - margin: 0; -} - -.mytheme .v-caption-inline-icon.v-caption-huge .v-icon { - position: absolute; - z-index: 10; -} - -.mytheme .v-caption-inline-icon.v-caption-huge span.v-icon { - left: 1px; - bottom: 1px; - width: 59px; - line-height: 57px; - text-align: center; - font-size: 26px; -} - -.mytheme .v-caption-inline-icon.v-caption-huge img.v-icon { - left: 22px; - bottom: 22px; -} - -.mytheme .v-textfield-inline-icon.v-textfield-huge { - padding-left: 59px; -} - -.mytheme .v-textfield-align-right { - text-align: right; -} - -.mytheme .v-textfield-align-center { - text-align: center; -} - -.mytheme .v-textarea { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 37px; - border-radius: 4px; - padding: 6px; - border: 1px solid #c5c5c5; - background: white; - color: #474747; - -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - height: auto; - resize: none; - white-space: pre-wrap; - width: 185px; -} - -.v-ie8 .mytheme .v-textarea, .v-ie9 .mytheme .v-textarea { - line-height: 37px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-textarea.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-textarea:focus { - outline: none; - -webkit-transition: none; - -moz-transition: none; - transition: none; - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-textarea[class*="prompt"] { - color: #a3a3a3; -} - -.v-ie8 .mytheme .v-textarea, .v-ie9 .mytheme .v-textarea { - line-height: inherit; - padding-top: 4px; - padding-bottom: 4px; -} - -.mytheme .v-textarea-readonly { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-textarea-readonly:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-textarea-error { - border-color: #ed473b !important; - background: #fffbfb; - color: #6c2621; -} - -.mytheme .v-textarea-borderless { - border: none; - border-radius: 0; - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; - color: inherit; -} - -.mytheme .v-textarea-borderless:focus { - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-textarea-borderless[class*="prompt"] { - color: inherit; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-textarea-tiny { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 28px; - border-radius: 4px; - padding: 6px; - - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - height: auto; - resize: none; - white-space: pre-wrap; - font-size: 12px; -} - -.v-ie8 .mytheme .v-textarea-tiny, .v-ie9 .mytheme .v-textarea-tiny { - line-height: 28px; - padding-top: 0; - padding-bottom: 0; -} - -.v-ie8 .mytheme .v-textarea-tiny, .v-ie9 .mytheme .v-textarea-tiny { - line-height: inherit; - padding-top: 3px; - padding-bottom: 3px; -} - -.mytheme .v-textarea-small { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 31px; - border-radius: 4px; - padding: 6px; - - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - height: auto; - resize: none; - white-space: pre-wrap; - font-size: 14px; -} - -.v-ie8 .mytheme .v-textarea-small, .v-ie9 .mytheme .v-textarea-small { - line-height: 31px; - padding-top: 0; - padding-bottom: 0; -} - -.v-ie8 .mytheme .v-textarea-small, .v-ie9 .mytheme .v-textarea-small { - line-height: inherit; - padding-top: 3px; - padding-bottom: 3px; -} - -.mytheme .v-textarea-large { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 44px; - border-radius: 4px; - padding: 6px; - - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - height: auto; - resize: none; - white-space: pre-wrap; - font-size: 20px; -} - -.v-ie8 .mytheme .v-textarea-large, .v-ie9 .mytheme .v-textarea-large { - line-height: 44px; - padding-top: 0; - padding-bottom: 0; -} - -.v-ie8 .mytheme .v-textarea-large, .v-ie9 .mytheme .v-textarea-large { - line-height: inherit; - padding-top: 5px; - padding-bottom: 5px; -} - -.mytheme .v-textarea-huge { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 59px; - border-radius: 4px; - padding: 6px; - - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - height: auto; - resize: none; - white-space: pre-wrap; - font-size: 26px; -} - -.v-ie8 .mytheme .v-textarea-huge, .v-ie9 .mytheme .v-textarea-huge { - line-height: 59px; - padding-top: 0; - padding-bottom: 0; -} - -.v-ie8 .mytheme .v-textarea-huge, .v-ie9 .mytheme .v-textarea-huge { - line-height: inherit; - padding-top: 7px; - padding-bottom: 7px; -} - -.mytheme .v-textarea-align-right { - text-align: right; -} - -.mytheme .v-textarea-align-center { - text-align: center; -} - -.mytheme .v-datefield { - position: relative; - width: 185px; - height: 37px; - border-radius: 4px; -} - -.mytheme .v-datefield [class*="textfield"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 37px; - border-radius: 4px; - padding: 4px 9px; - border: 1px solid #c5c5c5; - background: white; - color: #474747; - -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - padding-left: 44.4px; - width: 100%; - height: 100%; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-datefield [class*="textfield"], .v-ie9 .mytheme .v-datefield [class*="textfield"] { - line-height: 37px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-datefield [class*="textfield"].v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-datefield [class*="textfield"]:focus { - outline: none; - -webkit-transition: none; - -moz-transition: none; - transition: none; - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-datefield [class*="textfield"][class*="prompt"] { - color: #a3a3a3; -} - -.mytheme .v-datefield[class*="prompt"] > [class*="textfield"] { - color: #a3a3a3; -} - -.mytheme .v-datefield [class*="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - -webkit-appearance: none; - background: transparent; - padding: 0; - position: absolute; - z-index: 10; - width: 37px; - line-height: 35px; - text-align: center; - font: inherit; - outline: none; - margin: 0; - top: 1px; - bottom: 1px; - left: 1px; - border: none; - border-right: 1px solid #e4e4e4; - color: #a3a3a3; - border-radius: 3px 0 0 3px; -} - -.mytheme .v-datefield [class*="button"]:hover { - color: #474747; -} - -.mytheme .v-datefield [class*="button"]:before { - font-family: ThemeIcons; - content: "\f073"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-datefield [class*="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-color: rgba(128, 128, 128, 0.2); - border-radius: inherit; -} - -.mytheme .v-datefield.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-datefield.v-disabled [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield.v-disabled [class*="button"]:active:after { - display: none; -} - -.mytheme .v-datefield.v-readonly [class*="textfield"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-datefield.v-readonly [class*="textfield"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-datefield.v-readonly [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield.v-readonly [class*="button"]:active:after { - display: none; -} - -.mytheme .v-datefield-error .v-datefield-textfield { - border-color: #ed473b !important; - background: #fffbfb; - color: #6c2621; -} - -.mytheme .v-datefield-error .v-datefield-button { - color: #ed473b; - border-color: #ed473b; -} - -.mytheme .v-datefield-full { - width: 240px; -} - -.mytheme .v-datefield-day { - width: 185px; -} - -.mytheme .v-datefield-month { - width: 120px; -} - -.mytheme .v-datefield-year { - width: 104px; -} - -.mytheme .v-datefield-popup { - padding: 4px 4px; - border-radius: 4px; - background-color: white; - color: #474747; - -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - margin-top: 5px !important; - margin-bottom: 5px !important; - margin-right: 5px !important; - cursor: default; - width: auto; -} - -.mytheme .v-datefield-popup[class*="animate-in"] { - -webkit-animation: valo-overlay-animate-in 120ms; - -moz-animation: valo-overlay-animate-in 120ms; - animation: valo-overlay-animate-in 120ms; -} - -.mytheme .v-datefield-popup[class*="animate-out"] { - -webkit-animation: valo-animate-out-fade 120ms; - -moz-animation: valo-animate-out-fade 120ms; - animation: valo-animate-out-fade 120ms; -} - -.mytheme .v-datefield-popup table { - border-collapse: collapse; - border-spacing: 0; - margin: 0 auto; -} - -.mytheme .v-datefield-popup td { - padding: 2px; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel { - font-size: 16px; - text-align: center; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel:focus { - outline: none; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-day { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 30px; - height: 26px; - border: 1px solid transparent; - line-height: 26px; - text-align: center; - font-size: 14px; - background: #fafafa; - border-radius: 2px; - -webkit-transition: color 200ms; - -moz-transition: color 200ms; - transition: color 200ms; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-day:hover { - color: #197de1; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-day-offmonth { - color: #a0a0a0; - background: transparent; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-day-today { - color: #191919; - font-weight: 600; - border-color: #afafaf; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected, .mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected:hover { - color: #c8dbed; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - border: none; - font-weight: 600; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused { - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - position: relative; -} - -.v-ie8 .mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused { - border-color: #197de1; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range, .mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range:hover { - color: #a0a0a0; - cursor: not-allowed; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-weekdays { - height: 26px; - color: rgba(133, 133, 133, 0.85); -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-weekdays strong { - font: inherit; - font-size: 14px; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-header { - white-space: nowrap; -} - -.mytheme .v-datefield-popup td[class*="year"] button, .mytheme .v-datefield-popup td[class*="month"] button { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - border: none; - background: transparent; - padding: 0; - margin: 0; - cursor: pointer; - color: transparent; - font-size: 0; - width: 19px; - height: 25px; - outline: none; - position: relative; - vertical-align: middle; -} - -.mytheme .v-datefield-popup td[class*="year"] button:before, .mytheme .v-datefield-popup td[class*="month"] button:before { - color: #a0a0a0; - font-size: 21px; - line-height: 24px; - -webkit-transition: color 200ms; - -moz-transition: color 200ms; - transition: color 200ms; -} - -.mytheme .v-datefield-popup td[class*="year"] button:hover:before, .mytheme .v-datefield-popup td[class*="month"] button:hover:before { - color: #197de1; -} - -.mytheme .v-datefield-popup td[class*="year"] button.outside-range, .mytheme .v-datefield-popup td[class*="month"] button.outside-range { - cursor: default; - opacity: 0.3; - filter: alpha(opacity=30.0) ; -} - -.mytheme .v-datefield-popup td[class*="year"] button.outside-range:hover:before, .mytheme .v-datefield-popup td[class*="month"] button.outside-range:hover:before { - color: #a0a0a0; -} - -.mytheme .v-datefield-popup .v-button-prevyear:before { - font-family: ThemeIcons; - content: "\f100"; -} - -.mytheme .v-datefield-popup .v-button-prevmonth:before { - font-family: ThemeIcons; - content: "\f104"; -} - -.mytheme .v-datefield-popup .v-button-nextyear:before { - font-family: ThemeIcons; - content: "\f101"; -} - -.mytheme .v-datefield-popup .v-button-nextmonth:before { - font-family: ThemeIcons; - content: "\f105"; -} - -.mytheme .v-datefield-popup td.v-datefield-calendarpanel-month { - width: 148px; - color: #197de1; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-year td.v-datefield-calendarpanel-month { - width: 74px; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-weeknumber, .mytheme .v-datefield-popup .v-datefield-calendarpanel-weekdays.v-datefield-calendarpanel-weeknumbers td:first-child { - width: 30px; - color: rgba(133, 133, 133, 0.85); - font-size: 14px; - display: inline-block; - text-align: left; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-weeknumber { - position: relative; -} - -.mytheme .v-datefield-popup .v-datefield-calendarpanel-weeknumbers .v-first:before { - content: ""; - position: absolute; - top: 38px; - bottom: 0; - left: 0; - width: 34px; - border-top: 1px solid #eaeaea; - border-right: 1px solid #eaeaea; - border-top-right-radius: 4px; - border-bottom-left-radius: 4px; - background: #fafafa; -} - -.mytheme .v-datefield-popup td.v-datefield-calendarpanel-time { - width: 100%; - font-size: 14px; -} - -.mytheme .v-datefield-popup td.v-datefield-calendarpanel-time .v-label { - display: inline; - margin: 0 0.1em; - font-weight: 400; -} - -.mytheme .v-datefield-calendarpanel { - font-size: 16px; - text-align: center; -} - -.mytheme .v-datefield-calendarpanel:focus { - outline: none; -} - -.mytheme .v-datefield-calendarpanel-day { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 30px; - height: 26px; - border: 1px solid transparent; - line-height: 26px; - text-align: center; - font-size: 14px; - background: #fafafa; - border-radius: 2px; - -webkit-transition: color 200ms; - -moz-transition: color 200ms; - transition: color 200ms; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; -} - -.mytheme .v-datefield-calendarpanel-day:hover { - color: #197de1; -} - -.mytheme .v-datefield-calendarpanel-day-offmonth { - color: #a0a0a0; - background: transparent; -} - -.mytheme .v-datefield-calendarpanel-day-today { - color: #191919; - font-weight: 600; - border-color: #afafaf; -} - -.mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected, .mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected:hover { - color: #c8dbed; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - border: none; - font-weight: 600; -} - -.mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused { - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - position: relative; -} - -.v-ie8 .mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused { - border-color: #197de1; -} - -.mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range, .mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range:hover { - color: #a0a0a0; - cursor: not-allowed; -} - -.mytheme .v-datefield-calendarpanel-weekdays { - height: 26px; - color: rgba(133, 133, 133, 0.85); -} - -.mytheme .v-datefield-calendarpanel-weekdays strong { - font: inherit; - font-size: 14px; -} - -.mytheme .v-datefield-calendarpanel-header { - white-space: nowrap; -} - -.mytheme td[class*="year"] button, .mytheme td[class*="month"] button { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - border: none; - background: transparent; - padding: 0; - margin: 0; - cursor: pointer; - color: transparent; - font-size: 0; - width: 19px; - height: 25px; - outline: none; - position: relative; - vertical-align: middle; -} - -.mytheme td[class*="year"] button:before, .mytheme td[class*="month"] button:before { - color: #a0a0a0; - font-size: 21px; - line-height: 24px; - -webkit-transition: color 200ms; - -moz-transition: color 200ms; - transition: color 200ms; -} - -.mytheme td[class*="year"] button:hover:before, .mytheme td[class*="month"] button:hover:before { - color: #197de1; -} - -.mytheme td[class*="year"] button.outside-range, .mytheme td[class*="month"] button.outside-range { - cursor: default; - opacity: 0.3; - filter: alpha(opacity=30.0) ; -} - -.mytheme td[class*="year"] button.outside-range:hover:before, .mytheme td[class*="month"] button.outside-range:hover:before { - color: #a0a0a0; -} - -.mytheme .v-button-prevyear:before { - font-family: ThemeIcons; - content: "\f100"; -} - -.mytheme .v-button-prevmonth:before { - font-family: ThemeIcons; - content: "\f104"; -} - -.mytheme .v-button-nextyear:before { - font-family: ThemeIcons; - content: "\f101"; -} - -.mytheme .v-button-nextmonth:before { - font-family: ThemeIcons; - content: "\f105"; -} - -.mytheme td.v-datefield-calendarpanel-month { - width: 148px; - color: #197de1; -} - -.mytheme .v-datefield-calendarpanel-year td.v-datefield-calendarpanel-month { - width: 74px; -} - -.mytheme .v-datefield-calendarpanel-weeknumber, .mytheme .v-datefield-calendarpanel-weekdays.v-datefield-calendarpanel-weeknumbers td:first-child { - width: 30px; - color: rgba(133, 133, 133, 0.85); - font-size: 14px; - display: inline-block; - text-align: left; -} - -.mytheme .v-datefield-calendarpanel-weeknumber { - position: relative; -} - -.mytheme .v-datefield-calendarpanel-weeknumbers .v-first:before { - content: ""; - position: absolute; - top: 38px; - bottom: 0; - left: 0; - width: 34px; - border-top: 1px solid #eaeaea; - border-right: 1px solid #eaeaea; - border-top-right-radius: 4px; - border-bottom-left-radius: 4px; - background: #fafafa; -} - -.mytheme td.v-datefield-calendarpanel-time { - width: 100%; - font-size: 14px; -} - -.mytheme td.v-datefield-calendarpanel-time .v-label { - display: inline; - margin: 0 0.1em; - font-weight: 400; -} - -.mytheme .v-datefield-borderless .v-datefield-textfield { - border: none; - border-radius: 0; - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; - color: inherit; -} - -.mytheme .v-datefield-borderless .v-datefield-textfield:focus { - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-datefield-borderless .v-datefield-textfield[class*="prompt"] { - color: inherit; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-datefield-borderless .v-datefield-button { - border: none; - color: inherit; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-datefield-align-right input { - text-align: right; -} - -.mytheme .v-datefield-align-center input { - text-align: center; -} - -.mytheme .v-datefield-tiny { - height: 28px; - border-radius: 4px; - font-size: 12px; -} - -.mytheme .v-datefield-tiny [class*="textfield"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 28px; - border-radius: 4px; - padding: 3px 7px; - - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - padding-left: 33.6px; - width: 100%; - height: 100%; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-datefield-tiny [class*="textfield"], .v-ie9 .mytheme .v-datefield-tiny [class*="textfield"] { - line-height: 28px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-datefield-tiny [class*="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - -webkit-appearance: none; - background: transparent; - padding: 0; - position: absolute; - z-index: 10; - width: 28px; - line-height: 28px; - text-align: center; - font: inherit; - outline: none; - margin: 0; - border-radius: 4px 0 0 4px; -} - -.mytheme .v-datefield-tiny [class*="button"]:before { - font-family: ThemeIcons; - content: "\f073"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-datefield-tiny [class*="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-datefield-tiny.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-datefield-tiny.v-disabled [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield-tiny.v-disabled [class*="button"]:active:after { - display: none; -} - -.mytheme .v-datefield-tiny.v-readonly [class*="textfield"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-datefield-tiny.v-readonly [class*="textfield"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-datefield-tiny.v-readonly [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield-tiny.v-readonly [class*="button"]:active:after { - display: none; -} - -.mytheme .v-datefield-compact, .mytheme .v-datefield-small { - height: 31px; - border-radius: 4px; -} - -.mytheme .v-datefield-compact [class*="textfield"], .mytheme .v-datefield-small [class*="textfield"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 31px; - border-radius: 4px; - padding: 3px 8px; - - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - padding-left: 37.2px; - width: 100%; - height: 100%; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-datefield-compact [class*="textfield"], .v-ie9 .mytheme .v-datefield-compact [class*="textfield"], .v-ie8 .mytheme .v-datefield-small [class*="textfield"], .v-ie9 .mytheme .v-datefield-small [class*="textfield"] { - line-height: 31px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-datefield-compact [class*="button"], .mytheme .v-datefield-small [class*="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - -webkit-appearance: none; - background: transparent; - padding: 0; - position: absolute; - z-index: 10; - width: 31px; - line-height: 31px; - text-align: center; - font: inherit; - outline: none; - margin: 0; - border-radius: 4px 0 0 4px; -} - -.mytheme .v-datefield-compact [class*="button"]:before, .mytheme .v-datefield-small [class*="button"]:before { - font-family: ThemeIcons; - content: "\f073"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-datefield-compact [class*="button"]:active:after, .mytheme .v-datefield-small [class*="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-datefield-compact.v-disabled, .mytheme .v-datefield-small.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-datefield-compact.v-disabled [class*="button"], .mytheme .v-datefield-small.v-disabled [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield-compact.v-disabled [class*="button"]:active:after, .mytheme .v-datefield-small.v-disabled [class*="button"]:active:after { - display: none; -} - -.mytheme .v-datefield-compact.v-readonly [class*="textfield"], .mytheme .v-datefield-small.v-readonly [class*="textfield"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-datefield-compact.v-readonly [class*="textfield"]:focus, .mytheme .v-datefield-small.v-readonly [class*="textfield"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-datefield-compact.v-readonly [class*="button"], .mytheme .v-datefield-small.v-readonly [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield-compact.v-readonly [class*="button"]:active:after, .mytheme .v-datefield-small.v-readonly [class*="button"]:active:after { - display: none; -} - -.mytheme .v-datefield-small { - font-size: 14px; -} - -.mytheme .v-datefield-large { - height: 44px; - border-radius: 4px; - font-size: 20px; -} - -.mytheme .v-datefield-large [class*="textfield"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 44px; - border-radius: 4px; - padding: 5px 10px; - - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - padding-left: 52.8px; - width: 100%; - height: 100%; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-datefield-large [class*="textfield"], .v-ie9 .mytheme .v-datefield-large [class*="textfield"] { - line-height: 44px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-datefield-large [class*="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - -webkit-appearance: none; - background: transparent; - padding: 0; - position: absolute; - z-index: 10; - width: 44px; - line-height: 44px; - text-align: center; - font: inherit; - outline: none; - margin: 0; - border-radius: 4px 0 0 4px; -} - -.mytheme .v-datefield-large [class*="button"]:before { - font-family: ThemeIcons; - content: "\f073"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-datefield-large [class*="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-datefield-large.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-datefield-large.v-disabled [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield-large.v-disabled [class*="button"]:active:after { - display: none; -} - -.mytheme .v-datefield-large.v-readonly [class*="textfield"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-datefield-large.v-readonly [class*="textfield"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-datefield-large.v-readonly [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield-large.v-readonly [class*="button"]:active:after { - display: none; -} - -.mytheme .v-datefield-huge { - height: 59px; - border-radius: 4px; - font-size: 26px; -} - -.mytheme .v-datefield-huge [class*="textfield"] { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 59px; - border-radius: 4px; - padding: 7px 12px; - - - - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - padding-left: 70.8px; - width: 100%; - height: 100%; - border-radius: inherit; -} - -.v-ie8 .mytheme .v-datefield-huge [class*="textfield"], .v-ie9 .mytheme .v-datefield-huge [class*="textfield"] { - line-height: 59px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-datefield-huge [class*="button"] { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - -webkit-appearance: none; - background: transparent; - padding: 0; - position: absolute; - z-index: 10; - width: 59px; - line-height: 59px; - text-align: center; - font: inherit; - outline: none; - margin: 0; - border-radius: 4px 0 0 4px; -} - -.mytheme .v-datefield-huge [class*="button"]:before { - font-family: ThemeIcons; - content: "\f073"; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-datefield-huge [class*="button"]:active:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-datefield-huge.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-datefield-huge.v-disabled [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield-huge.v-disabled [class*="button"]:active:after { - display: none; -} - -.mytheme .v-datefield-huge.v-readonly [class*="textfield"] { - background: #fafafa; - color: #464646; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-datefield-huge.v-readonly [class*="textfield"]:focus { - box-shadow: none; - border-color: #c5c5c5; -} - -.mytheme .v-datefield-huge.v-readonly [class*="button"] { - cursor: default; - pointer-events: none; -} - -.mytheme .v-datefield-huge.v-readonly [class*="button"]:active:after { - display: none; -} - -.mytheme .v-inline-datefield-calendarpanel { - font-size: 16px; - text-align: center; -} - -.mytheme .v-inline-datefield-calendarpanel:focus { - outline: none; -} - -.mytheme .v-inline-datefield-calendarpanel-day { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 30px; - height: 26px; - border: 1px solid transparent; - line-height: 26px; - text-align: center; - font-size: 14px; - background: #fafafa; - border-radius: 2px; - -webkit-transition: color 200ms; - -moz-transition: color 200ms; - transition: color 200ms; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; -} - -.mytheme .v-inline-datefield-calendarpanel-day:hover { - color: #197de1; -} - -.mytheme .v-inline-datefield-calendarpanel-day-offmonth { - color: #a0a0a0; - background: transparent; -} - -.mytheme .v-inline-datefield-calendarpanel-day-today { - color: #191919; - font-weight: 600; - border-color: #afafaf; -} - -.mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-selected, .mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-selected:hover { - color: #c8dbed; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - border: none; - font-weight: 600; -} - -.mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-focused { - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - position: relative; -} - -.v-ie8 .mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-focused { - border-color: #197de1; -} - -.mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-outside-range, .mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-outside-range:hover { - color: #a0a0a0; - cursor: not-allowed; -} - -.mytheme .v-inline-datefield-calendarpanel-weekdays { - height: 26px; - color: rgba(133, 133, 133, 0.85); -} - -.mytheme .v-inline-datefield-calendarpanel-weekdays strong { - font: inherit; - font-size: 14px; -} - -.mytheme .v-inline-datefield-calendarpanel-header { - white-space: nowrap; -} - -.mytheme td[class*="year"] button, .mytheme td[class*="month"] button { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - border: none; - background: transparent; - padding: 0; - margin: 0; - cursor: pointer; - color: transparent; - font-size: 0; - width: 19px; - height: 25px; - outline: none; - position: relative; - vertical-align: middle; -} - -.mytheme td[class*="year"] button:before, .mytheme td[class*="month"] button:before { - color: #a0a0a0; - font-size: 21px; - line-height: 24px; - -webkit-transition: color 200ms; - -moz-transition: color 200ms; - transition: color 200ms; -} - -.mytheme td[class*="year"] button:hover:before, .mytheme td[class*="month"] button:hover:before { - color: #197de1; -} - -.mytheme td[class*="year"] button.outside-range, .mytheme td[class*="month"] button.outside-range { - cursor: default; - opacity: 0.3; - filter: alpha(opacity=30.0) ; -} - -.mytheme td[class*="year"] button.outside-range:hover:before, .mytheme td[class*="month"] button.outside-range:hover:before { - color: #a0a0a0; -} - -.mytheme .v-button-prevyear:before { - font-family: ThemeIcons; - content: "\f100"; -} - -.mytheme .v-button-prevmonth:before { - font-family: ThemeIcons; - content: "\f104"; -} - -.mytheme .v-button-nextyear:before { - font-family: ThemeIcons; - content: "\f101"; -} - -.mytheme .v-button-nextmonth:before { - font-family: ThemeIcons; - content: "\f105"; -} - -.mytheme td.v-inline-datefield-calendarpanel-month { - width: 148px; - color: #197de1; -} - -.mytheme .v-inline-datefield-calendarpanel-year td.v-inline-datefield-calendarpanel-month { - width: 74px; -} - -.mytheme .v-inline-datefield-calendarpanel-weeknumber, .mytheme .v-inline-datefield-calendarpanel-weekdays.v-inline-datefield-calendarpanel-weeknumbers td:first-child { - width: 30px; - color: rgba(133, 133, 133, 0.85); - font-size: 14px; - display: inline-block; - text-align: left; -} - -.mytheme .v-inline-datefield-calendarpanel-weeknumber { - position: relative; -} - -.mytheme .v-inline-datefield-calendarpanel-weeknumbers .v-first:before { - content: ""; - position: absolute; - top: 38px; - bottom: 0; - left: 0; - width: 34px; - border-top: 1px solid #eaeaea; - border-right: 1px solid #eaeaea; - border-top-right-radius: 4px; - border-bottom-left-radius: 4px; - background: #fafafa; -} - -.mytheme td.v-inline-datefield-calendarpanel-time { - width: 100%; - font-size: 14px; -} - -.mytheme td.v-inline-datefield-calendarpanel-time .v-label { - display: inline; - margin: 0 0.1em; - font-weight: 400; -} - -.mytheme .v-inline-datefield-calendarpanel { - position: relative; - background: white; - padding: 6px; -} - -.mytheme .v-gridlayout-margin-top { - padding-top: 37px; -} - -.mytheme .v-gridlayout-margin-bottom { - padding-bottom: 37px; -} - -.mytheme .v-gridlayout-margin-left { - padding-left: 37px; -} - -.mytheme .v-gridlayout-margin-right { - padding-right: 37px; -} - -.mytheme .v-gridlayout-spacing-on { - padding-left: 12px; - padding-top: 12px; -} - -.mytheme .v-menubar { - position: relative; - text-align: center; - white-space: nowrap; - outline: none; - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - height: 37px; - padding: 0 16px; - color: #191919; - font-weight: 400; - - cursor: default; - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - padding: 0; - text-align: left; - line-height: 35px; -} - -.mytheme .v-menubar:after { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; -} - -.mytheme .v-menubar:focus:after { - -webkit-transition: none; - -moz-transition: none; - transition: none; -} - -.mytheme .v-menubar.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-menubar.v-disabled:after { - display: none; -} - -.mytheme .v-menubar:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-menubar:focus:after { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-menubar > .v-menubar-menuitem { - padding: 0 14px; -} - -.mytheme .v-menubar > .v-menubar-menuitem[class*="-icon-only"] { - width: 37px; -} - -.mytheme .v-menubar:active:after { - background: transparent; -} - -.mytheme .v-menubar > .v-menubar-menuitem { - position: relative; - z-index: 1; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - height: 37px; - padding: 0 15px; - color: inherit; - font-weight: 400; - - cursor: pointer; - border-radius: 0; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; - border-width: 0 1px 0 0; - border-color: inherit; - height: 100%; - line-height: inherit; - vertical-align: top; - text-align: center; -} - -.mytheme .v-menubar > .v-menubar-menuitem:first-child { - border-left-width: 0; - border-radius: 3px 0 0 3px; -} - -.mytheme .v-menubar > .v-menubar-menuitem:last-child { - border-radius: 0 3px 3px 0; - border-right-width: 0; -} - -.mytheme .v-menubar > .v-menubar-menuitem:first-child:last-child { - border-radius: 3px; -} - -.mytheme .v-menubar > .v-menubar-menuitem:before { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-menubar > .v-menubar-menuitem:hover { - zoom: 1; -} - -.mytheme .v-menubar > .v-menubar-menuitem:hover:before { - background-color: rgba(186, 186, 186, 0.1); - border: none; -} - -.mytheme .v-menubar > .v-menubar-menuitem:active:before { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-menubar > .v-menubar-menuitem .v-icon { - margin: 0 4px 0 -4px; - cursor: inherit; -} - -.mytheme .v-menubar > .v-menubar-menuitem[class*="-icon-only"] { - width: 37px; - padding: 0; -} - -.mytheme .v-menubar > .v-menubar-menuitem[class*="-icon-only"] .v-icon { - margin: 0; -} - -.mytheme .v-menubar > .v-menubar-menuitem-checked { - -webkit-box-shadow: none; - box-shadow: none; - background-color: #ededed; - background-image: -webkit-linear-gradient(bottom, #ededed 2%, #e9e9e9 98%); - background-image: linear-gradient(to top,#ededed 2%, #e9e9e9 98%); - color: #181818; -} - -.mytheme .v-disabled > .v-menubar-menuitem, .mytheme .v-menubar > .v-menubar-menuitem-disabled { - cursor: default; -} - -.mytheme .v-disabled > .v-menubar-menuitem:before, .mytheme .v-menubar > .v-menubar-menuitem-disabled:before { - display: none; -} - -.mytheme .v-menubar-menuitem-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-menubar > .v-menubar-menuitem-selected { - color: #ecf2f8; - - - - border-radius: 0; - border: 1px solid #1362b1; - border-top-color: #156ab3; - border-bottom-color: #1156a8; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - -webkit-box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca; - box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); - border-top-width: 0; - border-left-width: 0; - border-bottom-width: 0; - z-index: 2; -} - -.mytheme .v-menubar > .v-menubar-menuitem-selected:hover:before { - background: none; -} - -.mytheme .v-menubar .v-menubar-submenu-indicator { - display: none; -} - -.mytheme .v-menubar .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:after { - font-family: ThemeIcons; - content: "\f078"; - font-size: 0.7em; - vertical-align: 0.15em; - margin: 0 -0.2em 0 0.5em; - opacity: 0.5; -} - -.mytheme .v-menubar .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:empty:after { - margin-left: -0.2em; -} - -.mytheme .v-menubar-popup { - padding: 4px 4px; - border-radius: 4px; - background-color: white; - color: #474747; - -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - padding: 4px 4px; - margin: 5px 0 0 1px !important; -} - -.mytheme .v-menubar-popup[class*="animate-in"] { - -webkit-animation: valo-overlay-animate-in 120ms; - -moz-animation: valo-overlay-animate-in 120ms; - animation: valo-overlay-animate-in 120ms; -} - -.mytheme .v-menubar-popup[class*="animate-out"] { - -webkit-animation: valo-animate-out-fade 120ms; - -moz-animation: valo-animate-out-fade 120ms; - animation: valo-animate-out-fade 120ms; -} - -.mytheme .v-menubar-popup .v-menubar-submenu { - outline: none; -} - -.mytheme .v-menubar-popup .v-menubar-menuitem { - display: block; - cursor: pointer; - line-height: 27px; - padding: 0 20px 0 10px; - border-radius: 3px; - font-weight: 400; - white-space: nowrap; - position: relative; - padding-left: 32px; - padding-right: 37px; - position: relative; -} - -.mytheme .v-menubar-popup .v-menubar-menuitem:active:before { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - background: #0957a6; - opacity: 0.15; - filter: alpha(opacity=15.0) ; - pointer-events: none; - border-radius: inherit; -} - -.mytheme .v-menubar-popup .v-menubar-menuitem .v-icon { - max-height: 27px; - margin-right: 5px; - min-width: 1em; -} - -.mytheme .v-menubar-popup .v-menubar-submenu-indicator { - display: none; -} - -.mytheme .v-menubar-popup .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:after { - position: absolute; - right: 10px; - font-family: ThemeIcons; - content: "\f054"; - line-height: 29px; -} - -.mytheme .v-menubar-popup .v-menubar-menuitem-selected { - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - color: #ecf2f8; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); -} - -.mytheme .v-menubar-popup .v-menubar-separator { - display: block; - margin: 4px 0; - height: 0; - overflow: hidden; - border-bottom: 1px solid #e4e4e4; -} - -.mytheme .v-menubar-popup [class*="checked"] .v-menubar-menuitem-caption:before { - content: "\f00c"; - font-family: ThemeIcons; - position: absolute; - left: 10px; -} - -.mytheme .v-menubar-popup [class*="unchecked"] .v-menubar-menuitem-caption:before { - content: ""; -} - -.mytheme .v-menubar-popup [class*="disabled"] { - cursor: default; -} - -.mytheme .v-menubar-small { - height: 31px; - padding: 0 14px; - - font-weight: 400; - - cursor: default; - border-radius: 4px; - padding: 0; - text-align: left; - line-height: 29px; - font-size: 14px; -} - -.mytheme .v-menubar-small:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-menubar-small > .v-menubar-menuitem { - padding: 0 12px; -} - -.mytheme .v-menubar-small > .v-menubar-menuitem[class*="-icon-only"] { - width: 31px; -} - -.mytheme .v-menubar-borderless { - border: none; - border-radius: 0; - padding: 1px; - -webkit-box-shadow: none; - box-shadow: none; - text-shadow: none; - background: transparent; - color: inherit; -} - -.mytheme .v-menubar-borderless:focus:after { - display: none; -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem { - -webkit-box-shadow: none; - box-shadow: none; - border: none; - margin-right: 1px; - border-radius: 4px; - color: #197de1; - padding: 0 12px; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem:first-child, .mytheme .v-menubar-borderless .v-menubar-menuitem:last-child, .mytheme .v-menubar-borderless .v-menubar-menuitem:first-child:last-child { - border-radius: 4px; -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem:before { - content: none; -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem:hover { - color: #4396ea; -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem:active { - color: inherit; -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem-checked, .mytheme .v-menubar-borderless .v-menubar-menuitem-checked:first-child { - border: 1px solid #c5c5c5; - color: #197de1; -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem-checked .v-menubar-menuitem-caption, .mytheme .v-menubar-borderless .v-menubar-menuitem-checked:first-child .v-menubar-menuitem-caption { - position: relative; - top: -1px; -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem-selected { - color: #ecf2f8; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem-selected:hover { - color: #ecf2f8; -} - -.mytheme .v-menubar-borderless .v-menubar-menuitem-disabled, .mytheme .v-menubar-borderless .v-menubar-menuitem-disabled:hover { - color: inherit; -} - -.mytheme .v-radiobutton { - position: relative; - line-height: 19px; - white-space: nowrap; -} - -.mytheme .v-radiobutton.v-has-width label { - white-space: normal; -} - -:root .mytheme .v-radiobutton { - padding-left: 25px; -} - -:root .mytheme .v-radiobutton label { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - display: inline-block; -} - -:root .mytheme .v-radiobutton > input { - position: absolute; - clip: rect(0, 0, 0, 0); - left: 0.2em; - top: 0.2em; - z-index: 0; - margin: 0; -} - -:root .mytheme .v-radiobutton > input:focus ~ label:before { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); -} - -:root .mytheme .v-radiobutton > input ~ label:before, :root .mytheme .v-radiobutton > input ~ label:after { - content: ""; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 19px; - height: 19px; - position: absolute; - top: 0; - left: 0; - border-radius: 4px; - font-size: 13px; - text-align: center; -} - -:root .mytheme .v-radiobutton > input ~ label:before { - height: 18.5px; - padding: 0 9px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - padding: 0; - height: 19px; -} - -:root .mytheme .v-radiobutton > input ~ label:after { - content: "\f00c"; - font-family: ThemeIcons; - color: transparent; - -webkit-transition: color 100ms; - -moz-transition: color 100ms; - transition: color 100ms; -} - -:root .mytheme .v-radiobutton > input:active ~ label:after { - background-color: rgba(125, 125, 125, 0.2); -} - -:root .mytheme .v-radiobutton > input:checked ~ label:after { - color: #197de1; -} - -.mytheme .v-radiobutton > .v-icon, .mytheme .v-radiobutton > label .v-icon { - margin: 0 6px 0 3px; - min-width: 1em; - cursor: pointer; -} - -.mytheme .v-radiobutton.v-disabled > label, .mytheme .v-radiobutton.v-disabled > .v-icon { - cursor: default; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-radiobutton.v-disabled > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-radiobutton.v-disabled > input:active ~ label:after { - background: transparent; -} - -.mytheme .v-radiobutton.v-readonly > label, .mytheme .v-radiobutton.v-readonly > .v-icon { - cursor: default; -} - -.mytheme .v-radiobutton.v-readonly > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-radiobutton.v-readonly > input:active ~ label:after { - background: transparent; -} - -:root .mytheme .v-radiobutton.v-readonly > input ~ label:after { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -:root .mytheme .v-radiobutton > input:checked ~ label:after { - width: 7px; - height: 7px; - top: 6px; - left: 6px; - background: #197de1; -} - -:root .mytheme .v-radiobutton > input ~ label:before, :root .mytheme .v-radiobutton > input ~ label:after { - border-radius: 50%; - content: ""; -} - -.mytheme .v-select-optiongroup .v-radiobutton, .mytheme .v-select-optiongroup .v-checkbox { - display: block; - margin: 9px 16px 0 0; -} - -.mytheme .v-select-optiongroup .v-radiobutton:first-child, .mytheme .v-select-optiongroup .v-checkbox:first-child { - margin-top: 6px; -} - -.mytheme .v-select-optiongroup .v-radiobutton:last-child, .mytheme .v-select-optiongroup .v-checkbox:last-child { - margin-bottom: 6px; -} - -.mytheme .v-select-optiongroup.v-has-width label { - white-space: normal; -} - -.mytheme .v-select-optiongroup-small { - font-size: 14px; -} - -.mytheme .v-select-optiongroup-small .v-checkbox { - position: relative; - line-height: 16px; - white-space: nowrap; -} - -.mytheme .v-select-optiongroup-small .v-checkbox.v-has-width label { - white-space: normal; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox { - padding-left: 21px; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox label { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - display: inline-block; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox > input { - position: absolute; - clip: rect(0, 0, 0, 0); - left: 0.2em; - top: 0.2em; - z-index: 0; - margin: 0; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox > input:focus ~ label:before { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:before, :root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:after { - content: ""; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 16px; - height: 16px; - position: absolute; - top: 0; - left: 0; - border-radius: 4px; - font-size: 11px; - text-align: center; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:before { - height: 15.5px; - padding: 0 7px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - padding: 0; - height: 16px; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:after { - content: "\f00c"; - font-family: ThemeIcons; - color: transparent; - -webkit-transition: color 100ms; - -moz-transition: color 100ms; - transition: color 100ms; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox > input:active ~ label:after { - background-color: rgba(125, 125, 125, 0.2); -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox > input:checked ~ label:after { - color: #197de1; -} - -.mytheme .v-select-optiongroup-small .v-checkbox > .v-icon, .mytheme .v-select-optiongroup-small .v-checkbox > label .v-icon { - margin: 0 5px 0 3px; - min-width: 1em; - cursor: pointer; -} - -.mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > label, .mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > .v-icon { - cursor: default; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > input:active ~ label:after { - background: transparent; -} - -.mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > label, .mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > .v-icon { - cursor: default; -} - -.mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > input:active ~ label:after { - background: transparent; -} - -:root .mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > input ~ label:after { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton { - position: relative; - line-height: 16px; - white-space: nowrap; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton.v-has-width label { - white-space: normal; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton { - padding-left: 21px; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton label { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - display: inline-block; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton > input { - position: absolute; - clip: rect(0, 0, 0, 0); - left: 0.2em; - top: 0.2em; - z-index: 0; - margin: 0; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:focus ~ label:before { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:after { - content: ""; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 16px; - height: 16px; - position: absolute; - top: 0; - left: 0; - border-radius: 4px; - font-size: 11px; - text-align: center; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:before { - height: 15.5px; - padding: 0 7px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - padding: 0; - height: 16px; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:after { - content: "\f00c"; - font-family: ThemeIcons; - color: transparent; - -webkit-transition: color 100ms; - -moz-transition: color 100ms; - transition: color 100ms; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:active ~ label:after { - background-color: rgba(125, 125, 125, 0.2); -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:checked ~ label:after { - color: #197de1; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton > .v-icon, .mytheme .v-select-optiongroup-small .v-radiobutton > label .v-icon { - margin: 0 5px 0 3px; - min-width: 1em; - cursor: pointer; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > label, .mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > .v-icon { - cursor: default; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > input:active ~ label:after { - background: transparent; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > label, .mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > .v-icon { - cursor: default; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > input:active ~ label:after { - background: transparent; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > input ~ label:after { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:checked ~ label:after { - width: 6px; - height: 6px; - top: 5px; - left: 5px; - background: #197de1; -} - -:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:after { - border-radius: 50%; - content: ""; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton, .mytheme .v-select-optiongroup-small .v-checkbox { - display: block; - margin: 8px 16px 0 0; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton:first-child, .mytheme .v-select-optiongroup-small .v-checkbox:first-child { - margin-top: 5px; -} - -.mytheme .v-select-optiongroup-small .v-radiobutton:last-child, .mytheme .v-select-optiongroup-small .v-checkbox:last-child { - margin-bottom: 5px; -} - -.mytheme .v-select-optiongroup-small.v-has-width label { - white-space: normal; -} - -.mytheme .v-select-optiongroup-large { - font-size: 20px; -} - -.mytheme .v-select-optiongroup-large .v-checkbox { - position: relative; - line-height: 22px; - white-space: nowrap; -} - -.mytheme .v-select-optiongroup-large .v-checkbox.v-has-width label { - white-space: normal; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox { - padding-left: 29px; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox label { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - display: inline-block; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox > input { - position: absolute; - clip: rect(0, 0, 0, 0); - left: 0.2em; - top: 0.2em; - z-index: 0; - margin: 0; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox > input:focus ~ label:before { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:before, :root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:after { - content: ""; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 22px; - height: 22px; - position: absolute; - top: 0; - left: 0; - border-radius: 4px; - font-size: 15px; - text-align: center; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:before { - height: 22px; - padding: 0 10px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - padding: 0; - height: 22px; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:after { - content: "\f00c"; - font-family: ThemeIcons; - color: transparent; - -webkit-transition: color 100ms; - -moz-transition: color 100ms; - transition: color 100ms; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox > input:active ~ label:after { - background-color: rgba(125, 125, 125, 0.2); -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox > input:checked ~ label:after { - color: #197de1; -} - -.mytheme .v-select-optiongroup-large .v-checkbox > .v-icon, .mytheme .v-select-optiongroup-large .v-checkbox > label .v-icon { - margin: 0 7px 0 4px; - min-width: 1em; - cursor: pointer; -} - -.mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > label, .mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > .v-icon { - cursor: default; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > input:active ~ label:after { - background: transparent; -} - -.mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > label, .mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > .v-icon { - cursor: default; -} - -.mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > input:active ~ label:after { - background: transparent; -} - -:root .mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > input ~ label:after { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton { - position: relative; - line-height: 22px; - white-space: nowrap; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton.v-has-width label { - white-space: normal; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton { - padding-left: 29px; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton label { - -webkit-tap-highlight-color: transparent; - -webkit-touch-callout: none; - cursor: pointer; - display: inline-block; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton > input { - position: absolute; - clip: rect(0, 0, 0, 0); - left: 0.2em; - top: 0.2em; - z-index: 0; - margin: 0; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:focus ~ label:before { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:after { - content: ""; - display: inline-block; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 22px; - height: 22px; - position: absolute; - top: 0; - left: 0; - border-radius: 4px; - font-size: 15px; - text-align: center; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:before { - height: 22px; - padding: 0 10px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - padding: 0; - height: 22px; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:after { - content: "\f00c"; - font-family: ThemeIcons; - color: transparent; - -webkit-transition: color 100ms; - -moz-transition: color 100ms; - transition: color 100ms; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:active ~ label:after { - background-color: rgba(125, 125, 125, 0.2); -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:checked ~ label:after { - color: #197de1; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton > .v-icon, .mytheme .v-select-optiongroup-large .v-radiobutton > label .v-icon { - margin: 0 7px 0 4px; - min-width: 1em; - cursor: pointer; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > label, .mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > .v-icon { - cursor: default; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > input:active ~ label:after { - background: transparent; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > label, .mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > .v-icon { - cursor: default; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > label > .v-icon { - cursor: default; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > input:active ~ label:after { - background: transparent; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > input ~ label:after { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:checked ~ label:after { - width: 8px; - height: 8px; - top: 7px; - left: 7px; - background: #197de1; -} - -:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:after { - border-radius: 50%; - content: ""; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton, .mytheme .v-select-optiongroup-large .v-checkbox { - display: block; - margin: 11px 16px 0 0; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton:first-child, .mytheme .v-select-optiongroup-large .v-checkbox:first-child { - margin-top: 7px; -} - -.mytheme .v-select-optiongroup-large .v-radiobutton:last-child, .mytheme .v-select-optiongroup-large .v-checkbox:last-child { - margin-bottom: 7px; -} - -.mytheme .v-select-optiongroup-large.v-has-width label { - white-space: normal; -} - -.mytheme .v-select-optiongroup-horizontal { - white-space: nowrap; -} - -.mytheme .v-select-optiongroup-horizontal .v-radiobutton, .mytheme .v-select-optiongroup-horizontal .v-checkbox { - display: inline-block; -} - -.mytheme .v-select-optiongroup-horizontal.v-has-width { - white-space: normal; -} - -.mytheme .v-select-optiongroup-horizontal.v-has-width label { - white-space: nowrap; -} - -.mytheme .v-link { - cursor: pointer; - color: #197de1; - text-decoration: underline; - font-weight: inherit; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-link:hover { - color: #4396ea; -} - -.mytheme .v-link.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-link a { - cursor: inherit; - color: inherit; - text-decoration: inherit; - -webkit-transition: inherit; - -moz-transition: inherit; - transition: inherit; -} - -.mytheme .v-link .v-icon { - cursor: inherit; -} - -.mytheme .v-link-small { - font-size: 14px; -} - -.mytheme .v-link-large { - font-size: 20px; -} - -.mytheme .v-window { - padding: 4px 4px; - border-radius: 4px; - background-color: white; - color: #474747; - -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - -webkit-box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1), 0 16px 80px -6px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.09098); - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1), 0 16px 80px -6px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.09098); - padding: 0; - min-width: 148px !important; - min-height: 37px !important; - white-space: nowrap; - overflow: hidden !important; - -webkit-transition: width 200ms, height 200ms, top 200ms, left 200ms; - -moz-transition: width 200ms, height 200ms, top 200ms, left 200ms; - transition: width 200ms, height 200ms, top 200ms, left 200ms; -} - -.mytheme .v-window[class*="animate-in"] { - -webkit-animation: valo-animate-in-fade 140ms; - -moz-animation: valo-animate-in-fade 140ms; - animation: valo-animate-in-fade 140ms; -} - -.mytheme .v-window[class*="animate-out"] { - -webkit-animation: valo-animate-out-scale-down-fade 100ms; - -moz-animation: valo-animate-out-scale-down-fade 100ms; - animation: valo-animate-out-scale-down-fade 100ms; -} - -.mytheme .v-window.v-window-animate-in { - -webkit-transition: none; - -moz-transition: none; - transition: none; -} - -.mytheme .v-window-modalitycurtain { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - background-color: #222; - background-image: -webkit-radial-gradient(50% 50%, circle, #222, #0e0e0e); - background-image: radial-gradient( circle at 50% 50%, #222, #0e0e0e); - opacity: 0.72; - filter: alpha(opacity=72) ; - -webkit-animation: valo-animate-in-fade 400ms 100ms backwards; - -moz-animation: valo-animate-in-fade 400ms 100ms backwards; - animation: valo-animate-in-fade 400ms 100ms backwards; -} - -.v-op12 .mytheme .v-window-modalitycurtain { - -webkit-animation: none; - -moz-animation: none; - animation: none; -} - -.mytheme .v-window-draggingCurtain { - position: fixed !important; -} - -.mytheme .v-window-resizingCurtain + .v-window, .mytheme .v-window-draggingCurtain + .v-window { - -webkit-transition: none; - -moz-transition: none; - transition: none; -} - -.mytheme .v-window-outerheader { - cursor: move; - position: absolute; - z-index: 2; - top: 0; - left: 0; - right: 0; - -webkit-transform: translatez(0); - -moz-transform: translatez(0); - -ms-transform: translatez(0); - -o-transform: translatez(0); - transform: translatez(0); -} - -.mytheme .v-window-outerheader:after { - content: ""; - position: absolute; - bottom: -1px; - right: 0; - left: 0; - height: 0; - border-top: 1px solid #dfdfdf; - border-color: rgba(197, 197, 197, 0.5); -} - -.mytheme .v-window-header { - line-height: 36px; - padding-left: 12px; - margin-right: 74px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - color: #7e7e7e; -} - -.mytheme .v-window-restorebox-disabled ~ .v-window-closebox ~ .v-window-header, .mytheme .v-window-maximizebox-disabled ~ .v-window-closebox ~ .v-window-header { - margin-right: 37px; -} - -.mytheme .v-window-restorebox-disabled ~ .v-window-closebox-disabled ~ .v-window-header, .mytheme .v-window-maximizebox-disabled ~ .v-window-closebox-disabled ~ .v-window-header { - margin-right: 12px; -} - -.mytheme .v-window-closebox, .mytheme .v-window-maximizebox, .mytheme .v-window-restorebox { - position: absolute; - z-index: 3; - top: 0; - right: 0; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 33px; - height: 36px; - background-color: white; - line-height: 34px; - text-align: center; - cursor: pointer; - font-size: 21px; - color: #999999; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-window-closebox:focus, .mytheme .v-window-maximizebox:focus, .mytheme .v-window-restorebox:focus { - outline: none; -} - -.mytheme .v-window-closebox:hover, .mytheme .v-window-maximizebox:hover, .mytheme .v-window-restorebox:hover { - opacity: 1; - filter: none ; - color: #197de1; -} - -.mytheme .v-window-closebox:active, .mytheme .v-window-maximizebox:active, .mytheme .v-window-restorebox:active { - color: inherit; -} - -.mytheme .v-window-closebox { - padding-right: 4px; - border-radius: 0 4px 0 4px; -} - -.mytheme .v-window-closebox:before { - content: "\00d7"; -} - -.mytheme .v-window-maximizebox, .mytheme .v-window-restorebox { - right: 33px; - padding-left: 4px; - border-radius: 0 0 0 4px; -} - -.mytheme .v-window-maximizebox + .v-window-closebox, .mytheme .v-window-restorebox + .v-window-closebox { - border-bottom-left-radius: 0; -} - -.mytheme .v-window-closebox-disabled, .mytheme .v-window-resizebox-disabled, .mytheme .v-window-restorebox-disabled, .mytheme .v-window-maximizebox-disabled { - display: none; -} - -.mytheme .v-window-closebox-disabled + .v-window-closebox, .mytheme .v-window-resizebox-disabled + .v-window-closebox, .mytheme .v-window-restorebox-disabled + .v-window-closebox, .mytheme .v-window-maximizebox-disabled + .v-window-closebox { - width: 37px; - padding-right: 0; - border-bottom-left-radius: 4px; -} - -.mytheme .v-window-maximizebox:before { - content: "+"; -} - -.mytheme .v-window-restorebox:before { - content: "\2013"; -} - -.mytheme .v-window > .popupContent, .mytheme .v-window-wrap, .mytheme .v-window-contents, .mytheme .v-window-contents > .v-scrollable { - height: 100%; -} - -.mytheme .v-window-contents { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - border-radius: 4px; - margin-top: 0 !important; -} - -.mytheme .v-window-contents > .v-scrollable { - position: relative; -} - -.mytheme .v-window-contents > .v-scrollable > .v-margin-top { - padding-top: 12px; -} - -.mytheme .v-window-contents > .v-scrollable > .v-margin-right { - padding-right: 12px; -} - -.mytheme .v-window-contents > .v-scrollable > .v-margin-bottom { - padding-bottom: 12px; -} - -.mytheme .v-window-contents > .v-scrollable > .v-margin-left { - padding-left: 12px; -} - -.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-top"] > tbody > [class*="firstrow"] > td { - padding-top: 12px; -} - -.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-bottom"] > tbody > [class*="lastrow"] > td { - padding-bottom: 12px; -} - -.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-left"] > tbody > [class*="row"] > [class*="captioncell"] { - padding-left: 12px; -} - -.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { - left: 12px; -} - -.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] { - padding-right: 12px; -} - -.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { - right: 12px; -} - -.mytheme .v-window-contents > .v-scrollable:focus { - outline: none; -} - -.mytheme .v-window-contents > .v-scrollable:before { - content: ""; - position: absolute; - z-index: 2; - top: 0; - height: 0; - border-top: 1px solid white; - left: 0; - right: 0; -} - -.mytheme .v-window-contents > .v-scrollable .v-panel-captionwrap:after { - border-color: #dfdfdf; -} - -.mytheme .v-window-contents > .v-scrollable .v-panel-content:before { - border-color: white; -} - -.mytheme .v-window-footer { - height: 0; -} - -.mytheme .v-window-resizebox { - position: absolute; - z-index: 1000; - right: 0; - bottom: 0; - width: 19px; - height: 19px; - cursor: nwse-resize; -} - -.v-ie8 .mytheme .v-window-resizebox { - background: #000; - filter: alpha(opacity=0.1); -} - -.v-ie8 .mytheme .v-window-resizebox, .v-ie9 .mytheme .v-window-resizebox { - cursor: se-resize; -} - -.mytheme .v-window-modalitycurtain:active ~ .v-window { - -webkit-animation: none; - -moz-animation: none; - animation: none; -} - -.mytheme .v-window-top-toolbar > .v-widget, .mytheme .v-window-bottom-toolbar > .v-widget { - vertical-align: top; -} - -.mytheme .v-window-top-toolbar .v-label, .mytheme .v-window-bottom-toolbar .v-label { - line-height: 36px; -} - -.mytheme .v-window-top-toolbar .v-spacing, .mytheme .v-window-bottom-toolbar .v-spacing { - width: 6px; -} - -.mytheme .v-window-top-toolbar.v-layout { - padding: 7px 12px; - position: relative; - z-index: 2; - border-top: 1px solid #dfdfdf; - border-bottom: 1px solid #dfdfdf; - background-color: #fafafa; -} - -.mytheme .v-window-top-toolbar.v-menubar { - margin: 12px 12px 6px; -} - -.mytheme .v-window-top-toolbar.v-menubar-borderless { - padding-left: 6px; - padding-right: 6px; - margin: 5px 0; -} - -.mytheme .v-window-bottom-toolbar.v-layout { - padding: 7px 12px; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #f0f0f0 0, #fafafa 4px); - background-image: linear-gradient(to bottom,#f0f0f0 0, #fafafa 4px); - border-top: 1px solid #dfdfdf; - border-radius: 0 0 4px 4px; -} - -.mytheme .v-margin-left.v-margin-right.v-margin-top .v-window-top-toolbar.v-layout { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - margin: -12px -12px 0; -} - -.mytheme .v-margin-left.v-margin-right.v-margin-top .v-window-top-toolbar.v-menubar { - margin: 0; -} - -.mytheme .v-margin-left.v-margin-right.v-margin-top .v-window-top-toolbar.v-menubar-borderless { - margin: -6px -6px 0; - padding: 0; -} - -.mytheme .v-margin-left.v-margin-right.v-margin-bottom .v-window-bottom-toolbar.v-layout { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - margin: 0 -12px -12px; -} - -.mytheme .v-tree { - position: relative; - white-space: nowrap; -} - -.mytheme .v-tree:focus { - outline: none; -} - -.mytheme .v-tree-node:before { - content: ""; - position: absolute; - display: inline-block; - z-index: 3; - width: 1.9em; - height: 28px; - cursor: pointer; - background: red; - opacity: 0; -} - -.v-ie8 .mytheme .v-tree-node:before { - position: static; - margin-left: -1.9em; - vertical-align: top; - content: "\f0da"; - font-family: ThemeIcons; - text-align: center; - background: transparent; -} - -.v-ie8 .mytheme .v-tree-node { - padding-left: 1.9em; -} - -.mytheme .v-tree-node-caption { - height: 28px; - line-height: 27px; - overflow: hidden; - white-space: nowrap; - vertical-align: top; -} - -.mytheme .v-tree-node-caption > div { - display: inline-block; - width: 100%; - position: relative; - z-index: 2; -} - -.mytheme .v-tree-node-caption > div:before { - content: "\f0da"; - font-family: ThemeIcons; - display: inline-block; - width: 0.5em; - text-align: center; - margin: 0 0.6em 0 0.8em; - -webkit-transition: all 100ms; - -moz-transition: all 100ms; - transition: all 100ms; -} - -.v-ie8 .mytheme .v-tree-node-caption > div:before { - display: none; -} - -.mytheme .v-tree-node-caption span { - padding-right: 28px; - cursor: pointer; - display: inline-block; - width: 100%; -} - -.v-ie .mytheme .v-tree-node-caption span { - width: auto; -} - -.mytheme .v-tree-node-caption .v-icon { - padding-right: 0; - width: auto; - min-width: 1em; -} - -.mytheme .v-tree-node-caption:after { - content: ""; - display: block; - vertical-align: top; - position: absolute; - z-index: 1; - left: 0; - margin-top: -28px; - width: 100%; - height: 28px; - border-radius: 4px; - opacity: 0; - -webkit-transition: opacity 120ms; - -moz-transition: opacity 120ms; - transition: opacity 120ms; -} - -.v-ie8 .mytheme .v-tree-node-caption:after { - content: none; -} - -.v-ie8 .mytheme .v-tree-node-caption { - display: inline-block; -} - -.mytheme .v-tree-node-expanded > .v-tree-node-caption > div:before { - -webkit-transform: rotate(90deg); - -moz-transform: rotate(90deg); - -ms-transform: rotate(90deg); - -o-transform: rotate(90deg); - transform: rotate(90deg); - content: "\f0da"; - font-family: ThemeIcons; -} - -.v-ie8 .mytheme .v-tree-node-expanded:before { - content: "\f0d7"; - font-family: ThemeIcons; -} - -.mytheme .v-tree-node-leaf:before, .mytheme .v-tree-node-leaf > .v-tree-node-caption > div:before { - visibility: hidden; -} - -.mytheme .v-tree-node-focused:after { - opacity: 1; - border: 1px solid #197de1; -} - -.v-ie8 .mytheme .v-tree-node-focused { - outline: 1px dotted #197de1; -} - -.mytheme .v-tree-node-selected { - color: #ecf2f8; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); -} - -.mytheme .v-tree-node-selected:after { - opacity: 1; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - border: none; -} - -.v-ie8 .mytheme .v-tree-node-selected { - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); -} - -.mytheme .v-tree-node-children { - padding-left: 19px; -} - -.v-ie8 .mytheme .v-tree-node-children { - padding-left: 0; -} - -.mytheme .v-tree-node-drag-top:before, .mytheme .v-tree-node-drag-bottom:after, .mytheme .v-tree-node-drag-bottom.v-tree-node-dragfolder.v-tree-node-expanded > .v-tree-node-children:before { - content: "\2022"; - display: block; - position: absolute; - height: 2px; - width: 100%; - background: #197de1; - font-size: 32px; - line-height: 2px; - color: #197de1; - text-indent: -4px; - text-shadow: 0 0 1px #fafafa, 0 0 1px #fafafa; - opacity: 1; - visibility: visible; -} - -.mytheme .v-tree-node-drag-bottom.v-tree-node-dragfolder.v-tree-node-expanded:after { - content: none; -} - -.mytheme .v-tree-node-caption-drag-center { - -webkit-box-shadow: 0 0 0 2px #197de1; - box-shadow: 0 0 0 2px #197de1; - position: relative; - border-radius: 4px; -} - -.v-ie8 .mytheme .v-tree-node-caption-drag-center { - outline: 2px solid #197de1; -} - -.v-ff .mytheme .v-tree-node-drag-top:before, .v-ff .mytheme .v-tree-node-drag-bottom:after { - line-height: 1px; -} - -.v-ie8 .mytheme .v-tree-node-drag-top:before, .v-ie8 .mytheme .v-tree-node-drag-bottom:after { - line-height: 0; -} - -.mytheme .v-table { - position: relative; - background: #fafafa; - color: #464646; - overflow: hidden; -} - -.mytheme .v-table-header table, .mytheme .v-table-footer table, .mytheme .v-table-table { - -webkit-box-shadow: 0 0 0 1px #d4d4d4; - box-shadow: 0 0 0 1px #d4d4d4; -} - -.v-ie8 .mytheme .v-table-header table, .v-ie8 .mytheme .v-table-footer table, .v-ie8 .mytheme .v-table-table { - outline: 1px solid #d4d4d4; -} - -.mytheme .v-table-header-wrap, .mytheme .v-table-footer-wrap, .mytheme .v-table-header-drag { - border: 1px solid #d4d4d4; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - white-space: nowrap; - font-size: 14px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); -} - -.mytheme .v-table-header-wrap { - position: relative; - border-bottom: none; -} - -.mytheme .v-table-footer-wrap { - border-top: none; -} - -.mytheme .v-table-footer td { - border-left: 1px solid #d4d4d4; -} - -.mytheme .v-table-footer-container, .mytheme .v-table-caption-container { - overflow: hidden; - line-height: 1; - min-height: 37px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.v-ie8 .mytheme .v-table-footer-container, .v-ie8 .mytheme .v-table-caption-container { - min-height: 14px; -} - -.mytheme .v-table-footer-container { - padding: 11px 12px 12px; - float: right; -} - -.mytheme [class^="v-table-header-cell"] { - position: relative; -} - -.mytheme .v-table-caption-container, .mytheme .v-table-header-drag { - padding: 12px 12px 11px; - border-left: 1px solid #d4d4d4; -} - -.mytheme .v-table-caption-container-align-right { - padding-right: 4px; -} - -.mytheme .v-table-resizer { - height: 37px; - width: 8px; - cursor: e-resize; - cursor: col-resize; - position: relative; - right: -4px; - z-index: 1; - margin-left: -8px; -} - -.mytheme .v-table-cell-content { - border-left: 1px solid #d4d4d4; - overflow: hidden; - height: 37px; - vertical-align: middle; -} - -.mytheme .v-table-cell-content:first-child { - border-left: none; - padding-left: 1px; -} - -.mytheme .v-table-header td:first-child .v-table-caption-container, .mytheme .v-table-footer td:first-child { - border-left-color: transparent; -} - -.mytheme .v-table-cell-wrapper { - line-height: 1; - padding: 0 12px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-right: 0 !important; -} - -.mytheme .v-table-cell-wrapper > .v-widget { - margin: 3px -6px; -} - -.mytheme .v-table-cell-wrapper > .v-widget.v-label, .mytheme .v-table-cell-wrapper > .v-widget.v-checkbox, .mytheme .v-table-cell-wrapper > .v-widget.v-select-optiongroup { - margin: 0; -} - -.mytheme .v-table-cell-wrapper > .v-widget.v-progressbar { - margin-left: 0; - margin-right: 0; -} - -.mytheme .v-table-body { - border: 1px solid #d4d4d4; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.mytheme .v-table-table { - background-color: white; - white-space: nowrap; -} - -.mytheme .v-table-table td { - border-top: 1px solid #d4d4d4; -} - -.mytheme .v-table-table tr:first-child > td { - border-top: none; -} - -.mytheme .v-table-row { - background-color: white; - cursor: pointer; -} - -.mytheme .v-table-row-odd { - background-color: #f5f5f5; - cursor: pointer; -} - -.mytheme .v-table-body-noselection .v-table-row, .mytheme .v-table-body-noselection .v-table-row-odd { - cursor: default; -} - -.mytheme .v-table [class*="-row"].v-selected { - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - background-origin: border-box; - color: #ecf2f8; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); -} - -.mytheme .v-table [class*="-row"].v-selected + .v-selected { - background: #166ed5; -} - -.mytheme .v-table [class*="-row"].v-selected + .v-selected td { - border-top-color: #166ed5; -} - -.mytheme .v-table [class*="-row"].v-selected .v-table-cell-content { - border-color: transparent; - border-left-color: #1d69b4; -} - -.mytheme .v-table [class*="-row"].v-selected .v-table-cell-content:first-child { - border-left-color: transparent; -} - -.mytheme .v-table-header-cell-asc .v-table-sort-indicator, .mytheme .v-table-header-cell-desc .v-table-sort-indicator { - background: transparent; - width: 19px; - height: 37px; - line-height: 37px; - margin-left: -19px; -} - -.mytheme .v-table-header-cell-asc .v-table-sort-indicator:before, .mytheme .v-table-header-cell-desc .v-table-sort-indicator:before { - font-style: normal; - font-weight: normal; - display: inline-block; -} - -.mytheme .v-table-header-cell-asc .v-table-sort-indicator:before { - content: "\f0de"; - font-family: ThemeIcons; -} - -.mytheme .v-table-header-cell-desc .v-table-sort-indicator:before { - content: "\f0dd"; - font-family: ThemeIcons; -} - -.mytheme [class*="rowheader"] span.v-icon { - min-width: 1em; -} - -.mytheme .v-table-focus { - outline: 1px solid #197de1; - outline-offset: -1px; -} - -.mytheme .v-drag-element.v-table-focus, .mytheme .v-drag-element .v-table-focus { - outline: none; -} - -.mytheme .v-table-header-drag { - position: absolute; - opacity: 0.9; - filter: alpha(opacity=90) ; - margin-top: -19px; - z-index: 30000; - line-height: 1; -} - -.mytheme .v-table-focus-slot-right { - border-right: 3px solid #197de1; - right: -2px; - margin-left: -11px !important; -} - -.mytheme .v-table-focus-slot-left { - float: left; - border-left: 3px solid #197de1; - left: -1px; - right: auto; - margin-left: 0 !important; - margin-right: -11px; -} - -.mytheme .v-table-column-selector { - height: 37px; - padding: 0 16px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - position: absolute; - z-index: 2; - top: 0; - right: 0; - width: 19px; - height: 19px; - line-height: 19px; - padding: 0; - border-top-width: 0; - border-right-width: 0; - border-radius: 0 0 0 4px; - cursor: pointer; - text-align: center; - opacity: 0; - filter: alpha(opacity=0) ; - -webkit-transition: opacity 200ms 2s; - -moz-transition: opacity 200ms 2s; - transition: opacity 200ms 2s; -} - -.mytheme .v-table-column-selector:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-table-column-selector:hover:after { - background-color: rgba(186, 186, 186, 0.1); -} - -.mytheme .v-table-column-selector:focus:after { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-table-column-selector:active:after { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-table-column-selector:after { - content: ""; - position: absolute; - border: none; - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.mytheme .v-table-column-selector:active:after { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-table-column-selector:before { - font-family: ThemeIcons; - content: "\f013"; -} - -.mytheme .v-table-header-wrap:hover .v-table-column-selector { - opacity: 1; - filter: none ; - -webkit-transition-delay: 200ms; - -moz-transition-delay: 200ms; - transition-delay: 200ms; -} - -.mytheme .v-on:before, .mytheme .v-off:before { - content: "\f00c"; - font-family: ThemeIcons; - font-size: 0.9em; - margin-right: 6px; -} - -.mytheme .v-on div, .mytheme .v-off div { - display: inline; -} - -.mytheme .v-on.v-disabled, .mytheme .v-off.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-off:before { - visibility: hidden; -} - -.mytheme tbody.v-drag-element { - display: block; - overflow: visible; - -webkit-box-shadow: none; - box-shadow: none; - background: transparent; - opacity: 1; - filter: none ; -} - -.mytheme tbody.v-drag-element tr { - display: block; - - - -webkit-box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); - border-radius: 4px; - overflow: hidden; - opacity: 0.5; - filter: alpha(opacity=50) ; - background: white; -} - -.mytheme .v-table-body { - position: relative; - z-index: 1; -} - -.mytheme .v-table-scrollposition { - position: absolute; - top: 50%; - width: 100%; - height: 37px; - line-height: 37px; - margin: -19px 0 0 !important; - text-align: center; -} - -.mytheme .v-table-drag { - overflow: visible; -} - -.mytheme .v-table-drag .v-table-body { - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - border-color: #197de1; -} - -.v-ie8 .mytheme .v-table-drag .v-table-body { - border-color: #197de1; -} - -.mytheme .v-table-drag .v-table-body .v-table-focus { - outline: none; -} - -.mytheme .v-table-row-drag-middle .v-table-cell-content { - background-color: #d1e5f9; - color: #214060; -} - -.mytheme .v-table-row-drag-bottom td.v-table-cell-content { - border-bottom: 2px solid #197de1; - height: 35px; -} - -.mytheme .v-table-row-drag-bottom .v-table-cell-wrapper { - margin-bottom: -2px; -} - -.mytheme .v-table-row-drag-top td.v-table-cell-content { - border-top: 2px solid #197de1; - height: 36px; -} - -.mytheme .v-table-row-drag-top .v-table-cell-wrapper { - margin-top: -1px; -} - -.mytheme .v-table-no-stripes .v-table-row, .mytheme .v-table-no-stripes .v-table-row-odd { - background: transparent; -} - -.mytheme .v-table-no-vertical-lines .v-table-cell-content { - border-left: none; - padding-left: 1px; -} - -.mytheme .v-table-no-vertical-lines.v-treetable .v-table-cell-content { - padding-left: 13px; -} - -.mytheme .v-table-no-horizontal-lines .v-table-cell-content { - border-top: none; - border-bottom: none; -} - -.mytheme .v-table-no-horizontal-lines .v-table-row-drag-top .v-table-cell-content, .mytheme .v-table-no-horizontal-lines .v-table-row-drag-bottom .v-table-cell-content { - height: 36px; -} - -.mytheme .v-table-no-header .v-table-header-wrap { - display: none; -} - -.mytheme .v-table-borderless .v-table-header-wrap, .mytheme .v-table-borderless .v-table-footer-wrap, .mytheme .v-table-borderless .v-table-header-drag, .mytheme .v-table-borderless .v-table-body { - border: none; -} - -.mytheme .v-table-borderless .v-table-header-wrap { - border-bottom: 1px solid #d9d9d9; -} - -.mytheme .v-table-borderless .v-table-footer-wrap { - border-top: 1px solid #d9d9d9; -} - -.mytheme .v-table-compact .v-table-header-wrap, .mytheme .v-table-compact .v-table-footer-wrap, .mytheme .v-table-compact .v-table-header-drag, .mytheme .v-table-small .v-table-header-wrap, .mytheme .v-table-small .v-table-footer-wrap, .mytheme .v-table-small .v-table-header-drag { - font-size: 14px; -} - -.mytheme .v-table-compact .v-table-footer-container, .mytheme .v-table-small .v-table-footer-container { - padding: 8px 7px 9px; -} - -.mytheme .v-table-compact .v-table-caption-container, .mytheme .v-table-compact .v-table-header-drag, .mytheme .v-table-small .v-table-caption-container, .mytheme .v-table-small .v-table-header-drag { - padding-top: 9px; - padding-bottom: 8px; - padding-left: 6px; - padding-right: 6px; -} - -.mytheme .v-table-compact .v-table-caption-container-align-right, .mytheme .v-table-small .v-table-caption-container-align-right { - padding-right: 0; -} - -.mytheme .v-table-compact .v-table-resizer, .mytheme .v-table-small .v-table-resizer { - height: 31px; -} - -.mytheme .v-table-compact .v-table-cell-content, .mytheme .v-table-small .v-table-cell-content { - height: 31px; -} - -.mytheme .v-table-compact .v-table-cell-wrapper, .mytheme .v-table-small .v-table-cell-wrapper { - padding-left: 6px; - padding-right: 6px; -} - -.mytheme .v-table-compact .v-table-cell-wrapper > .v-widget, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget { - margin: 2px -3px; -} - -.mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-label, .mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-checkbox, .mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-select-optiongroup, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-label, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-checkbox, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-select-optiongroup { - margin: 0; -} - -.mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-progressbar, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-progressbar { - margin-left: 0; - margin-right: 0; -} - -.mytheme .v-table-compact .v-table-header-cell-asc .v-table-sort-indicator, .mytheme .v-table-compact .v-table-header-cell-desc .v-table-sort-indicator, .mytheme .v-table-small .v-table-header-cell-asc .v-table-sort-indicator, .mytheme .v-table-small .v-table-header-cell-desc .v-table-sort-indicator { - height: 31px; - line-height: 31px; -} - -.mytheme .v-table-compact .v-table-header-drag, .mytheme .v-table-small .v-table-header-drag { - margin-top: -16px; -} - -.mytheme .v-table-compact.v-treetable .v-table-cell-wrapper, .mytheme .v-table-small.v-treetable .v-table-cell-wrapper { - padding-left: 0; - padding-right: 0; - min-height: 16px; -} - -.mytheme .v-table-compact.v-treetable .v-table-cell-content, .mytheme .v-table-small.v-treetable .v-table-cell-content { - padding-left: 6px; - padding-right: 6px; -} - -.mytheme .v-table-compact.v-treetable .v-table-cell-content:first-child, .mytheme .v-table-small.v-treetable .v-table-cell-content:first-child { - padding-left: 7px; -} - -.mytheme .v-table-compact.v-treetable .v-table-footer-container, .mytheme .v-table-small.v-treetable .v-table-footer-container { - padding-left: 6px; - padding-right: 6px; -} - -.mytheme .v-table-compact .v-table-row-drag-top .v-table-cell-content, .mytheme .v-table-compact .v-table-row-drag-bottom .v-table-cell-content, .mytheme .v-table-small .v-table-row-drag-top .v-table-cell-content, .mytheme .v-table-small .v-table-row-drag-bottom .v-table-cell-content { - height: 30px; -} - -.mytheme .v-table-small { - font-size: 14px; -} - -.mytheme .v-table-small.v-treetable .v-table-cell-wrapper { - min-height: 14px; -} - -.mytheme .v-treetable [class*="caption-container"], .mytheme .v-treetable [class*="footer-container"], .mytheme .v-treetable [class*="cell-wrapper"] { - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; - padding-left: 0; - padding-right: 0; -} - -.mytheme .v-treetable [class*="caption-container"], .mytheme .v-treetable [class*="footer-container"] { - min-height: 14px; -} - -.mytheme .v-treetable [class*="cell-wrapper"] { - min-height: 16px; -} - -.mytheme .v-treetable [class*="caption-container"] { - padding-left: 12px; -} - -.mytheme .v-treetable [class*="caption-container-align-right"] { - padding-left: 20px; -} - -.mytheme .v-treetable [class*="footer-container"] { - padding-right: 12px; -} - -.mytheme .v-treetable [class*="cell-content"] { - padding-left: 12px; - padding-right: 12px; -} - -.mytheme .v-treetable [class*="cell-content"]:first-child { - padding-left: 13px; -} - -.mytheme .v-treetable-treespacer { - display: inline-block; - position: absolute; - width: 19px !important; - margin-left: -25px; - text-align: center; - cursor: pointer; -} - -.mytheme .v-treetable-node-closed:before { - content: "\f0da"; - font-family: ThemeIcons; -} - -.mytheme .v-treetable-node-open:before { - content: "\f0d7"; - font-family: ThemeIcons; -} - -.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter { - width: 1px; -} - -.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter:after { - left: -6px; - right: -6px; -} - -.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before { - height: 37px; - padding: 0 16px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - height: auto; - padding: 0; - border-radius: 0; - background-color: #fafafa; - background-image: -webkit-linear-gradient(left, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to right,#fafafa 2%, #efefef 98%); -} - -.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:hover:after { - background-color: rgba(186, 186, 186, 0.1); -} - -.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:focus:after { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:active:after { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-second-container { - margin-left: 1px; -} - -.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter { - height: 1px; -} - -.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter:after { - top: -6px; - bottom: -6px; -} - -.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before { - height: 37px; - padding: 0 16px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - height: auto; - padding: 0; - border-radius: 0; -} - -.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:hover:after { - background-color: rgba(186, 186, 186, 0.1); -} - -.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:focus:after { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:active:after { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter { - width: 12px; -} - -.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter:after { - left: 0px; - right: 0px; -} - -.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before { - height: 37px; - padding: 0 16px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - height: auto; - padding: 0; - border-radius: 0; - background-color: #fafafa; - background-image: -webkit-linear-gradient(left, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to right,#fafafa 2%, #efefef 98%); -} - -.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:hover:after { - background-color: rgba(186, 186, 186, 0.1); -} - -.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:focus:after { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:active:after { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:after { - content: ""; - border: 1px solid #dadada; - border-top-color: #bababa; - border-left-color: #bababa; - position: absolute; - top: 50%; - left: 50%; - width: 0; - height: 37px; - margin-left: -1px; - margin-top: -19px; -} - -.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-second-container { - margin-left: 12px; -} - -.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter { - height: 12px; -} - -.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter:after { - top: 0px; - bottom: 0px; -} - -.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before { - height: 37px; - padding: 0 16px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - height: auto; - padding: 0; - border-radius: 0; -} - -.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:hover:after { - background-color: rgba(186, 186, 186, 0.1); -} - -.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:focus:after { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:active:after { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:after { - content: ""; - border: 1px solid #dadada; - border-top-color: #bababa; - border-left-color: #bababa; - position: absolute; - top: 50%; - left: 50%; - width: 37px; - height: 0; - margin-left: -19px; - margin-top: -1px; -} - -.mytheme .v-progressbar-wrapper { - border-radius: 4px; - height: 9px; - background-color: #d4d4d4; - background-image: -webkit-linear-gradient(bottom, #d7d7d7 2%, #c7c7c7 98%); - background-image: linear-gradient(to top,#d7d7d7 2%, #c7c7c7 98%); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-width: 74px; -} - -.mytheme .v-progressbar-indicator { - border-radius: 4px; - height: inherit; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - - - border: 1px solid #1362b1; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - max-width: 100%; - min-width: 8px; - -webkit-transition: width 160ms; - -moz-transition: width 160ms; - transition: width 160ms; -} - -.mytheme .v-progressbar-point .v-progressbar-indicator { - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; - border: none; - text-align: right; - overflow: hidden; -} - -.mytheme .v-progressbar-point .v-progressbar-indicator:before { - content: ""; - display: inline-block; - border-radius: 4px; - height: inherit; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - - - border: 1px solid #1362b1; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - max-width: 100%; - width: 9px; - vertical-align: top; -} - -.mytheme .v-progressbar-indeterminate { - height: 24px !important; - width: 24px !important; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - border: 2px solid rgba(25, 125, 225, 0.2); - border-top-color: #197de1; - border-right-color: #197de1; - border-radius: 100%; - -webkit-animation: v-rotate-360 500ms infinite linear; - -moz-animation: v-rotate-360 500ms infinite linear; - animation: v-rotate-360 500ms infinite linear; - pointer-events: none; -} - -.v-ie8 .mytheme .v-progressbar-indeterminate, .v-ie9 .mytheme .v-progressbar-indeterminate { - border: none; - border-radius: 4px; - background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; - background-size: 80%; -} - -.v-ie8 .mytheme .v-progressbar-indeterminate { - min-width: 30px; - min-height: 30px; -} - -.mytheme .v-progressbar-indeterminate .v-progressbar-wrapper { - display: none; -} - -.mytheme .v-slider { - position: relative; -} - -.mytheme .v-slider:focus { - outline: none; -} - -.mytheme .v-slider:focus .v-slider-handle:after { - opacity: 1; -} - -.v-ie8 .mytheme .v-slider:focus .v-slider-handle:after { - visibility: visible; -} - -.mytheme .v-slider.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-slider-base { - border-radius: 4px; - height: 9px; - background-color: #d4d4d4; - background-image: -webkit-linear-gradient(bottom, #d7d7d7 2%, #c7c7c7 98%); - background-image: linear-gradient(to top,#d7d7d7 2%, #c7c7c7 98%); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - min-width: 74px; - height: 6px; - margin: 16px 11px; - white-space: nowrap; - overflow: hidden; - -} - -.mytheme .v-slider-base:before { - content: ""; - position: absolute; - top: 16px; - bottom: 16px; - left: 11px; - width: 8px; - border-radius: 4px; - border-left: 1px solid #1362b1; -} - -.mytheme .v-slider-base:after { - border-radius: 4px; - height: inherit; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - - - border: 1px solid #1362b1; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - max-width: 100%; - content: ""; - display: inline-block; - margin-left: -100%; - width: 100%; - vertical-align: top; -} - -.v-ie8 .mytheme .v-slider-base:after { - position: relative; - left: -11px; -} - -.mytheme .v-has-width > .v-slider-base { - min-width: 0; -} - -.mytheme .v-slider-handle { - margin-top: -16px; - width: 0.1px; - display: inline-block; - vertical-align: top; -} - -.mytheme .v-slider-handle:before { - height: 37px; - padding: 0 16px; - color: #191919; - font-weight: 400; - - - border-radius: 4px; - border: 1px solid #c5c5c5; - border-top-color: #c5c5c5; - border-bottom-color: #bcbcbc; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); -} - -.mytheme .v-slider-handle:before:after { - border: inherit; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; -} - -.mytheme .v-slider-handle:before:hover:after { - background-color: rgba(186, 186, 186, 0.1); -} - -.mytheme .v-slider-handle:before:focus:after { - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-slider-handle:before:active:after { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-slider-handle:after { - border: 1px solid #c5c5c5; - border-color: #197de1; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - opacity: 0; - -webkit-transition: opacity 200ms; - -moz-transition: opacity 200ms; - transition: opacity 200ms; -} - -.v-ie8 .mytheme .v-slider-handle:after { - visibility: hidden; -} - -.mytheme .v-slider-handle:before, .mytheme .v-slider-handle:after { - content: ""; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0; - width: 22px; - height: 22px; - border-radius: 11px; - position: absolute; - z-index: 1; - margin-top: 8px; - margin-left: -11px; -} - -.mytheme .v-slider-feedback { - background-color: #323232; - background-color: rgba(50, 50, 50, 0.9); - -webkit-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); - box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); - color: white; - padding: 5px 9px; - border-radius: 3px; - max-width: 35em; - overflow: hidden !important; - font-size: 14px; -} - -.mytheme .v-slider-vertical { - padding: 11px 0; - height: 96px; -} - -.mytheme .v-slider-vertical .v-slider-base { - background-color: #d4d4d4; - background-image: -webkit-linear-gradient(right, #d7d7d7 2%, #c7c7c7 98%); - background-image: linear-gradient(to left,#d7d7d7 2%, #c7c7c7 98%); - width: 6px; - height: 100% !important; - min-width: 0; - margin: 0 16px; -} - -.mytheme .v-slider-vertical .v-slider-base:before { - top: auto; - bottom: 11px; - left: 16px; - right: 16px; - width: auto; - height: 8px; - border-left: none; - border-bottom: 1px solid #1362b1; -} - -.mytheme .v-slider-vertical .v-slider-base:after { - height: 101%; - margin-left: 0; - background-color: #197de1; - background-image: -webkit-linear-gradient(left, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to right,#1b87e3 2%, #166ed5 98%); -} - -.v-ie8 .mytheme .v-slider-vertical .v-slider-base:after { - top: 11px; - left: 0; - height: 130%; -} - -.mytheme .v-slider-vertical .v-slider-handle { - width: 0; - height: 0.1px; - width: 37px; - display: block; -} - -.mytheme .v-slider-vertical .v-slider-handle:before, .mytheme .v-slider-vertical .v-slider-handle:after { - width: 22px; - height: 22px; - margin-top: -11px; - margin-left: -8px; -} - -.mytheme .v-slider-no-indicator .v-slider-base:before, .mytheme .v-slider-no-indicator .v-slider-base:after { - display: none; -} - -.mytheme .v-tabsheet:not(.v-has-width) { - width: auto !important; -} - -.mytheme .v-tabsheet-spacertd { - display: none !important; -} - -.mytheme .v-tabsheet-tabcontainer { - position: relative; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mytheme .v-tabsheet-tabcontainer:before { - content: ""; - position: absolute; - height: 0; - border-top: 1px solid #dfdfdf; - bottom: 0; - left: 0; - right: 0; -} - -.mytheme .v-tabsheet-tabcontainer .v-tabsheet-tabs { - position: relative; -} - -.mytheme .v-tabsheet-tabitemcell { - vertical-align: bottom; -} - -.mytheme .v-tabsheet-tabitemcell .v-tabsheet-tabitem { - line-height: 0; - overflow: hidden; -} - -.mytheme .v-tabsheet-tabitemcell .v-caption { - margin-left: 19px; - padding: 0 4px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - cursor: pointer; - text-align: center; - line-height: 37px; - font-size: 15px; - font-weight: 300; - color: #696969; - width: auto !important; - overflow: hidden; - text-overflow: ellipsis; - border-bottom: 2px solid transparent; - position: relative; - -webkit-transition: border-bottom 200ms, color 200ms; - -moz-transition: border-bottom 200ms, color 200ms; - transition: border-bottom 200ms, color 200ms; -} - -.mytheme .v-tabsheet-tabitemcell .v-caption .v-captiontext { - display: inline; -} - -.mytheme .v-tabsheet-tabitemcell .v-caption .v-icon + .v-captiontext { - margin-left: 9px; -} - -.mytheme .v-tabsheet-tabitemcell .v-caption:hover { - color: #197de1; -} - -.mytheme .v-tabsheet-tabitemcell .v-caption.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; - cursor: default; - color: inherit !important; -} - -.mytheme .v-tabsheet-tabitemcell:first-child .v-caption, .mytheme .v-tabsheet-tabitemcell[aria-hidden="true"] + td .v-caption { - margin-left: 0; -} - -.mytheme .v-tabsheet-tabitemcell:focus { - outline: none; -} - -.mytheme .v-tabsheet-tabitemcell:focus .v-caption { - color: #197de1; -} - -.mytheme .v-tabsheet-tabitemcell .v-tabsheet-tabitem-selected .v-caption.v-caption { - border-bottom-color: #197de1; - color: #197de1; -} - -.mytheme .v-tabsheet-tabitemcell .v-caption-closable { - padding-right: 22px; -} - -.mytheme .v-tabsheet-tabitemcell.icons-on-top .v-caption-closable { - padding-right: 4px; -} - -.mytheme .v-tabsheet-tabitemcell .v-tabsheet-caption-close { - position: absolute; - right: 0; - top: 50%; - margin: -8px 0 0; - font-size: 18px; - line-height: 18px; - width: 18px; - text-align: center; - border-radius: 2px; - color: #969696; -} - -.mytheme .v-tabsheet-tabitemcell .v-tabsheet-caption-close:hover { - background: rgba(0, 0, 0, 0.03); - color: #197de1; -} - -.mytheme .v-tabsheet-tabitemcell .v-tabsheet-caption-close:active { - background: #197de1; - color: #c8dbed; -} - -.mytheme .v-tabsheet-scroller { - position: absolute; - top: 0; - right: 0; - bottom: 0; - padding-left: 19px; - background-color: transparent; - background-image: -webkit-linear-gradient(right, #fafafa 70%, rgba(250, 250, 250, 0) 100%); - background-image: linear-gradient(to left,#fafafa 70%, rgba(250, 250, 250, 0) 100%); - pointer-events: none; -} - -.mytheme .v-tabsheet-scroller:after { - content: ""; - height: 1px; - position: absolute; - bottom: 0; - left: 0; - right: 0; - display: block; - background-color: transparent; - background-image: -webkit-linear-gradient(right, #dfdfdf 70%, rgba(223, 223, 223, 0) 100%); - background-image: linear-gradient(to left,#dfdfdf 70%, rgba(223, 223, 223, 0) 100%); -} - -.v-ie8 .mytheme .v-tabsheet-scroller, .v-ie9 .mytheme .v-tabsheet-scroller { - background-color: #fafafa; -} - -.v-ie8 .mytheme .v-tabsheet-scroller:after, .v-ie9 .mytheme .v-tabsheet-scroller:after { - background-color: #dfdfdf; -} - -.mytheme .v-tabsheet-scroller button { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - border: none; - background: transparent; - font: inherit; - color: inherit; - height: 100%; - margin: 0; - padding: 0 9px; - outline: none; - cursor: pointer; - pointer-events: auto; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-tabsheet-scroller button:hover { - opacity: 1; - filter: none ; - color: #197de1; -} - -.mytheme .v-tabsheet-scroller button:active { - opacity: 0.7; - filter: alpha(opacity=70) ; - color: #197de1; -} - -.mytheme .v-tabsheet-scroller button::-moz-focus-inner { - padding: 0; - border: 0; -} - -.mytheme .v-tabsheet-scroller [class*="Next"] { - padding-left: 5px; -} - -.mytheme .v-tabsheet-scroller [class*="Next"]:before { - font-family: ThemeIcons; - content: "\f054"; -} - -.mytheme .v-tabsheet-scroller [class*="Prev"] { - padding-right: 5px; -} - -.mytheme .v-tabsheet-scroller [class*="Prev"]:before { - font-family: ThemeIcons; - content: "\f053"; -} - -.mytheme .v-tabsheet-scroller [class*="disabled"] { - cursor: default; - color: inherit !important; - opacity: 0.1 !important; - filter: alpha(opacity=10) !important; -} - -.mytheme .v-tabsheet-tabsheetpanel > .v-scrollable > .v-widget { - -webkit-animation: valo-animate-in-fade 300ms backwards; - -moz-animation: valo-animate-in-fade 300ms backwards; - animation: valo-animate-in-fade 300ms backwards; -} - -.mytheme .v-tabsheet-deco { - height: 20px !important; - width: 20px !important; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - border: 2px solid rgba(25, 125, 225, 0.2); - border-top-color: #197de1; - border-right-color: #197de1; - border-radius: 100%; - -webkit-animation: v-rotate-360 500ms infinite linear; - -moz-animation: v-rotate-360 500ms infinite linear; - animation: v-rotate-360 500ms infinite linear; - pointer-events: none; - display: none; - position: absolute; - z-index: 1; - bottom: 50%; - margin-bottom: -29px; - left: 50%; - margin-left: -10px; -} - -.v-ie8 .mytheme .v-tabsheet-deco, .v-ie9 .mytheme .v-tabsheet-deco { - border: none; - border-radius: 4px; - background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; - background-size: 80%; -} - -.v-ie8 .mytheme .v-tabsheet-deco { - min-width: 30px; - min-height: 30px; -} - -.mytheme .v-tabsheet-loading .v-tabsheet-deco { - display: block; -} - -.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer table, .mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer tbody, .mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer tr { - width: 100%; -} - -.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer tr { - display: table; - table-layout: fixed; -} - -.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer td { - display: table-cell; -} - -.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer .v-caption { - margin: 0; - display: block; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption { - margin-left: 4px; - padding: 0 12px; - background-color: #fafafa; - border: 1px solid transparent; - line-height: 36px; - border-radius: 4px 4px 0 0; - font-weight: 400; - -webkit-transition: background-color 160ms; - -moz-transition: background-color 160ms; - transition: background-color 160ms; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption:hover { - background-color: #f2f2f2; - border-bottom-color: #dfdfdf; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption.v-disabled:hover { - background-color: #fafafa; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption-closable { - padding-right: 30px; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-tabsheet-caption-close { - top: 4px; - right: 4px; - margin-top: 0; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer td:first-child .v-caption, .mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer [aria-hidden="true"] + td .v-caption { - margin-left: 0; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-tabsheet-tabitem .v-caption { - border-color: #dfdfdf; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-tabsheet-tabitem-selected .v-caption { - background: white; - border-color: #dfdfdf; - border-bottom: none; - padding-bottom: 1px; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-content { - border: 1px solid #dfdfdf; - border-top: none; -} - -.mytheme .v-tabsheet-framed > .v-tabsheet-content > div { - background: white; -} - -.mytheme .v-tabsheet-framed.padded-tabbar > .v-tabsheet-tabcontainer { - border: 1px solid #dfdfdf; - border-bottom: none; - background: #fafafa; - padding-top: 6px; -} - -.mytheme .v-tabsheet-framed.icons-on-top > .v-tabsheet-tabcontainer .v-tabsheet-tabitem-selected .v-caption { - padding-bottom: 7px; -} - -.mytheme .v-tabsheet-centered-tabs > .v-tabsheet-tabcontainer { - text-align: center; -} - -.mytheme .v-tabsheet-right-aligned-tabs > .v-tabsheet-tabcontainer { - text-align: right; -} - -.mytheme .v-tabsheet-padded-tabbar > .v-tabsheet-tabcontainer .v-tabsheet-tabs { - padding: 0 9px; -} - -.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-caption { - padding-top: 6px; - padding-bottom: 6px; - line-height: 1.2; -} - -.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-icon { - display: block; -} - -.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-icon + .v-captiontext.v-captiontext { - margin-left: 0; -} - -.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-caption-closable { - padding-right: 12px; -} - -.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-tabsheet-caption-close { - top: 4px; - margin-top: 0; -} - -.mytheme .v-tabsheet-compact-tabbar > .v-tabsheet-tabcontainer-compact-tabbar .v-caption { - line-height: 1.8; -} - -.mytheme .v-tabsheet-only-selected-closable > .v-tabsheet-tabcontainer .v-tabsheet-caption-close { - visibility: hidden; -} - -.mytheme .v-tabsheet-only-selected-closable > .v-tabsheet-tabcontainer .v-tabsheet-tabitem-selected .v-tabsheet-caption-close { - visibility: visible; -} - -.mytheme .v-colorpicker-popup.v-window { - min-width: 220px !important; -} - -.mytheme .v-colorpicker-popup .v-tabsheet-tabs { - padding: 0 9px; -} - -.mytheme .v-colorpicker-popup [class$="sliders"] { - padding: 12px; -} - -.mytheme .v-colorpicker-popup [class$="sliders"] .v-widget { - width: 100% !important; - vertical-align: middle; -} - -.mytheme .v-colorpicker-popup [class$="sliders"] .v-has-caption { - white-space: nowrap; - padding-left: 48px; -} - -.mytheme .v-colorpicker-popup [class$="sliders"] .v-caption { - display: inline-block; - margin-left: -48px; - width: 48px; -} - -.mytheme .v-colorpicker-popup [class$="sliders"] .v-slot-hue-slider + .v-slot .v-has-caption { - padding-left: 80px; -} - -.mytheme .v-colorpicker-popup [class$="sliders"] .v-slot-hue-slider + .v-slot .v-caption { - margin-left: -80px; - width: 80px; -} - -.mytheme .v-colorpicker-popup .v-slider-red .v-slider-base:after { - background: red; - border: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-colorpicker-popup .v-slider-green .v-slider-base:after { - background: green; - border: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-colorpicker-popup .v-slider-blue .v-slider-base:after { - background: blue; - border: none; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-colorpicker-popup .v-margin-bottom { - padding-bottom: 0; -} - -.mytheme .v-colorpicker-popup .resize-button { - width: 100% !important; - height: auto !important; - text-align: center; - outline: none; -} - -.mytheme .v-colorpicker-popup .resize-button:before { - font-family: ThemeIcons; - content: "\f141"; -} - -.mytheme .v-colorpicker-popup .resize-button-caption { - display: none; -} - -.mytheme .v-colorpicker-popup .v-horizontallayout { - height: auto !important; - padding: 9px 0; - background-color: #fafafa; - border-top: 1px solid #ededed; -} - -.mytheme .v-colorpicker-popup .v-horizontallayout .v-expand { - overflow: visible; -} - -.mytheme .v-colorpicker-popup .v-horizontallayout .v-button { - width: 80% !important; -} - -.mytheme .v-colorpicker-preview { - width: 100% !important; - height: auto !important; - padding: 9px; -} - -.mytheme .v-colorpicker-preview-textfield { - height: auto !important; - text-align: center; - border: none; -} - -.mytheme .v-colorpicker { - width: auto; -} - -.mytheme .v-colorpicker-button-color { - position: absolute; - top: 6px; - right: 6px; - bottom: 6px; - left: 6px; - border-radius: 3px; - border: 1px solid rgba(0, 0, 0, 0.5); - max-width: 23px; -} - -.mytheme .v-colorpicker-button-color + .v-button-caption:not(:empty) { - margin-left: 19px; -} - -.v-ie8 .mytheme .v-colorpicker-button-color { - position: relative; - top: auto; - right: auto; - bottom: auto; - left: auto; - width: 16px; - height: 16px; - display: inline-block; - vertical-align: middle; - margin: 0 -8px; -} - -.v-ie8 .mytheme .v-colorpicker-button-color + .v-button-caption { - margin-left: 19px; -} - -.mytheme .v-panel { - background: white; - color: #474747; - border-radius: 4px; - border: 1px solid #d5d5d5; - -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - overflow: visible !important; -} - -.mytheme .v-panel-caption { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0 12px; - line-height: 36px; - border-bottom: 1px solid #d5d5d5; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #f6f6f6 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #f6f6f6 98%); - color: #464646; - font-weight: 400; - font-size: 14px; - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee; - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - border-radius: 3px 3px 0 0; -} - -.mytheme .v-panel-content { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - width: 100%; - height: 100%; -} - -.mytheme .v-panel-content > .v-margin-top { - padding-top: 12px; -} - -.mytheme .v-panel-content > .v-margin-right { - padding-right: 12px; -} - -.mytheme .v-panel-content > .v-margin-bottom { - padding-bottom: 12px; -} - -.mytheme .v-panel-content > .v-margin-left { - padding-left: 12px; -} - -.mytheme .v-panel-borderless { - background: transparent; - color: inherit; - border: none; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-panel-borderless > div > [class*="-caption"] { - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; - color: inherit; - padding: 0; - margin: 0 12px; - border-bottom: none; -} - -.mytheme .v-panel-well { - background: #f5f5f5; - color: #454545; - -webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); - border-radius: 4px; - border: 1px solid #c5c5c5; -} - -.mytheme .v-panel-well > div > [class*="-caption"] { - background: transparent; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-panel-scroll-divider > [class*="-captionwrap"] { - position: relative; - z-index: 2; -} - -.mytheme .v-panel-scroll-divider > [class*="-captionwrap"]:after { - content: ""; - position: absolute; - bottom: -1px; - right: 0; - left: 0; - height: 0; - border-top: 1px solid #dfdfdf; - border-color: rgba(197, 197, 197, 0.5); -} - -.mytheme .v-panel-scroll-divider > [class*="-content"]:before { - content: ""; - position: absolute; - z-index: 2; - top: 0; - height: 0; - border-top: 1px solid #fafafa; - left: 0; - right: 0; -} - -.mytheme .v-panel-caption.v-horizontallayout { - height: auto !important; - line-height: 0; -} - -.mytheme .v-panel-caption.v-horizontallayout .v-slot { - vertical-align: middle; -} - -.mytheme .v-panel-caption.v-horizontallayout .v-label { - line-height: 37px; -} - -.mytheme .v-accordion { - background: white; - color: #474747; - border-radius: 4px; - border: 1px solid #d5d5d5; - -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #f4f4f4 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #f4f4f4 98%); - overflow: hidden; -} - -.mytheme .v-accordion-item { - position: relative; -} - -.mytheme .v-accordion-item:first-child { - border-top-left-radius: 3px; - border-top-right-radius: 3px; -} - -.mytheme .v-accordion-item:last-child { - border-bottom-left-radius: 3px; - border-bottom-right-radius: 3px; -} - -.mytheme .v-accordion-item:last-child [class*="item-content"] { - border-radius: inherit; -} - -.mytheme .v-accordion-item[class*="item-open"]:last-child > div > .v-caption { - border-radius: 0; -} - -.mytheme .v-accordion-item:not([class*="item-open"]):last-child > div > .v-caption { - border-bottom: none; - margin-bottom: 0; -} - -.mytheme .v-accordion-item[class*="item-open"] + [class*="item"] { - border-top: 1px solid #d9d9d9; -} - -.mytheme .v-accordion-item-caption { - border-radius: inherit; -} - -.mytheme .v-accordion-item-caption > .v-caption { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - padding: 0 12px; - line-height: 36px; - border-bottom: 1px solid #d5d5d5; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #f6f6f6 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #f6f6f6 98%); - color: #464646; - font-weight: 400; - font-size: 14px; - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee; - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); - display: block; - background: transparent; - border-bottom-color: #c9c9c9; - border-radius: inherit; - cursor: pointer; - position: relative; -} - -.mytheme .v-accordion-item-caption > .v-caption:hover:before, .mytheme .v-accordion-item-caption > .v-caption:active:before { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: 0; - left: 0; - border-radius: inherit; -} - -.mytheme .v-accordion-item-caption > .v-caption:hover:before { - background-color: rgba(186, 186, 186, 0.1); - border: none; -} - -.mytheme .v-accordion-item-caption > .v-caption:active:before { - background-color: rgba(125, 125, 125, 0.2); -} - -.mytheme .v-accordion-item-content { - -webkit-box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.05); - background-color: white; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; -} - -.mytheme .v-accordion-item-content > .v-margin-top { - padding-top: 12px; -} - -.mytheme .v-accordion-item-content > .v-margin-right { - padding-right: 12px; -} - -.mytheme .v-accordion-item-content > .v-margin-bottom { - padding-bottom: 12px; -} - -.mytheme .v-accordion-item-content > .v-margin-left { - padding-left: 12px; -} - -.mytheme .v-accordion-borderless { - border: none; - border-radius: 0; - -webkit-box-shadow: none; - box-shadow: none; -} - -.mytheme .v-accordion-borderless > .v-accordion-item, .mytheme .v-accordion-borderless > .v-accordion-item > div > .v-caption, .mytheme .v-accordion-borderless > .v-accordion-item > .v-accordion-item-content { - border-radius: 0; -} - -.mytheme .v-select-twincol { - white-space: normal; -} - -.mytheme .v-select-twincol select { - border: 1px solid #c5c5c5; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - color: #464646; -} - -.mytheme .v-select-twincol select:focus { - outline: none; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-select-twincol .v-textfield, .mytheme .v-select-twincol .v-nativebutton { - width: auto !important; - margin-top: 9px; -} - -.mytheme .v-select-twincol .v-nativebutton { - margin-left: 9px; -} - -.mytheme .v-select-twincol-caption-left, .mytheme .v-select-twincol-caption-right { - font-size: 14px; - font-weight: 400; - padding-bottom: 0.3em; - padding-left: 1px; -} - -.mytheme .v-select-twincol-buttons { - white-space: nowrap; - display: inline-block; - vertical-align: top; - position: relative; - min-width: 3.5em; -} - -.mytheme .v-select-twincol-buttons .v-button { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - display: inline-block; - vertical-align: top; - text-align: left; - white-space: normal; - position: absolute; - left: 9px; - right: 9px; - top: 36px; - padding: 0; - text-align: center; -} - -.mytheme .v-select-twincol-buttons .v-button:first-child { - top: 0; -} - -.mytheme .v-select-twincol-buttons .v-button-caption { - display: none; -} - -.mytheme .v-select-twincol-buttons .v-button:focus { - z-index: 1; -} - -.mytheme .v-select-twincol-buttons .v-button:first-child { - border-radius: 4px 4px 0 0; -} - -.mytheme .v-select-twincol-buttons .v-button:last-child { - border-radius: 0 0 4px 4px; -} - -.mytheme .v-select-twincol-buttons .v-button-wrap:before { - font-family: ThemeIcons; - content: "\f053"; -} - -.mytheme .v-select-twincol-buttons .v-button:first-child .v-button-wrap:before { - font-family: ThemeIcons; - content: "\f054"; -} - -.mytheme .v-select-twincol-error .v-select-twincol-options, .mytheme .v-select-twincol-error .v-select-twincol-selections { - border-color: #ed473b !important; - background: #fffbfb; - color: #6c2621; -} - -.mytheme .v-select select { - border: 1px solid #c5c5c5; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - color: #464646; -} - -.mytheme .v-select select:focus { - outline: none; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-select-select { - display: block; -} - -.mytheme .v-select-select + .v-textfield { - width: auto !important; - margin-top: 9px; -} - -.mytheme .v-select-select + .v-textfield + .v-nativebutton { - margin-top: 9px; - margin-left: 9px; -} - -.mytheme .v-select-error .v-select-select { - border-color: #ed473b !important; - background: #fffbfb; - color: #6c2621; -} - -.mytheme .v-calendar-header-day { - font-weight: 400; - text-align: center; - padding: 7px 0; -} - -.mytheme .v-calendar-header-week .v-calendar-back, .mytheme .v-calendar-header-week .v-calendar-next { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - background: transparent; - border: none; - padding: 0; - margin: 0; - cursor: pointer; - outline: none; - color: inherit; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-calendar-header-week .v-calendar-back:focus, .mytheme .v-calendar-header-week .v-calendar-next:focus { - outline: none; -} - -.mytheme .v-calendar-header-week .v-calendar-back:hover, .mytheme .v-calendar-header-week .v-calendar-next:hover { - opacity: 1; - filter: none ; -} - -.mytheme .v-calendar-header-week .v-calendar-back:active, .mytheme .v-calendar-header-week .v-calendar-next:active { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-calendar-header-week .v-calendar-back:before { - font-family: ThemeIcons; - content: "\f053"; -} - -.mytheme .v-calendar-header-week .v-calendar-next:before { - font-family: ThemeIcons; - content: "\f054"; -} - -.mytheme .v-calendar-month { - outline: none; - overflow: hidden; -} - -.mytheme .v-calendar-month td { - vertical-align: top; -} - -.mytheme .v-calendar-week-number { - cursor: pointer; - width: 20px; - text-align: center; - font-size: 0.8em; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-calendar-week-number:hover { - opacity: 1; - filter: none ; -} - -.mytheme .v-calendar-month-day { - outline: none; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - line-height: 1.2; -} - -.mytheme .v-calendar-bottom-spacer, .mytheme .v-calendar-spacer, .mytheme .v-calendar-bottom-spacer-empty { - height: 19px; - margin-bottom: 3px; -} - -.mytheme .v-calendar-bottom-spacer { - font-size: 0.8em; - padding: 0 5px; - cursor: pointer; -} - -.mytheme .v-calendar-bottom-spacer:hover { - color: #197de1; -} - -.mytheme .v-calendar-day-number { - line-height: 25px; - font-size: 16px; - text-align: right; - margin: 0 5px; - white-space: nowrap; - border-top: 1px solid #f2f2f2; - cursor: pointer; -} - -.mytheme .v-calendar-day-number:hover { - color: #197de1; -} - -.mytheme .v-calendar-month-day-today { - background: #eef3f8; -} - -.mytheme .v-calendar-month-day-today .v-calendar-day-number { - font-weight: 400; - color: #197de1; - border-top: 2px solid #197de1; - line-height: 24px; - margin: 0; - padding: 0 5px; -} - -.mytheme .v-calendar-month-day-selected { - background-color: #e3edf7; -} - -.mytheme .v-calendar-month-day-dragemphasis { - background-color: #a8a8a8; -} - -.mytheme .v-calendar-month-day-scrollable { - overflow-y: scroll; -} - -.mytheme .v-calendar-weekly-longevents { - margin-left: 50px; - border-bottom: 3px solid #e0e0e0; -} - -.mytheme .v-calendar-weekly-longevents .v-calendar-event-all-day { - height: 22px; - line-height: 1.6; - margin-bottom: 3px; -} - -.mytheme .v-calendar-header-week td { - vertical-align: middle !important; -} - -.mytheme .v-calendar-header-week .v-calendar-header-day { - cursor: pointer; -} - -.mytheme .v-calendar-times { - width: 50px; - font-size: 0.77em; - line-height: 1; - white-space: nowrap; -} - -.mytheme .v-calendar-time { - text-align: right; - padding-right: 9px; - margin-top: -6px; - padding-bottom: 6px; -} - -.mytheme .v-calendar-day-times, .mytheme .v-calendar-day-times-today { - outline: none; - border-right: 1px solid transparent; -} - -.mytheme .v-calendar-day-times:focus, .mytheme .v-calendar-day-times-today:focus { - outline: none; -} - -.mytheme .v-calendar .v-datecellslot, .mytheme .v-calendar .v-datecellslot-even { - border-top: 1px solid #dfdfdf; -} - -.mytheme .v-calendar .v-datecellslot:first-child, .mytheme .v-calendar .v-datecellslot-even:first-child { - border-top-color: transparent; -} - -.mytheme .v-calendar .v-datecellslot { - border-top-style: dotted; -} - -.mytheme .v-calendar .v-datecellslot, .mytheme .v-calendar .v-datecellslot-even { - margin-right: 5px; -} - -.mytheme .v-calendar-current-time { - background: #197de1; - line-height: 1px; - pointer-events: none; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-calendar-current-time:before { - content: "\2022"; - color: #197de1; - font-size: 22px; - margin-left: -0.07em; -} - -.mytheme .v-calendar .v-daterange { - position: relative; -} - -.mytheme .v-calendar .v-daterange:before { - content: ""; - position: absolute; - top: 0; - right: 0; - bottom: -1px; - left: 0; - background: #197de1; - opacity: 0.5; - filter: alpha(opacity=50) ; - border-radius: 4px 4px 0 0; -} - -.mytheme .v-calendar .v-daterange + .v-daterange { - border-color: transparent; -} - -.mytheme .v-calendar .v-daterange + .v-daterange:before { - border-radius: 0; -} - -.mytheme .v-calendar-event { - font-size: 0.85em; - overflow: hidden; - cursor: pointer; - outline: none; - border-radius: 4px; -} - -.mytheme .v-calendar-event:focus { - outline: none; -} - -.mytheme .v-calendar-event-month { - padding: 0 5px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - margin-bottom: 3px; - white-space: nowrap; - text-overflow: ellipsis; - height: 19px; - line-height: 19px; -} - -.mytheme .v-calendar-event-month .v-calendar-event-time { - float: right; - font-size: 0.9em; - line-height: 19px; - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-calendar-event-month:before { - content: "\25cf"; - margin-right: 0.2em; -} - -.mytheme .v-calendar-event-all-day { - padding: 0 5px; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - height: 19px; - line-height: 19px; - border-radius: 0; - margin-left: -1px; - white-space: nowrap; -} - -.mytheme .v-calendar-event-all-day:before { - content: ""; -} - -.mytheme .v-calendar-event-start { - overflow: visible; - margin-left: 0; -} - -.mytheme .v-calendar-event-start.v-calendar-event-continued-to, .mytheme .v-calendar-event-start.v-calendar-event-end { - overflow: hidden; - text-overflow: ellipsis; -} - -.mytheme .v-calendar-event-start { - border-top-left-radius: 4px; - border-bottom-left-radius: 4px; - margin-left: 5px; -} - -.mytheme .v-calendar-event-end { - border-top-right-radius: 4px; - border-bottom-right-radius: 4px; - margin-right: 5px; -} - -.mytheme .v-calendar-event-caption { - font-weight: 500; - line-height: 1.2; - padding: 5px 0; - position: absolute; - overflow: hidden; - right: 9px; - left: 5px; - bottom: 0; - top: 0; -} - -.mytheme .v-calendar-event-caption span { - font-weight: 300; - white-space: nowrap; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event { - overflow: visible; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event-content { - margin-top: -1px; - border-radius: 5px; - border: 1px solid #fafafa; - padding-top: 3px; - margin-right: 5px; -} - -.mytheme .v-calendar-event-month:before { - color: #00ace0; -} - -.mytheme .v-calendar-event-all-day { - background-color: #c8eaf4; - background-color: rgba(200, 234, 244, 0.8); - color: #00ace0; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event { - color: #00ace0; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event .v-calendar-event-content { - background-color: #c8eaf4; - background-color: rgba(200, 234, 244, 0.8); -} - -.mytheme .v-calendar-event-month[class*="color2"]:before { - color: #2d9f19; -} - -.mytheme .v-calendar-event-all-day[class*="color2"] { - background-color: #d1e7cd; - background-color: rgba(209, 231, 205, 0.8); - color: #2d9f19; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color2"] { - color: #2d9f19; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color2"] .v-calendar-event-content { - background-color: #d1e7cd; - background-color: rgba(209, 231, 205, 0.8); -} - -.mytheme .v-calendar-event-month[class*="color3"]:before { - color: #d18100; -} - -.mytheme .v-calendar-event-all-day[class*="color3"] { - background-color: #f1e1c8; - background-color: rgba(241, 225, 200, 0.8); - color: #d18100; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color3"] { - color: #d18100; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color3"] .v-calendar-event-content { - background-color: #f1e1c8; - background-color: rgba(241, 225, 200, 0.8); -} - -.mytheme .v-calendar-event-month[class*="color4"]:before { - color: #ce3812; -} - -.mytheme .v-calendar-event-all-day[class*="color4"] { - background-color: #f1d3cb; - background-color: rgba(241, 211, 203, 0.8); - color: #ce3812; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color4"] { - color: #ce3812; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color4"] .v-calendar-event-content { - background-color: #f1d3cb; - background-color: rgba(241, 211, 203, 0.8); -} - -.mytheme .v-calendar-event-month[class*="color5"]:before { - color: #2d55cd; -} - -.mytheme .v-calendar-event-all-day[class*="color5"] { - background-color: #d1d9f1; - background-color: rgba(209, 217, 241, 0.8); - color: #2d55cd; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color5"] { - color: #2d55cd; -} - -.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color5"] .v-calendar-event-content { - background-color: #d1d9f1; - background-color: rgba(209, 217, 241, 0.8); -} - -.mytheme .v-calendar.v-disabled * { - cursor: default; -} - -.mytheme .v-label { - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; -} - -.mytheme .v-label.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-label-undef-w { - white-space: nowrap; -} - -.mytheme h1, .mytheme .v-label-h1, .mytheme h2, .mytheme .v-label-h2, .mytheme h3, .mytheme .v-label-h3 { - line-height: 1.1; - font-weight: 200; - color: #141414; -} - -.mytheme h1, .mytheme .v-label-h1 { - font-size: 2.4em; - margin-top: 1.4em; - margin-bottom: 1em; - - letter-spacing: -0.03em; -} - -.mytheme h2, .mytheme .v-label-h2 { - font-size: 1.6em; - - margin-top: 1.6em; - margin-bottom: 0.77em; - letter-spacing: -0.02em; -} - -.mytheme h3, .mytheme .v-label-h3 { - font-size: 1.2em; - - margin-top: 1.8em; - margin-bottom: 0.77em; - letter-spacing: 0; -} - -.mytheme h4, .mytheme .v-label-h4 { - line-height: 1.1; - font-weight: 500; - font-size: 14px; - color: #414141; - text-transform: uppercase; - letter-spacing: 0; - margin-top: 2.4em; - margin-bottom: 0.8em; -} - -.mytheme .v-csslayout > h1:first-child, .mytheme .v-csslayout > h2:first-child, .mytheme .v-csslayout > h3:first-child, .mytheme .v-csslayout > h4 > .v-label-h1:first-child, .mytheme .v-csslayout > .v-label-h2:first-child, .mytheme .v-csslayout > .v-label-h3:first-child, .mytheme .v-csslayout > .v-label-h4:first-child { - margin-top: 16px; -} - -.mytheme .v-verticallayout > .v-slot:first-child h1, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h1, .mytheme .v-verticallayout > .v-slot:first-child h2, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h2, .mytheme .v-verticallayout > .v-slot:first-child h3, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h3, .mytheme .v-verticallayout > .v-slot:first-child h4, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h4, .mytheme .v-verticallayout > div > .v-slot:first-child h1, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h1, .mytheme .v-verticallayout > div > .v-slot:first-child h2, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h2, .mytheme .v-verticallayout > div > .v-slot:first-child h3, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h3, .mytheme .v-verticallayout > div > .v-slot:first-child h4, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h4 { - margin-top: 16px; -} - -.mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h1, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h1, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h2, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h2, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h3, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h3, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h4, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h4, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h1, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h1, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h2, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h2, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h3, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h3, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h4, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h4 { - margin-top: -0.5em; -} - -.mytheme h1.no-margin, .mytheme .v-label-h1.no-margin, .mytheme h2.no-margin, .mytheme .v-label-h2.no-margin, .mytheme h3.no-margin, .mytheme .v-label-h3.no-margin, .mytheme h4.no-margin, .mytheme .v-label-h4.no-margin { - margin: 0 !important; -} - -.mytheme .v-label-colored { - color: #197de1; -} - -.mytheme .v-label-large { - font-size: 20px; -} - -.mytheme .v-label-small { - font-size: 14px; -} - -.mytheme .v-label-tiny { - font-size: 12px; -} - -.mytheme .v-label-huge { - font-size: 26px; -} - -.mytheme .v-label-bold { - font-weight: 500; -} - -.mytheme .v-label-light { - font-weight: 200; - color: #7d7d7d; -} - -.mytheme .v-label-align-right { - text-align: right; -} - -.mytheme .v-label-align-center { - text-align: center; -} - -.mytheme .v-label-spinner { - height: 24px !important; - width: 24px !important; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - border: 2px solid rgba(25, 125, 225, 0.2); - border-top-color: #197de1; - border-right-color: #197de1; - border-radius: 100%; - -webkit-animation: v-rotate-360 500ms infinite linear; - -moz-animation: v-rotate-360 500ms infinite linear; - animation: v-rotate-360 500ms infinite linear; - pointer-events: none; -} - -.v-ie8 .mytheme .v-label-spinner, .v-ie9 .mytheme .v-label-spinner { - border: none; - border-radius: 4px; - background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; - background-size: 80%; -} - -.v-ie8 .mytheme .v-label-spinner { - min-width: 30px; - min-height: 30px; -} - -.mytheme .v-label-success, .mytheme .v-label-failure { - background: white; - color: #474747; - border: 2px solid #2c9720; - border-radius: 4px; - padding: 7px 19px 7px 37px; - font-weight: 400; - font-size: 15px; -} - -.mytheme .v-label-success:before, .mytheme .v-label-failure:before { - font-family: ThemeIcons; - content: "\f00c"; - margin-right: 0.5em; - margin-left: -19px; - color: #2c9720; -} - -.mytheme .v-label-failure { - border-color: #ed473b; -} - -.mytheme .v-label-failure:before { - content: "\f05e"; - color: #ed473b; -} - -.mytheme [draggable=true] { - -khtml-user-drag: element; - -webkit-user-drag: element; -} - -.mytheme .v-ddwrapper { - position: relative; -} - -.mytheme .v-ddwrapper-over:before, .mytheme .v-ddwrapper-over:after { - content: ""; - position: absolute; - z-index: 10; - top: -1px; - right: -1px; - bottom: -1px; - left: -1px; - border: 0 solid #197de1; -} - -.mytheme .v-ddwrapper-over-top:before { - border-top-width: 2px; -} - -.mytheme .v-ddwrapper-over-right:before { - border-right-width: 2px; -} - -.mytheme .v-ddwrapper-over-bottom:before { - border-bottom-width: 2px; -} - -.mytheme .v-ddwrapper-over-left:before { - border-left-width: 2px; -} - -.mytheme .no-vertical-drag-hints .v-ddwrapper-over-top:before, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-top:before { - border-top-width: 0; -} - -.mytheme .no-vertical-drag-hints .v-ddwrapper-over-top:after, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-top:after { - border-width: 2px; - border-radius: 4px; - opacity: 0.3; - filter: alpha(opacity=30.0) ; - background: #8abef2; -} - -.mytheme .no-vertical-drag-hints .v-ddwrapper-over-bottom:before, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-bottom:before { - border-bottom-width: 0; -} - -.mytheme .no-vertical-drag-hints .v-ddwrapper-over-bottom:after, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-bottom:after { - border-width: 2px; - border-radius: 4px; - opacity: 0.3; - filter: alpha(opacity=30.0) ; - background: #8abef2; -} - -.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-left:before, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-left:before { - border-left-width: 0; -} - -.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-left:after, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-left:after { - border-width: 2px; - border-radius: 4px; - opacity: 0.3; - filter: alpha(opacity=30.0) ; - background: #8abef2; -} - -.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-right:before, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-right:before { - border-right-width: 0; -} - -.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-right:after, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-right:after { - border-width: 2px; - border-radius: 4px; - opacity: 0.3; - filter: alpha(opacity=30.0) ; - background: #8abef2; -} - -.mytheme .v-ddwrapper-over-middle:after, .mytheme .v-ddwrapper-over-center:after { - border-width: 2px; - border-radius: 4px; - opacity: 0.3; - filter: alpha(opacity=30.0) ; - background: #8abef2; -} - -.mytheme .no-box-drag-hints.v-ddwrapper:after, .mytheme .no-box-drag-hints .v-ddwrapper:after { - display: none !important; - content: none; -} - -.mytheme .v-nativebutton { - -webkit-touch-callout: none; -} - -.mytheme .v-select select { - border: 1px solid #c5c5c5; - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - color: #464646; -} - -.mytheme .v-select select:focus { - outline: none; - -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); - box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); -} - -.mytheme .v-select-select { - display: block; -} - -.mytheme .v-select-select + .v-textfield { - width: auto !important; - margin-top: 9px; -} - -.mytheme .v-select-select + .v-textfield + .v-nativebutton { - margin-top: 9px; - margin-left: 9px; -} - -.mytheme .v-select-error .v-select-select { - border-color: #ed473b !important; - background: #fffbfb; - color: #6c2621; -} - -.mytheme .v-popupview { - cursor: pointer; - color: #197de1; - text-decoration: underline; - font-weight: inherit; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-popupview:hover { - color: #4396ea; -} - -.mytheme .v-popupview.v-disabled { - opacity: 0.5; - filter: alpha(opacity=50) ; -} - -.mytheme .v-popupview-popup { - padding: 4px 4px; - border-radius: 4px; - background-color: white; - color: #474747; - -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; -} - -.mytheme .v-popupview-popup[class*="animate-in"] { - -webkit-animation: v-popupview-animate-in 120ms; - -moz-animation: v-popupview-animate-in 120ms; - animation: v-popupview-animate-in 120ms; -} - -.mytheme .v-popupview-popup[class*="animate-out"] { - -webkit-animation: valo-animate-out-fade 120ms; - -moz-animation: valo-animate-out-fade 120ms; - animation: valo-animate-out-fade 120ms; -} - -.mytheme .v-popupview-popup .popupContent > .v-margin-top { - padding-top: 12px; -} - -.mytheme .v-popupview-popup .popupContent > .v-margin-right { - padding-right: 12px; -} - -.mytheme .v-popupview-popup .popupContent > .v-margin-bottom { - padding-bottom: 12px; -} - -.mytheme .v-popupview-popup .popupContent > .v-margin-left { - padding-left: 12px; -} - -.mytheme .v-popupview-loading { - margin: 12px 12px; - height: 24px !important; - width: 24px !important; - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - border: 2px solid rgba(25, 125, 225, 0.2); - border-top-color: #197de1; - border-right-color: #197de1; - border-radius: 100%; - -webkit-animation: v-rotate-360 500ms infinite linear; - -moz-animation: v-rotate-360 500ms infinite linear; - animation: v-rotate-360 500ms infinite linear; - pointer-events: none; -} - -.v-ie8 .mytheme .v-popupview-loading, .v-ie9 .mytheme .v-popupview-loading { - border: none; - border-radius: 4px; - background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; - background-size: 80%; -} - -.v-ie8 .mytheme .v-popupview-loading { - min-width: 30px; - min-height: 30px; -} - -.mytheme .v-richtextarea { - -webkit-appearance: none; - -moz-appearance: none; - -ms-appearance: none; - -o-appearance: none; - appearance: none; - -webkit-user-select: text; - -moz-user-select: text; - -ms-user-select: text; - user-select: text; - margin: 0; - font: inherit; - - font-weight: 400; - line-height: normal; - height: 37px; - border-radius: 4px; - padding: 0; - border: 1px solid #c5c5c5; - background: white; - color: #474747; - -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); - -webkit-transition: box-shadow 180ms, border 180ms; - -moz-transition: box-shadow 180ms, border 180ms; - transition: box-shadow 180ms, border 180ms; - height: auto; - overflow: hidden; -} - -.v-ie8 .mytheme .v-richtextarea, .v-ie9 .mytheme .v-richtextarea { - line-height: 37px; - padding-top: 0; - padding-bottom: 0; -} - -.mytheme .v-richtextarea[class*="prompt"] { - color: #a3a3a3; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar { - background-color: #fafafa; - background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); - background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); - -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; - box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; - border-bottom: 1px solid #c5c5c5; - color: #464646; -} - -.mytheme .v-richtextarea .gwt-ToggleButton, .mytheme .v-richtextarea .gwt-PushButton { - display: inline-block; - line-height: 37px; - width: 37px; - text-align: center; - outline: none; -} - -.mytheme .v-richtextarea .gwt-ToggleButton:hover, .mytheme .v-richtextarea .gwt-PushButton:hover { - color: black; -} - -.mytheme .v-richtextarea .gwt-ToggleButton-down, .mytheme .v-richtextarea .gwt-ToggleButton-down-hovering { - background-color: #e0e0e0; - background-image: -webkit-linear-gradient(bottom, #e0e0e0 2%, #dcdcdc 98%); - background-image: linear-gradient(to top,#e0e0e0 2%, #dcdcdc 98%); -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top img { - display: none; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div:before { - font-family: ThemeIcons; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Bold"]:before { - content: "\f032"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Italic"]:before { - content: "\f033"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Underline"]:before { - content: "\f0cd"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Subscript"]:before { - content: "\f12c"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Superscript"]:before { - content: "\f12b"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Left Justify"]:before { - content: "\f036"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Center"]:before { - content: "\f037"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Right Justify"]:before { - content: "\f038"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Strikethrough"]:before { - content: "\f0cc"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Indent Right"]:before { - content: "\f03c"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Indent Left"]:before { - content: "\f03b"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Horizontal Rule"]:before { - content: "\2014"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Ordered List"]:before { - content: "\f0cb"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Unordered List"]:before { - content: "\f0ca"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Image"]:before { - content: "\f03e"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Create Link"]:before { - content: "\f0c1"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Remove Link"]:before { - content: "\f127"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Remove Formatting"]:before { - content: "\f12d"; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-bottom { - font-size: 13px; - padding: 0 9px 9px 0; -} - -.mytheme .v-richtextarea .gwt-RichTextToolbar-bottom select { - margin: 9px 0 0 9px; -} - -.mytheme .v-richtextarea .gwt-RichTextArea { - background: #fff; - border: none; - display: block; -} - -.mytheme .v-richtextarea-readonly { - padding: 5px 7px; - background: transparent; -} - -.mytheme .v-upload .v-button { - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - box-sizing: border-box; - display: inline-block; - vertical-align: top; - text-align: left; - white-space: normal; -} - -.mytheme .v-upload-immediate .v-button { - width: 100%; -} - -.mytheme .v-upload-immediate input[type="file"] { - opacity: 0; - filter: alpha(opacity=0) ; - z-index: -1; - position: absolute; - right: 0; - height: 37px; - text-align: right; - border: none; - background: transparent; -} - -.mytheme .v-Notification.v-position-top { - top: 12px; -} - -.mytheme .v-Notification.v-position-right { - right: 12px; -} - -.mytheme .v-Notification.v-position-bottom { - bottom: 12px; -} - -.mytheme .v-Notification.v-position-left { - left: 12px; -} - -.mytheme .v-Notification.v-position-assistive { - top: -9999px; - left: -9999px; -} - -.mytheme .v-Notification-animate-in { - -webkit-animation: valo-animate-in-fade 180ms 10ms backwards; - -moz-animation: valo-animate-in-fade 180ms 10ms backwards; - animation: valo-animate-in-fade 180ms 10ms backwards; -} - -.mytheme .v-Notification-animate-in.v-position-top { - -webkit-animation: valo-animate-in-slide-down 400ms 10ms backwards; - -moz-animation: valo-animate-in-slide-down 400ms 10ms backwards; - animation: valo-animate-in-slide-down 400ms 10ms backwards; -} - -.mytheme .v-Notification-animate-in.v-position-bottom { - -webkit-animation: valo-animate-in-slide-up 400ms 10ms backwards; - -moz-animation: valo-animate-in-slide-up 400ms 10ms backwards; - animation: valo-animate-in-slide-up 400ms 10ms backwards; -} - -.mytheme .v-Notification-animate-out { - -webkit-animation: valo-animate-out-fade 150ms; - -moz-animation: valo-animate-out-fade 150ms; - animation: valo-animate-out-fade 150ms; -} - -.mytheme .v-Notification-animate-out.v-position-top, .mytheme .v-Notification-animate-out.v-position-bottom { - -webkit-animation: valo-animate-out-slide-down-fade 200ms; - -moz-animation: valo-animate-out-slide-down-fade 200ms; - animation: valo-animate-out-slide-down-fade 200ms; -} - -.mytheme .v-Notification { - border-radius: 4px; - text-align: center; - position: fixed !important; - -webkit-backface-visibility: hidden; - -moz-backface-visibility: hidden; - -ms-backface-visibility: hidden; - backface-visibility: hidden; - background: white; - -webkit-box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.15); - box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.15); - padding: 19px 22px; -} - -.mytheme .v-Notification .v-Notification-caption { - color: #197de1; - font-size: 19px; - line-height: 1; -} - -.mytheme .v-Notification .v-Notification-description { - line-height: 1.4; -} - -.mytheme .v-Notification-caption { - margin: 0; - display: inline-block; - text-align: left; - font-weight: inherit; - line-height: inherit; - white-space: nowrap; - letter-spacing: 0; -} - -.mytheme .v-Notification-description, .mytheme .v-Notification-details { - margin: 0; - display: inline-block; - vertical-align: middle; - max-width: 30em; - text-align: left; - max-height: 20em; - overflow: auto; -} - -.mytheme .v-Notification-caption ~ .v-Notification-description, .mytheme .v-Notification-caption ~ .v-Notification-details { - margin-left: 24px; -} - -.mytheme .v-icon + .v-Notification-caption { - margin-left: 16px; -} - -.mytheme .v-Notification-system { - left: 0 !important; - right: 0; - max-width: 100%; - margin: 0 !important; - border-radius: 0; - -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); - padding: 12px 15px; - background-color: #444; - background-color: rgba(68, 68, 68, 0.9); - font-weight: 400; - line-height: 22px; -} - -.mytheme .v-Notification-system .v-Notification-description, .mytheme .v-Notification-system .v-Notification-details { - max-width: 50em; -} - -.mytheme .v-Notification-system.v-position-top { - top: 0; -} - -.mytheme .v-Notification-system.v-position-top[class*="animate-in"] { - -webkit-animation: valo-animate-in-slide-down 300ms 10ms backwards; - -moz-animation: valo-animate-in-slide-down 300ms 10ms backwards; - animation: valo-animate-in-slide-down 300ms 10ms backwards; -} - -.mytheme .v-Notification-system.v-position-top[class*="animate-out"] { - -webkit-animation: valo-animate-out-slide-up 200ms; - -moz-animation: valo-animate-out-slide-up 200ms; - animation: valo-animate-out-slide-up 200ms; -} - -.mytheme .v-Notification-system.v-position-bottom { - bottom: 0; -} - -.mytheme .v-Notification-system.v-position-bottom[class*="animate-in"] { - -webkit-animation: valo-animate-in-slide-up 300ms 10ms backwards; - -moz-animation: valo-animate-in-slide-up 300ms 10ms backwards; - animation: valo-animate-in-slide-up 300ms 10ms backwards; -} - -.mytheme .v-Notification-system.v-position-bottom[class*="animate-out"] { - -webkit-animation: valo-animate-out-slide-down 200ms; - -moz-animation: valo-animate-out-slide-down 200ms; - animation: valo-animate-out-slide-down 200ms; -} - -.mytheme .v-Notification-system .v-Notification-caption { - color: #fff; - vertical-align: middle; -} - -.mytheme .v-Notification-system .v-Notification-description, .mytheme .v-Notification-system .v-Notification-details { - color: #e6e6e6; -} - -.mytheme .v-Notification-system u { - text-decoration: none; -} - -.mytheme .v-Notification.tray { - text-align: left; -} - -.mytheme .v-Notification.tray .v-Notification-caption + .v-Notification-description { - display: block; - margin: 0.5em 0 0; -} - -.mytheme .v-Notification.warning { - background: #FFF3D2; -} - -.mytheme .v-Notification.warning .v-Notification-caption { - color: #AC7C00; -} - -.mytheme .v-Notification.warning .v-Notification-description { - color: #9D874D; -} - -.mytheme .v-Notification.error { - background: #ed473b; - font-weight: 400; - -webkit-box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.25); - box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.25); -} - -.mytheme .v-Notification.error .v-Notification-caption { - color: white; -} - -.mytheme .v-Notification.error .v-Notification-description { - color: #f4e0df; -} - -.mytheme .v-Notification.dark { - background-color: #444; - background-color: rgba(68, 68, 68, 0.9); - font-weight: 400; - line-height: 22px; -} - -.mytheme .v-Notification.dark .v-Notification-caption { - color: #fff; - vertical-align: middle; -} - -.mytheme .v-Notification.dark .v-Notification-description, .mytheme .v-Notification.dark .v-Notification-details { - color: #e6e6e6; -} - -.mytheme .v-Notification.bar { - left: 0 !important; - right: 0; - max-width: 100%; - margin: 0 !important; - border-radius: 0; - -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); - padding: 12px 15px; -} - -.mytheme .v-Notification.bar .v-Notification-description, .mytheme .v-Notification.bar .v-Notification-details { - max-width: 50em; -} - -.mytheme .v-Notification.bar.v-position-top { - top: 0; -} - -.mytheme .v-Notification.bar.v-position-top[class*="animate-in"] { - -webkit-animation: valo-animate-in-slide-down 300ms 10ms backwards; - -moz-animation: valo-animate-in-slide-down 300ms 10ms backwards; - animation: valo-animate-in-slide-down 300ms 10ms backwards; -} - -.mytheme .v-Notification.bar.v-position-top[class*="animate-out"] { - -webkit-animation: valo-animate-out-slide-up 200ms; - -moz-animation: valo-animate-out-slide-up 200ms; - animation: valo-animate-out-slide-up 200ms; -} - -.mytheme .v-Notification.bar.v-position-bottom { - bottom: 0; -} - -.mytheme .v-Notification.bar.v-position-bottom[class*="animate-in"] { - -webkit-animation: valo-animate-in-slide-up 300ms 10ms backwards; - -moz-animation: valo-animate-in-slide-up 300ms 10ms backwards; - animation: valo-animate-in-slide-up 300ms 10ms backwards; -} - -.mytheme .v-Notification.bar.v-position-bottom[class*="animate-out"] { - -webkit-animation: valo-animate-out-slide-down 200ms; - -moz-animation: valo-animate-out-slide-down 200ms; - animation: valo-animate-out-slide-down 200ms; -} - -.mytheme .v-Notification.small { - padding: 11px 13px; -} - -.mytheme .v-Notification.small .v-Notification-caption { - font-size: 16px; -} - -.mytheme .v-Notification.small .v-Notification-description { - font-size: 14px; -} - -.mytheme .v-Notification.closable { - padding-right: 59px; - overflow: hidden !important; - cursor: pointer; -} - -.mytheme .v-Notification.closable:after { - content: "\00d7"; - font-size: 1.5em; - position: absolute; - top: 50%; - margin-top: -12px; - right: 12px; - width: 25px; - height: 25px; - line-height: 24px; - cursor: pointer; - color: #000; - opacity: 0.5; - filter: alpha(opacity=50) ; - text-align: center; - border: 1px solid #000; - border-color: rgba(0, 0, 0, 0.3); - border-radius: 50%; - -webkit-transition: opacity 200ms; - -moz-transition: opacity 200ms; - transition: opacity 200ms; -} - -.mytheme .v-Notification.closable:hover:after { - opacity: 1; - filter: none ; -} - -.mytheme .v-Notification.closable:active:after { - background-color: #000; - color: #fff; - opacity: 0.3; - filter: alpha(opacity=30.0) ; - -webkit-transition: none 200ms; - -moz-transition: none 200ms; - transition: none 200ms; -} - -.mytheme .v-Notification.closable.dark:after, .mytheme .v-Notification.closable.error:after, .mytheme .v-Notification.closable.system:after { - color: #fff; - border-color: #fff; - border-color: rgba(255, 255, 255, 0.3); -} - -.mytheme .v-Notification.closable.dark:active:after, .mytheme .v-Notification.closable.error:active:after, .mytheme .v-Notification.closable.system:active:after { - background-color: #fff; - color: #000; -} - -.mytheme .v-Notification.closable.tray:after { - top: 16px; - margin-top: 0; -} - -.mytheme .v-Notification.success, .mytheme .v-Notification.failure { - background: #fff; - color: #555; - border: 2px solid #2c9720; -} - -.mytheme .v-Notification.success .v-Notification-caption, .mytheme .v-Notification.failure .v-Notification-caption { - color: #2c9720; - font-weight: 400; -} - -.mytheme .v-Notification.success .v-Notification-caption:before, .mytheme .v-Notification.failure .v-Notification-caption:before { - font-family: ThemeIcons; - content: "\f00c"; - margin-right: 0.5em; -} - -.mytheme .v-Notification.success.bar, .mytheme .v-Notification.failure.bar { - margin: -2px !important; -} - -.mytheme .v-Notification.failure { - border-color: #ed473b; -} - -.mytheme .v-Notification.failure .v-Notification-caption { - color: #ed473b; -} - -.mytheme .v-Notification.failure .v-Notification-caption:before { - content: "\f05e"; -} - -.mytheme .valo-menu { - height: 100%; - background-color: #4b4b4b; - background-image: -webkit-linear-gradient(right, #414141 0%, #4b4b4b 9px); - background-image: linear-gradient(to left,#414141 0%, #4b4b4b 9px); - color: #a5a5a5; - font-size: 14px; - line-height: 30px; - border-right: 1px solid #3b3b3b; - white-space: nowrap; -} - -.mytheme .valo-menu-toggle { - display: none; - position: fixed; - z-index: 200; - top: 3px; - left: 3px; - min-width: 0; -} - -.mytheme .valo-menu-part { - border-left: 1px solid #414141; - height: 100%; - padding-bottom: 37px; - overflow: auto; -} - -.mytheme .valo-menu-part:first-child { - border-left: none; -} - -.mytheme .valo-menu-title, .mytheme .valo-menu-subtitle, .mytheme .valo-menu-item { - display: block; - line-height: inherit; - white-space: nowrap; - position: relative; -} - -.mytheme .valo-menu-title .valo-menu-badge, .mytheme .valo-menu-subtitle .valo-menu-badge, .mytheme .valo-menu-item .valo-menu-badge { - position: absolute; - right: 19px; -} - -.mytheme .valo-menu-title { - line-height: 1.2; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - color: white; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); - padding: 12px 19px; - font-size: 14px; - border-bottom: 1px solid #1362b1; - -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - text-align: center; -} - -.mytheme .valo-menu-title .v-menubar.v-menubar { - background: transparent; - border-color: #1362b1; - color: inherit; - -webkit-box-shadow: none; - box-shadow: none; - text-shadow: inherit; -} - -.mytheme .valo-menu-title .v-menubar-menuitem { - background: transparent; - -webkit-box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca; - box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca; - text-shadow: inherit; - font-size: 16px; - border-color: inherit; -} - -.mytheme .valo-menu-title h1, .mytheme .valo-menu-title .v-label-h1, .mytheme .valo-menu-title h2, .mytheme .valo-menu-title .v-label-h2, .mytheme .valo-menu-title h3, .mytheme .valo-menu-title .v-label-h3, .mytheme .valo-menu-title h4, .mytheme .valo-menu-title .v-label-h4 { - margin-top: 0; - margin-bottom: 0; - color: inherit; -} - -.mytheme .v-menubar-user-menu { - border: none; - border-radius: 0; - padding: 1px; - -webkit-box-shadow: none; - box-shadow: none; - text-shadow: none; - background: transparent; - color: inherit; - margin: 19px 7px; - display: block; - overflow: hidden; - text-align: center; - height: auto; - color: inherit; -} - -.mytheme .v-menubar-user-menu:focus:after { - display: none; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem { - -webkit-box-shadow: none; - box-shadow: none; - border: none; - margin-right: 1px; - border-radius: 4px; - color: #197de1; - padding: 0 12px; - -webkit-transition: color 140ms; - -moz-transition: color 140ms; - transition: color 140ms; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem:first-child, .mytheme .v-menubar-user-menu .v-menubar-menuitem:last-child, .mytheme .v-menubar-user-menu .v-menubar-menuitem:first-child:last-child { - border-radius: 4px; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem:before { - content: none; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem:hover { - color: #4396ea; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem:active { - color: inherit; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem-checked, .mytheme .v-menubar-user-menu .v-menubar-menuitem-checked:first-child { - border: 1px solid #c5c5c5; - color: #197de1; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem-checked .v-menubar-menuitem-caption, .mytheme .v-menubar-user-menu .v-menubar-menuitem-checked:first-child .v-menubar-menuitem-caption { - position: relative; - top: -1px; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem-selected { - color: #ecf2f8; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem-selected:hover { - color: #ecf2f8; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem-disabled, .mytheme .v-menubar-user-menu .v-menubar-menuitem-disabled:hover { - color: inherit; -} - -.mytheme .v-menubar-user-menu > .v-menubar-menuitem { - color: inherit; - white-space: normal; - line-height: 1.4; - margin: 0; -} - -.mytheme .v-menubar-user-menu > .v-menubar-menuitem img.v-icon { - width: 56px; - height: 56px; - border-radius: 29px; - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - display: block; - margin: 0 auto 0.3em; - border: 1px solid #c5c5c5; -} - -.mytheme .v-menubar-user-menu > .v-menubar-menuitem:after { - top: 0; - right: 0; - bottom: 0; - left: 0; -} - -.mytheme .v-menubar-user-menu .v-menubar-menuitem-selected { - background: transparent; -} - -.mytheme .valo-menu-subtitle { - color: #868686; - margin: 7px 0 7px 19px; - border-bottom: 1px solid #666666; -} - -.mytheme .valo-menu-subtitle [class*="badge"] { - color: #73a5d7; -} - -.mytheme .valo-menuitems { - display: block; -} - -.mytheme .valo-menu-item { - outline: none; - font-weight: 400; - padding: 0 37px 0 19px; - cursor: pointer; - position: relative; - overflow: hidden; - text-shadow: 0 2px 0 rgba(0, 0, 0, 0.05); - -webkit-transition: background-color 300ms, color 60ms; - -moz-transition: background-color 300ms, color 60ms; - transition: background-color 300ms, color 60ms; -} - -.mytheme .valo-menu-item [class*="caption"] { - vertical-align: middle; - display: inline-block; - width: 90%; - max-width: 15em; - padding-right: 19px; - text-overflow: ellipsis; - overflow: hidden; -} - -.mytheme .valo-menu-item [class*="badge"] { - color: #73a5d7; -} - -.mytheme .valo-menu-item.selected { - background: #434343; -} - -.mytheme .valo-menu-item.selected .v-icon { - color: #197de1; -} - -.mytheme .valo-menu-item.selected [class*="badge"] { - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - color: #c8dbed; -} - -.mytheme .valo-menu-item:focus, .mytheme .valo-menu-item:hover, .mytheme .valo-menu-item.selected { - color: white; -} - -.mytheme .valo-menu-item span.v-icon { - min-width: 1em; - margin-right: 19px; - text-align: center; - vertical-align: middle; - -webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(black), to(rgba(0, 0, 0, 0.75))); -} - -.mytheme .valo-menu-item span.v-icon + span { - margin-left: 0; -} - -.mytheme .valo-menu-item [class*="badge"] { - background-color: #585858; - -webkit-transition: background-color 300ms; - -moz-transition: background-color 300ms; - transition: background-color 300ms; - line-height: 1; - padding: 4px 6px; - min-width: 11px; - text-align: center; - top: 4px; - border-radius: 4px; -} - -.mytheme .valo-menu-part.large-icons { - background-color: #4b4b4b; - min-width: 74px; - max-width: 111px; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-title { - font-size: 12px; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-title .v-label-undef-w { - white-space: normal; -} - -.mytheme .valo-menu-part.large-icons .v-menubar-user-menu { - margin-left: 0; - margin-right: 0; - font-size: 11px; -} - -.mytheme .valo-menu-part.large-icons .v-menubar-user-menu img.v-icon { - width: 28px; - height: 28px; -} - -.mytheme .valo-menu-part.large-icons [class*="subtitle"] { - margin: 9px 0 0; - padding: 7px 25px 7px 9px; - line-height: 1; - border: none; - text-overflow: ellipsis; - overflow: hidden; - background: #3c3c3c; - font-size: 13px; - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); -} - -.mytheme .valo-menu-part.large-icons [class*="subtitle"] [class*="badge"] { - right: 9px; -} - -.mytheme .valo-menu-part.large-icons [class*="subtitle"] + .valo-menu-item { - border-top: none; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-item { - display: block; - font-size: 26px; - line-height: 1; - padding: 12px; - text-align: center; - border-top: 1px solid #555555; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-item:first-child { - border-top: none; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-item [class*="caption"] { - display: block; - width: auto; - margin: 0.3em 0 0; - padding: 0; - font-size: 11px; - line-height: 1.3; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-item .v-icon { - margin: 0; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-item span.v-icon { - opacity: 0.8; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-item.selected { - background: #434343; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-item.selected .v-icon { - opacity: 1; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-item.selected [class*="badge"] { - border-color: #434343; -} - -.mytheme .valo-menu-part.large-icons .valo-menu-item [class*="badge"] { - padding-left: 4px; - padding-right: 4px; - top: 7px; - right: 7px; - border: 2px solid #4b4b4b; -} - -.mytheme .valo-menu-logo { - display: block; - overflow: hidden; - width: 44px !important; - height: 44px; - border-radius: 4px; - text-align: center; - background-color: #197de1; - background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); - background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); - color: white; - font-size: 25px; - line-height: 44px; - margin: 19px auto; - -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); -} - -.mytheme .valo-menu-logo:focus { - outline: none; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part { - background-color: #4b4b4b; - min-width: 74px; - max-width: 111px; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-title { - font-size: 12px; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-title .v-label-undef-w { - white-space: normal; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .v-menubar-user-menu { - margin-left: 0; - margin-right: 0; - font-size: 11px; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .v-menubar-user-menu img.v-icon { - width: 28px; - height: 28px; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part [class*="subtitle"] { - margin: 9px 0 0; - padding: 7px 25px 7px 9px; - line-height: 1; - border: none; - text-overflow: ellipsis; - overflow: hidden; - background: #3c3c3c; - font-size: 13px; - box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part [class*="subtitle"] [class*="badge"] { - right: 9px; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part [class*="subtitle"] + .valo-menu-item { - border-top: none; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item { - display: block; - font-size: 26px; - line-height: 1; - padding: 12px; - text-align: center; - border-top: 1px solid #555555; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item:first-child { - border-top: none; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item [class*="caption"] { - display: block; - width: auto; - margin: 0.3em 0 0; - padding: 0; - font-size: 11px; - line-height: 1.3; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item .v-icon { - margin: 0; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item span.v-icon { - opacity: 0.8; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item.selected { - background: #434343; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item.selected .v-icon { - opacity: 1; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item.selected [class*="badge"] { - border-color: #434343; -} - -.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item [class*="badge"] { - padding-left: 4px; - padding-right: 4px; - top: 7px; - right: 7px; - border: 2px solid #4b4b4b; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] { - padding-top: 37px; - -webkit-box-sizing: border-box; - box-sizing: border-box; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .v-loading-indicator { - top: 37px; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] > .v-widget { - position: relative !important; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu { - border-right: none; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-part { - overflow: visible; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-toggle { - display: inline-block; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-title { - position: fixed; - z-index: 100; - top: 0; - left: 0; - right: 0; - height: 37px !important; - padding-top: 0; - padding-bottom: 0; - -webkit-backface-visibility: hidden; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu .v-menubar-user-menu { - position: fixed; - z-index: 100; - top: 0; - right: 0; - margin: 0; - padding: 0; - height: 37px; - color: #97bee5; - max-width: 30%; - -webkit-backface-visibility: hidden; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu .v-menubar-user-menu .v-menubar-menuitem { - line-height: 36px; - white-space: nowrap; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu .v-menubar-user-menu img.v-icon { - display: inline-block; - margin: 0 6px 0 0; - width: 19px; - height: 19px; - border-radius: 10px; - border: none; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menuitems { - height: 100%; - background-color: #4b4b4b; - background-image: -webkit-linear-gradient(right, #414141 0%, #4b4b4b 9px); - background-image: linear-gradient(to left,#414141 0%, #4b4b4b 9px); - color: #a5a5a5; - font-size: 14px; - line-height: 30px; - border-right: 1px solid #3b3b3b; - white-space: nowrap; - position: fixed; - z-index: 9000; - top: 37px; - bottom: 0; - height: auto; - max-width: 100%; - overflow: auto; - padding: 19px 0; - -webkit-transform: translatex(-100%); - -moz-transform: translatex(-100%); - -ms-transform: translatex(-100%); - -o-transform: translatex(-100%); - transform: translatex(-100%); - -webkit-transition: all 300ms; - -moz-transition: all 300ms; - transition: all 300ms; -} - -.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-visible .valo-menuitems, .mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-hover:hover .valo-menuitems { - -webkit-transform: translatex(0%); - -moz-transform: translatex(0%); - -ms-transform: translatex(0%); - -o-transform: translatex(0%); - transform: translatex(0%); -} - -.mytheme .valo-menu-responsive[width-range~="0-500px"] .valo-menu-toggle .v-button-caption { - display: none; -} - -.mytheme .valo-menu-responsive[width-range~="0-500px"] .valo-menu .v-menubar-user-menu .v-menubar-menuitem-caption { - display: inline-block; - width: 19px; - overflow: hidden; -} \ No newline at end of file diff --git a/wicket/pom.xml b/wicket/pom.xml index 80c728e3a5..c7e6bc20de 100644 --- a/wicket/pom.xml +++ b/wicket/pom.xml @@ -5,7 +5,7 @@ com.baeldung.wicket.examples wicket 1.0-SNAPSHOT - Wicket + wicket war From 1888614f84207127dd60f29af6bf400823b279e4 Mon Sep 17 00:00:00 2001 From: Kamlesh Kumar Date: Sun, 25 Aug 2019 21:13:47 +0530 Subject: [PATCH 049/396] Updated code example and test case for mutex (#7642) --- .../concurrent/mutex/SequenceGenerator.java | 5 +- .../mutex/SequenceGeneratorUsingMonitor.java | 9 ++-- .../SequenceGeneratorUsingReentrantLock.java | 3 +- .../SequenceGeneratorUsingSemaphore.java | 5 +- ...quenceGeneratorUsingSynchronizedBlock.java | 6 ++- ...uenceGeneratorUsingSynchronizedMethod.java | 2 +- .../concurrent/mutex/MutexUnitTest.java | 53 +++++++++---------- 7 files changed, 45 insertions(+), 38 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java index 97d44e5156..26354de0a9 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java @@ -1,11 +1,12 @@ package com.baeldung.concurrent.mutex; public class SequenceGenerator { + private int currentValue = 0; - public int getNextSequence() throws InterruptedException { + public int getNextSequence() { currentValue = currentValue + 1; - Thread.sleep(500); return currentValue; } + } diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java index 30c8da4865..2824237e24 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java @@ -4,15 +4,16 @@ import com.google.common.util.concurrent.Monitor; public class SequenceGeneratorUsingMonitor extends SequenceGenerator { - private Monitor monitor = new Monitor(); + private Monitor mutex = new Monitor(); @Override - public int getNextSequence() throws InterruptedException { - monitor.enter(); + public int getNextSequence() { + mutex.enter(); try { return super.getNextSequence(); } finally { - monitor.leave(); + mutex.leave(); } } + } diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java index 85ce780bda..d57b0c4a52 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java @@ -7,7 +7,7 @@ public class SequenceGeneratorUsingReentrantLock extends SequenceGenerator { private ReentrantLock mutex = new ReentrantLock(); @Override - public int getNextSequence() throws InterruptedException { + public int getNextSequence() { try { mutex.lock(); return super.getNextSequence(); @@ -15,4 +15,5 @@ public class SequenceGeneratorUsingReentrantLock extends SequenceGenerator { mutex.unlock(); } } + } diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java index fdece049e6..50f2538646 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java @@ -7,12 +7,15 @@ public class SequenceGeneratorUsingSemaphore extends SequenceGenerator { private Semaphore mutex = new Semaphore(1); @Override - public int getNextSequence() throws InterruptedException { + public int getNextSequence() { try { mutex.acquire(); return super.getNextSequence(); + } catch (InterruptedException e) { + throw new RuntimeException("Exception in critical section.", e); } finally { mutex.release(); } } + } diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java index d485eae21c..9933c302cb 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java @@ -2,9 +2,11 @@ package com.baeldung.concurrent.mutex; public class SequenceGeneratorUsingSynchronizedBlock extends SequenceGenerator { + private Object mutex = new Object(); + @Override - public int getNextSequence() throws InterruptedException { - synchronized (this) { + public int getNextSequence() { + synchronized (mutex) { return super.getNextSequence(); } } diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java index 441b33dc43..6de8725d73 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java @@ -3,7 +3,7 @@ package com.baeldung.concurrent.mutex; public class SequenceGeneratorUsingSynchronizedMethod extends SequenceGenerator { @Override - public synchronized int getNextSequence() throws InterruptedException { + public synchronized int getNextSequence() { return super.getNextSequence(); } diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java index 620179800a..462f910718 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java @@ -1,7 +1,7 @@ package com.baeldung.concurrent.mutex; import java.util.ArrayList; -import java.util.HashSet; +import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import java.util.concurrent.ExecutorService; @@ -12,59 +12,58 @@ import java.util.concurrent.TimeUnit; import org.junit.Assert; import org.junit.Test; -import com.baeldung.concurrent.mutex.SequenceGenerator; -import com.baeldung.concurrent.mutex.SequenceGeneratorUsingMonitor; -import com.baeldung.concurrent.mutex.SequenceGeneratorUsingReentrantLock; -import com.baeldung.concurrent.mutex.SequenceGeneratorUsingSemaphore; -import com.baeldung.concurrent.mutex.SequenceGeneratorUsingSynchronizedBlock; -import com.baeldung.concurrent.mutex.SequenceGeneratorUsingSynchronizedMethod; - public class MutexUnitTest { - private final int RANGE = 30; - - @Test + // @Test + // This test verifies the race condition use case, it may pass or fail based on execution environment + // Uncomment @Test to run it public void givenUnsafeSequenceGenerator_whenRaceCondition_thenUnexpectedBehavior() throws Exception { - Set uniqueSequences = getASetOFUniqueSequences(new SequenceGenerator()); - Assert.assertNotEquals(RANGE, uniqueSequences.size()); + int count = 1000; + Set uniqueSequences = getUniqueSequences(new SequenceGenerator(), count); + Assert.assertNotEquals(count, uniqueSequences.size()); } @Test public void givenSequenceGeneratorUsingSynchronizedMethod_whenRaceCondition_thenSuccess() throws Exception { - Set uniqueSequences = getASetOFUniqueSequences(new SequenceGeneratorUsingSynchronizedMethod()); - Assert.assertEquals(RANGE, uniqueSequences.size()); + int count = 1000; + Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingSynchronizedMethod(), count); + Assert.assertEquals(count, uniqueSequences.size()); } @Test public void givenSequenceGeneratorUsingSynchronizedBlock_whenRaceCondition_thenSuccess() throws Exception { - Set uniqueSequences = getASetOFUniqueSequences(new SequenceGeneratorUsingSynchronizedBlock()); - Assert.assertEquals(RANGE, uniqueSequences.size()); + int count = 1000; + Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingSynchronizedBlock(), count); + Assert.assertEquals(count, uniqueSequences.size()); } @Test public void givenSequenceGeneratorUsingReentrantLock_whenRaceCondition_thenSuccess() throws Exception { - Set uniqueSequences = getASetOFUniqueSequences(new SequenceGeneratorUsingReentrantLock()); - Assert.assertEquals(RANGE, uniqueSequences.size()); + int count = 1000; + Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingReentrantLock(), count); + Assert.assertEquals(count, uniqueSequences.size()); } @Test public void givenSequenceGeneratorUsingSemaphore_whenRaceCondition_thenSuccess() throws Exception { - Set uniqueSequences = getASetOFUniqueSequences(new SequenceGeneratorUsingSemaphore()); - Assert.assertEquals(RANGE, uniqueSequences.size()); + int count = 1000; + Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingSemaphore(), count); + Assert.assertEquals(count, uniqueSequences.size()); } @Test public void givenSequenceGeneratorUsingMonitor_whenRaceCondition_thenSuccess() throws Exception { - Set uniqueSequences = getASetOFUniqueSequences(new SequenceGeneratorUsingMonitor()); - Assert.assertEquals(RANGE, uniqueSequences.size()); + int count = 1000; + Set uniqueSequences = getUniqueSequences(new SequenceGeneratorUsingMonitor(), count); + Assert.assertEquals(count, uniqueSequences.size()); } - private Set getASetOFUniqueSequences(SequenceGenerator generator) throws Exception { + private Set getUniqueSequences(SequenceGenerator generator, int count) throws Exception { ExecutorService executor = Executors.newFixedThreadPool(3); - Set uniqueSequences = new HashSet<>(); + Set uniqueSequences = new LinkedHashSet<>(); List> futures = new ArrayList<>(); - for (int i = 0; i < RANGE; i++) { + for (int i = 0; i < count; i++) { futures.add(executor.submit(generator::getNextSequence)); } @@ -72,7 +71,7 @@ public class MutexUnitTest { uniqueSequences.add(future.get()); } - executor.awaitTermination(15, TimeUnit.SECONDS); + executor.awaitTermination(1, TimeUnit.SECONDS); executor.shutdown(); return uniqueSequences; From 3a5f594754887c4ae57195e68afa013e1a8e6000 Mon Sep 17 00:00:00 2001 From: NickTononi <48349671+NickTononi@users.noreply.github.com> Date: Sun, 25 Aug 2019 18:11:24 +0200 Subject: [PATCH 050/396] [BAEL-3149] Java 'private' access modifier (#7622) * Added private access modifier to tutorials * added private access modifier example to core-lang-2 module * [BAEL-3149] Java 'private' access modifier * Update core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java Co-Authored-By: KevinGilmore * Update core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java Co-Authored-By: KevinGilmore --- .../com/baeldung/core/modifiers/Employee.java | 50 +++++++++++++++++++ .../baeldung/core/modifiers/ExampleClass.java | 10 ++++ .../core/modifiers/PublicOuterClass.java | 16 ++++++ 3 files changed, 76 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java new file mode 100644 index 0000000000..e43b6634ed --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java @@ -0,0 +1,50 @@ +package com.baeldung.core.modifiers; + +public class Employee { + + private String privateId; + public String name; + private boolean manager; + + public Employee(String id, String name) { + changeId(id); + this.name = name; + } + + private Employee(String id, String name, boolean managerAttribute) { + this.privateId = id; + this.name = name; + this.privateId = id + "_ID-MANAGER"; + } + + public void changeId(String customId) { + if (customId.endsWith("_ID")) { + this.privateId = customId; + } else { + this.privateId = customId + "_ID"; + } + } + + public String getId() { + return privateId; + } + + public boolean isManager() { + return manager; + } + + public void elevateToManager() { + if ("Carl".equals(this.name)) { + setManager(true); + } + } + + private void setManager(boolean manager) { + this.manager = manager; + } + + public static Employee buildManager(String id, String name) { + return new Employee(id, name, true); + } + +} diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java new file mode 100644 index 0000000000..db58b4f00b --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java @@ -0,0 +1,10 @@ +package com.baeldung.core.modifiers; + +public class ExampleClass { + + public static void main(String[] args) { + Employee employee = new Employee("Bob","ABC123"); + employee.changeId("BCD234"); + System.out.println(employee.getId()); + } +} diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java new file mode 100644 index 0000000000..329ebf3bb6 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java @@ -0,0 +1,16 @@ +package com.baeldung.core.modifiers; + +public class PublicOuterClass { + + public PrivateInnerClass getInnerClassInstance() { + PrivateInnerClass myPrivateClassInstance = this.new PrivateInnerClass(); + myPrivateClassInstance.id = "ID1"; + myPrivateClassInstance.name = "Bob"; + return myPrivateClassInstance; + } + + private class PrivateInnerClass { + public String name; + public String id; + } +} From 2796491d849765cef65fc4384b9e421e3926227c Mon Sep 17 00:00:00 2001 From: Gang Date: Sun, 25 Aug 2019 11:13:21 -0600 Subject: [PATCH 051/396] Add @Test annotation --- .../baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java index 05a01ba97d..d82b1349d8 100644 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java @@ -19,6 +19,7 @@ public class CheckedUncheckedExceptionsUnitTest { }); } + @Test public void whenTryCatchExcetpion_thenSuccess() { try { CheckedUncheckedExceptions.checkedExceptionWithTryCatch(); From 67d82a7e6d551de08d429bce5780a62f449c7f2c Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 25 Aug 2019 23:29:19 +0530 Subject: [PATCH 052/396] [BAEL-7387] - Fix integration tests for spring-5-mvc module --- spring-5-mvc/pom.xml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/spring-5-mvc/pom.xml b/spring-5-mvc/pom.xml index 9569d52abf..be21db481a 100644 --- a/spring-5-mvc/pom.xml +++ b/spring-5-mvc/pom.xml @@ -86,6 +86,11 @@ javafaker 0.18 + + org.apache.httpcomponents + httpclient + ${httpclient.version} + @@ -167,5 +172,6 @@ 2.9.0 1.1.2 com.baeldung.Spring5Application + 4.5.8 From bcbff2712968204ec347ebbe9fbf2a81b87e7ed1 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 25 Aug 2019 21:22:38 +0300 Subject: [PATCH 053/396] BAEL-2846 - JDIExample renamed to JDIExampleDebuggee (#7636) --- .../baeldung/jdi/{JDIExample.java => JDIExampleDebuggee.java} | 2 +- java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebugger.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename java-jdi/src/main/java/com/baeldung/jdi/{JDIExample.java => JDIExampleDebuggee.java} (92%) diff --git a/java-jdi/src/main/java/com/baeldung/jdi/JDIExample.java b/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebuggee.java similarity index 92% rename from java-jdi/src/main/java/com/baeldung/jdi/JDIExample.java rename to java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebuggee.java index f8f20553b8..4fb49024fb 100644 --- a/java-jdi/src/main/java/com/baeldung/jdi/JDIExample.java +++ b/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebuggee.java @@ -1,6 +1,6 @@ package com.baeldung.jdi; -public class JDIExample { +public class JDIExampleDebuggee { public static void main(String[] args) { String jpda = "Java Platform Debugger Architecture"; diff --git a/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebugger.java b/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebugger.java index 1d9de57ddb..41a568e55f 100644 --- a/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebugger.java +++ b/java-jdi/src/main/java/com/baeldung/jdi/JDIExampleDebugger.java @@ -123,7 +123,7 @@ public class JDIExampleDebugger { public static void main(String[] args) throws Exception { JDIExampleDebugger debuggerInstance = new JDIExampleDebugger(); - debuggerInstance.setDebugClass(JDIExample.class); + debuggerInstance.setDebugClass(JDIExampleDebuggee.class); int[] breakPoints = {6, 9}; debuggerInstance.setBreakPointLines(breakPoints); VirtualMachine vm = null; From 55e70becd82c74c4d3f6583572987008e7bab5fe Mon Sep 17 00:00:00 2001 From: Drazen Nikolic Date: Mon, 26 Aug 2019 21:42:01 +0200 Subject: [PATCH 054/396] BAEL-3140: Comparing Dates in Java - examples. --- java-dates-2/pom.xml | 9 +- .../comparison/DateTimeComparisonUtils.java | 35 ++++++++ .../comparison/LegacyDateComparisonUtils.java | 17 ++++ .../DateTimeComparisonUtilsUnitTest.java | 75 +++++++++++++++++ ...DateTimeApiGeneralComparisonsUnitTest.java | 83 +++++++++++++++++++ .../LegacyDateComparisonUtilsUnitTest.java | 54 ++++++++++++ 6 files changed, 272 insertions(+), 1 deletion(-) create mode 100644 java-dates-2/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java create mode 100644 java-dates-2/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java create mode 100644 java-dates-2/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java create mode 100644 java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java create mode 100644 java-dates-2/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java diff --git a/java-dates-2/pom.xml b/java-dates-2/pom.xml index c1419514ef..08b2076d03 100644 --- a/java-dates-2/pom.xml +++ b/java-dates-2/pom.xml @@ -20,7 +20,13 @@ joda-time ${joda-time.version} - + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + commons-validator @@ -63,6 +69,7 @@ 3.6.1 2.10 + 3.9 1.6 1.9 1.9 diff --git a/java-dates-2/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java b/java-dates-2/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java new file mode 100644 index 0000000000..4d732df795 --- /dev/null +++ b/java-dates-2/src/main/java/com/baeldung/date/comparison/DateTimeComparisonUtils.java @@ -0,0 +1,35 @@ +package com.baeldung.date.comparison; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import static java.time.temporal.ChronoUnit.*; + +public class DateTimeComparisonUtils { + + public static boolean isSameDay(LocalDateTime timestamp, LocalDate localDateToCompare) { + return timestamp.toLocalDate().isEqual(localDateToCompare); + } + + public static boolean isSameDay(LocalDateTime timestamp, LocalDateTime timestampToCompare) { + return timestamp.truncatedTo(DAYS).isEqual(timestampToCompare.truncatedTo(DAYS)); + } + + public static boolean isSameHour(LocalDateTime timestamp, LocalDateTime timestampToCompare) { + return timestamp.truncatedTo(HOURS).isEqual(timestampToCompare.truncatedTo(HOURS)); + } + + public static boolean isSameMinute(LocalDateTime timestamp, LocalDateTime timestampToCompare) { + return timestamp.truncatedTo(MINUTES).isEqual(timestampToCompare.truncatedTo(MINUTES)); + } + + public static boolean isSameHour(ZonedDateTime zonedTimestamp, ZonedDateTime zonedTimestampToCompare) { + return zonedTimestamp.truncatedTo(HOURS).isEqual(zonedTimestampToCompare.truncatedTo(HOURS)); + } + + public static boolean isSameHour(ZonedDateTime zonedDateTime, LocalDateTime localDateTime, ZoneId zoneId) { + return isSameHour(zonedDateTime, localDateTime.atZone(zoneId)); + } +} diff --git a/java-dates-2/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java b/java-dates-2/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java new file mode 100644 index 0000000000..9519bc316a --- /dev/null +++ b/java-dates-2/src/main/java/com/baeldung/date/comparison/LegacyDateComparisonUtils.java @@ -0,0 +1,17 @@ +package com.baeldung.date.comparison; + +import org.apache.commons.lang3.time.DateUtils; + +import java.util.Calendar; +import java.util.Date; + +public class LegacyDateComparisonUtils { + + public static boolean isSameDay(Date date, Date dateToCompare) { + return DateUtils.isSameDay(date, dateToCompare); + } + + public static boolean isSameHour(Date date, Date dateToCompare) { + return DateUtils.truncatedEquals(date, dateToCompare, Calendar.HOUR); + } +} diff --git a/java-dates-2/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java new file mode 100644 index 0000000000..0db0d1e8d7 --- /dev/null +++ b/java-dates-2/src/test/java/com/baeldung/date/comparison/DateTimeComparisonUtilsUnitTest.java @@ -0,0 +1,75 @@ +package com.baeldung.date.comparison; + +import org.junit.jupiter.api.Test; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +class DateTimeComparisonUtilsUnitTest { + + @Test + void givenLocalDateTimes_whenIsSameDay_thenCompareTrue() { + LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 11, 00, 0); + LocalDateTime secondTimestamp = firstTimestamp.plusHours(5); + LocalDateTime thirdTimestamp = firstTimestamp.plusDays(1); + + assertThat(DateTimeComparisonUtils.isSameDay(firstTimestamp, secondTimestamp), is(true)); + + assertThat(DateTimeComparisonUtils.isSameDay(secondTimestamp, thirdTimestamp), is(false)); + } + + @Test + void givenLocalDateAndLocalDateTime_whenIsSameDay_thenCompareTrue() { + LocalDate localDate = LocalDate.of(2019, 8, 10); + LocalDateTime localDateTime = LocalDateTime.of(2019, 8, 10, 11, 30, 0); + + assertThat(DateTimeComparisonUtils.isSameDay(localDateTime, localDate), is(true)); + } + + @Test + void givenLocalDateTimes_whenIsSameHour_thenCompareTrue() { + LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 8, 00, 0); + LocalDateTime secondTimestamp = firstTimestamp.plusMinutes(15); + LocalDateTime thirdTimestamp = firstTimestamp.plusHours(2); + + assertThat(DateTimeComparisonUtils.isSameHour(firstTimestamp, secondTimestamp), is(true)); + + assertThat(DateTimeComparisonUtils.isSameHour(secondTimestamp, thirdTimestamp), is(false)); + } + + @Test + void givenLocalDateTimes_whenIsSameMinute_thenCompareTrue() { + LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 8, 15, 0); + LocalDateTime secondTimestamp = firstTimestamp.plusSeconds(30); + LocalDateTime thirdTimestamp = firstTimestamp.plusMinutes(5); + + assertThat(DateTimeComparisonUtils.isSameMinute(firstTimestamp, secondTimestamp), is(true)); + + assertThat(DateTimeComparisonUtils.isSameMinute(secondTimestamp, thirdTimestamp), is(false)); + } + + @Test + void givenZonedDateTimes_whenIsSameHour_thenCompareTrue() { + ZonedDateTime zonedTimestamp = ZonedDateTime.of(2019, 8, 10, 8, 0, 0, 30, + ZoneId.of("America/New_York")); + ZonedDateTime zonedTimestampToCompare = ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0, + ZoneId.of("Europe/Berlin")); + + assertThat(DateTimeComparisonUtils.isSameHour(zonedTimestamp, zonedTimestampToCompare), is(true)); + } + + @Test + void givenZonedDateTimeAndLocalDateTime_whenIsSameHour_thenCompareTrue() { + ZonedDateTime zonedTimestamp = ZonedDateTime.of(2019, 8, 10, 8, 15, 0, 0, + ZoneId.of("America/New_York")); + LocalDateTime localTimestamp = LocalDateTime.of(2019, 8, 10, 14, 20, 0); + ZoneId zoneId = ZoneId.of("Europe/Berlin"); + + assertThat(DateTimeComparisonUtils.isSameHour(zonedTimestamp, localTimestamp, zoneId), is(true)); + } +} \ No newline at end of file diff --git a/java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java new file mode 100644 index 0000000000..ff51476e7c --- /dev/null +++ b/java-dates-2/src/test/java/com/baeldung/date/comparison/Java8DateTimeApiGeneralComparisonsUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.date.comparison; + +import org.junit.Test; + +import java.time.*; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +public class Java8DateTimeApiGeneralComparisonsUnitTest { + + @Test + public void givenLocalDates_whenComparing_thenAssertsPass() { + LocalDate firstDate = LocalDate.of(2019, 8, 10); + LocalDate secondDate = LocalDate.of(2019, 7, 1); + LocalDate thirdDate = LocalDate.of(2019, 7, 1); // same date as secondDate + + assertThat(firstDate.isAfter(secondDate), is(true)); + assertThat(firstDate.isBefore(secondDate), is(false)); + + assertThat(firstDate.isEqual(secondDate), is(false)); + assertThat(firstDate.equals(secondDate), is(false)); + + assertThat(firstDate.compareTo(secondDate), is(1)); + assertThat(secondDate.compareTo(firstDate), is(-1)); + + assertThat(secondDate.isAfter(thirdDate), is(false)); + assertThat(secondDate.isBefore(thirdDate), is(false)); + assertThat(secondDate.isEqual(thirdDate), is(true)); + assertThat(secondDate.equals(thirdDate), is(true)); + assertThat(secondDate.compareTo(thirdDate), is(0)); + } + + @Test + public void givenLocalDateTimes_whenComparing_thenAssertsPass() { + LocalDateTime firstTimestamp = LocalDateTime.of(2019, 8, 10, 11, 30, 0); + LocalDateTime secondTimestamp = LocalDateTime.of(2019, 8, 10, 11, 15, 0); + LocalDateTime thirdTimestamp = LocalDateTime.of(2019, 8, 10, 11, 15, 0); // same as secondTimestamp + + assertThat(firstTimestamp.isAfter(secondTimestamp), is(true)); + assertThat(firstTimestamp.isBefore(secondTimestamp), is(false)); + + assertThat(firstTimestamp.isEqual(secondTimestamp), is(false)); + assertThat(firstTimestamp.equals(secondTimestamp), is(false)); + + assertThat(firstTimestamp.compareTo(secondTimestamp), is(1)); + assertThat(secondTimestamp.compareTo(firstTimestamp), is(-1)); + + assertThat(secondTimestamp.isAfter(thirdTimestamp), is(false)); + assertThat(secondTimestamp.isBefore(thirdTimestamp), is(false)); + assertThat(secondTimestamp.isEqual(thirdTimestamp), is(true)); + assertThat(secondTimestamp.compareTo(thirdTimestamp), is(0)); + } + + @Test + public void givenZonedDateTimes_whenComparing_thenAssertsPass() { + ZonedDateTime timeInNewYork = ZonedDateTime.of(2019, 8, 10, 8, 0, 0, 0, + ZoneId.of("America/New_York")); + ZonedDateTime timeInBerlin = ZonedDateTime.of(2019, 8, 10, 14, 0, 0, 0, + ZoneId.of("Europe/Berlin")); + + assertThat(timeInNewYork.isAfter(timeInBerlin), is(false)); + assertThat(timeInNewYork.isBefore(timeInBerlin), is(false)); + + assertThat(timeInNewYork.isEqual(timeInBerlin), is(true)); + assertThat(timeInNewYork.equals(timeInBerlin), is(false)); + + assertThat(timeInNewYork.compareTo(timeInBerlin), is(-1)); + } + + @Test + public void givenLocalTimes_whenComparing_thenAssertsPass() { + LocalTime firstTime = LocalTime.of(8, 30); + LocalTime secondTime = LocalTime.of(9, 45); + + assertThat(firstTime.isAfter(secondTime), is(false)); + assertThat(firstTime.isBefore(secondTime), is(true)); + + assertThat(firstTime.equals(secondTime), is(false)); + + assertThat(firstTime.compareTo(secondTime), is(-1)); + } +} \ No newline at end of file diff --git a/java-dates-2/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java b/java-dates-2/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java new file mode 100644 index 0000000000..a501cb8888 --- /dev/null +++ b/java-dates-2/src/test/java/com/baeldung/date/comparison/LegacyDateComparisonUtilsUnitTest.java @@ -0,0 +1,54 @@ +package com.baeldung.date.comparison; + +import org.junit.jupiter.api.Test; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +class LegacyDateComparisonUtilsUnitTest { + + private Date toDate(LocalDateTime localDateTime) { + return Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant()); + } + + @Test + void givenDatesWithDifferentHours_whenIsSameDay_thenReturnsTrue() { + Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 11, 00, 00)); + Date secondDate = toDate(LocalDateTime.of(2019, 8, 10, 12, 00, 00)); + Date thirdDate = toDate(LocalDateTime.of(2019, 8, 15, 12, 00, 00)); + + assertThat(LegacyDateComparisonUtils.isSameDay(firstDate, secondDate), is(true)); + assertThat(LegacyDateComparisonUtils.isSameDay(secondDate, thirdDate), is(false)); + } + + @Test + void givenDatesWithingSameHour_whenIsSameHour_thenReturnsTrue() { + Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 11, 00, 00)); + Date secondDate = toDate(LocalDateTime.of(2019, 8, 10, 11, 15, 00)); + Date thirdDate = toDate(LocalDateTime.of(2019, 8, 10, 12, 00, 00)); + + assertThat(LegacyDateComparisonUtils.isSameHour(firstDate, secondDate), is(true)); + assertThat(LegacyDateComparisonUtils.isSameHour(secondDate, thirdDate), is(false)); + } + + @Test + void givenDates__whenComparing_thenAssertsPass() { + Date firstDate = toDate(LocalDateTime.of(2019, 8, 10, 0, 00, 00)); + Date secondDate = toDate(LocalDateTime.of(2019, 8, 15, 0, 00, 00)); + Date thirdDate = toDate(LocalDateTime.of(2019, 8, 15, 0, 00, 00)); // same date as secondDate + + assertThat(firstDate.after(secondDate), is(false)); + assertThat(firstDate.before(secondDate), is(true)); + assertThat(firstDate.compareTo(secondDate), is(-1)); + assertThat(firstDate.equals(secondDate), is(false)); + + assertThat(thirdDate.after(secondDate), is(false)); + assertThat(thirdDate.before(secondDate), is(false)); + assertThat(thirdDate.compareTo(secondDate), is(0)); + assertThat(thirdDate.equals(secondDate), is(true)); + } +} \ No newline at end of file From 7e18a82d1b09bc11962333ccf5f7d078434d4658 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 27 Aug 2019 06:43:00 +0530 Subject: [PATCH 055/396] BAEL-16906 Slice 6 | The top 100 articles should have their own package in the module (#7652) -Moved packages --- .../ExamplePostController.java | 5 ++--- .../{transfer => requestresponsebody}/LoginForm.java | 2 +- .../{transfer => requestresponsebody}/ResponseTransfer.java | 2 +- .../src/main/java/com/baeldung/services/ExampleService.java | 3 ++- .../ExamplePostControllerRequestIntegrationTest.java | 4 ++-- .../ExamplePostControllerResponseIntegrationTest.java | 4 ++-- 6 files changed, 10 insertions(+), 10 deletions(-) rename spring-boot-rest/src/main/java/com/baeldung/{web/controller => requestresponsebody}/ExamplePostController.java (91%) rename spring-boot-rest/src/main/java/com/baeldung/{transfer => requestresponsebody}/LoginForm.java (93%) rename spring-boot-rest/src/main/java/com/baeldung/{transfer => requestresponsebody}/ResponseTransfer.java (86%) diff --git a/spring-boot-rest/src/main/java/com/baeldung/web/controller/ExamplePostController.java b/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ExamplePostController.java similarity index 91% rename from spring-boot-rest/src/main/java/com/baeldung/web/controller/ExamplePostController.java rename to spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ExamplePostController.java index 1519d95d4d..90211b11a3 100644 --- a/spring-boot-rest/src/main/java/com/baeldung/web/controller/ExamplePostController.java +++ b/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ExamplePostController.java @@ -1,7 +1,7 @@ -package com.baeldung.web.controller; +package com.baeldung.requestresponsebody; import com.baeldung.services.ExampleService; -import com.baeldung.transfer.ResponseTransfer; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -10,7 +10,6 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import com.baeldung.transfer.LoginForm; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; diff --git a/spring-boot-rest/src/main/java/com/baeldung/transfer/LoginForm.java b/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/LoginForm.java similarity index 93% rename from spring-boot-rest/src/main/java/com/baeldung/transfer/LoginForm.java rename to spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/LoginForm.java index caafcdb500..36c7946918 100644 --- a/spring-boot-rest/src/main/java/com/baeldung/transfer/LoginForm.java +++ b/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/LoginForm.java @@ -1,4 +1,4 @@ -package com.baeldung.transfer; +package com.baeldung.requestresponsebody; public class LoginForm { private String username; diff --git a/spring-boot-rest/src/main/java/com/baeldung/transfer/ResponseTransfer.java b/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ResponseTransfer.java similarity index 86% rename from spring-boot-rest/src/main/java/com/baeldung/transfer/ResponseTransfer.java rename to spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ResponseTransfer.java index d4fb282c1b..60fc698792 100644 --- a/spring-boot-rest/src/main/java/com/baeldung/transfer/ResponseTransfer.java +++ b/spring-boot-rest/src/main/java/com/baeldung/requestresponsebody/ResponseTransfer.java @@ -1,4 +1,4 @@ -package com.baeldung.transfer; +package com.baeldung.requestresponsebody; public class ResponseTransfer { diff --git a/spring-boot-rest/src/main/java/com/baeldung/services/ExampleService.java b/spring-boot-rest/src/main/java/com/baeldung/services/ExampleService.java index 48d98b41db..f2734ffa39 100644 --- a/spring-boot-rest/src/main/java/com/baeldung/services/ExampleService.java +++ b/spring-boot-rest/src/main/java/com/baeldung/services/ExampleService.java @@ -1,8 +1,9 @@ package com.baeldung.services; -import com.baeldung.transfer.LoginForm; import org.springframework.stereotype.Service; +import com.baeldung.requestresponsebody.LoginForm; + @Service public class ExampleService { diff --git a/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java b/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java index fc533072c8..a277d5a685 100644 --- a/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java +++ b/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java @@ -17,9 +17,9 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import com.baeldung.SpringBootRestApplication; +import com.baeldung.requestresponsebody.ExamplePostController; +import com.baeldung.requestresponsebody.LoginForm; import com.baeldung.services.ExampleService; -import com.baeldung.transfer.LoginForm; -import com.baeldung.web.controller.ExamplePostController; @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringBootRestApplication.class) diff --git a/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java b/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java index cbe21b1d90..f8c70b0f4a 100644 --- a/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java +++ b/spring-boot-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java @@ -18,9 +18,9 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import com.baeldung.SpringBootRestApplication; +import com.baeldung.requestresponsebody.ExamplePostController; +import com.baeldung.requestresponsebody.LoginForm; import com.baeldung.services.ExampleService; -import com.baeldung.transfer.LoginForm; -import com.baeldung.web.controller.ExamplePostController; @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringBootRestApplication.class) From bfba59a42f97aa5b34eb0eedbd2a7b57f390bbba Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 27 Aug 2019 02:16:44 +0100 Subject: [PATCH 056/396] =?UTF-8?q?Moved=20the=20benchmarks=20class,=20upd?= =?UTF-8?q?ated=20README=20with=20instructions,=20updated=E2=80=A6=20(#765?= =?UTF-8?q?0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Moved the benchmarks class, updated README with instructions, updated pom with build instructions for easy benchmark running * updated README, changed wrong benchmarks.java to *.jar --- performance-tests/README.md | 7 + performance-tests/pom.xml | 171 ++++++++++++++---- .../MappingFrameworksPerformance.java | 0 3 files changed, 146 insertions(+), 32 deletions(-) rename performance-tests/src/{test/java/com/baeldung/performancetests/benchmark => main/java/com/baeldung/performancetests}/MappingFrameworksPerformance.java (100%) diff --git a/performance-tests/README.md b/performance-tests/README.md index 5af735b708..0064157966 100644 --- a/performance-tests/README.md +++ b/performance-tests/README.md @@ -1,3 +1,10 @@ ### Relevant Articles: - [Performance of Java Mapping Frameworks](http://www.baeldung.com/java-performance-mapping-frameworks) + +### Running + + To run the performance benchmarks: + +1: `mvn clean install` +2: `java -jar target/benchmarks.jar` \ No newline at end of file diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index d7738780bf..956c0ccfa8 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -1,17 +1,20 @@ - - 4.0.0 + + com.baeldung performance-tests - performance-tests - + 1.0 + jar + parent-modules com.baeldung 1.0.0-SNAPSHOT + performance-tests + ma.glasnost.orika @@ -32,7 +35,16 @@ org.mapstruct mapstruct-jdk8 ${mapstruct-jdk8.version} + true + + + org.mapstruct + mapstruct-processor + 1.2.0.Final + provided + + org.modelmapper modelmapper @@ -46,46 +58,141 @@ org.openjdk.jmh jmh-core - ${jmh-core.version} + ${jmh.version} org.openjdk.jmh jmh-generator-annprocess - ${jmh-generator.version} + ${jmh.version} + provided - - - - - - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - ${java.version} - ${java.version} - - - org.mapstruct - mapstruct-processor - ${mapstruct-processor.version} - - - - - - - - + + UTF-8 + + + 1.21 1.5.2 5.5.1 1.0.2 1.2.0.Final 1.1.0 1.6.0.1 + 1.8 1.2.0.Final + 1.21 + 1.21 + 3.7.0 + + + 1.8 + + + benchmarks - \ No newline at end of file + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.1 + + ${javac.target} + ${javac.target} + ${javac.target} + + + org.mapstruct + mapstruct-processor + ${mapstruct-processor.version} + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.2 + + + package + + shade + + + ${uberjar.name} + + + org.openjdk.jmh.Main + + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + + + + maven-clean-plugin + 2.5 + + + maven-deploy-plugin + 2.8.1 + + + maven-install-plugin + 2.5.1 + + + maven-jar-plugin + 2.4 + + + maven-javadoc-plugin + 2.9.1 + + + maven-resources-plugin + 2.6 + + + maven-site-plugin + 3.3 + + + maven-source-plugin + 2.2.1 + + + maven-surefire-plugin + 2.17 + + + + + + diff --git a/performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java b/performance-tests/src/main/java/com/baeldung/performancetests/MappingFrameworksPerformance.java similarity index 100% rename from performance-tests/src/test/java/com/baeldung/performancetests/benchmark/MappingFrameworksPerformance.java rename to performance-tests/src/main/java/com/baeldung/performancetests/MappingFrameworksPerformance.java From d78101176260809e5c0280650914ec08d570a87d Mon Sep 17 00:00:00 2001 From: dupirefr Date: Tue, 27 Aug 2019 07:36:52 +0200 Subject: [PATCH 057/396] [BAEL-3117] Moved code into operators module --- .../src/main/java/com/baeldung}/booleanoperators/Car.java | 2 +- .../test/java/com/baeldung}/booleanoperators/XorUnitTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename core-java-modules/{core-java/src/main/java/com/baeldung/java => core-java-lang-operators/src/main/java/com/baeldung}/booleanoperators/Car.java (93%) rename core-java-modules/{core-java/src/test/java/com/baeldung/java => core-java-lang-operators/src/test/java/com/baeldung}/booleanoperators/XorUnitTest.java (98%) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java similarity index 93% rename from core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java rename to core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java index 7394895325..37fb139917 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/java/booleanoperators/Car.java +++ b/core-java-modules/core-java-lang-operators/src/main/java/com/baeldung/booleanoperators/Car.java @@ -1,4 +1,4 @@ -package com.baeldung.java.booleanoperators; +package com.baeldung.booleanoperators; public class Car { diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java similarity index 98% rename from core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java index 70abc0266d..e3cee4888a 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/java/booleanoperators/XorUnitTest.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.booleanoperators; +package com.baeldung.booleanoperators; import org.junit.jupiter.api.Test; From 1b0dea74f6b37fd9083764a90799831b7d3ea1f7 Mon Sep 17 00:00:00 2001 From: dupirefr Date: Tue, 27 Aug 2019 07:55:16 +0200 Subject: [PATCH 058/396] [BAEL-3117] Added integer xor --- .../booleanoperators/XorUnitTest.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java index e3cee4888a..efe38c6f45 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/booleanoperators/XorUnitTest.java @@ -7,58 +7,63 @@ import static org.assertj.core.api.Assertions.assertThat; class XorUnitTest { @Test - void givenDieselManualCar_whenXorOldSchool_ThenFalse() { + void givenDieselManualCar_whenXorOldSchool_thenFalse() { Car car = Car.dieselAndManualCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isFalse(); } @Test - void givenDieselAutomaticCar_whenXorOldSchool_ThenTrue() { + void givenDieselAutomaticCar_whenXorOldSchool_thenTrue() { Car car = Car.dieselAndAutomaticCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isTrue(); } @Test - void givenNonDieselManualCar_whenXorOldSchool_ThenTrue() { + void givenNonDieselManualCar_whenXorOldSchool_thenTrue() { Car car = Car.oilAndManualCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isTrue(); } @Test - void givenNonDieselAutomaticCar_whenXorOldSchool_ThenFalse() { + void givenNonDieselAutomaticCar_whenXorOldSchool_thenFalse() { Car car = Car.oilAndAutomaticCar(); boolean dieselXorManual = (car.isDiesel() && !car.isManual()) || (!car.isDiesel() && car.isManual()); assertThat(dieselXorManual).isFalse(); } @Test - void givenDieselManualCar_whenXor_ThenFalse() { + void givenDieselManualCar_whenXor_thenFalse() { Car car = Car.dieselAndManualCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isFalse(); } @Test - void givenDieselAutomaticCar_whenXor_ThenTrue() { + void givenDieselAutomaticCar_whenXor_thenTrue() { Car car = Car.dieselAndAutomaticCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isTrue(); } @Test - void givenNonDieselManualCar_whenXor_ThenTrue() { + void givenNonDieselManualCar_whenXor_thenTrue() { Car car = Car.oilAndManualCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isTrue(); } @Test - void givenNonDieselAutomaticCar_whenXor_ThenFalse() { + void givenNonDieselAutomaticCar_whenXor_thenFalse() { Car car = Car.oilAndAutomaticCar(); boolean dieselXorManual = car.isDiesel() ^ car.isManual(); assertThat(dieselXorManual).isFalse(); } + + @Test + void givenNumbersOneAndThree_whenXor_thenTwo() { + assertThat(1 ^ 3).isEqualTo(2); + } } From 0216c364b0bddb717c054ab7d0ff61b1aaf032e9 Mon Sep 17 00:00:00 2001 From: Fabio Silva Date: Tue, 27 Aug 2019 12:33:06 -0300 Subject: [PATCH 059/396] Add a Header to a Jersey SSE Client Request (#7662) * Add a Header to a Jersey SSE Client Request (cherry picked from commit ee70714e7885cf8713e9c2698a8a8d93fb6a53c8) * Class and Methods rename --- jersey/pom.xml | 17 +- .../jersey/client/JerseyClientHeaders.java | 189 +++++++++++++++++ .../filter/AddHeaderOnRequestFilter.java | 16 ++ .../baeldung/jersey/server/EchoHeaders.java | 72 +++++++ .../jersey/server/EchoHeadersUnitTest.java | 197 ++++++++++++++++++ 5 files changed, 490 insertions(+), 1 deletion(-) create mode 100644 jersey/src/main/java/com/baeldung/jersey/client/JerseyClientHeaders.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/client/filter/AddHeaderOnRequestFilter.java create mode 100644 jersey/src/main/java/com/baeldung/jersey/server/EchoHeaders.java create mode 100644 jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java diff --git a/jersey/pom.xml b/jersey/pom.xml index 708b36ce41..0b4d469e3a 100644 --- a/jersey/pom.xml +++ b/jersey/pom.xml @@ -32,7 +32,7 @@ org.glassfish.jersey.containers jersey-container-grizzly2-servlet - ${jersey.version} + ${jersey.version} org.glassfish.jersey.ext @@ -44,6 +44,21 @@ jersey-bean-validation ${jersey.version} + + org.glassfish.jersey.security + oauth1-client + ${jersey.version} + + + org.glassfish.jersey.security + oauth2-client + ${jersey.version} + + + org.glassfish.jersey.media + jersey-media-sse + ${jersey.version} + org.glassfish.jersey.test-framework jersey-test-framework-core diff --git a/jersey/src/main/java/com/baeldung/jersey/client/JerseyClientHeaders.java b/jersey/src/main/java/com/baeldung/jersey/client/JerseyClientHeaders.java new file mode 100644 index 0000000000..ebcbe1d4ab --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/client/JerseyClientHeaders.java @@ -0,0 +1,189 @@ +package com.baeldung.jersey.client; + +import com.baeldung.jersey.client.filter.AddHeaderOnRequestFilter; +import org.glassfish.jersey.client.authentication.HttpAuthenticationFeature; +import org.glassfish.jersey.client.oauth1.AccessToken; +import org.glassfish.jersey.client.oauth1.ConsumerCredentials; +import org.glassfish.jersey.client.oauth1.OAuth1ClientSupport; +import org.glassfish.jersey.client.oauth2.OAuth2ClientSupport; + +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.Feature; +import javax.ws.rs.core.Response; +import javax.ws.rs.sse.InboundSseEvent; +import javax.ws.rs.sse.SseEventSource; + +import static org.glassfish.jersey.client.authentication.HttpAuthenticationFeature.*; + +public class JerseyClientHeaders { + + private static final String BEARER_CONSUMER_SECRET = "my-consumer-secret"; + private static final String BEARER_ACCESS_TOKEN_SECRET = "my-access-token-secret"; + private static final String TARGET = "http://localhost:9998/"; + private static final String MAIN_RESOURCE = "echo-headers"; + private static final String RESOURCE_AUTH_DIGEST = "digest"; + + private static String sseHeaderValue; + + public static Response simpleHeader(String headerKey, String headerValue) { + Client client = ClientBuilder.newClient(); + WebTarget webTarget = client.target(TARGET); + WebTarget resourceWebTarget = webTarget.path(MAIN_RESOURCE); + Invocation.Builder invocationBuilder = resourceWebTarget.request(); + invocationBuilder.header(headerKey, headerValue); + return invocationBuilder.get(); + } + + public static Response simpleHeaderFluently(String headerKey, String headerValue) { + Client client = ClientBuilder.newClient(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .request() + .header(headerKey, headerValue) + .get(); + } + + public static Response basicAuthenticationAtClientLevel(String username, String password) { + //To simplify we removed de SSL/TLS protection, but it's required to have an encryption + // when using basic authentication schema as it's send only on Base64 encoding + HttpAuthenticationFeature feature = HttpAuthenticationFeature.basic(username, password); + Client client = ClientBuilder.newBuilder().register(feature).build(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .request() + .get(); + } + + public static Response basicAuthenticationAtRequestLevel(String username, String password) { + //To simplify we removed de SSL/TLS protection, but it's required to have an encryption + // when using basic authentication schema as it's send only on Base64 encoding + HttpAuthenticationFeature feature = HttpAuthenticationFeature.basicBuilder().build(); + Client client = ClientBuilder.newBuilder().register(feature).build(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .request() + .property(HTTP_AUTHENTICATION_BASIC_USERNAME, username) + .property(HTTP_AUTHENTICATION_BASIC_PASSWORD, password) + .get(); + } + + public static Response digestAuthenticationAtClientLevel(String username, String password) { + HttpAuthenticationFeature feature = HttpAuthenticationFeature.digest(username, password); + Client client = ClientBuilder.newBuilder().register(feature).build(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .path(RESOURCE_AUTH_DIGEST) + .request() + .get(); + } + + public static Response digestAuthenticationAtRequestLevel(String username, String password) { + HttpAuthenticationFeature feature = HttpAuthenticationFeature.digest(); + + Client client = ClientBuilder.newBuilder().register(feature).build(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .path(RESOURCE_AUTH_DIGEST) + .request() + .property(HTTP_AUTHENTICATION_DIGEST_USERNAME, username) + .property(HTTP_AUTHENTICATION_DIGEST_PASSWORD, password) + .get(); + } + + public static Response bearerAuthenticationWithOAuth1AtClientLevel(String token, String consumerKey) { + ConsumerCredentials consumerCredential = new ConsumerCredentials(consumerKey, BEARER_CONSUMER_SECRET); + AccessToken accessToken = new AccessToken(token, BEARER_ACCESS_TOKEN_SECRET); + Feature feature = OAuth1ClientSupport + .builder(consumerCredential) + .feature() + .accessToken(accessToken) + .build(); + + Client client = ClientBuilder.newBuilder().register(feature).build(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .request() + .get(); + } + + public static Response bearerAuthenticationWithOAuth1AtRequestLevel(String token, String consumerKey) { + ConsumerCredentials consumerCredential = new ConsumerCredentials(consumerKey, BEARER_CONSUMER_SECRET); + AccessToken accessToken = new AccessToken(token, BEARER_ACCESS_TOKEN_SECRET); + Feature feature = OAuth1ClientSupport + .builder(consumerCredential) + .feature() + .build(); + + Client client = ClientBuilder.newBuilder().register(feature).build(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .request() + .property(OAuth1ClientSupport.OAUTH_PROPERTY_ACCESS_TOKEN, accessToken) + .get(); + } + + public static Response bearerAuthenticationWithOAuth2AtClientLevel(String token) { + Feature feature = OAuth2ClientSupport.feature(token); + + Client client = ClientBuilder.newBuilder().register(feature).build(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .request() + .get(); + } + + public static Response bearerAuthenticationWithOAuth2AtRequestLevel(String token, String otherToken) { + Feature feature = OAuth2ClientSupport.feature(token); + + Client client = ClientBuilder.newBuilder().register(feature).build(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .request() + .property(OAuth2ClientSupport.OAUTH2_PROPERTY_ACCESS_TOKEN, otherToken) + .get(); + } + + public static Response filter() { + Client client = ClientBuilder.newBuilder().register(AddHeaderOnRequestFilter.class).build(); + return client.target(TARGET) + .path(MAIN_RESOURCE) + .request() + .get(); + } + + public static Response sendRestrictedHeaderThroughDefaultTransportConnector(String headerKey, String headerValue) { + Client client = ClientBuilder.newClient(); + System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); + + return client.target(TARGET) + .path(MAIN_RESOURCE) + .request() + .header(headerKey, headerValue) + .get(); + } + + public static String simpleSSEHeader() throws InterruptedException { + Client client = ClientBuilder.newBuilder() + .register(AddHeaderOnRequestFilter.class) + .build(); + + WebTarget webTarget = client.target(TARGET) + .path(MAIN_RESOURCE) + .path("events"); + + SseEventSource sseEventSource = SseEventSource.target(webTarget).build(); + sseEventSource.register(JerseyClientHeaders::receiveEvent); + sseEventSource.open(); + Thread.sleep(3_000); + sseEventSource.close(); + + return sseHeaderValue; + } + + private static void receiveEvent(InboundSseEvent event) { + sseHeaderValue = event.readData(); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/client/filter/AddHeaderOnRequestFilter.java b/jersey/src/main/java/com/baeldung/jersey/client/filter/AddHeaderOnRequestFilter.java new file mode 100644 index 0000000000..a874928c16 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/client/filter/AddHeaderOnRequestFilter.java @@ -0,0 +1,16 @@ +package com.baeldung.jersey.client.filter; + +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import java.io.IOException; + +public class AddHeaderOnRequestFilter implements ClientRequestFilter { + + public static final String FILTER_HEADER_VALUE = "filter-header-value"; + public static final String FILTER_HEADER_KEY = "x-filter-header"; + + @Override + public void filter(ClientRequestContext requestContext) throws IOException { + requestContext.getHeaders().add(FILTER_HEADER_KEY, FILTER_HEADER_VALUE); + } +} diff --git a/jersey/src/main/java/com/baeldung/jersey/server/EchoHeaders.java b/jersey/src/main/java/com/baeldung/jersey/server/EchoHeaders.java new file mode 100644 index 0000000000..a8df3c10a8 --- /dev/null +++ b/jersey/src/main/java/com/baeldung/jersey/server/EchoHeaders.java @@ -0,0 +1,72 @@ +package com.baeldung.jersey.server; + +import com.baeldung.jersey.client.filter.AddHeaderOnRequestFilter; + +import javax.annotation.security.RolesAllowed; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.*; +import javax.ws.rs.sse.OutboundSseEvent; +import javax.ws.rs.sse.Sse; +import javax.ws.rs.sse.SseEventSink; + +@Path("/echo-headers") +public class EchoHeaders { + + static final String REALM_KEY = "realm"; + static final String REALM_VALUE = "Baeldung"; + static final String QOP_KEY = "qop"; + static final String QOP_VALUE = "auth"; + static final String NONCE_KEY = "nonce"; + static final String NONCE_VALUE = "dcd98b7102dd2f0e8b11d0f600bfb0c093"; + static final String OPAQUE_KEY = "opaque"; + static final String OPAQUE_VALUE = "5ccc069c403ebaf9f0171e9517f40e41"; + static final String SSE_HEADER_KEY = "x-sse-header-key"; + + @Context + HttpHeaders headers; + + @GET + public Response getHeadersBack() { + return echoHeaders(); + } + + @RolesAllowed("ADMIN") + @GET + @Path("/digest") + public Response getHeadersBackFromDigestAuthentication() { + // As the Digest authentication require some complex steps to work we'll simulate the process + // https://en.wikipedia.org/wiki/Digest_access_authentication#Example_with_explanation + if (headers.getHeaderString("authorization") == null) { + String authenticationRequired = "Digest " + REALM_KEY + "=\"" + REALM_VALUE + "\", " + QOP_KEY + "=\"" + QOP_VALUE + "\", " + NONCE_KEY + "=\"" + NONCE_VALUE + "\", " + OPAQUE_KEY + "=\"" + OPAQUE_VALUE + "\""; + return Response.status(Response.Status.UNAUTHORIZED) + .header("WWW-Authenticate", authenticationRequired) + .build(); + } else { + return echoHeaders(); + } + } + + @GET + @Path("/events") + @Produces(MediaType.SERVER_SENT_EVENTS) + public void getServerSentEvents(@Context SseEventSink eventSink, @Context Sse sse) { + OutboundSseEvent event = sse.newEventBuilder() + .name("echo-headers") + .data(String.class, headers.getHeaderString(AddHeaderOnRequestFilter.FILTER_HEADER_KEY)) + .build(); + eventSink.send(event); + } + + private Response echoHeaders() { + Response.ResponseBuilder responseBuilder = Response.noContent(); + + headers.getRequestHeaders() + .forEach((k, v) -> { + v.forEach(value -> responseBuilder.header(k, value)); + }); + + return responseBuilder.build(); + } +} diff --git a/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java b/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java new file mode 100644 index 0000000000..ac2cc2c4eb --- /dev/null +++ b/jersey/src/test/java/com/baeldung/jersey/server/EchoHeadersUnitTest.java @@ -0,0 +1,197 @@ +package com.baeldung.jersey.server; + +import com.baeldung.jersey.client.JerseyClientHeaders; +import com.baeldung.jersey.client.filter.AddHeaderOnRequestFilter; +import org.glassfish.jersey.media.sse.SseFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.test.JerseyTest; +import org.junit.Test; + +import javax.ws.rs.core.Application; +import javax.ws.rs.core.Response; +import java.util.Base64; +import java.util.HashMap; +import java.util.Map; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +public class EchoHeadersUnitTest extends JerseyTest { + + private static final String SIMPLE_HEADER_KEY = "my-header-key"; + private static final String SIMPLE_HEADER_VALUE = "my-header-value"; + private static final String USERNAME = "baeldung"; + private static final String PASSWORD = "super-secret"; + private static final String AUTHORIZATION_HEADER_KEY = "authorization"; + private static final String BEARER_TOKEN_VALUE = "my-token"; + private static final String BEARER_CONSUMER_KEY_VALUE = "my-consumer-key"; + private static final String BEARER_REQUEST_TOKEN_VALUE = "my-request-token"; + + @Test + public void whenCallingSimpleHeader_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.simpleHeader(SIMPLE_HEADER_KEY, SIMPLE_HEADER_VALUE); + + assertEquals(response.getHeaderString(SIMPLE_HEADER_KEY), SIMPLE_HEADER_VALUE); + } + + @Test + public void whenCallingSimpleHeaderFluently_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.simpleHeaderFluently(SIMPLE_HEADER_KEY, SIMPLE_HEADER_VALUE); + + assertEquals(response.getHeaderString(SIMPLE_HEADER_KEY), SIMPLE_HEADER_VALUE); + } + + @Test + public void whenCallingBasicAuthenticationAtClientLevel_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.basicAuthenticationAtClientLevel(USERNAME, PASSWORD); + + assertBasicAuthenticationHeaders(response); + } + + @Test + public void whenCallingBasicAuthenticationAtRequestLevel_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.basicAuthenticationAtRequestLevel(USERNAME, PASSWORD); + + assertBasicAuthenticationHeaders(response); + } + + @Test + public void whenCallingDigestAuthenticationAtClientLevel_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.digestAuthenticationAtClientLevel(USERNAME, PASSWORD); + + Map subHeadersMap = parseAuthenticationSubHeader(response, 7); + + assertDigestAuthenticationHeaders(subHeadersMap); + } + + @Test + public void whenCallingDigestAuthenticationAtRequestLevel_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.digestAuthenticationAtRequestLevel(USERNAME, PASSWORD); + + Map subHeadersMap = parseAuthenticationSubHeader(response, 7); + + assertDigestAuthenticationHeaders(subHeadersMap); + } + + @Test + public void whenCallingBearerAuthenticationWithOAuth1AtClientLevel_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.bearerAuthenticationWithOAuth1AtClientLevel(BEARER_TOKEN_VALUE, BEARER_CONSUMER_KEY_VALUE); + + Map subHeadersMap = parseAuthenticationSubHeader(response, 6); + + assertBearerAuthenticationHeaders(subHeadersMap); + } + + @Test + public void whenCallingBearerAuthenticationWithOAuth1AtRequestLevel_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.bearerAuthenticationWithOAuth1AtRequestLevel(BEARER_TOKEN_VALUE, BEARER_CONSUMER_KEY_VALUE); + + Map subHeadersMap = parseAuthenticationSubHeader(response, 6); + + assertBearerAuthenticationHeaders(subHeadersMap); + } + + @Test + public void whenCallingBearerAuthenticationWithOAuth2AtClientLevel_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.bearerAuthenticationWithOAuth2AtClientLevel(BEARER_TOKEN_VALUE); + + assertEquals("Bearer " + BEARER_TOKEN_VALUE, response.getHeaderString(AUTHORIZATION_HEADER_KEY)); + } + + @Test + public void whenCallingBearerAuthenticationWithOAuth2AtRequestLevel_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.bearerAuthenticationWithOAuth2AtRequestLevel(BEARER_TOKEN_VALUE, BEARER_REQUEST_TOKEN_VALUE); + + assertEquals("Bearer " + BEARER_REQUEST_TOKEN_VALUE, response.getHeaderString(AUTHORIZATION_HEADER_KEY)); + } + + @Test + public void whenCallingFilter_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.filter(); + + assertEquals(AddHeaderOnRequestFilter.FILTER_HEADER_VALUE, response.getHeaderString(AddHeaderOnRequestFilter.FILTER_HEADER_KEY)); + } + + @Test + public void whenCallingSendRestrictedHeaderThroughDefaultTransportConnector_thenHeadersReturnedBack() { + Response response = JerseyClientHeaders.sendRestrictedHeaderThroughDefaultTransportConnector("keep-alive", "keep-alive-value"); + + assertEquals("keep-alive-value", response.getHeaderString("keep-alive")); + } + + @Test + public void whenCallingSimpleSSEHeader_thenHeadersReturnedBack() throws InterruptedException { + String sseHeaderBackValue = JerseyClientHeaders.simpleSSEHeader(); + + assertEquals(AddHeaderOnRequestFilter.FILTER_HEADER_VALUE, sseHeaderBackValue); + } + + private void assertBearerAuthenticationHeaders(Map subHeadersMap) { + + assertEquals(BEARER_TOKEN_VALUE, subHeadersMap.get("oauth_token")); + assertEquals(BEARER_CONSUMER_KEY_VALUE, subHeadersMap.get("oauth_consumer_key")); + assertNotNull(subHeadersMap.get("oauth_nonce")); + assertNotNull(subHeadersMap.get("oauth_signature")); + assertNotNull(subHeadersMap.get("oauth_callback")); + assertNotNull(subHeadersMap.get("oauth_signature_method")); + assertNotNull(subHeadersMap.get("oauth_version")); + assertNotNull(subHeadersMap.get("oauth_timestamp")); + } + + private void assertDigestAuthenticationHeaders(Map subHeadersMap) { + assertEquals(EchoHeaders.NONCE_VALUE, subHeadersMap.get(EchoHeaders.NONCE_KEY)); + assertEquals(EchoHeaders.OPAQUE_VALUE, subHeadersMap.get(EchoHeaders.OPAQUE_KEY)); + assertEquals(EchoHeaders.QOP_VALUE, subHeadersMap.get(EchoHeaders.QOP_KEY)); + assertEquals(EchoHeaders.REALM_VALUE, subHeadersMap.get(EchoHeaders.REALM_KEY)); + + assertEquals(USERNAME, subHeadersMap.get("username")); + assertEquals("/echo-headers/digest", subHeadersMap.get("uri")); + assertNotNull(subHeadersMap.get("cnonce")); + assertEquals("00000001", subHeadersMap.get("nc")); + assertNotNull(subHeadersMap.get("response")); + } + + private Map parseAuthenticationSubHeader(Response response, int startAt) { + String authorizationHeader = response.getHeaderString(AUTHORIZATION_HEADER_KEY); + // The substring(startAt) is used to cut off the authentication schema part from the value returned. + String[] subHeadersKeyValue = authorizationHeader.substring(startAt).split(","); + Map subHeadersMap = new HashMap<>(); + + for (String subHeader : subHeadersKeyValue) { + String[] keyValue = subHeader.split("="); + + if (keyValue[1].startsWith("\"")) { + keyValue[1] = keyValue[1].substring(1, keyValue[1].length() - 1); + } + + subHeadersMap.put(keyValue[0].trim(), keyValue[1].trim()); + } + return subHeadersMap; + } + + private void assertBasicAuthenticationHeaders(Response response) { + String base64Credentials = response.getHeaderString(AUTHORIZATION_HEADER_KEY); + // The substring(6) is used to cut the "Basic " part of the value returned, + // as it's used to indicates the authentication schema and does not belong to the credentials + byte[] credentials = Base64.getDecoder().decode(base64Credentials.substring(6)); + String[] credentialsParsed = new String(credentials).split(":"); + + assertEquals(credentialsParsed[0], USERNAME); + assertEquals(credentialsParsed[1], PASSWORD); + } + + @Override + protected Application configure() { + return new ResourceConfig() + .register(EchoHeaders.class); + } + + @Override + public void setUp() throws Exception { + super.setUp(); + // We need this definition here, because if you are running + // the complete suit test the sendingRestrictedHeaderThroughDefaultTransportConnector_shouldReturnThanBack + // will fail if only defined on the client method, since the JerseyTest is created once. + System.setProperty("sun.net.http.allowRestrictedHeaders", "true"); + } +} \ No newline at end of file From 8f8679d8461b0d71e8fc290a570d67c2bcc4cfa2 Mon Sep 17 00:00:00 2001 From: Alexander Molochko Date: Tue, 27 Aug 2019 23:21:51 +0300 Subject: [PATCH 060/396] BAEL-790 Using JaVers for Data Model Auditing in Spring Data --- spring-boot-data/pom.xml | 49 ++++++++++--- .../javers/SpringBootJaVersApplication.java | 31 ++++++++ .../javers/config/JaversConfiguration.java | 20 +++++ .../com/baeldung/javers/domain/Address.java | 33 +++++++++ .../com/baeldung/javers/domain/Product.java | 61 ++++++++++++++++ .../com/baeldung/javers/domain/Store.java | 62 ++++++++++++++++ .../javers/repo/ProductRepository.java | 11 +++ .../baeldung/javers/repo/StoreRepository.java | 9 +++ .../baeldung/javers/service/StoreService.java | 59 +++++++++++++++ .../baeldung/javers/web/RebrandStoreDto.java | 5 ++ .../baeldung/javers/web/StoreController.java | 73 +++++++++++++++++++ .../baeldung/javers/web/UpdatePriceDto.java | 5 ++ .../src/main/resources/application.properties | 25 ++++++- 13 files changed, 432 insertions(+), 11 deletions(-) create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/config/JaversConfiguration.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/domain/Address.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/domain/Product.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/domain/Store.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/repo/ProductRepository.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/repo/StoreRepository.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/service/StoreService.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/web/StoreController.java create mode 100644 spring-boot-data/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java diff --git a/spring-boot-data/pom.xml b/spring-boot-data/pom.xml index 9c11e09f4a..83c4c5610f 100644 --- a/spring-boot-data/pom.xml +++ b/spring-boot-data/pom.xml @@ -6,44 +6,42 @@ war spring-boot-data Spring Boot Data Module - parent-boot-2 com.baeldung 0.0.1-SNAPSHOT ../parent-boot-2 - org.springframework.boot spring-boot-starter-data-redis 2.1.6.RELEASE - + + org.javers + javers-spring-boot-starter-sql + ${javers.version} + org.springframework.boot spring-boot-starter-data-mongodb 2.1.6.RELEASE - org.springframework.boot spring-boot-starter-data-jpa 2.1.6.RELEASE - com.h2database h2 1.4.197 - org.springframework.boot spring-boot-starter-web - org.springframework.boot spring-boot-starter-tomcat @@ -54,8 +52,8 @@ spring-boot-starter-test test - + spring-boot @@ -98,6 +96,14 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + @@ -106,6 +112,22 @@ autoconfiguration + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.javers.SpringBootJaVersApplication + JAR + + + + org.apache.maven.plugins + maven-compiler-plugin + + 8 + 8 + + org.apache.maven.plugins maven-surefire-plugin @@ -133,14 +155,21 @@ + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + - com.baeldung.SpringBootDataApplication + 5.6.3 2.2.4 - diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java b/spring-boot-data/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java new file mode 100644 index 0000000000..91c9b11af5 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/SpringBootJaVersApplication.java @@ -0,0 +1,31 @@ +package com.baeldung.javers; + +import com.baeldung.javers.domain.Address; +import com.baeldung.javers.domain.Product; +import com.baeldung.javers.domain.Store; +import com.baeldung.javers.repo.StoreRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.event.EventListener; + +@SpringBootApplication +public class SpringBootJaVersApplication { + @Autowired + StoreRepository storeRepository; + + public static void main(String[] args) { + SpringApplication.run(SpringBootJaVersApplication.class, args); + } + + @EventListener + public void appReady(ApplicationReadyEvent event) { + Store store = new Store("Baeldung store", new Address("Some street", 22222)); + for (int i = 1; i < 3; i++) { + Product product = new Product("Product #" + i, 100 * i); + store.addProduct(product); + } + storeRepository.save(store); + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/config/JaversConfiguration.java b/spring-boot-data/src/main/java/com/baeldung/javers/config/JaversConfiguration.java new file mode 100644 index 0000000000..b230dcec1d --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/config/JaversConfiguration.java @@ -0,0 +1,20 @@ +package com.baeldung.javers.config; + +import org.javers.spring.auditable.AuthorProvider; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class JaversConfiguration { + @Bean + public AuthorProvider provideJaversAuthor() { + return new SimpleAuthorProvider(); + } + + private static class SimpleAuthorProvider implements AuthorProvider { + @Override + public String provide() { + return "Baeldung Author"; + } + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/domain/Address.java b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Address.java new file mode 100644 index 0000000000..930276b3ee --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Address.java @@ -0,0 +1,33 @@ +package com.baeldung.javers.domain; + +import javax.persistence.Embeddable; + +@Embeddable +public class Address { + private String address; + private Integer zipCode; + + public Address(String address, Integer zipCode) { + this.address = address; + this.zipCode = zipCode; + } + + public Address() { + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Integer getZipCode() { + return zipCode; + } + + public void setZipCode(Integer zipCode) { + this.zipCode = zipCode; + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/domain/Product.java b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Product.java new file mode 100644 index 0000000000..61a2993bb9 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Product.java @@ -0,0 +1,61 @@ +package com.baeldung.javers.domain; + +import javax.persistence.*; + +@Entity +public class Product { + @Id + @GeneratedValue + private int id; + + private String name; + private double price; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "store_id") + private Store store; + + public Product(String name, double price) { + this.name = name; + this.price = price; + } + + public Product() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Store getStore() { + return store; + } + + public void setStore(Store store) { + this.store = store; + } + + public void setNamePrefix(String prefix) { + this.name = prefix + this.name; + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/domain/Store.java b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Store.java new file mode 100644 index 0000000000..5aa6686261 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/domain/Store.java @@ -0,0 +1,62 @@ +package com.baeldung.javers.domain; + +import javax.persistence.*; +import java.util.ArrayList; +import java.util.List; + +@Entity +public class Store { + @Id + @GeneratedValue + private int id; + private String name; + @Embedded + private Address address; + @OneToMany( + mappedBy = "store", + cascade = CascadeType.ALL, + orphanRemoval = true + ) + private List products = new ArrayList<>(); + + public Store(String name, Address address) { + this.name = name; + this.address = address; + } + + public Store() { + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public void addProduct(Product product) { + product.setStore(this); + this.products.add(product); + } + + public List getProducts() { + return this.products; + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/repo/ProductRepository.java b/spring-boot-data/src/main/java/com/baeldung/javers/repo/ProductRepository.java new file mode 100644 index 0000000000..090ebe6742 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/repo/ProductRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.javers.repo; + +import com.baeldung.javers.domain.Product; +import org.javers.spring.annotation.JaversAuditable; +import org.springframework.data.repository.CrudRepository; + +public interface ProductRepository extends CrudRepository { + @Override + @JaversAuditable + S save(S s); +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/repo/StoreRepository.java b/spring-boot-data/src/main/java/com/baeldung/javers/repo/StoreRepository.java new file mode 100644 index 0000000000..aa9d07c4c8 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/repo/StoreRepository.java @@ -0,0 +1,9 @@ +package com.baeldung.javers.repo; + +import com.baeldung.javers.domain.Store; +import org.javers.spring.annotation.JaversSpringDataAuditable; +import org.springframework.data.repository.CrudRepository; + +@JaversSpringDataAuditable +public interface StoreRepository extends CrudRepository { +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/service/StoreService.java b/spring-boot-data/src/main/java/com/baeldung/javers/service/StoreService.java new file mode 100644 index 0000000000..2977f715cb --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/service/StoreService.java @@ -0,0 +1,59 @@ +package com.baeldung.javers.service; + + +import com.baeldung.javers.domain.Product; +import com.baeldung.javers.domain.Store; +import com.baeldung.javers.repo.ProductRepository; +import com.baeldung.javers.repo.StoreRepository; +import org.springframework.stereotype.Service; + +import java.util.Optional; +import java.util.Random; + +@Service +public class StoreService { + private final ProductRepository productRepository; + private final StoreRepository storeRepository; + + public StoreService(ProductRepository productRepository, StoreRepository storeRepository) { + this.productRepository = productRepository; + this.storeRepository = storeRepository; + } + + public void updateProductPrice(Integer productId, Double price) { + Optional productOpt = productRepository.findById(productId); + productOpt.ifPresent(product -> { + product.setPrice(price); + productRepository.save(product); + }); + } + + public void rebrandStore(int storeId, String updatedName) { + Optional storeOpt = storeRepository.findById(storeId); + storeOpt.ifPresent(store -> { + store.setName(updatedName); + store.getProducts().forEach(product -> { + product.setNamePrefix(updatedName); + }); + storeRepository.save(store); + }); + } + + public void createRandomProduct(Integer storeId) { + Optional storeOpt = this.storeRepository.findById(storeId); + storeOpt.ifPresent(store -> { + Random random = new Random(); + Product product = new Product("Product#" + random.nextInt(), random.nextDouble() * 100); + store.addProduct(product); + storeRepository.save(store); + }); + } + + public Store findStoreById(int storeId) { + return storeRepository.findById(storeId).get(); + } + + public Product findProductById(int id) { + return this.productRepository.findById(id).get(); + } +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java b/spring-boot-data/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java new file mode 100644 index 0000000000..c9681add40 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/web/RebrandStoreDto.java @@ -0,0 +1,5 @@ +package com.baeldung.javers.web; + +public class RebrandStoreDto { + public String name; +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/web/StoreController.java b/spring-boot-data/src/main/java/com/baeldung/javers/web/StoreController.java new file mode 100644 index 0000000000..89c3c03a11 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/web/StoreController.java @@ -0,0 +1,73 @@ +package com.baeldung.javers.web; + +import com.baeldung.javers.domain.Product; +import com.baeldung.javers.domain.Store; +import com.baeldung.javers.service.StoreService; +import org.javers.core.Changes; +import org.javers.core.Javers; +import org.javers.core.metamodel.object.CdoSnapshot; +import org.javers.repository.jql.JqlQuery; +import org.javers.repository.jql.QueryBuilder; +import org.javers.shadow.Shadow; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +public class StoreController { + private final StoreService storeService; + private final Javers javers; + + public StoreController(StoreService customerService, Javers javers) { + this.storeService = customerService; + this.javers = javers; + } + + @PostMapping("/stores/{storeId}/products/random") + public void createRandomProduct(@PathVariable final Integer storeId) { + storeService.createRandomProduct(storeId); + } + + @PostMapping("/stores/{storeId}/rebrand") + public void rebrandStore(@PathVariable final Integer storeId, @RequestBody RebrandStoreDto rebrandStoreDto) { + storeService.rebrandStore(storeId, rebrandStoreDto.name); + } + + @PostMapping(value = "/stores/{storeId}/products/{productId}/price", consumes = MediaType.APPLICATION_JSON_VALUE) + public void updateProductPrice(@PathVariable final Integer productId, @PathVariable String storeId, @RequestBody UpdatePriceDto priceDto) { + storeService.updateProductPrice(productId, priceDto.price); + } + + @GetMapping("/products/{productId}/changes") + public String getProductChanges(@PathVariable int productId) { + Product product = storeService.findProductById(productId); + QueryBuilder jqlQuery = QueryBuilder.byInstance(product); + Changes changes = javers.findChanges(jqlQuery.build()); + return javers.getJsonConverter().toJson(changes); + } + + @GetMapping("/products/snapshots") + public String getProductSnapshots() { + QueryBuilder jqlQuery = QueryBuilder.byClass(Product.class); + List snapshots = javers.findSnapshots(jqlQuery.build()); + return javers.getJsonConverter().toJson(snapshots); + } + + @GetMapping("/stores/{storeId}/shadows") + public String getStoreShadows(@PathVariable int storeId) { + Store store = storeService.findStoreById(storeId); + JqlQuery jqlQuery = QueryBuilder.byInstance(store) + .withChildValueObjects().build(); + List> shadows = javers.findShadows(jqlQuery); + return javers.getJsonConverter().toJson(shadows.get(0)); + } + + @GetMapping("/stores/snapshots") + public String getStoresSnapshots() { + QueryBuilder jqlQuery = QueryBuilder.byClass(Store.class); + List snapshots = javers.findSnapshots(jqlQuery.build()); + return javers.getJsonConverter().toJson(snapshots); + } + +} diff --git a/spring-boot-data/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java b/spring-boot-data/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java new file mode 100644 index 0000000000..02808a8134 --- /dev/null +++ b/spring-boot-data/src/main/java/com/baeldung/javers/web/UpdatePriceDto.java @@ -0,0 +1,5 @@ +package com.baeldung.javers.web; + +public class UpdatePriceDto { + public double price; +} diff --git a/spring-boot-data/src/main/resources/application.properties b/spring-boot-data/src/main/resources/application.properties index 845b783634..6378a48506 100644 --- a/spring-boot-data/src/main/resources/application.properties +++ b/spring-boot-data/src/main/resources/application.properties @@ -1,2 +1,25 @@ spring.jackson.date-format=yyyy-MM-dd HH:mm:ss -spring.jackson.time-zone=Europe/Zagreb \ No newline at end of file +spring.jackson.time-zone=Europe/Zagreb +spring.h2.console.path=/h2 +spring.h2.console.enabled=true +spring.datasource.url=jdbc:h2:mem:testdb +spring.datasource.driver-class-name=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password= +spring.main.allow-bean-definition-overriding=true +javers.mappingStyle=FIELD +javers.algorithm=SIMPLE +javers.commitIdGenerator=synchronized_sequence +javers.prettyPrint=true +javers.typeSafeValues=false +javers.newObjectSnapshot=true +javers.packagesToScan= +javers.auditableAspectEnabled=true +javers.springDataAuditableRepositoryAspectEnabled=true +javers.sqlSchema= +javers.sqlSchemaManagementEnabled=true +javers.prettyPrintDateFormats.localDateTime=dd MMM yyyy, HH:mm:ss +javers.prettyPrintDateFormats.zonedDateTime=dd MMM yyyy, HH:mm:ssZ +javers.prettyPrintDateFormats.localDate=dd MMM yyyy +javers.prettyPrintDateFormats.localTime=HH:mm:ss + From 9d825c429e462ad15182910b20a7a705c6c86007 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Wed, 28 Aug 2019 10:25:04 +0530 Subject: [PATCH 061/396] Adding source code for the article tracked under BAEL-3232. (#7657) --- java-blockchain/.gitignore | 26 +++++++ java-blockchain/README.md | 6 ++ java-blockchain/pom.xml | 40 +++++++++++ .../java/com/baeldung/blockchain/Block.java | 65 ++++++++++++++++++ .../src/main/resources/logback.xml | 13 ++++ .../blockchain/BlockchainUnitTest.java | 67 +++++++++++++++++++ java-blockchain/src/test/resources/.gitignore | 13 ++++ pom.xml | 2 + 8 files changed, 232 insertions(+) create mode 100644 java-blockchain/.gitignore create mode 100644 java-blockchain/README.md create mode 100644 java-blockchain/pom.xml create mode 100644 java-blockchain/src/main/java/com/baeldung/blockchain/Block.java create mode 100644 java-blockchain/src/main/resources/logback.xml create mode 100644 java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java create mode 100644 java-blockchain/src/test/resources/.gitignore diff --git a/java-blockchain/.gitignore b/java-blockchain/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/java-blockchain/.gitignore @@ -0,0 +1,26 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +*.txt +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/java-blockchain/README.md b/java-blockchain/README.md new file mode 100644 index 0000000000..600f4dd610 --- /dev/null +++ b/java-blockchain/README.md @@ -0,0 +1,6 @@ +========= + +## Basic Implementation of Blockchian in Java + +### Relevant Articles: +- []() diff --git a/java-blockchain/pom.xml b/java-blockchain/pom.xml new file mode 100644 index 0000000000..2f9e011aa7 --- /dev/null +++ b/java-blockchain/pom.xml @@ -0,0 +1,40 @@ + + 4.0.0 + com.baeldung.blockchain + java-blockchain + 0.1.0-SNAPSHOT + java-blockchain + jar + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + java-blockchain + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + 1.8 + 1.8 + + \ No newline at end of file diff --git a/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java new file mode 100644 index 0000000000..264e3c4b69 --- /dev/null +++ b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java @@ -0,0 +1,65 @@ +package com.baeldung.blockchain; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Date; +import java.util.logging.Level; +import java.util.logging.Logger; + +public class Block { + + private static Logger logger = Logger.getLogger(Block.class.getName()); + + private String hash; + private String previousHash; + private String data; + private long timeStamp; + private int nonce; + + public Block(String data, String previousHash) { + this.data = data; + this.previousHash = previousHash; + this.timeStamp = new Date().getTime(); + this.hash = calculateBlockHash(); + } + + public String mineBlock(int prefix) { + String prefixString = new String(new char[prefix]).replace('\0', '0'); + while (!hash.substring(0, prefix) + .equals(prefixString)) { + nonce++; + hash = calculateBlockHash(); + } + return hash; + } + + public String calculateBlockHash() { + String dataToHash = previousHash + Long.toString(timeStamp) + Integer.toString(nonce) + data; + MessageDigest digest = null; + byte[] bytes = null; + try { + digest = MessageDigest.getInstance("SHA-256"); + bytes = digest.digest(dataToHash.getBytes("UTF-8")); + } catch (NoSuchAlgorithmException | UnsupportedEncodingException ex) { + logger.log(Level.SEVERE, ex.getMessage()); + } + StringBuffer buffer = new StringBuffer(); + for (byte b : bytes) { + buffer.append(String.format("%02x", b)); + } + return buffer.toString(); + } + + public String getHash() { + return this.hash; + } + + public String getPreviousHash() { + return this.previousHash; + } + + public void setData(String data) { + this.data = data; + } +} diff --git a/java-blockchain/src/main/resources/logback.xml b/java-blockchain/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/java-blockchain/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java new file mode 100644 index 0000000000..acbf651e78 --- /dev/null +++ b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java @@ -0,0 +1,67 @@ +package com.baeldung.blockchain; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.ArrayList; +import java.util.List; + +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +public class BlockchainUnitTest { + + public static List blockchain = new ArrayList(); + public static int prefix = 4; + public static String prefixString = new String(new char[prefix]).replace('\0', '0'); + + @BeforeClass + public static void setUp() { + Block genesisBlock = new Block("The is the Genesis Block.", "0"); + genesisBlock.mineBlock(prefix); + blockchain.add(genesisBlock); + Block firstBlock = new Block("The is the First Block.", genesisBlock.getHash()); + firstBlock.mineBlock(prefix); + blockchain.add(firstBlock); + } + + @Test + public void givenBlockchain_whenNewBlockAdded_thenSuccess() { + Block newBlock = new Block("The is a New Block.", blockchain.get(blockchain.size() - 1) + .getHash()); + newBlock.mineBlock(prefix); + assertTrue(newBlock.getHash() + .substring(0, prefix) + .equals(prefixString)); + blockchain.add(newBlock); + } + + @Test + public void givenBlockchain_whenValidated_thenSuccess() { + boolean flag = true; + for (int i = 0; i < blockchain.size(); i++) { + String previousHash = i == 0 ? "0" + : blockchain.get(i - 1) + .getHash(); + flag = blockchain.get(i) + .getHash() + .equals(blockchain.get(i) + .calculateBlockHash()) + && previousHash.equals(blockchain.get(i) + .getPreviousHash()) + && blockchain.get(i) + .getHash() + .substring(0, prefix) + .equals(prefixString); + if (!flag) + break; + } + assertTrue(flag); + } + + @AfterClass + public static void tearDown() { + blockchain.clear(); + } + +} diff --git a/java-blockchain/src/test/resources/.gitignore b/java-blockchain/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/java-blockchain/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/pom.xml b/pom.xml index a4f2a13c28..1dbc3647b5 100644 --- a/pom.xml +++ b/pom.xml @@ -566,6 +566,7 @@ oauth2-framework-impl spring-boot-nashorn + java-blockchain @@ -802,6 +803,7 @@ spring-security-kerberos spring-boot-nashorn + java-blockchain From 0eedbaa5f4da4570137da7105dd82a9089817a3d Mon Sep 17 00:00:00 2001 From: pazis Date: Wed, 28 Aug 2019 11:00:23 +0000 Subject: [PATCH 062/396] stax fix --- .../com/baeldung/xml/stax/StaxParser.java | 65 ++++++++++--------- .../baeldung/xml/stax/StaxParserUnitTest.java | 4 +- 2 files changed, 38 insertions(+), 31 deletions(-) diff --git a/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java index 6c06bfdb17..9e3b5e8b0f 100644 --- a/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java +++ b/xml/src/main/java/com/baeldung/xml/stax/StaxParser.java @@ -1,4 +1,5 @@ package com.baeldung.xml.stax; + import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.List; @@ -16,52 +17,58 @@ import javax.xml.namespace.QName; public class StaxParser { public static List parse(String path) { - List webSites = new ArrayList(); - WebSite webSite = null; + List websites = new ArrayList(); + WebSite website = null; XMLInputFactory xmlInputFactory = XMLInputFactory.newInstance(); try { XMLEventReader reader = xmlInputFactory.createXMLEventReader(new FileInputStream(path)); - while(reader.hasNext()){ + while (reader.hasNext()) { XMLEvent nextEvent = reader.nextEvent(); - if (nextEvent.isStartElement()){ + if (nextEvent.isStartElement()) { StartElement startElement = nextEvent.asStartElement(); - switch (startElement.getName().getLocalPart()) { - case "website": - webSite = new WebSite(); - Attribute url = startElement.getAttributeByName(new QName("url")); - if (url != null) { - webSite.setUrl(url.getValue()); - } - break; - case "name": - nextEvent = reader.nextEvent(); - webSite.setName(nextEvent.asCharacters().getData()); - break; - case "category": - nextEvent = reader.nextEvent(); - webSite.setCategory(nextEvent.asCharacters().getData()); - break; - case "status": - nextEvent = reader.nextEvent(); - webSite.setStatus(nextEvent.asCharacters().getData()); - break; + switch (startElement.getName() + .getLocalPart()) { + case "website": + website = new WebSite(); + Attribute url = startElement.getAttributeByName(new QName("url")); + if (url != null) { + website.setUrl(url.getValue()); + } + break; + case "name": + nextEvent = reader.nextEvent(); + website.setName(nextEvent.asCharacters() + .getData()); + break; + case "category": + nextEvent = reader.nextEvent(); + website.setCategory(nextEvent.asCharacters() + .getData()); + break; + case "status": + nextEvent = reader.nextEvent(); + website.setStatus(nextEvent.asCharacters() + .getData()); + break; } } - if(nextEvent.isEndElement()){ + if (nextEvent.isEndElement()) { EndElement endElement = nextEvent.asEndElement(); - if(endElement.getName().getLocalPart().equals("website")){ - webSites.add(webSite); + if (endElement.getName() + .getLocalPart() + .equals("website")) { + websites.add(website); } } } - } catch (XMLStreamException xse){ + } catch (XMLStreamException xse) { System.out.println("XMLStreamException"); xse.printStackTrace(); } catch (FileNotFoundException fnfe) { System.out.println("FileNotFoundException"); fnfe.printStackTrace(); } - return webSites; + return websites; } } diff --git a/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java index 7629487e11..587c2adf3b 100644 --- a/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/stax/StaxParserUnitTest.java @@ -20,12 +20,12 @@ public class StaxParserUnitTest { @Test public void givenWebsitesXML_whenParsed_thenSizeIsThree() { List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); - assertTrue(websites.size() == 3); + assertEquals(3, websites.size()); } @Test public void givenWebsitesXML_whenParsed_thenLocalhostExists() { List websites = StaxParser.parse("src/test/resources/xml/websites.xml"); - assertEquals(websites.get(2).getName(),"Localhost"); + assertEquals("Localhost", websites.get(2).getName()); } } From 62eb0f742861df6122bba8812449e92d07948ce1 Mon Sep 17 00:00:00 2001 From: maryarm Date: Wed, 28 Aug 2019 20:00:29 +0430 Subject: [PATCH 063/396] BAEL-3009: Logging Spring WebClient calls --- spring-5-reactive-client/pom.xml | 12 +- .../WebClientLoggingIntegrationTest.java | 150 ++++++++++++++++++ .../reactive/logging/filters/LogFilters.java | 33 ++++ .../logging/jetty/RequestLogEnhancer.java | 88 ++++++++++ .../reactive/logging/netty/CustomLogger.java | 37 +++++ .../src/test/resources/logback-test.xml | 8 +- 6 files changed, 324 insertions(+), 4 deletions(-) create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index 1b71815eb4..5e9fdd9fb4 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-5-reactive-client spring-5-reactive-client @@ -56,7 +56,6 @@ - org.springframework.boot spring-boot-devtools @@ -89,6 +88,14 @@ org.projectlombok lombok + + + + org.eclipse.jetty + jetty-reactive-httpclient + ${jetty-reactive-httpclient.version} + test + @@ -110,6 +117,7 @@ 1.0 1.0 4.1 + 1.0.3 diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java new file mode 100644 index 0000000000..bb88502132 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -0,0 +1,150 @@ +package com.baeldung.reactive.logging; + +import ch.qos.logback.classic.spi.LoggingEvent; +import ch.qos.logback.core.Appender; +import com.baeldung.reactive.logging.filters.LogFilters; +import com.baeldung.reactive.logging.jetty.RequestLogEnhancer; +import com.baeldung.reactive.logging.netty.CustomLogger; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.net.URI; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.util.ssl.SslContextFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.slf4j.LoggerFactory; +import org.springframework.http.client.reactive.JettyClientHttpConnector; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.reactive.function.BodyInserters; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.netty.channel.BootstrapHandlers; +import reactor.netty.http.client.HttpClient; + +import static org.mockito.ArgumentMatchers.argThat; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + + +public class WebClientLoggingIntegrationTest { + + @AllArgsConstructor + @Data + class Post { + private String title; + private String body; + private int userId; + } + + private Appender jettyAppender; + private Appender nettyAppender; + private Appender mockAppender; + private String sampleUrl = "https://jsonplaceholder.typicode.com/posts"; + + private Post post; + private String sampleResponseBody; + + @BeforeEach + private void setup() throws Exception { + + post = new Post("Learn WebClient logging with Baeldung!", "", 1); + sampleResponseBody = new ObjectMapper().writeValueAsString(post); + + ch.qos.logback.classic.Logger jetty = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.reactive.logging.jetty"); + jettyAppender = mock(Appender.class); + when(jettyAppender.getName()).thenReturn("com.baeldung.reactive.logging.jetty"); + jetty.addAppender(jettyAppender); + + ch.qos.logback.classic.Logger netty = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("reactor.netty.http.client"); + nettyAppender = mock(Appender.class); + when(nettyAppender.getName()).thenReturn("reactor.netty.http.client"); + netty.addAppender(nettyAppender); + + ch.qos.logback.classic.Logger test = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.baeldung.reactive"); + mockAppender = mock(Appender.class); + when(mockAppender.getName()).thenReturn("com.baeldung.reactive"); + test.addAppender(mockAppender); + + } + + @Test + public void givenJettyHttpClient_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + SslContextFactory.Client sslContextFactory = new SslContextFactory.Client(); + org.eclipse.jetty.client.HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(sslContextFactory) { + @Override + public Request newRequest(URI uri) { + Request request = super.newRequest(uri); + return new RequestLogEnhancer().enhance(request); + } + }; + + WebClient + .builder() + .clientConnector(new JettyClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .retrieve() + .bodyToMono(String.class) + .block(); + + verify(jettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody))); + } + + @Test + public void givenNettyHttpClientWithWiretap_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + + reactor.netty.http.client.HttpClient httpClient = HttpClient + .create() + .wiretap(true); + WebClient + .builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .exchange() + .block(); + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("00000300"))); + } + + @Test + public void givenNettyHttpClientWithCustomLogger_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + + reactor.netty.http.client.HttpClient httpClient = HttpClient + .create() + .tcpConfiguration(tcpClient -> tcpClient.bootstrap(b -> BootstrapHandlers.updateLogSupport(b, new CustomLogger(HttpClient.class)))); + WebClient + .builder() + .clientConnector(new ReactorClientHttpConnector(httpClient)) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .exchange() + .block(); + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody))); + } + + @Test + public void givenDefaultHttpClientWithString_whenEndpointIsConsumed_thenRequestAndResponseLogged() { + WebClient + .builder() + .filters(exchangeFilterFunctions -> { + exchangeFilterFunctions.addAll(LogFilters.prepareFilters()); + }) + .build() + .post() + .uri(sampleUrl) + .body(BodyInserters.fromObject(post)) + .exchange() + .block(); + + verify(mockAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("domain=.typicode.com;"))); + } + + +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java new file mode 100644 index 0000000000..8bb4c2aecd --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java @@ -0,0 +1,33 @@ +package com.baeldung.reactive.logging.filters; + +import java.util.Arrays; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.reactive.function.client.ExchangeFilterFunction; +import reactor.core.publisher.Mono; + +@Slf4j +public class LogFilters { + public static List prepareFilters(){ + return Arrays.asList(ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + if ( log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Request: \n").append(clientRequest.method()).append(" ").append(clientRequest.url()); + clientRequest + .headers() + .forEach((name, values) -> values.forEach(value -> sb.append("\n").append(name).append(":").append(value))); + log.debug(sb.toString()); + } + return Mono.just(clientRequest); + }), ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { + if ( log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Response: \n").append("Status: ").append(clientResponse.rawStatusCode()); + clientResponse + .headers() + .asHttpHeaders() + .forEach((key, value1) -> value1.forEach(value -> sb.append("\n").append(key).append(":").append(value))); + log.debug(sb.toString()); + } + return Mono.just(clientResponse); + })); + } +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java new file mode 100644 index 0000000000..334faf2c91 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java @@ -0,0 +1,88 @@ +package com.baeldung.reactive.logging.jetty; + +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.Locale; +import lombok.extern.slf4j.Slf4j; +import org.eclipse.jetty.client.api.Request; +import org.eclipse.jetty.http.HttpField; +import org.eclipse.jetty.http.HttpFields; +import org.eclipse.jetty.http.HttpHeader; + +@Slf4j +public class RequestLogEnhancer { + + public Request enhance(Request request) { + StringBuilder group = new StringBuilder(); + request.onRequestBegin(theRequest -> group + .append("Request ") + .append(theRequest.getMethod()) + .append(" ") + .append(theRequest.getURI()) + .append("\n")); + request.onRequestHeaders(theRequest -> { + for (HttpField header : theRequest.getHeaders()) + group + .append(header) + .append("\n"); + }); + request.onRequestContent((theRequest, content) -> group.append(toString(content, getCharset(theRequest.getHeaders())))); + request.onRequestSuccess(theRequest -> { + log.debug(group.toString()); + group.delete(0, group.length()); + }); + group.append("\n"); + request.onResponseBegin(theResponse -> { + group + .append("Response \n ") + .append(theResponse.getVersion()) + .append(" ") + .append(theResponse.getStatus()); + if (theResponse.getReason() != null) group + .append(" ") + .append(theResponse.getReason()); + group.append("\n"); + }); + request.onResponseHeaders(theResponse -> { + for (HttpField header : theResponse.getHeaders()) + group + .append(header) + .append("\n"); + }); + request.onResponseContent((theResponse, content) -> group.append(toString(content, getCharset(theResponse.getHeaders())))); + request.onResponseSuccess(theResponse -> { + log.debug(group.toString()); + }); + return request; + } + + + private String toString(ByteBuffer buffer, Charset charset) + { + byte[] bytes; + if (buffer.hasArray()) { + bytes = new byte[buffer.capacity()]; + System.arraycopy(buffer.array(), 0, bytes, 0, buffer.capacity() ); + } + else + { + bytes = new byte[buffer.remaining()]; + buffer.get(bytes, 0, bytes.length); + } + return new String(bytes, charset); + } + + + private Charset getCharset(HttpFields headers) { + String contentType = headers.get(HttpHeader.CONTENT_TYPE); + if (contentType == null) return StandardCharsets.UTF_8; + String[] tokens = contentType + .toLowerCase(Locale.US) + .split("charset="); + if (tokens.length != 2) return StandardCharsets.UTF_8; + String encoding = tokens[1].replaceAll("[;\"]", ""); + return Charset.forName(encoding); + } +} + diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java new file mode 100644 index 0000000000..df7c65f33f --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java @@ -0,0 +1,37 @@ +package com.baeldung.reactive.logging.netty; + +import io.netty.buffer.ByteBuf; +import io.netty.channel.ChannelHandlerContext; +import io.netty.handler.logging.LoggingHandler; +import io.netty.util.internal.PlatformDependent; +import java.nio.charset.Charset; + +public class CustomLogger extends LoggingHandler { + public CustomLogger(Class clazz) { + super(clazz); + } + + @Override + protected String format(ChannelHandlerContext ctx, String eventName, Object arg) { + if (arg instanceof ByteBuf) { + ByteBuf msg = (ByteBuf) arg; + return decodeString(msg, msg.readerIndex(), msg.readableBytes(), Charset.defaultCharset()); + } + return ""; + } + + private String decodeString(ByteBuf src, int readerIndex, int len, Charset charset) { + if (len == 0) return ""; + byte[] array; + int offset; + if (src.hasArray()) { + array = src.array(); + offset = src.arrayOffset() + readerIndex; + } else { + array = PlatformDependent.allocateUninitializedArray(Math.max(len, 1024)); + offset = 0; + src.getBytes(readerIndex, array, 0, len); + } + return new String(array, offset, len, charset); + } +} diff --git a/spring-5-reactive-client/src/test/resources/logback-test.xml b/spring-5-reactive-client/src/test/resources/logback-test.xml index 7072369b8d..42cb0865c5 100644 --- a/spring-5-reactive-client/src/test/resources/logback-test.xml +++ b/spring-5-reactive-client/src/test/resources/logback-test.xml @@ -6,11 +6,15 @@ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - + + + + + - + \ No newline at end of file From 788a0258e8511fa83ebc5c0bd380a837fbb8632f Mon Sep 17 00:00:00 2001 From: amit2103 Date: Thu, 29 Aug 2019 00:08:58 +0530 Subject: [PATCH 064/396] [BAEL-16822] - Added removed css file --- .../webapp/VAADIN/themes/mytheme/styles.css | 12986 ++++++++++++++++ 1 file changed, 12986 insertions(+) create mode 100644 vaadin/src/main/webapp/VAADIN/themes/mytheme/styles.css diff --git a/vaadin/src/main/webapp/VAADIN/themes/mytheme/styles.css b/vaadin/src/main/webapp/VAADIN/themes/mytheme/styles.css new file mode 100644 index 0000000000..75bf26f498 --- /dev/null +++ b/vaadin/src/main/webapp/VAADIN/themes/mytheme/styles.css @@ -0,0 +1,12986 @@ +/** + * Checks if a list contains a certain value. + * + * @param {list} $list - the list to check + * @param {value} $var - the value to search for + * @param {bool} $recursive (false) - should any contained lists be checked for the value + * + * @return {bool} true if the value is found from the list, false otherwise + * + * @group lists + */ + +/** + * Cross-browser opacity. + * + * @param {number} $value - opacity value from 0 to 1 + * @param {bool} $important (false) - should the property value be declared with !important + * + * @group util + */ + +@-webkit-keyframes valo-animate-in-fade { + 0% { + opacity: 0; + } + } + +@-moz-keyframes valo-animate-in-fade { + 0% { + opacity: 0; + } + } + +@keyframes valo-animate-in-fade { + 0% { + opacity: 0; + } + } + +@-webkit-keyframes valo-animate-out-fade { + 100% { + opacity: 0; + } + } + +@-moz-keyframes valo-animate-out-fade { + 100% { + opacity: 0; + } + } + +@keyframes valo-animate-out-fade { + 100% { + opacity: 0; + } + } + +@-webkit-keyframes valo-animate-in-slide-down { + 0% { + -webkit-transform: translateY(-100%); + } + } + +@-moz-keyframes valo-animate-in-slide-down { + 0% { + -moz-transform: translateY(-100%); + } + } + +@keyframes valo-animate-in-slide-down { + 0% { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); + } + } + +@-webkit-keyframes valo-animate-in-slide-up { + 0% { + -webkit-transform: translateY(100%); + } + } + +@-moz-keyframes valo-animate-in-slide-up { + 0% { + -moz-transform: translateY(100%); + } + } + +@keyframes valo-animate-in-slide-up { + 0% { + -webkit-transform: translateY(100%); + -moz-transform: translateY(100%); + -ms-transform: translateY(100%); + -o-transform: translateY(100%); + transform: translateY(100%); + } + } + +@-webkit-keyframes valo-animate-in-slide-left { + 0% { + -webkit-transform: translateX(100%); + } + } + +@-moz-keyframes valo-animate-in-slide-left { + 0% { + -moz-transform: translateX(100%); + } + } + +@keyframes valo-animate-in-slide-left { + 0% { + -webkit-transform: translateX(100%); + -moz-transform: translateX(100%); + -ms-transform: translateX(100%); + -o-transform: translateX(100%); + transform: translateX(100%); + } + } + +@-webkit-keyframes valo-animate-in-slide-right { + 0% { + -webkit-transform: translateX(-100%); + } + } + +@-moz-keyframes valo-animate-in-slide-right { + 0% { + -moz-transform: translateX(-100%); + } + } + +@keyframes valo-animate-in-slide-right { + 0% { + -webkit-transform: translateX(-100%); + -moz-transform: translateX(-100%); + -ms-transform: translateX(-100%); + -o-transform: translateX(-100%); + transform: translateX(-100%); + } + } + +@-webkit-keyframes valo-animate-out-slide-down { + 100% { + -webkit-transform: translateY(100%); + } + } + +@-moz-keyframes valo-animate-out-slide-down { + 100% { + -moz-transform: translateY(100%); + } + } + +@keyframes valo-animate-out-slide-down { + 100% { + -webkit-transform: translateY(100%); + -moz-transform: translateY(100%); + -ms-transform: translateY(100%); + -o-transform: translateY(100%); + transform: translateY(100%); + } + } + +@-webkit-keyframes valo-animate-out-slide-up { + 100% { + -webkit-transform: translateY(-100%); + } + } + +@-moz-keyframes valo-animate-out-slide-up { + 100% { + -moz-transform: translateY(-100%); + } + } + +@keyframes valo-animate-out-slide-up { + 100% { + -webkit-transform: translateY(-100%); + -moz-transform: translateY(-100%); + -ms-transform: translateY(-100%); + -o-transform: translateY(-100%); + transform: translateY(-100%); + } + } + +@-webkit-keyframes valo-animate-out-slide-left { + 100% { + -webkit-transform: translateX(-100%); + } + } + +@-moz-keyframes valo-animate-out-slide-left { + 100% { + -moz-transform: translateX(-100%); + } + } + +@keyframes valo-animate-out-slide-left { + 100% { + -webkit-transform: translateX(-100%); + -moz-transform: translateX(-100%); + -ms-transform: translateX(-100%); + -o-transform: translateX(-100%); + transform: translateX(-100%); + } + } + +@-webkit-keyframes valo-animate-out-slide-right { + 100% { + -webkit-transform: translateX(100%); + } + } + +@-moz-keyframes valo-animate-out-slide-right { + 100% { + -moz-transform: translateX(100%); + } + } + +@keyframes valo-animate-out-slide-right { + 100% { + -webkit-transform: translateX(100%); + -moz-transform: translateX(100%); + -ms-transform: translateX(100%); + -o-transform: translateX(100%); + transform: translateX(100%); + } + } + +@-webkit-keyframes valo-overlay-animate-in { + 0% { + -webkit-transform: translatey(-4px); + opacity: 0; + } + } + +@-moz-keyframes valo-overlay-animate-in { + 0% { + -moz-transform: translatey(-4px); + opacity: 0; + } + } + +@keyframes valo-overlay-animate-in { + 0% { + -webkit-transform: translatey(-4px); + -moz-transform: translatey(-4px); + -ms-transform: translatey(-4px); + -o-transform: translatey(-4px); + transform: translatey(-4px); + opacity: 0; + } + } + +@-webkit-keyframes valo-animate-out-slide-down-fade { + 100% { + opacity: 0; + -webkit-transform: translatey(30%); + } + } + +@-moz-keyframes valo-animate-out-slide-down-fade { + 100% { + opacity: 0; + -moz-transform: translatey(30%); + } + } + +@keyframes valo-animate-out-slide-down-fade { + 100% { + opacity: 0; + -webkit-transform: translatey(30%); + -moz-transform: translatey(30%); + -ms-transform: translatey(30%); + -o-transform: translatey(30%); + transform: translatey(30%); + } + } + +/** + * Outputs cross-browser Valo-specific linear gradient background-image declarations. + * + * @group style + * + * @param {color} $color ($v-background-color) - The base color for the gradient color stops + * @param {list} $gradient ($v-gradient) - Valo-specific gradient value. See the documentation for $v-gradient. + * @param {color} $fallback (null) - A fallback color for browser which do not support linear gradients (IE8 and IE9 in particular). If null, the base $color is used instead. + * @param {string} $direction (to bottom) - the direction of the linear gradient. The color stops are by default so that a lighter shade is at the start and a darker shade is at the end. + */ + +/** + * Computes a CSS border property value for the given base color. + * + * @group style + * + * @param {list} $border ($v-border) - CSS border value which can contain any of the color keywords + * @param {color} $color ($v-background-color) - the base color to which the color keywords are applied to + * @param {color} $context (null) - context/surrounding color where the border is expected to appear. The color of the final border is the darker of the two parameters passed to this function. + * @param {number} $strength (1) - adjustment for the border contrast + * + * @return {list} The input $border value with any color keyword replaced with the corresponding actual color + */ + +/** + * Ouput selectors and properties to vertically center elements inside their parent. + * + * @param {string} $to-align (()) - The selector to match the elements which you wish to align vertically. The targeted elements should be inline or inline-block elements. + * @param {string} $align (middle) - The vertical-align value, e.g. top, middle, bottom + * @param {string} $pseudo-element (after) - Which pseudo element to use for the vertical align guide + * + * @group util + */ + +@font-face { + font-family: ThemeIcons; + font-weight: normal; + font-style: normal; + src: url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.eot); + src: url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.woff) format("woff"), url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.ttf) format("truetype"), url(../valo/util/bourbon/css3/../../../../base/fonts/themeicons-webfont.svg#ThemeIcons) format("svg"); +} + +.ThemeIcons { + font-family: ThemeIcons; + font-style: normal; + font-weight: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: inline-block; + text-align: center; +} + +@font-face { + font-family: FontAwesome; + font-weight: normal; + font-style: normal; + src: url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.eot); + src: url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.woff) format("woff"), url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.ttf) format("truetype"), url(../valo/util/bourbon/css3/../../../../base/fonts/fontawesome-webfont.svg#FontAwesome) format("svg"); +} + +.FontAwesome { + font-family: FontAwesome; + font-style: normal; + font-weight: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + display: inline-block; + text-align: center; +} + +@font-face { + font-family: "Open Sans"; + src: url(../valo/fonts/open-sans/OpenSans-Light-webfont.eot); + src: url(../valo/fonts/open-sans/OpenSans-Light-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/fonts/open-sans/OpenSans-Light-webfont.woff) format("woff"), url(../valo/fonts/open-sans/OpenSans-Light-webfont.ttf) format("truetype"); + font-weight: 300; + font-style: normal; +} + +@font-face { + font-family: "Open Sans"; + src: url(../valo/fonts/open-sans/OpenSans-Regular-webfont.eot); + src: url(../valo/fonts/open-sans/OpenSans-Regular-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/fonts/open-sans/OpenSans-Regular-webfont.woff) format("woff"), url(../valo/fonts/open-sans/OpenSans-Regular-webfont.ttf) format("truetype"); + font-weight: 400; + font-style: normal; +} + +@font-face { + font-family: "Open Sans"; + src: url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.eot); + src: url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.eot?#iefix) format("embedded-opentype"), url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.woff) format("woff"), url(../valo/fonts/open-sans/OpenSans-Semibold-webfont.ttf) format("truetype"); + font-weight: 600; + font-style: normal; +} + +@-webkit-keyframes v-rotate-360 { + to { + -webkit-transform: rotate(360deg); + } + } + +@-moz-keyframes v-rotate-360 { + to { + -moz-transform: rotate(360deg); + } + } + +@-o-keyframes v-rotate-360 { + to { + -o-transform: rotate(360deg); + } + } + +@keyframes v-rotate-360 { + to { + transform: rotate(360deg); + } + } + +@-webkit-keyframes v-progress-start { + 0% { + width: 0%; + } + 100% { + width: 50%; + } + } + +@-moz-keyframes v-progress-start { + 0% { + width: 0%; + } + 100% { + width: 50%; + } + } + +@keyframes v-progress-start { + 0% { + width: 0%; + } + 100% { + width: 50%; + } + } + +@-webkit-keyframes v-progress-delay { + 0% { + width: 50%; + } + 100% { + width: 90%; + } + } + +@-moz-keyframes v-progress-delay { + 0% { + width: 50%; + } + 100% { + width: 90%; + } + } + +@keyframes v-progress-delay { + 0% { + width: 50%; + } + 100% { + width: 90%; + } + } + +@-webkit-keyframes v-progress-wait { + 0% { + width: 90%; + height: 4px; + } + 3% { + width: 91%; + height: 7px; + } + 100% { + width: 96%; + height: 7px; + } + } + +@-moz-keyframes v-progress-wait { + 0% { + width: 90%; + height: 4px; + } + 3% { + width: 91%; + height: 7px; + } + 100% { + width: 96%; + height: 7px; + } + } + +@keyframes v-progress-wait { + 0% { + width: 90%; + height: 4px; + } + 3% { + width: 91%; + height: 7px; + } + 100% { + width: 96%; + height: 7px; + } + } + +@-webkit-keyframes v-progress-wait-pulse { + 0% { + opacity: 1; + } + 50% { + opacity: 0.1; + } + 100% { + opacity: 1; + } + } + +@-moz-keyframes v-progress-wait-pulse { + 0% { + opacity: 1; + } + 50% { + opacity: 0.1; + } + 100% { + opacity: 1; + } + } + +@keyframes v-progress-wait-pulse { + 0% { + opacity: 1; + } + 50% { + opacity: 0.1; + } + 100% { + opacity: 1; + } + } + +/** + * Outputs the context menu selectors and styles, which is used by Table and Tree for instance. + * + * @requires {mixin} valo-selection-item-style + * @requires {mixin} valo-selection-item-selected-style + */ + +/** + * The background color for overlay elements. + * + * @type color + * @group overlay + */ + +.v-shadow, .v-shadow-window { + display: none; +} + +.v-ie8 .v-shadow, .v-ie8 .v-shadow-window { + display: block; +} + +.v-ie8 .v-shadow .top, .v-ie8 .v-shadow-window .top { + position: absolute; + top: -6px; + right: 10px; + bottom: 6px; + left: -10px; + background: black; + filter: alpha(opacity=5) progid:DXImageTransform.Microsoft.blur(pixelradius=10, makeShadow=false); +} + +.v-ie8 .v-shadow .top-left, .v-ie8 .v-shadow-window .top-left { + position: absolute; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; + background: black; + filter: alpha(opacity=9) progid:DXImageTransform.Microsoft.blur(pixelradius=0, makeShadow=false); +} + +/** + * The backgound color for tooltips. + * + * @type color + * @group tooltip + */ + +/** + * + * + * @param {string} $primary-stylename (v-absolutelayout) - + * + * @group absolutelayout + */ + +/** + * Outputs the selectors and properties for the Accordion component. + * + * @param {string} $primary-stylename (v-accordion) - the primary style name for the selectors + * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component + * @group accordion + */ + +/** + * Outputs the selectors and properties for the Button component. + * + * @param {string} $primary-stylename (v-button) - the primary style name for the selectors + * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component + * + * @group button + */ + +/** + * A list of colors for custom event colors. Can be an empty list of you don't + * need any custom event colors. + * + * @example javascript + * // Java code + * // 'event' is an instance of EditableCalendarEvent + * event.setStyleName("color1"); // 1st color in the list + * event.setStyleName("color2"); // 2nd color in the list + * // etc. + * + * @group calendar + */ + +/** + * Outputs the selectors and properties for the CheckBox component. + * + * @param {string} $primary-stylename (v-checkbox) - the primary style name for the selectors + * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component + * + * @group checkbox + */ + +/** + * Outputs the global selectors and properties for the ColorPicker component - styles which are + * considered mandatory for the component to work properly. + * + * @param {string} $primary-stylename (v-colorpicker) - the primary style name for the selectors + * + * @group colorpicker + */ + +/** + * Outputs the selectors and properties for the ComboBox component. + * + * @param {string} $primary-stylename (v-filterselect) - the primary style name for the selectors + * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component + * + * @group combobox + */ + +/** + * The amount of spacing between different widgets in a component group. + * If null, a computed value is used ($v-border size * -1, or 1px if $v-border size is 0) + * + * @group csslayout + */ + +/** + * + * + * @param {string} $primary-stylename (v-customcomponent) - + * + * @group customcomponent + */ + +/** + * + * + * @param {string} $primary-stylename (v-customlayout) - + * + * @group customlayout + */ + +/** + * Outputs the selectors and properties for the DateField component. + * + * @param {string} $primary-stylename (v-datefield) - the primary style name for the selectors + * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component + * + * @group datefield + */ + +/** + * Outputs the styles and selectors for the DragAndDropWrapper component. + * + * @param {string} $primary-stylename (v-ddwrapper) - the primary style name for the selectors + * + * @group drag-n-drop + */ + +/** + * + * + * @param {string} $primary-stylename (v-form) - + * + * @group form + */ + +/** + * Outputs the selectors and properties for the FormLayout component. + * + * @param {string} $primary-stylename (v-formlayout) - the primary style name for the selectors + * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component + * + * @group formlayout + */ + +/** + * + * @group table + */ + +@-webkit-keyframes valo-grid-editor-footer-animate-in { + 0% { + margin-top: -37px; + } + } + +@-moz-keyframes valo-grid-editor-footer-animate-in { + 0% { + margin-top: -37px; + } + } + +@keyframes valo-grid-editor-footer-animate-in { + 0% { + margin-top: -37px; + } + } + +@-webkit-keyframes valo-grid-editor-footer-animate-in-alt { + 0% { + margin-bottom: -38px; + } + 100% { + margin-bottom: -1px; + } + } + +@-moz-keyframes valo-grid-editor-footer-animate-in-alt { + 0% { + margin-bottom: -38px; + } + 100% { + margin-bottom: -1px; + } + } + +@keyframes valo-grid-editor-footer-animate-in-alt { + 0% { + margin-bottom: -38px; + } + 100% { + margin-bottom: -1px; + } + } + +/** + * + * + * @param {string} $primary-stylename (v-gridlayout) - + * + * @group gridlayout + */ + +/** + * The font weight for headers. + * + * @group label + */ + +/** + * + * @group link + */ + +/** + * + * + * @param {string} $primary-stylename (v-loginform) - + * + * @group loginform + */ + +/** + * + * + * @param {string} $primary-stylename (v-menubar) - + * @param {bool} $include-additional-styles - + * + * @group menubar + */ + +/** + * + * + * @param {string} $primary-stylename (v-nativebutton) - + * + * @group nativebutton + */ + +/** + * + * + * @param {string} $primary-stylename (v-select) - + * + * @group nativeselect + */ + +/** + * + * @group notification + */ + +/** + * + * + * @param {string} $primary-stylename (v-select-optiongroup) - + * @param {bool} $include-additional-styles - + * + * @group optiongroup + */ + +/** + * + * + * + * @group orderedlayout + */ + +/** + * + * @group panel + */ + +@-webkit-keyframes v-popupview-animate-in { + 0% { + -webkit-transform: scale(0); + } + } + +@-moz-keyframes v-popupview-animate-in { + 0% { + -moz-transform: scale(0); + } + } + +@keyframes v-popupview-animate-in { + 0% { + -webkit-transform: scale(0); + -moz-transform: scale(0); + -ms-transform: scale(0); + -o-transform: scale(0); + transform: scale(0); + } + } + +/** + * + * @group progressbar + */ + +/** + * + * @group richtextarea + */ + +/** + * + * @group slider + */ + +/** + * + * + * @param {string} $primary-stylename (v-splitpanel) - + * @param {bool} $include-additional-styles - + * + * @group splitpanel + */ + +/** + * + * @group table + */ + +/** + * Should the tabsheet content changes be animated. + * + * @group tabsheet + */ + +/** + * The background color for text fields. + * @group textfield + */ + +/** + * Outputs the selectors and properties for the TextArea component. + * + * @param {string} $primary-stylename (v-textarea) - the primary style name for the selectors + * @param {bool} $include-additional-styles - should the mixin output all the different style variations of the component + * + * @group textarea + */ + +/** + * + * @group tree + */ + +/** + * + * + * @param {string} $primary-stylename (v-treetable) - + * + * @group treetable + */ + +/** + * + * + * @param {string} $primary-stylename (v-select-twincol) - + * + * @group twin-column-select + */ + +/** + * + * + * @param {string} $primary-stylename (v-upload) - + * + * @group upload + */ + +/** + * + */ + +/** + * @group window + */ + +@-webkit-keyframes valo-modal-window-indication { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + +@-moz-keyframes valo-modal-window-indication { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + +@keyframes valo-modal-window-indication { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } + } + +@-webkit-keyframes valo-animate-out-scale-down-fade { + 100% { + -webkit-transform: scale(0.8); + opacity: 0; + } + } + +@-moz-keyframes valo-animate-out-scale-down-fade { + 100% { + -moz-transform: scale(0.8); + opacity: 0; + } + } + +@keyframes valo-animate-out-scale-down-fade { + 100% { + -webkit-transform: scale(0.8); + -moz-transform: scale(0.8); + -ms-transform: scale(0.8); + -o-transform: scale(0.8); + transform: scale(0.8); + opacity: 0; + } + } + +/** + * @group valo-menu + */ + +.v-vaadin-version:after { + content: "7.7.10"; +} + +.v-widget { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + vertical-align: top; + text-align: left; + white-space: normal; +} + +.v-generated-body { + overflow: hidden; + margin: 0; + padding: 0; + border: 0; +} + +.v-app { + height: 100%; + -webkit-tap-highlight-color: transparent; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + -webkit-text-size-adjust: 100%; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.v-app input[type="text"], .v-app .v-slot > .v-caption, .v-app .v-gridlayout-slot > .v-caption, .v-app .v-has-caption > .v-caption, .v-app .v-formlayout-captioncell > .v-caption, .v-app .v-csslayout > .v-caption { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.v-app input::-ms-clear { + display: none; +} + +.v-ui { + position: relative; +} + +.v-ui.v-ui-embedded { + margin-top: -1px; + border-top: 1px solid transparent; +} + +.v-ui:focus { + outline: none; +} + +.v-overlay-container { + width: 0; + height: 0; +} + +.v-drag-element { + z-index: 60000; + position: absolute !important; + cursor: default; +} + +.v-clip { + overflow: hidden; +} + +.v-scrollable { + overflow: auto; +} + +.v-scrollable > .v-widget { + vertical-align: middle; + overflow: hidden; +} + +.v-ios.v-webkit .v-scrollable { + -webkit-overflow-scrolling: touch; +} + +.v-ios5.v-webkit .v-scrollable { + -webkit-overflow-scrolling: none; +} + +.v-webkit.v-ios .v-browserframe { + -webkit-overflow-scrolling: touch; + overflow: auto; +} + +.v-assistive-device-only { + position: absolute; + top: -2000px; + left: -2000px; + width: 10px; + overflow: hidden; +} + +.v-icon { + cursor: inherit; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.v-icon, .v-errorindicator, .v-required-field-indicator { + display: inline-block; + line-height: inherit; +} + +.v-caption { + display: inline-block; + white-space: nowrap; + line-height: 1.55; +} + +.v-captiontext { + display: inline-block; + line-height: inherit; +} + +div.v-layout.v-horizontal.v-widget { + white-space: nowrap; +} + +.v-layout.v-vertical > .v-expand, .v-layout.v-horizontal > .v-expand { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; +} + +.v-slot, .v-spacing { + display: inline-block; + white-space: nowrap; + vertical-align: top; +} + +.v-vertical > .v-slot:after { + display: inline-block; + clear: both; + width: 0; + height: 0; + overflow: hidden; +} + +.v-vertical > .v-slot, .v-vertical > .v-expand > .v-slot { + display: block; + clear: both; +} + +.v-horizontal > .v-slot, .v-horizontal > .v-expand > .v-slot { + height: 100%; +} + +.v-horizontal > .v-expand > .v-slot { + position: relative; +} + +.v-vertical > .v-spacing, .v-vertical > .v-expand > .v-spacing { + width: 0 !important; + display: block; + clear: both; +} + +.v-horizontal > .v-spacing, .v-horizontal > .v-expand > .v-spacing { + height: 0 !important; +} + +.v-align-middle:before, .v-align-bottom:before, .v-expand > .v-align-middle:before, .v-expand > .v-align-bottom:before { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle; + width: 0; +} + +.v-align-middle, .v-align-bottom { + white-space: nowrap; +} + +.v-align-middle > .v-widget, .v-align-bottom > .v-widget { + display: inline-block; +} + +.v-align-middle, .v-align-middle > .v-widget { + vertical-align: middle; +} + +.v-align-bottom, .v-align-bottom > .v-widget { + vertical-align: bottom; +} + +.v-align-center { + text-align: center; +} + +.v-align-center > .v-widget { + margin-left: auto; + margin-right: auto; +} + +.v-align-right { + text-align: right; +} + +.v-align-right > .v-widget { + margin-left: auto; +} + +.v-has-caption, .v-has-caption > .v-caption { + display: inline-block; +} + +.v-caption-on-left, .v-caption-on-right { + white-space: nowrap; +} + +.v-caption-on-top > .v-caption, .v-caption-on-bottom > .v-caption { + display: block; +} + +.v-caption-on-left > .v-caption { + padding-right: 0.5em; +} + +.v-caption-on-left > .v-widget, .v-caption-on-right > .v-widget { + display: inline-block; +} + +.v-has-caption.v-has-width > .v-widget { + width: 100% !important; +} + +.v-has-caption.v-has-height > .v-widget { + height: 100% !important; +} + +.v-gridlayout { + position: relative; +} + +.v-gridlayout-slot { + position: absolute; + line-height: 1.55; +} + +.v-gridlayout-spacing-on { + overflow: hidden; +} + +.v-gridlayout-spacing, .v-gridlayout-spacing-off { + padding-left: 0; + padding-top: 0; +} + +.v-gridlayout-spacing-off { + overflow: hidden; +} + +.v-calendar-month-day-scrollable { + overflow-y: scroll; +} + +.v-calendar-week-wrapper { + position: relative; + overflow: hidden; +} + +.v-calendar-current-time { + position: absolute; + left: 0; + width: 100%; + height: 1px; + background: red; + z-index: 2; +} + +.v-calendar-event-resizetop, .v-calendar-event-resizebottom { + position: absolute; + height: 5%; + min-height: 3px; + width: 100%; + z-index: 1; +} + +.v-calendar-event-resizetop { + cursor: row-resize; + top: 0; +} + +.v-calendar-event-resizebottom { + cursor: row-resize; + bottom: 0; +} + +.v-calendar-header-month td:first-child { + padding-left: 20px; +} + +.v-calendar-month-sizedheight .v-calendar-month-day { + height: 100px; +} + +.v-calendar-month-sizedwidth .v-calendar-month-day { + width: 100px; +} + +.v-calendar-header-month-Hsized .v-calendar-header-day { + width: 101px; +} + +.v-calendar-header-month-Hsized td:first-child { + padding-left: 21px; +} + +.v-calendar-header-day-Hsized { + width: 200px; +} + +.v-calendar-week-numbers-Vsized .v-calendar-week-number { + height: 100px; + line-height: 100px; +} + +.v-calendar-week-wrapper-Vsized { + height: 400px; + overflow-x: hidden !important; +} + +.v-calendar-times-Vsized .v-calendar-time { + height: 38px; +} + +.v-calendar-times-Hsized .v-calendar-time { + width: 42px; +} + +.v-calendar-day-times-Vsized .v-datecellslot, .v-calendar-day-times-Vsized .v-datecellslot-even { + height: 18px; +} + +.v-calendar-day-times-Hsized, .v-calendar-day-times-Hsized .v-datecellslot, .v-calendar-day-times-Hsized .v-datecellslot-even { + width: 200px; +} + +.v-colorpicker-popup.v-window { + min-width: 220px !important; +} + +.v-colorpicker-gradient-container { + overflow: visible !important; +} + +.v-colorpicker-gradient-clicklayer { + opacity: 0; + filter: alpha(opacity=0) ; +} + +.rgb-gradient .v-colorpicker-gradient-background { + background: url(../valo/components/img/colorpicker/gradient2.png); +} + +.hsv-gradient .v-colorpicker-gradient-foreground { + background: url(../valo/components/img/colorpicker/gradient.png); +} + +.v-colorpicker-gradient-higherbox:before { + content: ""; + width: 11px; + height: 11px; + border-radius: 7px; + border: 1px solid #fff; + -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3); + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.3), inset 0 0 0 1px rgba(0, 0, 0, 0.3); + position: absolute; + bottom: -6px; + left: -6px; +} + +.v-colorpicker-popup .v-slider.v-slider-red:before { + background-color: red; +} + +.v-colorpicker-popup .v-slider.v-slider-green:before { + background-color: green; +} + +.v-colorpicker-popup .v-slider.v-slider-blue:before { + background-color: blue; +} + +.v-colorpicker-popup .v-slider.hue-slider:before { + background: url(../valo/components/img/colorpicker/slider_hue_bg.png); +} + +.v-colorpicker-popup input.v-textfield-dark { + color: #fff; +} + +.v-colorpicker-popup input.v-textfield-light { + color: #000; +} + +.v-colorpicker-grid { + height: 319px; +} + +.v-colorpicker-popup .colorselect td { + line-height: 15px; +} + +.v-table-header table, .v-table-footer table, .v-table-table { + border-spacing: 0; + border-collapse: separate; + margin: 0; + padding: 0; + border: 0; + line-height: 1.55; +} + +.v-table-resizer, .v-table-sort-indicator { + float: right; +} + +.v-table-caption-container-align-center { + text-align: center; +} + +.v-table-caption-container-align-right { + text-align: right; +} + +.v-table-header td, .v-table-footer td, .v-table-cell-content { + padding: 0; +} + +.v-table-sort-indicator { + width: 0; +} + +.v-tabsheet-hidetabs > .v-tabsheet-tabcontainer, .v-tabsheet-spacertd, .v-disabled .v-tabsheet-scroller, .v-tabsheet .v-disabled .v-tabsheet-caption-close { + display: none; +} + +.v-tabsheet { + overflow: visible !important; + position: relative; +} + +.v-tabsheet-tabcontainer table, .v-tabsheet-tabcontainer tbody, .v-tabsheet-tabcontainer tr { + display: inline-block; + border-spacing: 0; + border-collapse: collapse; + vertical-align: top; +} + +.v-tabsheet-tabcontainer td { + display: inline-block; + padding: 0; +} + +.v-tabsheet-tabs { + white-space: nowrap; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.v-tabsheet-content { + position: relative; +} + +.v-tabsheet-content > div > .v-scrollable > .v-margin-top { + padding-top: 12px; +} + +.v-tabsheet-content > div > .v-scrollable > .v-margin-right { + padding-right: 12px; +} + +.v-tabsheet-content > div > .v-scrollable > .v-margin-bottom { + padding-bottom: 12px; +} + +.v-tabsheet-content > div > .v-scrollable > .v-margin-left { + padding-left: 12px; +} + +.v-splitpanel-vertical, .v-splitpanel-horizontal { + overflow: hidden; + white-space: nowrap; +} + +.v-splitpanel-hsplitter { + z-index: 100; + cursor: e-resize; + cursor: col-resize; +} + +.v-splitpanel-vsplitter { + z-index: 100; + cursor: s-resize; + cursor: row-resize; +} + +.v-splitpanel-hsplitter:after, .v-splitpanel-vsplitter:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.v-splitpanel-hsplitter div, .v-splitpanel-vsplitter div { + width: inherit; + height: inherit; + overflow: hidden; + position: relative; +} + +.v-splitpanel-hsplitter div:before, .v-splitpanel-vsplitter div:before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.v-disabled [class$="splitter"] div { + cursor: default; +} + +.v-disabled [class$="splitter"] div:before { + display: none; +} + +.v-splitpanel-horizontal > div > .v-splitpanel-second-container { + position: static !important; + display: inline-block; + vertical-align: top; +} + +.v-splitpanel-horizontal > div > .v-splitpanel-first-container { + display: inline-block; + vertical-align: top; +} + +.mytheme.v-app, .mytheme.v-app-loading { + font: 300 16px/1.55 "Open Sans", sans-serif; + color: #464646; + background-color: #fafafa; + cursor: default; +} + +.mytheme .v-app-loading { + width: 100%; + height: 100%; + background: #fafafa; +} + +.mytheme .v-app-loading:before { + content: ""; + position: fixed; + z-index: 100; + top: 45%; + left: 50%; + width: 28px; + height: 28px; + padding: 9px; + margin-top: -24px; + margin-left: -24px; + background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50%; + border-radius: 4px; +} + +.mytheme .v-loading-indicator { + position: fixed !important; + z-index: 99999; + left: 0; + right: auto; + top: 0; + width: 50%; + opacity: 1; + height: 4px; + background-color: #197de1; + pointer-events: none; + -webkit-transition: none; + -moz-transition: none; + transition: none; + -webkit-animation: v-progress-start 1000ms 200ms both; + -moz-animation: v-progress-start 1000ms 200ms both; + animation: v-progress-start 1000ms 200ms both; +} + +.mytheme .v-loading-indicator[style*="none"] { + display: block !important; + width: 100% !important; + opacity: 0; + -webkit-animation: none; + -moz-animation: none; + animation: none; + -webkit-transition: opacity 500ms 300ms, width 300ms; + -moz-transition: opacity 500ms 300ms, width 300ms; + transition: opacity 500ms 300ms, width 300ms; +} + +.mytheme .v-loading-indicator-delay { + width: 90%; + -webkit-animation: v-progress-delay 3.8s forwards; + -moz-animation: v-progress-delay 3.8s forwards; + animation: v-progress-delay 3.8s forwards; +} + +.v-ff .mytheme .v-loading-indicator-delay { + width: 50%; +} + +.mytheme .v-loading-indicator-wait { + width: 96%; + -webkit-animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards; + -moz-animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards; + animation: v-progress-wait 5s forwards, v-progress-wait-pulse 1s 4s infinite backwards; +} + +.v-ff .mytheme .v-loading-indicator-wait { + width: 90%; +} + +.v-ie8 .mytheme .v-loading-indicator, .v-ie8 .mytheme .v-loading-indicator-delay, .v-ie8 .mytheme .v-loading-indicator-wait, .v-ie9 .mytheme .v-loading-indicator, .v-ie9 .mytheme .v-loading-indicator-delay, .v-ie9 .mytheme .v-loading-indicator-wait { + width: 28px !important; + height: 28px; + padding: 9px; + background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50%; + border-radius: 4px; + top: 9px; + right: 9px; + left: auto; + filter: alpha(opacity=50); +} + +.v-ie8 .mytheme .v-loading-indicator[style*="none"], .v-ie8 .mytheme .v-loading-indicator-delay[style*="none"], .v-ie8 .mytheme .v-loading-indicator-wait[style*="none"], .v-ie9 .mytheme .v-loading-indicator[style*="none"], .v-ie9 .mytheme .v-loading-indicator-delay[style*="none"], .v-ie9 .mytheme .v-loading-indicator-wait[style*="none"] { + display: none !important; +} + +.v-ie8 .mytheme .v-loading-indicator-wait, .v-ie9 .mytheme .v-loading-indicator-wait { + filter: alpha(opacity=100); +} + +.mytheme .v-scrollable:focus { + outline: none; +} + +.mytheme img.v-icon { + vertical-align: middle; +} + +.mytheme .v-caption { + font-size: 14px; + font-weight: 400; + padding-bottom: 0.3em; + padding-left: 1px; +} + +.mytheme .v-caption-on-left .v-caption, .mytheme .v-caption-on-right .v-caption { + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-icon + .v-captiontext, .mytheme .v-icon + span { + margin-left: 7px; +} + +.mytheme .v-icon + .v-captiontext:empty, .mytheme .v-icon + span:empty { + margin-left: 0; +} + +.mytheme .v-errorindicator { + color: #ed473b; + font-weight: 600; + width: 19px; + text-align: center; +} + +.mytheme .v-errorindicator:before { + content: "!"; +} + +.mytheme .v-required-field-indicator { + color: #ed473b; + padding: 0 0.2em; +} + +.mytheme select { + font: inherit; + font-weight: 400; + line-height: inherit; + padding: 5px; + margin: 0; + border-radius: 4px; + border: 1px solid #c5c5c5; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + color: #464646; +} + +.mytheme select:focus { + outline: none; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme button { + font: inherit; + font-weight: 400; + line-height: 1.55; +} + +.mytheme a { + cursor: pointer; + color: #197de1; + text-decoration: underline; + font-weight: inherit; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme a:hover { + color: #4396ea; +} + +.mytheme a.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-disabled { + cursor: default !important; +} + +.mytheme .v-drag-element { + background: #fafafa; + color: #464646; + -webkit-box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); + border-radius: 4px; + overflow: hidden; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-tooltip { + background-color: #323232; + background-color: rgba(50, 50, 50, 0.9); + -webkit-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); + color: white; + padding: 5px 9px; + border-radius: 3px; + max-width: 35em; + overflow: hidden !important; + font-size: 14px; +} + +.mytheme .v-tooltip div[style*="width"] { + width: auto !important; +} + +.mytheme .v-tooltip .v-errormessage { + background-color: white; + background-color: #fff; + color: #ed473b; + margin: -5px -9px; + padding: 5px 9px; + max-height: 10em; + overflow: auto; + font-weight: 400; +} + +.mytheme .v-tooltip .v-errormessage h2:only-child { + font: inherit; + line-height: inherit; +} + +.mytheme .v-tooltip .v-tooltip-text { + max-height: 10em; + overflow: auto; + margin-top: 10px; +} + +.mytheme .v-tooltip .v-errormessage[aria-hidden="true"] + .v-tooltip-text { + margin-top: 0; +} + +.mytheme .v-tooltip h1, .mytheme .v-tooltip h2, .mytheme .v-tooltip h3, .mytheme .v-tooltip h4 { + color: inherit; +} + +.mytheme .v-contextmenu { + padding: 4px 4px; + border-radius: 4px; + background-color: white; + color: #474747; + -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + padding: 4px 4px; +} + +.mytheme .v-contextmenu[class*="animate-in"] { + -webkit-animation: valo-overlay-animate-in 120ms; + -moz-animation: valo-overlay-animate-in 120ms; + animation: valo-overlay-animate-in 120ms; +} + +.mytheme .v-contextmenu[class*="animate-out"] { + -webkit-animation: valo-animate-out-fade 120ms; + -moz-animation: valo-animate-out-fade 120ms; + animation: valo-animate-out-fade 120ms; +} + +.mytheme .v-contextmenu table { + border-spacing: 0; +} + +.mytheme .v-contextmenu .gwt-MenuItem { + cursor: pointer; + line-height: 27px; + padding: 0 20px 0 10px; + border-radius: 3px; + font-weight: 400; + white-space: nowrap; + position: relative; + display: block; +} + +.mytheme .v-contextmenu .gwt-MenuItem:active:before { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: #0957a6; + opacity: 0.15; + filter: alpha(opacity=15.0) ; + pointer-events: none; + border-radius: inherit; +} + +.mytheme .v-contextmenu .gwt-MenuItem .v-icon { + max-height: 27px; + margin-right: 5px; + min-width: 1em; +} + +.mytheme .v-contextmenu .gwt-MenuItem-selected { + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + color: #ecf2f8; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); +} + +.mytheme .v-reconnect-dialog { + color: white; + top: 12px; + right: 12px; + max-width: 100%; + border-radius: 0; + -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); + padding: 12px 15px; + background-color: #444; + background-color: rgba(68, 68, 68, 0.9); + line-height: 22px; + text-align: center; +} + +.mytheme .v-reconnect-dialog .text { + display: inline-block; + padding-left: 10px; +} + +.mytheme .v-reconnect-dialog .spinner { + height: 24px !important; + width: 24px !important; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 2px solid rgba(25, 125, 225, 0.2); + border-top-color: #197de1; + border-right-color: #197de1; + border-radius: 100%; + -webkit-animation: v-rotate-360 500ms infinite linear; + -moz-animation: v-rotate-360 500ms infinite linear; + animation: v-rotate-360 500ms infinite linear; + pointer-events: none; + display: none; + vertical-align: middle; +} + +.v-ie8 .mytheme .v-reconnect-dialog .spinner, .v-ie9 .mytheme .v-reconnect-dialog .spinner { + border: none; + border-radius: 4px; + background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; + background-size: 80%; +} + +.v-ie8 .mytheme .v-reconnect-dialog .spinner { + min-width: 30px; + min-height: 30px; +} + +.mytheme .v-reconnect-dialog.active .spinner { + display: inline-block; +} + +.mytheme .v-absolutelayout-wrapper { + position: absolute; +} + +.mytheme .v-absolutelayout-margin, .mytheme .v-absolutelayout-canvas { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mytheme .v-absolutelayout.v-has-height > div, .mytheme .v-absolutelayout.v-has-height .v-absolutelayout-margin { + height: 100%; +} + +.mytheme .v-absolutelayout.v-has-height > div, .mytheme .v-absolutelayout.v-has-width .v-absolutelayout-margin { + width: 100%; +} + +.mytheme .v-margin-top { + padding-top: 37px; +} + +.mytheme .v-margin-right { + padding-right: 37px; +} + +.mytheme .v-margin-bottom { + padding-bottom: 37px; +} + +.mytheme .v-margin-left { + padding-left: 37px; +} + +.mytheme .v-spacing { + width: 12px; + height: 12px; +} + +.mytheme .v-verticallayout-well, .mytheme .v-horizontallayout-well { + background: #f5f5f5; + color: #454545; + -webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); + border-radius: 4px; + border: 1px solid #c5c5c5; +} + +.mytheme .v-verticallayout-well > div > [class*="-caption"], .mytheme .v-horizontallayout-well > div > [class*="-caption"] { + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-verticallayout-well > .v-margin-top, .mytheme .v-horizontallayout-well > .v-margin-top { + padding-top: 12px; +} + +.mytheme .v-verticallayout-well > .v-margin-right, .mytheme .v-horizontallayout-well > .v-margin-right { + padding-right: 12px; +} + +.mytheme .v-verticallayout-well > .v-margin-bottom, .mytheme .v-horizontallayout-well > .v-margin-bottom { + padding-bottom: 12px; +} + +.mytheme .v-verticallayout-well > .v-margin-left, .mytheme .v-horizontallayout-well > .v-margin-left { + padding-left: 12px; +} + +.mytheme .v-verticallayout-card, .mytheme .v-horizontallayout-card { + background: white; + color: #474747; + border-radius: 4px; + border: 1px solid #d5d5d5; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); +} + +.mytheme .v-verticallayout-card > .v-margin-top, .mytheme .v-horizontallayout-card > .v-margin-top { + padding-top: 12px; +} + +.mytheme .v-verticallayout-card > .v-margin-right, .mytheme .v-horizontallayout-card > .v-margin-right { + padding-right: 12px; +} + +.mytheme .v-verticallayout-card > .v-margin-bottom, .mytheme .v-horizontallayout-card > .v-margin-bottom { + padding-bottom: 12px; +} + +.mytheme .v-verticallayout-card > .v-margin-left, .mytheme .v-horizontallayout-card > .v-margin-left { + padding-left: 12px; +} + +.mytheme .v-horizontallayout-wrapping { + white-space: normal !important; +} + +.mytheme .v-horizontallayout-wrapping > .v-spacing + .v-slot, .mytheme .v-horizontallayout-wrapping > .v-slot:first-child { + margin-bottom: 12px; +} + +.mytheme .v-horizontallayout-wrapping > .v-slot:first-child:last-child { + margin-bottom: 0; +} + +.mytheme .v-button { + position: relative; + text-align: center; + white-space: nowrap; + outline: none; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + height: 37px; + padding: 0 16px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); +} + +.mytheme .v-button:before { + content: ""; + display: inline-block; + width: 0; + height: 100%; + vertical-align: middle; +} + +.mytheme .v-button > div { + vertical-align: middle; +} + +.v-sa .mytheme .v-button:before { + height: 110%; +} + +.v-ff .mytheme .v-button:before { + height: 107%; +} + +.v-ie .mytheme .v-button:before { + margin-top: 4px; +} + +.mytheme .v-button:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; +} + +.mytheme .v-button:focus:after { + -webkit-transition: none; + -moz-transition: none; + transition: none; +} + +.mytheme .v-button.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-button.v-disabled:after { + display: none; +} + +.mytheme .v-button:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-button:hover:after { + background-color: rgba(186, 186, 186, 0.1); +} + +.mytheme .v-button:focus:after { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-button:active:after { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-button-primary { + height: 37px; + padding: 0 16px; + color: #ecf2f8; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #1362b1; + border-top-color: #156ab3; + border-bottom-color: #1156a8; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + -webkit-box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); + padding: 0 19px; + font-weight: bold; + min-width: 81px; +} + +.mytheme .v-button-primary:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-button-primary:hover:after { + background-color: rgba(90, 163, 237, 0.1); +} + +.mytheme .v-button-primary:focus:after { + border: inherit; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-button-primary:active:after { + background-color: rgba(2, 62, 122, 0.2); +} + +.v-ie8 .mytheme .v-button-primary { + min-width: 43px; +} + +.mytheme .v-button-friendly { + height: 37px; + padding: 0 16px; + color: #eaf4e9; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #227719; + border-top-color: #257d1a; + border-bottom-color: #1e6b15; + background-color: #2c9720; + background-image: -webkit-linear-gradient(top, #2f9f22 2%, #26881b 98%); + background-image: linear-gradient(to bottom,#2f9f22 2%, #26881b 98%); + -webkit-box-shadow: inset 0 1px 0 #46b33a, inset 0 -1px 0 #26811b, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 #46b33a, inset 0 -1px 0 #26811b, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); +} + +.mytheme .v-button-friendly:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-button-friendly:hover:after { + background-color: rgba(65, 211, 48, 0.1); +} + +.mytheme .v-button-friendly:focus:after { + border: inherit; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-button-friendly:active:after { + background-color: rgba(14, 86, 6, 0.2); +} + +.mytheme .v-button-danger { + height: 37px; + padding: 0 16px; + color: #f9f0ef; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #bb382e; + border-top-color: #bc3c31; + border-bottom-color: #b13028; + background-color: #ed473b; + background-image: -webkit-linear-gradient(top, #ee4c3f 2%, #e13e33 98%); + background-image: linear-gradient(to bottom,#ee4c3f 2%, #e13e33 98%); + -webkit-box-shadow: inset 0 1px 0 #ef786f, inset 0 -1px 0 #da3c31, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 #ef786f, inset 0 -1px 0 #da3c31, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); +} + +.mytheme .v-button-danger:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-button-danger:hover:after { + background-color: rgba(243, 137, 129, 0.1); +} + +.mytheme .v-button-danger:focus:after { + border: inherit; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-button-danger:active:after { + background-color: rgba(146, 12, 2, 0.2); +} + +.mytheme .v-button-borderless { + border: none; + -webkit-box-shadow: none; + box-shadow: none; + background: transparent; + color: inherit; +} + +.mytheme .v-button-borderless:hover:after { + background: transparent; +} + +.mytheme .v-button-borderless:active { + opacity: 0.7; + filter: alpha(opacity=70) ; +} + +.mytheme .v-button-borderless:active:after { + background: transparent; +} + +.mytheme .v-button-borderless-colored { + border: none; + -webkit-box-shadow: none; + box-shadow: none; + background: transparent; + color: #197de1; +} + +.mytheme .v-button-borderless-colored:hover { + color: #4396ea; +} + +.mytheme .v-button-borderless-colored:hover:after { + background: transparent; +} + +.mytheme .v-button-borderless-colored:active { + opacity: 0.7; + filter: alpha(opacity=70) ; +} + +.mytheme .v-button-borderless-colored:active:after { + background: transparent; +} + +.mytheme .v-button-quiet { + visibility: hidden; +} + +.mytheme .v-button-quiet:focus, .mytheme .v-button-quiet:hover { + visibility: visible; +} + +.mytheme .v-button-quiet [class*="wrap"] { + visibility: visible; +} + +.mytheme .v-button-quiet [class*="caption"] { + display: inline-block; +} + +.mytheme .v-button-link { + border: none; + -webkit-box-shadow: none; + box-shadow: none; + background: transparent; + color: inherit; + cursor: pointer; + color: #197de1; + text-decoration: underline; + font-weight: inherit; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-button-link:hover:after { + background: transparent; +} + +.mytheme .v-button-link:active { + opacity: 0.7; + filter: alpha(opacity=70) ; +} + +.mytheme .v-button-link:active:after { + background: transparent; +} + +.mytheme .v-button-link:hover { + color: #4396ea; +} + +.mytheme .v-button-link.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-button-tiny { + height: 28px; + padding: 0 13px; + + + font-size: 12px; + + border-radius: 4px; +} + +.mytheme .v-button-tiny:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-button-small { + height: 31px; + padding: 0 14px; + + + font-size: 14px; + + border-radius: 4px; +} + +.mytheme .v-button-small:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-button-large { + height: 44px; + padding: 0 19px; + + + font-size: 20px; + + border-radius: 4px; +} + +.mytheme .v-button-large:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-button-huge { + height: 59px; + padding: 0 26px; + + + font-size: 26px; + + border-radius: 4px; +} + +.mytheme .v-button-huge:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-button-icon-align-right [class*="wrap"] { + display: inline-block; +} + +.mytheme .v-button-icon-align-right .v-icon { + float: right; + margin-left: 13px; +} + +.mytheme .v-button-icon-align-right .v-icon + span:not(:empty) { + margin-left: 0; +} + +.mytheme .v-button-icon-align-top { + height: auto; + padding-top: 5px; + padding-bottom: 5px; +} + +.mytheme .v-button-icon-align-top [class*="wrap"] { + display: inline-block; +} + +.mytheme .v-button-icon-align-top .v-icon { + display: block; + margin-left: auto; + margin-right: auto; +} + +.mytheme .v-button-icon-align-top .v-icon + span:not(:empty) { + margin-top: 7px; + margin-left: 0; +} + +.mytheme .v-button-icon-only { + width: 37px; + padding: 0; +} + +.mytheme .v-button-icon-only.v-button-tiny { + width: 28px; +} + +.mytheme .v-button-icon-only.v-button-small { + width: 31px; +} + +.mytheme .v-button-icon-only.v-button-large { + width: 44px; +} + +.mytheme .v-button-icon-only.v-button-huge { + width: 59px; +} + +.mytheme .v-button-icon-only .v-button-caption { + display: none; +} + +.mytheme .v-checkbox { + position: relative; + line-height: 19px; + white-space: nowrap; +} + +.mytheme .v-checkbox.v-has-width label { + white-space: normal; +} + +:root .mytheme .v-checkbox { + padding-left: 25px; +} + +:root .mytheme .v-checkbox label { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + display: inline-block; +} + +:root .mytheme .v-checkbox > input { + position: absolute; + clip: rect(0, 0, 0, 0); + left: 0.2em; + top: 0.2em; + z-index: 0; + margin: 0; +} + +:root .mytheme .v-checkbox > input:focus ~ label:before { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); +} + +:root .mytheme .v-checkbox > input ~ label:before, :root .mytheme .v-checkbox > input ~ label:after { + content: ""; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 19px; + height: 19px; + position: absolute; + top: 0; + left: 0; + border-radius: 4px; + font-size: 13px; + text-align: center; +} + +:root .mytheme .v-checkbox > input ~ label:before { + height: 18.5px; + padding: 0 9px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + padding: 0; + height: 19px; +} + +:root .mytheme .v-checkbox > input ~ label:after { + content: "\f00c"; + font-family: ThemeIcons; + color: transparent; + -webkit-transition: color 100ms; + -moz-transition: color 100ms; + transition: color 100ms; +} + +:root .mytheme .v-checkbox > input:active ~ label:after { + background-color: rgba(125, 125, 125, 0.2); +} + +:root .mytheme .v-checkbox > input:checked ~ label:after { + color: #197de1; +} + +.mytheme .v-checkbox > .v-icon, .mytheme .v-checkbox > label .v-icon { + margin: 0 6px 0 3px; + min-width: 1em; + cursor: pointer; +} + +.mytheme .v-checkbox.v-disabled > label, .mytheme .v-checkbox.v-disabled > .v-icon { + cursor: default; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-checkbox.v-disabled > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-checkbox.v-disabled > input:active ~ label:after { + background: transparent; +} + +.mytheme .v-checkbox.v-readonly > label, .mytheme .v-checkbox.v-readonly > .v-icon { + cursor: default; +} + +.mytheme .v-checkbox.v-readonly > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-checkbox.v-readonly > input:active ~ label:after { + background: transparent; +} + +:root .mytheme .v-checkbox.v-readonly > input ~ label:after { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-checkbox-small { + position: relative; + line-height: 16px; + white-space: nowrap; + font-size: 14px; +} + +.mytheme .v-checkbox-small.v-has-width label { + white-space: normal; +} + +:root .mytheme .v-checkbox-small { + padding-left: 21px; +} + +:root .mytheme .v-checkbox-small label { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + display: inline-block; +} + +:root .mytheme .v-checkbox-small > input { + position: absolute; + clip: rect(0, 0, 0, 0); + left: 0.2em; + top: 0.2em; + z-index: 0; + margin: 0; +} + +:root .mytheme .v-checkbox-small > input:focus ~ label:before { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); +} + +:root .mytheme .v-checkbox-small > input ~ label:before, :root .mytheme .v-checkbox-small > input ~ label:after { + content: ""; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 16px; + height: 16px; + position: absolute; + top: 0; + left: 0; + border-radius: 4px; + font-size: 11px; + text-align: center; +} + +:root .mytheme .v-checkbox-small > input ~ label:before { + height: 15.5px; + padding: 0 7px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + padding: 0; + height: 16px; +} + +:root .mytheme .v-checkbox-small > input ~ label:after { + content: "\f00c"; + font-family: ThemeIcons; + color: transparent; + -webkit-transition: color 100ms; + -moz-transition: color 100ms; + transition: color 100ms; +} + +:root .mytheme .v-checkbox-small > input:active ~ label:after { + background-color: rgba(125, 125, 125, 0.2); +} + +:root .mytheme .v-checkbox-small > input:checked ~ label:after { + color: #197de1; +} + +.mytheme .v-checkbox-small > .v-icon, .mytheme .v-checkbox-small > label .v-icon { + margin: 0 5px 0 3px; + min-width: 1em; + cursor: pointer; +} + +.mytheme .v-checkbox-small.v-disabled > label, .mytheme .v-checkbox-small.v-disabled > .v-icon { + cursor: default; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-checkbox-small.v-disabled > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-checkbox-small.v-disabled > input:active ~ label:after { + background: transparent; +} + +.mytheme .v-checkbox-small.v-readonly > label, .mytheme .v-checkbox-small.v-readonly > .v-icon { + cursor: default; +} + +.mytheme .v-checkbox-small.v-readonly > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-checkbox-small.v-readonly > input:active ~ label:after { + background: transparent; +} + +:root .mytheme .v-checkbox-small.v-readonly > input ~ label:after { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-checkbox-large { + position: relative; + line-height: 22px; + white-space: nowrap; + font-size: 20px; +} + +.mytheme .v-checkbox-large.v-has-width label { + white-space: normal; +} + +:root .mytheme .v-checkbox-large { + padding-left: 29px; +} + +:root .mytheme .v-checkbox-large label { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + display: inline-block; +} + +:root .mytheme .v-checkbox-large > input { + position: absolute; + clip: rect(0, 0, 0, 0); + left: 0.2em; + top: 0.2em; + z-index: 0; + margin: 0; +} + +:root .mytheme .v-checkbox-large > input:focus ~ label:before { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); +} + +:root .mytheme .v-checkbox-large > input ~ label:before, :root .mytheme .v-checkbox-large > input ~ label:after { + content: ""; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 22px; + height: 22px; + position: absolute; + top: 0; + left: 0; + border-radius: 4px; + font-size: 15px; + text-align: center; +} + +:root .mytheme .v-checkbox-large > input ~ label:before { + height: 22px; + padding: 0 10px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + padding: 0; + height: 22px; +} + +:root .mytheme .v-checkbox-large > input ~ label:after { + content: "\f00c"; + font-family: ThemeIcons; + color: transparent; + -webkit-transition: color 100ms; + -moz-transition: color 100ms; + transition: color 100ms; +} + +:root .mytheme .v-checkbox-large > input:active ~ label:after { + background-color: rgba(125, 125, 125, 0.2); +} + +:root .mytheme .v-checkbox-large > input:checked ~ label:after { + color: #197de1; +} + +.mytheme .v-checkbox-large > .v-icon, .mytheme .v-checkbox-large > label .v-icon { + margin: 0 7px 0 4px; + min-width: 1em; + cursor: pointer; +} + +.mytheme .v-checkbox-large.v-disabled > label, .mytheme .v-checkbox-large.v-disabled > .v-icon { + cursor: default; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-checkbox-large.v-disabled > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-checkbox-large.v-disabled > input:active ~ label:after { + background: transparent; +} + +.mytheme .v-checkbox-large.v-readonly > label, .mytheme .v-checkbox-large.v-readonly > .v-icon { + cursor: default; +} + +.mytheme .v-checkbox-large.v-readonly > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-checkbox-large.v-readonly > input:active ~ label:after { + background: transparent; +} + +:root .mytheme .v-checkbox-large.v-readonly > input ~ label:after { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect { + position: relative; + width: 185px; + height: 37px; + border-radius: 4px; + white-space: nowrap; +} + +.mytheme .v-filterselect [class*="input"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 37px; + border-radius: 4px; + padding: 4px 9px; + border: 1px solid #c5c5c5; + background: white; + color: #474747; + -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + width: 100% !important; + height: 100%; + padding-right: 38px; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-filterselect [class*="input"], .v-ie9 .mytheme .v-filterselect [class*="input"] { + line-height: 37px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-filterselect [class*="input"].v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect [class*="input"]:focus { + outline: none; + -webkit-transition: none; + -moz-transition: none; + transition: none; + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-filterselect [class*="input"][class*="prompt"] { + color: #a3a3a3; +} + +.mytheme .v-filterselect .v-icon + [class*="input"] { + padding-left: 37px; +} + +.mytheme .v-filterselect img.v-icon { + max-height: 37px; + margin-left: 9px; +} + +.mytheme .v-filterselect span.v-icon { + color: #474747; + width: 37px; + line-height: 1; + padding-top: 0.12em; +} + +.mytheme .v-filterselect[class*="prompt"] > [class*="input"] { + color: #a3a3a3; +} + +.mytheme .v-filterselect [class$="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + position: absolute; + width: 37px; + top: 1px; + right: 1px; + bottom: 1px; + border-left: 1px solid #e4e4e4; + color: #a3a3a3; + border-radius: 0 3px 3px 0; +} + +.v-ie8 .mytheme .v-filterselect [class$="button"] { + background-color: white; +} + +.mytheme .v-filterselect [class$="button"]:before { + font-family: ThemeIcons; + content: "\f078"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; + position: absolute; + width: 37px; + text-align: center; + top: 50%; + line-height: 1; + margin-top: -0.47em; +} + +.mytheme .v-filterselect [class$="button"]:hover:before { + color: #474747; +} + +.mytheme .v-filterselect [class$="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; + background-color: rgba(128, 128, 128, 0.2); +} + +.mytheme .v-filterselect.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect.v-disabled [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect.v-disabled [class$="button"]:active:after { + display: none; +} + +.mytheme .v-filterselect.v-readonly [class*="input"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-filterselect.v-readonly [class*="input"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-filterselect.v-readonly [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect.v-readonly [class$="button"]:active:after { + display: none; +} + +.mytheme .v-filterselect .v-icon { + position: absolute; + pointer-events: none; +} + +.mytheme .v-filterselect-error .v-filterselect-input { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.mytheme .v-filterselect-error .v-filterselect-button { + color: #ed473b; + border-color: #ed473b; +} + +.mytheme .v-filterselect-suggestpopup { + margin-top: 5px !important; +} + +.mytheme .v-filterselect-suggestpopup[class*="animate-in"] { + -webkit-animation: valo-overlay-animate-in 120ms; + -moz-animation: valo-overlay-animate-in 120ms; + animation: valo-overlay-animate-in 120ms; +} + +.mytheme .v-filterselect-suggestpopup [class$="suggestmenu"] { + padding: 4px 4px; + border-radius: 4px; + background-color: white; + color: #474747; + -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + padding: 4px 4px; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + position: relative; + z-index: 1; + display: block; +} + +.mytheme .v-filterselect-suggestpopup table, .mytheme .v-filterselect-suggestpopup tbody, .mytheme .v-filterselect-suggestpopup tr, .mytheme .v-filterselect-suggestpopup td { + display: block; + width: 100%; + overflow-y: hidden; + float: left; + clear: both; +} + +.mytheme .v-filterselect-suggestpopup .gwt-MenuItem { + cursor: pointer; + line-height: 27px; + padding: 0 20px 0 10px; + border-radius: 3px; + font-weight: 400; + white-space: nowrap; + position: relative; + height: 27px; + box-sizing: border-box; + text-overflow: ellipsis; + overflow-x: hidden; +} + +.mytheme .v-filterselect-suggestpopup .gwt-MenuItem:active:before { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: #0957a6; + opacity: 0.15; + filter: alpha(opacity=15.0) ; + pointer-events: none; + border-radius: inherit; +} + +.mytheme .v-filterselect-suggestpopup .gwt-MenuItem .v-icon { + max-height: 27px; + margin-right: 5px; + min-width: 1em; +} + +.mytheme .v-filterselect-suggestpopup .gwt-MenuItem-selected { + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + color: #ecf2f8; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); +} + +.mytheme .v-filterselect-suggestpopup [class$="status"] { + position: absolute; + right: 4px; + background: rgba(212, 212, 212, 0.9); + color: #3b3b3b; + border-radius: 0 0 4px 4px; + height: 23px; + bottom: -23px; + font-size: 12px; + line-height: 23px; + padding: 0 6px; + cursor: default; + pointer-events: none; + -webkit-animation: valo-animate-in-slide-down 200ms 80ms backwards; + -moz-animation: valo-animate-in-slide-down 200ms 80ms backwards; + animation: valo-animate-in-slide-down 200ms 80ms backwards; +} + +.mytheme .v-filterselect-suggestpopup [class$="status"] > * { + color: #3b3b3b; + text-decoration: none; +} + +.mytheme .v-filterselect-suggestpopup div[class*="page"] { + position: absolute; + z-index: 3; + right: 0; + opacity: 0.2; + filter: alpha(opacity=20) ; + cursor: pointer; + -webkit-transition: all 200ms; + -moz-transition: all 200ms; + transition: all 200ms; + width: 25px; + height: 25px; + line-height: 25px; + text-align: center; + font-family: ThemeIcons; + -webkit-transform: scale(0.8); + -moz-transform: scale(0.8); + -ms-transform: scale(0.8); + -o-transform: scale(0.8); + transform: scale(0.8); + color: #464646; +} + +.mytheme .v-filterselect-suggestpopup div[class*="page"]:after { + content: ""; + position: absolute; + display: block; + border-radius: 50%; +} + +.mytheme .v-filterselect-suggestpopup div[class*="page"]:hover { + opacity: 1; + filter: none ; + background: rgba(250, 250, 250, 0.5); +} + +.mytheme .v-filterselect-suggestpopup div[class*="page"]:hover:after { + top: -10px; + bottom: -10px; + left: -20px; + right: -20px; +} + +.mytheme .v-filterselect-suggestpopup div[class*="page"] span { + display: none; +} + +.mytheme .v-filterselect-suggestpopup:hover div[class*="page"] { + -webkit-transform: scale(1); + -moz-transform: scale(1); + -ms-transform: scale(1); + -o-transform: scale(1); + transform: scale(1); +} + +.mytheme .v-filterselect-suggestpopup div[class*="prev"] { + top: 0; + -webkit-transform-origin: 100% 0%; + -moz-transform-origin: 100% 0%; + -ms-transform-origin: 100% 0%; + -o-transform-origin: 100% 0%; + transform-origin: 100% 0%; + border-radius: 0 4px 0 4px; +} + +.mytheme .v-filterselect-suggestpopup div[class*="prev"]:before { + content: "\f0d8"; +} + +.mytheme .v-filterselect-suggestpopup div[class*="next"] { + bottom: 0; + -webkit-transform-origin: 100% 100%; + -moz-transform-origin: 100% 100%; + -ms-transform-origin: 100% 100%; + -o-transform-origin: 100% 100%; + transform-origin: 100% 100%; + border-radius: 4px 0 4px 0; +} + +.mytheme .v-filterselect-suggestpopup div[class*="next"]:before { + content: "\f0d7"; +} + +.mytheme .v-filterselect-suggestpopup div[class*="-off"] { + display: none; +} + +.mytheme .v-filterselect-no-input { + cursor: pointer; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); +} + +.mytheme .v-filterselect-no-input [class*="input"] { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + cursor: inherit; + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + text-shadow: inherit; + text-overflow: ellipsis; + border-radius: inherit; +} + +.mytheme .v-filterselect-no-input [class*="input"]:focus { + outline: none; + -webkit-transition: none; + -moz-transition: none; + transition: none; + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-filterselect-no-input [class$="button"] { + border-left: none !important; +} + +.mytheme .v-filterselect-no-input:hover [class$="button"]:before { + color: inherit; +} + +.mytheme .v-filterselect-borderless .v-filterselect-input { + border: none; + border-radius: 0; + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: inherit; +} + +.mytheme .v-filterselect-borderless .v-filterselect-input:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-filterselect-borderless .v-filterselect-input[class*="prompt"] { + color: inherit; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect-borderless .v-filterselect-button { + border: none; + color: inherit; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect-borderless.v-filterselect-prompt .v-filterselect-input { + color: inherit; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect-align-right input { + text-align: right; +} + +.mytheme .v-filterselect-align-center input { + text-align: center; +} + +.mytheme .v-filterselect-tiny { + height: 28px; + + font-size: 12px; +} + +.mytheme .v-filterselect-tiny [class*="input"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 28px; + + padding: 3px 5px; + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + width: 100% !important; + height: 100%; + padding-right: 29px; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-filterselect-tiny [class*="input"], .v-ie9 .mytheme .v-filterselect-tiny [class*="input"] { + line-height: 28px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-filterselect-tiny .v-icon + [class*="input"] { + padding-left: 28px; +} + +.mytheme .v-filterselect-tiny img.v-icon { + max-height: 28px; + margin-left: 5px; +} + +.mytheme .v-filterselect-tiny span.v-icon { + + width: 28px; + line-height: 1; + padding-top: 0.12em; +} + +.mytheme .v-filterselect-tiny [class$="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + position: absolute; + width: 28px; + border-radius: 0 4px 4px 0; +} + +.mytheme .v-filterselect-tiny [class$="button"]:before { + font-family: ThemeIcons; + content: "\f078"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; + position: absolute; + width: 28px; + text-align: center; + top: 50%; + line-height: 1; + margin-top: -0.47em; +} + +.mytheme .v-filterselect-tiny [class$="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-filterselect-tiny.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect-tiny.v-disabled [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect-tiny.v-disabled [class$="button"]:active:after { + display: none; +} + +.mytheme .v-filterselect-tiny.v-readonly [class*="input"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-filterselect-tiny.v-readonly [class*="input"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-filterselect-tiny.v-readonly [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect-tiny.v-readonly [class$="button"]:active:after { + display: none; +} + +.mytheme .v-filterselect-compact, .mytheme .v-filterselect-small { + height: 31px; + +} + +.mytheme .v-filterselect-compact [class*="input"], .mytheme .v-filterselect-small [class*="input"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 31px; + + padding: 3px 6px; + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + width: 100% !important; + height: 100%; + padding-right: 32px; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-filterselect-compact [class*="input"], .v-ie9 .mytheme .v-filterselect-compact [class*="input"], .v-ie8 .mytheme .v-filterselect-small [class*="input"], .v-ie9 .mytheme .v-filterselect-small [class*="input"] { + line-height: 31px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-filterselect-compact .v-icon + [class*="input"], .mytheme .v-filterselect-small .v-icon + [class*="input"] { + padding-left: 31px; +} + +.mytheme .v-filterselect-compact img.v-icon, .mytheme .v-filterselect-small img.v-icon { + max-height: 31px; + margin-left: 6px; +} + +.mytheme .v-filterselect-compact span.v-icon, .mytheme .v-filterselect-small span.v-icon { + + width: 31px; + line-height: 1; + padding-top: 0.12em; +} + +.mytheme .v-filterselect-compact [class$="button"], .mytheme .v-filterselect-small [class$="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + position: absolute; + width: 31px; + border-radius: 0 4px 4px 0; +} + +.mytheme .v-filterselect-compact [class$="button"]:before, .mytheme .v-filterselect-small [class$="button"]:before { + font-family: ThemeIcons; + content: "\f078"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; + position: absolute; + width: 31px; + text-align: center; + top: 50%; + line-height: 1; + margin-top: -0.47em; +} + +.mytheme .v-filterselect-compact [class$="button"]:active:after, .mytheme .v-filterselect-small [class$="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-filterselect-compact.v-disabled, .mytheme .v-filterselect-small.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect-compact.v-disabled [class$="button"], .mytheme .v-filterselect-small.v-disabled [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect-compact.v-disabled [class$="button"]:active:after, .mytheme .v-filterselect-small.v-disabled [class$="button"]:active:after { + display: none; +} + +.mytheme .v-filterselect-compact.v-readonly [class*="input"], .mytheme .v-filterselect-small.v-readonly [class*="input"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-filterselect-compact.v-readonly [class*="input"]:focus, .mytheme .v-filterselect-small.v-readonly [class*="input"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-filterselect-compact.v-readonly [class$="button"], .mytheme .v-filterselect-small.v-readonly [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect-compact.v-readonly [class$="button"]:active:after, .mytheme .v-filterselect-small.v-readonly [class$="button"]:active:after { + display: none; +} + +.mytheme .v-filterselect-small { + font-size: 14px; +} + +.mytheme .v-filterselect-large { + height: 44px; + + font-size: 20px; +} + +.mytheme .v-filterselect-large [class*="input"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 44px; + + padding: 5px 8px; + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + width: 100% !important; + height: 100%; + padding-right: 45px; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-filterselect-large [class*="input"], .v-ie9 .mytheme .v-filterselect-large [class*="input"] { + line-height: 44px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-filterselect-large .v-icon + [class*="input"] { + padding-left: 44px; +} + +.mytheme .v-filterselect-large img.v-icon { + max-height: 44px; + margin-left: 8px; +} + +.mytheme .v-filterselect-large span.v-icon { + + width: 44px; + line-height: 1; + padding-top: 0.12em; +} + +.mytheme .v-filterselect-large [class$="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + position: absolute; + width: 44px; + border-radius: 0 4px 4px 0; +} + +.mytheme .v-filterselect-large [class$="button"]:before { + font-family: ThemeIcons; + content: "\f078"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; + position: absolute; + width: 44px; + text-align: center; + top: 50%; + line-height: 1; + margin-top: -0.47em; +} + +.mytheme .v-filterselect-large [class$="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-filterselect-large.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect-large.v-disabled [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect-large.v-disabled [class$="button"]:active:after { + display: none; +} + +.mytheme .v-filterselect-large.v-readonly [class*="input"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-filterselect-large.v-readonly [class*="input"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-filterselect-large.v-readonly [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect-large.v-readonly [class$="button"]:active:after { + display: none; +} + +.mytheme .v-filterselect-huge { + height: 59px; + + font-size: 26px; +} + +.mytheme .v-filterselect-huge [class*="input"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 59px; + + padding: 7px 10px; + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + width: 100% !important; + height: 100%; + padding-right: 60px; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-filterselect-huge [class*="input"], .v-ie9 .mytheme .v-filterselect-huge [class*="input"] { + line-height: 59px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-filterselect-huge .v-icon + [class*="input"] { + padding-left: 59px; +} + +.mytheme .v-filterselect-huge img.v-icon { + max-height: 59px; + margin-left: 10px; +} + +.mytheme .v-filterselect-huge span.v-icon { + + width: 59px; + line-height: 1; + padding-top: 0.12em; +} + +.mytheme .v-filterselect-huge [class$="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + position: absolute; + width: 59px; + border-radius: 0 4px 4px 0; +} + +.mytheme .v-filterselect-huge [class$="button"]:before { + font-family: ThemeIcons; + content: "\f078"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; + position: absolute; + width: 59px; + text-align: center; + top: 50%; + line-height: 1; + margin-top: -0.47em; +} + +.mytheme .v-filterselect-huge [class$="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-filterselect-huge.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-filterselect-huge.v-disabled [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect-huge.v-disabled [class$="button"]:active:after { + display: none; +} + +.mytheme .v-filterselect-huge.v-readonly [class*="input"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-filterselect-huge.v-readonly [class*="input"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-filterselect-huge.v-readonly [class$="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-filterselect-huge.v-readonly [class$="button"]:active:after { + display: none; +} + +.mytheme .v-csslayout-well { + background: #f5f5f5; + color: #454545; + -webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); + border-radius: 4px; + border: 1px solid #c5c5c5; +} + +.mytheme .v-csslayout-well > div > [class*="-caption"] { + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-csslayout-well > .v-margin-top { + padding-top: 12px; +} + +.mytheme .v-csslayout-well > .v-margin-right { + padding-right: 12px; +} + +.mytheme .v-csslayout-well > .v-margin-bottom { + padding-bottom: 12px; +} + +.mytheme .v-csslayout-well > .v-margin-left { + padding-left: 12px; +} + +.mytheme .v-csslayout-card { + background: white; + color: #474747; + border-radius: 4px; + border: 1px solid #d5d5d5; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); +} + +.mytheme .v-csslayout-card > .v-margin-top { + padding-top: 12px; +} + +.mytheme .v-csslayout-card > .v-margin-right { + padding-right: 12px; +} + +.mytheme .v-csslayout-card > .v-margin-bottom { + padding-bottom: 12px; +} + +.mytheme .v-csslayout-card > .v-margin-left { + padding-left: 12px; +} + +.mytheme .v-csslayout-v-component-group { + white-space: nowrap; + position: relative; +} + +.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget:not(:last-child) { + border-radius: 0; +} + +.mytheme .v-csslayout-v-component-group .v-widget:last-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.mytheme .v-csslayout-v-component-group .v-widget:first-child, .mytheme .v-csslayout-v-component-group .v-caption:first-child + .v-widget { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget.first.first { + border-radius: 4px 0 0 4px; +} + +.mytheme .v-csslayout-v-component-group .v-widget ~ .v-widget.last.last { + border-radius: 0 4px 4px 0; +} + +.mytheme .v-csslayout-v-component-group .v-widget { + vertical-align: middle; + margin-left: -1px; +} + +.mytheme .v-csslayout-v-component-group .v-widget:first-child { + margin-left: 0; +} + +.mytheme .v-csslayout-v-component-group .v-widget:focus, .mytheme .v-csslayout-v-component-group .v-widget[class*="focus"], .mytheme .v-csslayout-v-component-group .v-widget [class*="focus"] { + position: relative; + z-index: 5; +} + +.mytheme .v-form fieldset { + border: none; + padding: 0; + margin: 0; + height: 100%; +} + +.mytheme .v-form-content { + height: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mytheme [class*="spacing"] > tbody > [class*="row"] > td { + padding-top: 12px; +} + +.mytheme [class*="spacing"] > tbody > [class*="firstrow"] > td { + padding-top: 0; +} + +.mytheme [class*="margin-top"] > tbody > [class*="firstrow"] > td { + padding-top: 37px; +} + +.mytheme [class*="margin-bottom"] > tbody > [class*="lastrow"] > td { + padding-bottom: 37px; +} + +.mytheme [class*="margin-left"] > tbody > [class*="row"] > [class*="captioncell"] { + padding-left: 37px; +} + +.mytheme [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { + left: 37px; +} + +.mytheme [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] { + padding-right: 37px; +} + +.mytheme [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { + right: 37px; +} + +.mytheme .v-formlayout > table { + border-spacing: 0; + position: relative; +} + +.mytheme .v-formlayout.v-has-width > table, .mytheme .v-formlayout.v-has-width .v-formlayout-contentcell { + width: 100%; +} + +.mytheme .v-formlayout-error-indicator { + width: 19px; +} + +.mytheme .v-formlayout-captioncell { + vertical-align: top; + line-height: 36px; +} + +.mytheme .v-formlayout-captioncell .v-caption { + padding-bottom: 0; +} + +.mytheme .v-formlayout-captioncell .v-caption-h2, .mytheme .v-formlayout-captioncell .v-caption-h3, .mytheme .v-formlayout-captioncell .v-caption-h4 { + height: 3em; +} + +.mytheme .v-formlayout-contentcell .v-checkbox, .mytheme .v-formlayout-contentcell .v-radiobutton { + font-weight: 400; +} + +.mytheme .v-formlayout-contentcell > .v-label-h2, .mytheme .v-formlayout-contentcell > .v-label-h3, .mytheme .v-formlayout-contentcell > .v-label-h4 { + position: absolute; + left: 0; + right: 0; + width: auto !important; + margin-top: -0.5em; + padding-bottom: 0.5em; + border-bottom: 1px solid #dfdfdf; +} + +.mytheme .v-formlayout.light > table { + padding: 0; +} + +.mytheme .v-formlayout.light > table > tbody > tr > td { + padding-top: 0; + height: 37px; + border-bottom: 1px solid #eaeaea; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="lastrow"] > td { + border-bottom: none; +} + +.mytheme .v-formlayout.light > table > tbody > tr > [class*="captioncell"] { + color: #7d7d7d; + text-align: right; + padding-left: 13px; + line-height: 37px; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] { + padding-right: 0; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect-input, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield-textfield { + width: 100%; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 37px; + border-radius: 0; + padding: 4px 7px; + + -webkit-box-shadow: none; + box-shadow: none; + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + background: transparent; + border: none; + color: inherit; +} + +.v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield, .v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input, .v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input, .v-ie8 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea, .v-ie9 .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea { + line-height: 37px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input.v-disabled, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea:focus { + outline: none; + -webkit-transition: none; + -moz-transition: none; + transition: none; + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), none; + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), none; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect input:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield input:focus, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea:focus { + box-shadow: none; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textfield-prompt, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea-prompt, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-filterselect-prompt input, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-datefield-prompt input { + color: #a3a3a3; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-textarea, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-richtextarea { + height: auto; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { + border-bottom: none; + left: 0; + right: 0; +} + +.mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme .v-formlayout.light > table > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { + margin-top: 0; +} + +.mytheme .v-formlayout.light .v-richtextarea { + margin: 5px 0; +} + +.mytheme .v-formlayout.light .v-filterselect-button, .mytheme .v-formlayout.light .v-datefield-button { + border: none; +} + +.mytheme .v-formlayout.light .v-filterselect-button:active:after, .mytheme .v-formlayout.light .v-datefield-button:active:after { + display: none; +} + +.mytheme .v-formlayout.light .v-datefield-button { + right: 0; + left: auto; +} + +.mytheme .v-formlayout.light .v-checkbox { + margin-left: 7px; +} + +.mytheme .v-grid { + position: relative; +} + +.mytheme .v-grid-scroller { + position: absolute; + z-index: 1; + outline: none; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mytheme .v-grid-scroller-horizontal { + left: 0; + right: 0; + bottom: 0; + overflow-y: hidden; + -ms-overflow-y: hidden; +} + +.mytheme .v-grid-scroller-vertical { + right: 0; + top: 0; + bottom: 0; + overflow-x: hidden; + -ms-overflow-x: hidden; +} + +.mytheme .v-grid-tablewrapper { + position: absolute; + overflow: hidden; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 5; +} + +.mytheme .v-grid-tablewrapper > table { + border-spacing: 0; + table-layout: fixed; + width: inherit; +} + +.mytheme .v-grid-header-deco, .mytheme .v-grid-footer-deco { + position: absolute; + right: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mytheme .v-grid-horizontal-scrollbar-deco { + position: absolute; + bottom: 0; + left: 0; + right: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mytheme .v-grid-header, .mytheme .v-grid-body, .mytheme .v-grid-footer { + position: absolute; + left: 0; + width: inherit; + z-index: 10; +} + +.mytheme .v-grid-header, .mytheme .v-grid-header-deco { + top: 0; +} + +.mytheme .v-grid-footer, .mytheme .v-grid-footer-deco { + bottom: 0; +} + +.mytheme .v-grid-body { + -ms-touch-action: none; + touch-action: none; + z-index: 0; + top: 0; +} + +.mytheme .v-grid-body .v-grid-row { + position: absolute; + top: 0; + left: 0; +} + +.mytheme .v-grid-row { + display: block; +} + +.v-ie8 .mytheme .v-grid-row, .v-ie9 .mytheme .v-grid-row { + float: left; + clear: left; + margin-top: 0; +} + +.mytheme .v-grid-row > td, .mytheme .v-grid-row > th { + background-color: white; +} + +.mytheme .v-grid-row { + width: inherit; +} + +.mytheme .v-grid-cell { + display: block; + float: left; + padding: 2px; + white-space: nowrap; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + overflow: hidden; + font-size: 16px; +} + +.mytheme .v-grid-cell.frozen { + position: relative; + z-index: 1; +} + +.mytheme .v-grid-spacer { + position: absolute; + display: block; + background-color: white; +} + +.mytheme .v-grid-spacer > td { + width: 100%; + height: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.v-ie8 .mytheme .v-grid-spacer, .v-ie9 .mytheme .v-grid-spacer { + margin-top: 0; +} + +.mytheme .v-grid { + outline: none; +} + +.mytheme .v-grid-scroller-vertical, .mytheme .v-grid-scroller-horizontal { + border: 1px solid #d4d4d4; +} + +.mytheme .v-grid-scroller-vertical { + border-left: none; +} + +.mytheme .v-grid-scroller-horizontal { + border-top: none; +} + +.mytheme .v-grid-tablewrapper { + border: 1px solid #d4d4d4; +} + +.mytheme .v-grid .header-drag-table { + border-spacing: 0; + position: relative; + table-layout: fixed; + width: inherit; +} + +.mytheme .v-grid .header-drag-table .v-grid-header { + position: absolute; +} + +.mytheme .v-grid .header-drag-table .v-grid-header > .v-grid-cell { + border: 1px solid #d4d4d4; + margin-top: -10px; + opacity: 0.9; + filter: alpha(opacity=90); + z-index: 30000; +} + +.mytheme .v-grid .header-drag-table .v-grid-header > .v-grid-drop-marker { + background-color: #197de1; + position: absolute; + width: 3px; +} + +.mytheme .v-grid-sidebar.v-contextmenu { + -webkit-box-shadow: none; + box-shadow: none; + border-radius: 0; + position: absolute; + top: 0; + right: 0; + background-color: #fafafa; + border: 1px solid #d4d4d4; + padding: 0; + z-index: 5; +} + +.mytheme .v-grid-sidebar.v-contextmenu.v-grid-sidebar-popup { + right: auto; +} + +.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button { + background: transparent; + border: none; + color: inherit; + cursor: pointer; + outline: none; + padding: 0 4px; + text-align: right; + line-height: 1; +} + +.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button[disabled] { + cursor: default; +} + +.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button::-moz-focus-inner { + border: 0; +} + +.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-button:after { + content: "\f0c9"; + display: block; + font-family: ThemeIcons, sans-serif; + font-size: 14px; +} + +.mytheme .v-grid-sidebar.v-contextmenu.closed { + border-radius: 0; +} + +.mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button { + width: 100%; +} + +.mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button:after { + content: "\f0c9"; + font-size: 14px; + line-height: 1; +} + +.v-ie .mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button { + vertical-align: middle; +} + +.v-ie8 .mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-button:after { + vertical-align: middle; + text-align: center; + display: inline; +} + +.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-content { + padding: 4px 0; + overflow-y: auto; + overflow-x: hidden; +} + +.mytheme .v-grid-sidebar.v-contextmenu .v-grid-sidebar-content .gwt-MenuBar .gwt-MenuItem .column-hiding-toggle { + text-shadow: none; +} + +.mytheme .v-grid-cell { + background-color: white; + padding: 0 18px; + line-height: 37px; + text-overflow: ellipsis; +} + +.mytheme .v-grid-cell > * { + line-height: 1.55; + vertical-align: middle; +} + +.mytheme .v-grid-cell > div { + display: inline-block; +} + +.mytheme .v-grid-cell.frozen { + -webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1); + box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1); + border-right: 1px solid #d4d4d4; +} + +.mytheme .v-grid-cell.frozen + th, .mytheme .v-grid-cell.frozen + td { + border-left: none; +} + +.mytheme .v-grid-row > td, .mytheme .v-grid-editor-cells > div { + border-left: 1px solid #d4d4d4; + border-bottom: 1px solid #d4d4d4; +} + +.mytheme .v-grid-row > td:first-child, .mytheme .v-grid-editor-cells > div:first-child { + border-left: none; +} + +.mytheme .v-grid-editor-cells.frozen > div { + -webkit-box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1); + box-shadow: 1px 0 2px rgba(0, 0, 0, 0.1); + border-right: 1px solid #d4d4d4; + border-left: none; +} + +.mytheme .v-grid-row-stripe > td { + background-color: #f5f5f5; +} + +.mytheme .v-grid-row-selected > td { + background: #197de1; +} + +.mytheme .v-grid-row-focused > td { + +} + +.mytheme .v-grid-header th { + position: relative; + background-color: #fafafa; + font-size: 14px; + font-weight: inherit; + border-left: 1px solid #d4d4d4; + border-bottom: 1px solid #d4d4d4; + + text-align: left; +} + +.mytheme .v-grid-header th:first-child { + border-left: none; +} + +.mytheme .v-grid-header .sort-asc, .mytheme .v-grid-header .sort-desc { + padding-right: 35px; +} + +.mytheme .v-grid-header .sort-asc:after, .mytheme .v-grid-header .sort-desc:after { + font-family: ThemeIcons, sans-serif; + content: "\f0de" " " attr(sort-order); + position: absolute; + right: 18px; + font-size: 12px; +} + +.mytheme .v-grid-header .sort-desc:after { + content: "\f0dd" " " attr(sort-order); +} + +.mytheme .v-grid-column-resize-handle { + position: absolute; + width: 36px; + right: -18px; + top: 0px; + bottom: 0px; + cursor: col-resize; + z-index: 10; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.mytheme .v-grid-column-resize-simple-indicator { + position: absolute; + width: 3px; + top: 0px; + left: 18px; + z-index: 9001; + background: #fff; + box-shadow: 0px 0px 5px #000; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.mytheme .v-grid-footer td { + background-color: #fafafa; + font-size: 14px; + font-weight: inherit; + border-left: 1px solid #d4d4d4; + border-top: 1px solid #d4d4d4; + border-bottom: none; + +} + +.mytheme .v-grid-footer td:first-child { + border-left: none; +} + +.mytheme .v-grid-header .v-grid-cell, .mytheme .v-grid-footer .v-grid-cell { + overflow: visible; +} + +.mytheme .v-grid-column-header-content, .mytheme .v-grid-column-footer-content { + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + line-height: 37px; + vertical-align: baseline; +} + +.mytheme .v-grid-header-deco { + border-top: 1px solid #d4d4d4; + border-right: 1px solid #d4d4d4; + background-color: #fafafa; +} + +.mytheme .v-grid-footer-deco { + border-bottom: 1px solid #d4d4d4; + border-right: 1px solid #d4d4d4; + background-color: #fafafa; +} + +.mytheme .v-grid-horizontal-scrollbar-deco { + background-color: #fafafa; + border: 1px solid #d4d4d4; + border-top: none; +} + +.mytheme .v-grid-cell-focused { + position: relative; +} + +.mytheme .v-grid-cell-focused:before { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border: 2px solid #197de1; + display: none; + pointer-events: none; +} + +.ie8 .mytheme .v-grid-cell-focused:before, .ie9 .mytheme .v-grid-cell-focused:before, .ie10 .mytheme .v-grid-cell-focused:before { + content: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==); +} + +.mytheme .v-grid:focus .v-grid-cell-focused:before { + display: block; +} + +.mytheme .v-grid.v-disabled:focus .v-grid-cell-focused:before { + display: none; +} + +.mytheme .v-grid-editor { + position: absolute; + z-index: 20; + overflow: hidden; + left: 0; + right: 0; + border: 1px solid #d4d4d4; + box-sizing: border-box; + -moz-box-sizing: border-box; + margin-top: -1px; + -webkit-box-shadow: 0 0 9px rgba(0, 0, 0, 0.2); + box-shadow: 0 0 9px rgba(0, 0, 0, 0.2); +} + +.mytheme .v-grid-editor.unbuffered .v-grid-editor-footer { + width: 100%; +} + +.mytheme .v-grid-editor-cells { + position: relative; + white-space: nowrap; +} + +.mytheme .v-grid-editor-cells.frozen { + z-index: 2; +} + +.mytheme .v-grid-editor-cells > div { + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + vertical-align: middle; + background: white; +} + +.mytheme .v-grid-editor-cells > div:first-child { + border-left: none; +} + +.mytheme .v-grid-editor-cells > div > * { + vertical-align: middle; + display: inline-block; +} + +.mytheme .v-grid-editor-cells > div .v-filterselect { + padding-left: 0; +} + +.mytheme .v-grid-editor-cells > div input[type="text"], .mytheme .v-grid-editor-cells > div input[type="text"].v-filterselect-input, .mytheme .v-grid-editor-cells > div input[type="password"] { + padding-left: 18px; +} + +.mytheme .v-grid-editor-cells > div input[type="text"]:not(.v-filterselect-input), .mytheme .v-grid-editor-cells > div input[type="password"] { + padding-right: 9px; +} + +.mytheme .v-grid-editor-cells > div input[type="checkbox"] { + margin-left: 18px; +} + +.mytheme .v-grid-editor-cells > div .v-textfield, .mytheme .v-grid-editor-cells > div .v-datefield, .mytheme .v-grid-editor-cells > div .v-filterselect { + min-width: 100%; + max-width: 100%; + min-height: 100%; + max-height: 100%; +} + +.v-ie8 .mytheme .v-grid-editor-cells > div .v-datefield-button { + margin-left: -37px; +} + +.v-ie8 .mytheme .v-grid-editor-cells > div .v-filterselect-button { + margin-left: -25px; +} + +.mytheme .v-grid-editor-cells > div .v-select, .mytheme .v-grid-editor-cells > div .v-select-select { + min-width: 100%; + max-width: 100%; +} + +.mytheme .v-grid-editor-cells > div.not-editable.v-grid-cell { + float: none; +} + +.mytheme .v-grid-editor-cells .error::before { + position: absolute; + display: block; + height: 0; + width: 0; + content: ""; + border-top: 5px solid red; + border-right: 5px solid transparent; +} + +.mytheme .v-grid-editor-cells .error, .mytheme .v-grid-editor-cells .error > input { + background-color: #fee; +} + +.mytheme .v-grid-editor-footer { + display: table; + height: 37px; + border-top: 1px solid #d4d4d4; + margin-top: -1px; + background: white; + padding: 0 5px; +} + +.mytheme .v-grid-editor-footer + .v-grid-editor-cells > div { + border-bottom: none; + border-top: 1px solid #d4d4d4; +} + +.mytheme .v-grid-editor-footer:first-child { + border-top: none; + margin-top: 0; + border-bottom: 1px solid #d4d4d4; + margin-bottom: -1px; +} + +.mytheme .v-grid-editor-message, .mytheme .v-grid-editor-buttons { + display: table-cell; + white-space: nowrap; + vertical-align: middle; +} + +.mytheme .v-grid-editor-message { + width: 100%; + position: relative; +} + +.mytheme .v-grid-editor-message > div { + position: absolute; + width: 100%; + overflow: hidden; + text-overflow: ellipsis; + line-height: 37px; + top: 0; +} + +.mytheme .v-grid-editor-save { + margin-right: 4px; +} + +.mytheme .v-grid-spacer { + padding-left: 1px; +} + +.mytheme .v-grid-spacer > td { + display: block; + padding: 0; + background-color: white; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #d4d4d4; +} + +.mytheme .v-grid-spacer.stripe > td { + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + border-bottom: 1px solid #d4d4d4; +} + +.mytheme .v-grid-spacer-deco-container { + border-top: 1px solid transparent; + position: relative; + top: 0; + z-index: 5; +} + +.mytheme .v-grid-spacer-deco { + top: 0; + left: 0; + width: 2px; + background-color: #197de1; + position: absolute; + height: 100%; + pointer-events: none; +} + +.ie8 .mytheme .v-grid-spacer-deco:before, .ie9 .mytheme .v-grid-spacer-deco:before, .ie10 .mytheme .v-grid-spacer-deco:before { + content: url(data:image/svg+xml;charset=utf-8;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==); +} + +.mytheme .v-grid-cell > .v-progressbar { + width: 100%; +} + +.mytheme .v-grid { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + background-color: #fafafa; +} + +.mytheme .v-grid.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-grid-header .v-grid-cell { + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); +} + +.mytheme .v-grid-header .v-grid-cell.dragged { + opacity: 0.5; + filter: alpha(opacity=50) ; + -webkit-transition: opacity 0.3s ease-in-out; + -moz-transition: opacity 0.3s ease-in-out; + transition: opacity 0.3s ease-in-out; +} + +.mytheme .v-grid-header .v-grid-cell.dragged-column-header { + margin-top: -19px; +} + +.mytheme .v-grid-footer .v-grid-cell { + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); +} + +.mytheme .v-grid-header-deco { + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); +} + +.mytheme .v-grid-footer-deco, .mytheme .v-grid-horizontal-scrollbar-deco { + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); +} + +.mytheme .v-grid-row-selected > .v-grid-cell { + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + color: #c8dbed; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); + border-color: #1d69b4; +} + +.mytheme .v-grid-row-selected > .v-grid-cell-focused:before { + border-color: #71b0ef; +} + +.mytheme .v-grid-editor { + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + border-color: #197de1; +} + +.mytheme .v-grid-editor-footer { + font-size: 14px; + padding: 0 6px; + background: #fafafa; + -webkit-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards; + -moz-animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards; + animation: valo-grid-editor-footer-animate-in 200ms 120ms backwards; +} + +.mytheme .v-grid-editor-footer:first-child { + -webkit-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards; + -moz-animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards; + animation: valo-grid-editor-footer-animate-in-alt 200ms 120ms backwards; +} + +.mytheme .v-grid-editor-cells { + z-index: 1; +} + +.mytheme .v-grid-editor-cells > div:before { + content: ""; + display: inline-block; + height: 100%; + vertical-align: middle; +} + +.mytheme .v-grid-editor-cells > div.not-editable.v-grid-cell { + float: none; +} + +.mytheme .v-grid-editor-cells > div .error::before { + border-top: 9px solid #ed473b; + border-right: 9px solid transparent; +} + +.mytheme .v-grid-editor-cells > div .error, .mytheme .v-grid-editor-cells > div .error > input { + background-color: #fffbfb; +} + +.mytheme .v-grid-editor-cells > div .v-textfield, .mytheme .v-grid-editor-cells > div .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-datefield, .mytheme .v-grid-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-filterselect-input, .mytheme .v-grid-editor-cells > div .v-filterselect-input:focus { + border: none; + border-radius: 0; + background: transparent; + -webkit-box-shadow: inset 0 1px 0 #f2f2f2; + box-shadow: inset 0 1px 0 #f2f2f2; +} + +.mytheme .v-grid-editor-cells > div input[type="text"].v-datefield-textfield { + padding-left: 44.4px; +} + +.v-ie8 .mytheme .v-grid-editor-cells > div .v-datefield-button { + margin-left: 0px; +} + +.v-ie8 .mytheme .v-grid-editor-cells > div .v-filterselect-button { + margin-left: 0px; +} + +.mytheme .v-grid-editor-cells > div .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-datefield .v-textfield-focus, .mytheme .v-grid-editor-cells > div .v-filterselect-input:focus { + position: relative; +} + +.mytheme .v-grid-editor-cells > div .v-select { + padding-left: 9px; + padding-right: 9px; +} + +.mytheme .v-grid-editor-cells > div .v-checkbox { + margin: 0 9px 0 18px; +} + +.mytheme .v-grid-editor-cells > div .v-checkbox > input[type="checkbox"] { + margin-left: 0; +} + +.mytheme .v-grid-editor-cells > div .v-checkbox > label { + white-space: nowrap; +} + +.mytheme .v-grid-editor-message > div:before { + display: inline-block; + color: #ed473b; + font-weight: 600; + width: 19px; + text-align: center; + content: "!"; +} + +.mytheme .v-grid-editor-save, .mytheme .v-grid-editor-cancel { + cursor: pointer; + color: #197de1; + text-decoration: underline; + font-weight: inherit; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; + font-weight: 400; + text-decoration: none; + border: none; + background: transparent; + padding: 6px 6px; + margin: 0; + outline: none; +} + +.mytheme .v-grid-editor-save:hover, .mytheme .v-grid-editor-cancel:hover { + color: #4396ea; +} + +.mytheme .v-grid-editor-save.v-disabled, .mytheme .v-grid-editor-cancel.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-grid-spacer { + margin-top: -1px; +} + +.mytheme .v-grid-sidebar.v-contextmenu.open .v-grid-sidebar-content { + margin: 0 0 2px; + padding: 4px 4px 2px; + overflow-y: auto; + overflow-x: hidden; +} + +.mytheme .v-grid-sidebar.v-contextmenu.closed { + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); +} + +.mytheme .v-grid-scroller::-webkit-scrollbar { + border: none; +} + +.mytheme .v-grid-scroller::-webkit-scrollbar-thumb { + border-radius: 10px; + border: 4px solid transparent; + background: rgba(0, 0, 0, 0.3); + -webkit-background-clip: content-box; + background-clip: content-box; +} + +.mytheme .v-grid-scroller-vertical::-webkit-scrollbar-thumb { + min-height: 30px; +} + +.mytheme .v-grid-scroller-horizontal::-webkit-scrollbar-thumb { + min-width: 30px; +} + +.mytheme .v-textfield { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 37px; + border-radius: 4px; + padding: 4px 9px; + border: 1px solid #c5c5c5; + background: white; + color: #474747; + -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + width: 185px; +} + +.v-ie8 .mytheme .v-textfield, .v-ie9 .mytheme .v-textfield { + line-height: 37px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-textfield.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-textfield:focus { + outline: none; + -webkit-transition: none; + -moz-transition: none; + transition: none; + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-textfield[class*="prompt"] { + color: #a3a3a3; +} + +.mytheme .v-textfield-readonly { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-textfield-readonly:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-textfield-error { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.mytheme .v-textfield-borderless { + border: none; + border-radius: 0; + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: inherit; +} + +.mytheme .v-textfield-borderless:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-textfield-borderless[class*="prompt"] { + color: inherit; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-textfield-tiny { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 28px; + border-radius: 4px; + padding: 3px 7px; + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + font-size: 12px; +} + +.v-ie8 .mytheme .v-textfield-tiny, .v-ie9 .mytheme .v-textfield-tiny { + line-height: 28px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-textfield-compact, .mytheme .v-textfield-small { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 31px; + border-radius: 4px; + padding: 3px 8px; + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; +} + +.v-ie8 .mytheme .v-textfield-compact, .v-ie9 .mytheme .v-textfield-compact, .v-ie8 .mytheme .v-textfield-small, .v-ie9 .mytheme .v-textfield-small { + line-height: 31px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-textfield-small { + font-size: 14px; +} + +.mytheme .v-textfield-large { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 44px; + border-radius: 4px; + padding: 5px 10px; + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + font-size: 20px; +} + +.v-ie8 .mytheme .v-textfield-large, .v-ie9 .mytheme .v-textfield-large { + line-height: 44px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-textfield-huge { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 59px; + border-radius: 4px; + padding: 7px 12px; + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + font-size: 26px; +} + +.v-ie8 .mytheme .v-textfield-huge, .v-ie9 .mytheme .v-textfield-huge { + line-height: 59px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-slot-inline-icon { + position: relative; +} + +.mytheme .v-caption-inline-icon { + padding: 0; +} + +.mytheme .v-caption-inline-icon .v-captiontext { + font-size: 14px; + font-weight: 400; + padding-bottom: 0.3em; + padding-left: 1px; + margin: 0; +} + +.mytheme .v-caption-inline-icon .v-icon { + position: absolute; + z-index: 10; +} + +.mytheme .v-caption-inline-icon span.v-icon { + left: 1px; + bottom: 1px; + width: 37px; + line-height: 35px; + text-align: center; + font-size: 16px; +} + +.mytheme .v-caption-inline-icon img.v-icon { + left: 11px; + bottom: 11px; +} + +.mytheme .v-textfield-inline-icon { + padding-left: 37px; +} + +.mytheme .v-slot-inline-icon.v-slot-tiny { + position: relative; +} + +.mytheme .v-caption-inline-icon.v-caption-tiny { + padding: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-tiny .v-captiontext { + font-size: 14px; + font-weight: 400; + padding-bottom: 0.3em; + padding-left: 1px; + margin: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-tiny .v-icon { + position: absolute; + z-index: 10; +} + +.mytheme .v-caption-inline-icon.v-caption-tiny span.v-icon { + left: 1px; + bottom: 1px; + width: 28px; + line-height: 26px; + text-align: center; + font-size: 12px; +} + +.mytheme .v-caption-inline-icon.v-caption-tiny img.v-icon { + left: 6px; + bottom: 6px; +} + +.mytheme .v-textfield-inline-icon.v-textfield-tiny { + padding-left: 28px; +} + +.mytheme .v-slot-inline-icon.v-slot-compact { + position: relative; +} + +.mytheme .v-caption-inline-icon.v-caption-compact { + padding: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-compact .v-captiontext { + font-size: 14px; + font-weight: 400; + padding-bottom: 0.3em; + padding-left: 1px; + margin: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-compact .v-icon { + position: absolute; + z-index: 10; +} + +.mytheme .v-caption-inline-icon.v-caption-compact span.v-icon { + left: 1px; + bottom: 1px; + width: 31px; + line-height: 29px; + text-align: center; + font-size: 16px; +} + +.mytheme .v-caption-inline-icon.v-caption-compact img.v-icon { + left: 8px; + bottom: 8px; +} + +.mytheme .v-textfield-inline-icon.v-textfield-compact { + padding-left: 31px; +} + +.mytheme .v-slot-inline-icon.v-slot-small { + position: relative; +} + +.mytheme .v-caption-inline-icon.v-caption-small { + padding: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-small .v-captiontext { + font-size: 14px; + font-weight: 400; + padding-bottom: 0.3em; + padding-left: 1px; + margin: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-small .v-icon { + position: absolute; + z-index: 10; +} + +.mytheme .v-caption-inline-icon.v-caption-small span.v-icon { + left: 1px; + bottom: 1px; + width: 31px; + line-height: 29px; + text-align: center; + font-size: 14px; +} + +.mytheme .v-caption-inline-icon.v-caption-small img.v-icon { + left: 8px; + bottom: 8px; +} + +.mytheme .v-textfield-inline-icon.v-textfield-small { + padding-left: 31px; +} + +.mytheme .v-slot-inline-icon.v-slot-large { + position: relative; +} + +.mytheme .v-caption-inline-icon.v-caption-large { + padding: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-large .v-captiontext { + font-size: 14px; + font-weight: 400; + padding-bottom: 0.3em; + padding-left: 1px; + margin: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-large .v-icon { + position: absolute; + z-index: 10; +} + +.mytheme .v-caption-inline-icon.v-caption-large span.v-icon { + left: 1px; + bottom: 1px; + width: 44px; + line-height: 42px; + text-align: center; + font-size: 20px; +} + +.mytheme .v-caption-inline-icon.v-caption-large img.v-icon { + left: 14px; + bottom: 14px; +} + +.mytheme .v-textfield-inline-icon.v-textfield-large { + padding-left: 44px; +} + +.mytheme .v-slot-inline-icon.v-slot-huge { + position: relative; +} + +.mytheme .v-caption-inline-icon.v-caption-huge { + padding: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-huge .v-captiontext { + font-size: 14px; + font-weight: 400; + padding-bottom: 0.3em; + padding-left: 1px; + margin: 0; +} + +.mytheme .v-caption-inline-icon.v-caption-huge .v-icon { + position: absolute; + z-index: 10; +} + +.mytheme .v-caption-inline-icon.v-caption-huge span.v-icon { + left: 1px; + bottom: 1px; + width: 59px; + line-height: 57px; + text-align: center; + font-size: 26px; +} + +.mytheme .v-caption-inline-icon.v-caption-huge img.v-icon { + left: 22px; + bottom: 22px; +} + +.mytheme .v-textfield-inline-icon.v-textfield-huge { + padding-left: 59px; +} + +.mytheme .v-textfield-align-right { + text-align: right; +} + +.mytheme .v-textfield-align-center { + text-align: center; +} + +.mytheme .v-textarea { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 37px; + border-radius: 4px; + padding: 6px; + border: 1px solid #c5c5c5; + background: white; + color: #474747; + -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + height: auto; + resize: none; + white-space: pre-wrap; + width: 185px; +} + +.v-ie8 .mytheme .v-textarea, .v-ie9 .mytheme .v-textarea { + line-height: 37px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-textarea.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-textarea:focus { + outline: none; + -webkit-transition: none; + -moz-transition: none; + transition: none; + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-textarea[class*="prompt"] { + color: #a3a3a3; +} + +.v-ie8 .mytheme .v-textarea, .v-ie9 .mytheme .v-textarea { + line-height: inherit; + padding-top: 4px; + padding-bottom: 4px; +} + +.mytheme .v-textarea-readonly { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-textarea-readonly:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-textarea-error { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.mytheme .v-textarea-borderless { + border: none; + border-radius: 0; + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: inherit; +} + +.mytheme .v-textarea-borderless:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-textarea-borderless[class*="prompt"] { + color: inherit; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-textarea-tiny { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 28px; + border-radius: 4px; + padding: 6px; + + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + height: auto; + resize: none; + white-space: pre-wrap; + font-size: 12px; +} + +.v-ie8 .mytheme .v-textarea-tiny, .v-ie9 .mytheme .v-textarea-tiny { + line-height: 28px; + padding-top: 0; + padding-bottom: 0; +} + +.v-ie8 .mytheme .v-textarea-tiny, .v-ie9 .mytheme .v-textarea-tiny { + line-height: inherit; + padding-top: 3px; + padding-bottom: 3px; +} + +.mytheme .v-textarea-small { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 31px; + border-radius: 4px; + padding: 6px; + + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + height: auto; + resize: none; + white-space: pre-wrap; + font-size: 14px; +} + +.v-ie8 .mytheme .v-textarea-small, .v-ie9 .mytheme .v-textarea-small { + line-height: 31px; + padding-top: 0; + padding-bottom: 0; +} + +.v-ie8 .mytheme .v-textarea-small, .v-ie9 .mytheme .v-textarea-small { + line-height: inherit; + padding-top: 3px; + padding-bottom: 3px; +} + +.mytheme .v-textarea-large { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 44px; + border-radius: 4px; + padding: 6px; + + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + height: auto; + resize: none; + white-space: pre-wrap; + font-size: 20px; +} + +.v-ie8 .mytheme .v-textarea-large, .v-ie9 .mytheme .v-textarea-large { + line-height: 44px; + padding-top: 0; + padding-bottom: 0; +} + +.v-ie8 .mytheme .v-textarea-large, .v-ie9 .mytheme .v-textarea-large { + line-height: inherit; + padding-top: 5px; + padding-bottom: 5px; +} + +.mytheme .v-textarea-huge { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 59px; + border-radius: 4px; + padding: 6px; + + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + height: auto; + resize: none; + white-space: pre-wrap; + font-size: 26px; +} + +.v-ie8 .mytheme .v-textarea-huge, .v-ie9 .mytheme .v-textarea-huge { + line-height: 59px; + padding-top: 0; + padding-bottom: 0; +} + +.v-ie8 .mytheme .v-textarea-huge, .v-ie9 .mytheme .v-textarea-huge { + line-height: inherit; + padding-top: 7px; + padding-bottom: 7px; +} + +.mytheme .v-textarea-align-right { + text-align: right; +} + +.mytheme .v-textarea-align-center { + text-align: center; +} + +.mytheme .v-datefield { + position: relative; + width: 185px; + height: 37px; + border-radius: 4px; +} + +.mytheme .v-datefield [class*="textfield"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 37px; + border-radius: 4px; + padding: 4px 9px; + border: 1px solid #c5c5c5; + background: white; + color: #474747; + -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + padding-left: 44.4px; + width: 100%; + height: 100%; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-datefield [class*="textfield"], .v-ie9 .mytheme .v-datefield [class*="textfield"] { + line-height: 37px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-datefield [class*="textfield"].v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-datefield [class*="textfield"]:focus { + outline: none; + -webkit-transition: none; + -moz-transition: none; + transition: none; + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-datefield [class*="textfield"][class*="prompt"] { + color: #a3a3a3; +} + +.mytheme .v-datefield[class*="prompt"] > [class*="textfield"] { + color: #a3a3a3; +} + +.mytheme .v-datefield [class*="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + -webkit-appearance: none; + background: transparent; + padding: 0; + position: absolute; + z-index: 10; + width: 37px; + line-height: 35px; + text-align: center; + font: inherit; + outline: none; + margin: 0; + top: 1px; + bottom: 1px; + left: 1px; + border: none; + border-right: 1px solid #e4e4e4; + color: #a3a3a3; + border-radius: 3px 0 0 3px; +} + +.mytheme .v-datefield [class*="button"]:hover { + color: #474747; +} + +.mytheme .v-datefield [class*="button"]:before { + font-family: ThemeIcons; + content: "\f073"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-datefield [class*="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: rgba(128, 128, 128, 0.2); + border-radius: inherit; +} + +.mytheme .v-datefield.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-datefield.v-disabled [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield.v-disabled [class*="button"]:active:after { + display: none; +} + +.mytheme .v-datefield.v-readonly [class*="textfield"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-datefield.v-readonly [class*="textfield"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-datefield.v-readonly [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield.v-readonly [class*="button"]:active:after { + display: none; +} + +.mytheme .v-datefield-error .v-datefield-textfield { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.mytheme .v-datefield-error .v-datefield-button { + color: #ed473b; + border-color: #ed473b; +} + +.mytheme .v-datefield-full { + width: 240px; +} + +.mytheme .v-datefield-day { + width: 185px; +} + +.mytheme .v-datefield-month { + width: 120px; +} + +.mytheme .v-datefield-year { + width: 104px; +} + +.mytheme .v-datefield-popup { + padding: 4px 4px; + border-radius: 4px; + background-color: white; + color: #474747; + -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + margin-top: 5px !important; + margin-bottom: 5px !important; + margin-right: 5px !important; + cursor: default; + width: auto; +} + +.mytheme .v-datefield-popup[class*="animate-in"] { + -webkit-animation: valo-overlay-animate-in 120ms; + -moz-animation: valo-overlay-animate-in 120ms; + animation: valo-overlay-animate-in 120ms; +} + +.mytheme .v-datefield-popup[class*="animate-out"] { + -webkit-animation: valo-animate-out-fade 120ms; + -moz-animation: valo-animate-out-fade 120ms; + animation: valo-animate-out-fade 120ms; +} + +.mytheme .v-datefield-popup table { + border-collapse: collapse; + border-spacing: 0; + margin: 0 auto; +} + +.mytheme .v-datefield-popup td { + padding: 2px; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel { + font-size: 16px; + text-align: center; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel:focus { + outline: none; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-day { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 30px; + height: 26px; + border: 1px solid transparent; + line-height: 26px; + text-align: center; + font-size: 14px; + background: #fafafa; + border-radius: 2px; + -webkit-transition: color 200ms; + -moz-transition: color 200ms; + transition: color 200ms; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + cursor: pointer; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-day:hover { + color: #197de1; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-day-offmonth { + color: #a0a0a0; + background: transparent; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-day-today { + color: #191919; + font-weight: 600; + border-color: #afafaf; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected, .mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected:hover { + color: #c8dbed; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + border: none; + font-weight: 600; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused { + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + position: relative; +} + +.v-ie8 .mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused { + border-color: #197de1; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range, .mytheme .v-datefield-popup .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range:hover { + color: #a0a0a0; + cursor: not-allowed; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-weekdays { + height: 26px; + color: rgba(133, 133, 133, 0.85); +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-weekdays strong { + font: inherit; + font-size: 14px; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-header { + white-space: nowrap; +} + +.mytheme .v-datefield-popup td[class*="year"] button, .mytheme .v-datefield-popup td[class*="month"] button { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + border: none; + background: transparent; + padding: 0; + margin: 0; + cursor: pointer; + color: transparent; + font-size: 0; + width: 19px; + height: 25px; + outline: none; + position: relative; + vertical-align: middle; +} + +.mytheme .v-datefield-popup td[class*="year"] button:before, .mytheme .v-datefield-popup td[class*="month"] button:before { + color: #a0a0a0; + font-size: 21px; + line-height: 24px; + -webkit-transition: color 200ms; + -moz-transition: color 200ms; + transition: color 200ms; +} + +.mytheme .v-datefield-popup td[class*="year"] button:hover:before, .mytheme .v-datefield-popup td[class*="month"] button:hover:before { + color: #197de1; +} + +.mytheme .v-datefield-popup td[class*="year"] button.outside-range, .mytheme .v-datefield-popup td[class*="month"] button.outside-range { + cursor: default; + opacity: 0.3; + filter: alpha(opacity=30.0) ; +} + +.mytheme .v-datefield-popup td[class*="year"] button.outside-range:hover:before, .mytheme .v-datefield-popup td[class*="month"] button.outside-range:hover:before { + color: #a0a0a0; +} + +.mytheme .v-datefield-popup .v-button-prevyear:before { + font-family: ThemeIcons; + content: "\f100"; +} + +.mytheme .v-datefield-popup .v-button-prevmonth:before { + font-family: ThemeIcons; + content: "\f104"; +} + +.mytheme .v-datefield-popup .v-button-nextyear:before { + font-family: ThemeIcons; + content: "\f101"; +} + +.mytheme .v-datefield-popup .v-button-nextmonth:before { + font-family: ThemeIcons; + content: "\f105"; +} + +.mytheme .v-datefield-popup td.v-datefield-calendarpanel-month { + width: 148px; + color: #197de1; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-year td.v-datefield-calendarpanel-month { + width: 74px; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-weeknumber, .mytheme .v-datefield-popup .v-datefield-calendarpanel-weekdays.v-datefield-calendarpanel-weeknumbers td:first-child { + width: 30px; + color: rgba(133, 133, 133, 0.85); + font-size: 14px; + display: inline-block; + text-align: left; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-weeknumber { + position: relative; +} + +.mytheme .v-datefield-popup .v-datefield-calendarpanel-weeknumbers .v-first:before { + content: ""; + position: absolute; + top: 38px; + bottom: 0; + left: 0; + width: 34px; + border-top: 1px solid #eaeaea; + border-right: 1px solid #eaeaea; + border-top-right-radius: 4px; + border-bottom-left-radius: 4px; + background: #fafafa; +} + +.mytheme .v-datefield-popup td.v-datefield-calendarpanel-time { + width: 100%; + font-size: 14px; +} + +.mytheme .v-datefield-popup td.v-datefield-calendarpanel-time .v-label { + display: inline; + margin: 0 0.1em; + font-weight: 400; +} + +.mytheme .v-datefield-calendarpanel { + font-size: 16px; + text-align: center; +} + +.mytheme .v-datefield-calendarpanel:focus { + outline: none; +} + +.mytheme .v-datefield-calendarpanel-day { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 30px; + height: 26px; + border: 1px solid transparent; + line-height: 26px; + text-align: center; + font-size: 14px; + background: #fafafa; + border-radius: 2px; + -webkit-transition: color 200ms; + -moz-transition: color 200ms; + transition: color 200ms; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + cursor: pointer; +} + +.mytheme .v-datefield-calendarpanel-day:hover { + color: #197de1; +} + +.mytheme .v-datefield-calendarpanel-day-offmonth { + color: #a0a0a0; + background: transparent; +} + +.mytheme .v-datefield-calendarpanel-day-today { + color: #191919; + font-weight: 600; + border-color: #afafaf; +} + +.mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected, .mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-selected:hover { + color: #c8dbed; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + border: none; + font-weight: 600; +} + +.mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused { + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + position: relative; +} + +.v-ie8 .mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-focused { + border-color: #197de1; +} + +.mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range, .mytheme .v-datefield-calendarpanel-day.v-datefield-calendarpanel-day-outside-range:hover { + color: #a0a0a0; + cursor: not-allowed; +} + +.mytheme .v-datefield-calendarpanel-weekdays { + height: 26px; + color: rgba(133, 133, 133, 0.85); +} + +.mytheme .v-datefield-calendarpanel-weekdays strong { + font: inherit; + font-size: 14px; +} + +.mytheme .v-datefield-calendarpanel-header { + white-space: nowrap; +} + +.mytheme td[class*="year"] button, .mytheme td[class*="month"] button { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + border: none; + background: transparent; + padding: 0; + margin: 0; + cursor: pointer; + color: transparent; + font-size: 0; + width: 19px; + height: 25px; + outline: none; + position: relative; + vertical-align: middle; +} + +.mytheme td[class*="year"] button:before, .mytheme td[class*="month"] button:before { + color: #a0a0a0; + font-size: 21px; + line-height: 24px; + -webkit-transition: color 200ms; + -moz-transition: color 200ms; + transition: color 200ms; +} + +.mytheme td[class*="year"] button:hover:before, .mytheme td[class*="month"] button:hover:before { + color: #197de1; +} + +.mytheme td[class*="year"] button.outside-range, .mytheme td[class*="month"] button.outside-range { + cursor: default; + opacity: 0.3; + filter: alpha(opacity=30.0) ; +} + +.mytheme td[class*="year"] button.outside-range:hover:before, .mytheme td[class*="month"] button.outside-range:hover:before { + color: #a0a0a0; +} + +.mytheme .v-button-prevyear:before { + font-family: ThemeIcons; + content: "\f100"; +} + +.mytheme .v-button-prevmonth:before { + font-family: ThemeIcons; + content: "\f104"; +} + +.mytheme .v-button-nextyear:before { + font-family: ThemeIcons; + content: "\f101"; +} + +.mytheme .v-button-nextmonth:before { + font-family: ThemeIcons; + content: "\f105"; +} + +.mytheme td.v-datefield-calendarpanel-month { + width: 148px; + color: #197de1; +} + +.mytheme .v-datefield-calendarpanel-year td.v-datefield-calendarpanel-month { + width: 74px; +} + +.mytheme .v-datefield-calendarpanel-weeknumber, .mytheme .v-datefield-calendarpanel-weekdays.v-datefield-calendarpanel-weeknumbers td:first-child { + width: 30px; + color: rgba(133, 133, 133, 0.85); + font-size: 14px; + display: inline-block; + text-align: left; +} + +.mytheme .v-datefield-calendarpanel-weeknumber { + position: relative; +} + +.mytheme .v-datefield-calendarpanel-weeknumbers .v-first:before { + content: ""; + position: absolute; + top: 38px; + bottom: 0; + left: 0; + width: 34px; + border-top: 1px solid #eaeaea; + border-right: 1px solid #eaeaea; + border-top-right-radius: 4px; + border-bottom-left-radius: 4px; + background: #fafafa; +} + +.mytheme td.v-datefield-calendarpanel-time { + width: 100%; + font-size: 14px; +} + +.mytheme td.v-datefield-calendarpanel-time .v-label { + display: inline; + margin: 0 0.1em; + font-weight: 400; +} + +.mytheme .v-datefield-borderless .v-datefield-textfield { + border: none; + border-radius: 0; + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: inherit; +} + +.mytheme .v-datefield-borderless .v-datefield-textfield:focus { + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-datefield-borderless .v-datefield-textfield[class*="prompt"] { + color: inherit; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-datefield-borderless .v-datefield-button { + border: none; + color: inherit; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-datefield-align-right input { + text-align: right; +} + +.mytheme .v-datefield-align-center input { + text-align: center; +} + +.mytheme .v-datefield-tiny { + height: 28px; + border-radius: 4px; + font-size: 12px; +} + +.mytheme .v-datefield-tiny [class*="textfield"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 28px; + border-radius: 4px; + padding: 3px 7px; + + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + padding-left: 33.6px; + width: 100%; + height: 100%; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-datefield-tiny [class*="textfield"], .v-ie9 .mytheme .v-datefield-tiny [class*="textfield"] { + line-height: 28px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-datefield-tiny [class*="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + -webkit-appearance: none; + background: transparent; + padding: 0; + position: absolute; + z-index: 10; + width: 28px; + line-height: 28px; + text-align: center; + font: inherit; + outline: none; + margin: 0; + border-radius: 4px 0 0 4px; +} + +.mytheme .v-datefield-tiny [class*="button"]:before { + font-family: ThemeIcons; + content: "\f073"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-datefield-tiny [class*="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-datefield-tiny.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-datefield-tiny.v-disabled [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield-tiny.v-disabled [class*="button"]:active:after { + display: none; +} + +.mytheme .v-datefield-tiny.v-readonly [class*="textfield"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-datefield-tiny.v-readonly [class*="textfield"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-datefield-tiny.v-readonly [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield-tiny.v-readonly [class*="button"]:active:after { + display: none; +} + +.mytheme .v-datefield-compact, .mytheme .v-datefield-small { + height: 31px; + border-radius: 4px; +} + +.mytheme .v-datefield-compact [class*="textfield"], .mytheme .v-datefield-small [class*="textfield"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 31px; + border-radius: 4px; + padding: 3px 8px; + + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + padding-left: 37.2px; + width: 100%; + height: 100%; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-datefield-compact [class*="textfield"], .v-ie9 .mytheme .v-datefield-compact [class*="textfield"], .v-ie8 .mytheme .v-datefield-small [class*="textfield"], .v-ie9 .mytheme .v-datefield-small [class*="textfield"] { + line-height: 31px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-datefield-compact [class*="button"], .mytheme .v-datefield-small [class*="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + -webkit-appearance: none; + background: transparent; + padding: 0; + position: absolute; + z-index: 10; + width: 31px; + line-height: 31px; + text-align: center; + font: inherit; + outline: none; + margin: 0; + border-radius: 4px 0 0 4px; +} + +.mytheme .v-datefield-compact [class*="button"]:before, .mytheme .v-datefield-small [class*="button"]:before { + font-family: ThemeIcons; + content: "\f073"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-datefield-compact [class*="button"]:active:after, .mytheme .v-datefield-small [class*="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-datefield-compact.v-disabled, .mytheme .v-datefield-small.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-datefield-compact.v-disabled [class*="button"], .mytheme .v-datefield-small.v-disabled [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield-compact.v-disabled [class*="button"]:active:after, .mytheme .v-datefield-small.v-disabled [class*="button"]:active:after { + display: none; +} + +.mytheme .v-datefield-compact.v-readonly [class*="textfield"], .mytheme .v-datefield-small.v-readonly [class*="textfield"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-datefield-compact.v-readonly [class*="textfield"]:focus, .mytheme .v-datefield-small.v-readonly [class*="textfield"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-datefield-compact.v-readonly [class*="button"], .mytheme .v-datefield-small.v-readonly [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield-compact.v-readonly [class*="button"]:active:after, .mytheme .v-datefield-small.v-readonly [class*="button"]:active:after { + display: none; +} + +.mytheme .v-datefield-small { + font-size: 14px; +} + +.mytheme .v-datefield-large { + height: 44px; + border-radius: 4px; + font-size: 20px; +} + +.mytheme .v-datefield-large [class*="textfield"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 44px; + border-radius: 4px; + padding: 5px 10px; + + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + padding-left: 52.8px; + width: 100%; + height: 100%; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-datefield-large [class*="textfield"], .v-ie9 .mytheme .v-datefield-large [class*="textfield"] { + line-height: 44px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-datefield-large [class*="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + -webkit-appearance: none; + background: transparent; + padding: 0; + position: absolute; + z-index: 10; + width: 44px; + line-height: 44px; + text-align: center; + font: inherit; + outline: none; + margin: 0; + border-radius: 4px 0 0 4px; +} + +.mytheme .v-datefield-large [class*="button"]:before { + font-family: ThemeIcons; + content: "\f073"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-datefield-large [class*="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-datefield-large.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-datefield-large.v-disabled [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield-large.v-disabled [class*="button"]:active:after { + display: none; +} + +.mytheme .v-datefield-large.v-readonly [class*="textfield"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-datefield-large.v-readonly [class*="textfield"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-datefield-large.v-readonly [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield-large.v-readonly [class*="button"]:active:after { + display: none; +} + +.mytheme .v-datefield-huge { + height: 59px; + border-radius: 4px; + font-size: 26px; +} + +.mytheme .v-datefield-huge [class*="textfield"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 59px; + border-radius: 4px; + padding: 7px 12px; + + + + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + padding-left: 70.8px; + width: 100%; + height: 100%; + border-radius: inherit; +} + +.v-ie8 .mytheme .v-datefield-huge [class*="textfield"], .v-ie9 .mytheme .v-datefield-huge [class*="textfield"] { + line-height: 59px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-datefield-huge [class*="button"] { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + -webkit-appearance: none; + background: transparent; + padding: 0; + position: absolute; + z-index: 10; + width: 59px; + line-height: 59px; + text-align: center; + font: inherit; + outline: none; + margin: 0; + border-radius: 4px 0 0 4px; +} + +.mytheme .v-datefield-huge [class*="button"]:before { + font-family: ThemeIcons; + content: "\f073"; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-datefield-huge [class*="button"]:active:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-datefield-huge.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-datefield-huge.v-disabled [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield-huge.v-disabled [class*="button"]:active:after { + display: none; +} + +.mytheme .v-datefield-huge.v-readonly [class*="textfield"] { + background: #fafafa; + color: #464646; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-datefield-huge.v-readonly [class*="textfield"]:focus { + box-shadow: none; + border-color: #c5c5c5; +} + +.mytheme .v-datefield-huge.v-readonly [class*="button"] { + cursor: default; + pointer-events: none; +} + +.mytheme .v-datefield-huge.v-readonly [class*="button"]:active:after { + display: none; +} + +.mytheme .v-inline-datefield-calendarpanel { + font-size: 16px; + text-align: center; +} + +.mytheme .v-inline-datefield-calendarpanel:focus { + outline: none; +} + +.mytheme .v-inline-datefield-calendarpanel-day { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 30px; + height: 26px; + border: 1px solid transparent; + line-height: 26px; + text-align: center; + font-size: 14px; + background: #fafafa; + border-radius: 2px; + -webkit-transition: color 200ms; + -moz-transition: color 200ms; + transition: color 200ms; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + cursor: pointer; +} + +.mytheme .v-inline-datefield-calendarpanel-day:hover { + color: #197de1; +} + +.mytheme .v-inline-datefield-calendarpanel-day-offmonth { + color: #a0a0a0; + background: transparent; +} + +.mytheme .v-inline-datefield-calendarpanel-day-today { + color: #191919; + font-weight: 600; + border-color: #afafaf; +} + +.mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-selected, .mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-selected:hover { + color: #c8dbed; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + border: none; + font-weight: 600; +} + +.mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-focused { + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + position: relative; +} + +.v-ie8 .mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-focused { + border-color: #197de1; +} + +.mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-outside-range, .mytheme .v-inline-datefield-calendarpanel-day.v-inline-datefield-calendarpanel-day-outside-range:hover { + color: #a0a0a0; + cursor: not-allowed; +} + +.mytheme .v-inline-datefield-calendarpanel-weekdays { + height: 26px; + color: rgba(133, 133, 133, 0.85); +} + +.mytheme .v-inline-datefield-calendarpanel-weekdays strong { + font: inherit; + font-size: 14px; +} + +.mytheme .v-inline-datefield-calendarpanel-header { + white-space: nowrap; +} + +.mytheme td[class*="year"] button, .mytheme td[class*="month"] button { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + border: none; + background: transparent; + padding: 0; + margin: 0; + cursor: pointer; + color: transparent; + font-size: 0; + width: 19px; + height: 25px; + outline: none; + position: relative; + vertical-align: middle; +} + +.mytheme td[class*="year"] button:before, .mytheme td[class*="month"] button:before { + color: #a0a0a0; + font-size: 21px; + line-height: 24px; + -webkit-transition: color 200ms; + -moz-transition: color 200ms; + transition: color 200ms; +} + +.mytheme td[class*="year"] button:hover:before, .mytheme td[class*="month"] button:hover:before { + color: #197de1; +} + +.mytheme td[class*="year"] button.outside-range, .mytheme td[class*="month"] button.outside-range { + cursor: default; + opacity: 0.3; + filter: alpha(opacity=30.0) ; +} + +.mytheme td[class*="year"] button.outside-range:hover:before, .mytheme td[class*="month"] button.outside-range:hover:before { + color: #a0a0a0; +} + +.mytheme .v-button-prevyear:before { + font-family: ThemeIcons; + content: "\f100"; +} + +.mytheme .v-button-prevmonth:before { + font-family: ThemeIcons; + content: "\f104"; +} + +.mytheme .v-button-nextyear:before { + font-family: ThemeIcons; + content: "\f101"; +} + +.mytheme .v-button-nextmonth:before { + font-family: ThemeIcons; + content: "\f105"; +} + +.mytheme td.v-inline-datefield-calendarpanel-month { + width: 148px; + color: #197de1; +} + +.mytheme .v-inline-datefield-calendarpanel-year td.v-inline-datefield-calendarpanel-month { + width: 74px; +} + +.mytheme .v-inline-datefield-calendarpanel-weeknumber, .mytheme .v-inline-datefield-calendarpanel-weekdays.v-inline-datefield-calendarpanel-weeknumbers td:first-child { + width: 30px; + color: rgba(133, 133, 133, 0.85); + font-size: 14px; + display: inline-block; + text-align: left; +} + +.mytheme .v-inline-datefield-calendarpanel-weeknumber { + position: relative; +} + +.mytheme .v-inline-datefield-calendarpanel-weeknumbers .v-first:before { + content: ""; + position: absolute; + top: 38px; + bottom: 0; + left: 0; + width: 34px; + border-top: 1px solid #eaeaea; + border-right: 1px solid #eaeaea; + border-top-right-radius: 4px; + border-bottom-left-radius: 4px; + background: #fafafa; +} + +.mytheme td.v-inline-datefield-calendarpanel-time { + width: 100%; + font-size: 14px; +} + +.mytheme td.v-inline-datefield-calendarpanel-time .v-label { + display: inline; + margin: 0 0.1em; + font-weight: 400; +} + +.mytheme .v-inline-datefield-calendarpanel { + position: relative; + background: white; + padding: 6px; +} + +.mytheme .v-gridlayout-margin-top { + padding-top: 37px; +} + +.mytheme .v-gridlayout-margin-bottom { + padding-bottom: 37px; +} + +.mytheme .v-gridlayout-margin-left { + padding-left: 37px; +} + +.mytheme .v-gridlayout-margin-right { + padding-right: 37px; +} + +.mytheme .v-gridlayout-spacing-on { + padding-left: 12px; + padding-top: 12px; +} + +.mytheme .v-menubar { + position: relative; + text-align: center; + white-space: nowrap; + outline: none; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + height: 37px; + padding: 0 16px; + color: #191919; + font-weight: 400; + + cursor: default; + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + padding: 0; + text-align: left; + line-height: 35px; +} + +.mytheme .v-menubar:after { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; +} + +.mytheme .v-menubar:focus:after { + -webkit-transition: none; + -moz-transition: none; + transition: none; +} + +.mytheme .v-menubar.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-menubar.v-disabled:after { + display: none; +} + +.mytheme .v-menubar:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-menubar:focus:after { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-menubar > .v-menubar-menuitem { + padding: 0 14px; +} + +.mytheme .v-menubar > .v-menubar-menuitem[class*="-icon-only"] { + width: 37px; +} + +.mytheme .v-menubar:active:after { + background: transparent; +} + +.mytheme .v-menubar > .v-menubar-menuitem { + position: relative; + z-index: 1; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + height: 37px; + padding: 0 15px; + color: inherit; + font-weight: 400; + + cursor: pointer; + border-radius: 0; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; + border-width: 0 1px 0 0; + border-color: inherit; + height: 100%; + line-height: inherit; + vertical-align: top; + text-align: center; +} + +.mytheme .v-menubar > .v-menubar-menuitem:first-child { + border-left-width: 0; + border-radius: 3px 0 0 3px; +} + +.mytheme .v-menubar > .v-menubar-menuitem:last-child { + border-radius: 0 3px 3px 0; + border-right-width: 0; +} + +.mytheme .v-menubar > .v-menubar-menuitem:first-child:last-child { + border-radius: 3px; +} + +.mytheme .v-menubar > .v-menubar-menuitem:before { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-menubar > .v-menubar-menuitem:hover { + zoom: 1; +} + +.mytheme .v-menubar > .v-menubar-menuitem:hover:before { + background-color: rgba(186, 186, 186, 0.1); + border: none; +} + +.mytheme .v-menubar > .v-menubar-menuitem:active:before { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-menubar > .v-menubar-menuitem .v-icon { + margin: 0 4px 0 -4px; + cursor: inherit; +} + +.mytheme .v-menubar > .v-menubar-menuitem[class*="-icon-only"] { + width: 37px; + padding: 0; +} + +.mytheme .v-menubar > .v-menubar-menuitem[class*="-icon-only"] .v-icon { + margin: 0; +} + +.mytheme .v-menubar > .v-menubar-menuitem-checked { + -webkit-box-shadow: none; + box-shadow: none; + background-color: #ededed; + background-image: -webkit-linear-gradient(bottom, #ededed 2%, #e9e9e9 98%); + background-image: linear-gradient(to top,#ededed 2%, #e9e9e9 98%); + color: #181818; +} + +.mytheme .v-disabled > .v-menubar-menuitem, .mytheme .v-menubar > .v-menubar-menuitem-disabled { + cursor: default; +} + +.mytheme .v-disabled > .v-menubar-menuitem:before, .mytheme .v-menubar > .v-menubar-menuitem-disabled:before { + display: none; +} + +.mytheme .v-menubar-menuitem-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-menubar > .v-menubar-menuitem-selected { + color: #ecf2f8; + + + + border-radius: 0; + border: 1px solid #1362b1; + border-top-color: #156ab3; + border-bottom-color: #1156a8; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + -webkit-box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca; + box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); + border-top-width: 0; + border-left-width: 0; + border-bottom-width: 0; + z-index: 2; +} + +.mytheme .v-menubar > .v-menubar-menuitem-selected:hover:before { + background: none; +} + +.mytheme .v-menubar .v-menubar-submenu-indicator { + display: none; +} + +.mytheme .v-menubar .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:after { + font-family: ThemeIcons; + content: "\f078"; + font-size: 0.7em; + vertical-align: 0.15em; + margin: 0 -0.2em 0 0.5em; + opacity: 0.5; +} + +.mytheme .v-menubar .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:empty:after { + margin-left: -0.2em; +} + +.mytheme .v-menubar-popup { + padding: 4px 4px; + border-radius: 4px; + background-color: white; + color: #474747; + -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + padding: 4px 4px; + margin: 5px 0 0 1px !important; +} + +.mytheme .v-menubar-popup[class*="animate-in"] { + -webkit-animation: valo-overlay-animate-in 120ms; + -moz-animation: valo-overlay-animate-in 120ms; + animation: valo-overlay-animate-in 120ms; +} + +.mytheme .v-menubar-popup[class*="animate-out"] { + -webkit-animation: valo-animate-out-fade 120ms; + -moz-animation: valo-animate-out-fade 120ms; + animation: valo-animate-out-fade 120ms; +} + +.mytheme .v-menubar-popup .v-menubar-submenu { + outline: none; +} + +.mytheme .v-menubar-popup .v-menubar-menuitem { + display: block; + cursor: pointer; + line-height: 27px; + padding: 0 20px 0 10px; + border-radius: 3px; + font-weight: 400; + white-space: nowrap; + position: relative; + padding-left: 32px; + padding-right: 37px; + position: relative; +} + +.mytheme .v-menubar-popup .v-menubar-menuitem:active:before { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: #0957a6; + opacity: 0.15; + filter: alpha(opacity=15.0) ; + pointer-events: none; + border-radius: inherit; +} + +.mytheme .v-menubar-popup .v-menubar-menuitem .v-icon { + max-height: 27px; + margin-right: 5px; + min-width: 1em; +} + +.mytheme .v-menubar-popup .v-menubar-submenu-indicator { + display: none; +} + +.mytheme .v-menubar-popup .v-menubar-submenu-indicator + .v-menubar-menuitem-caption:after { + position: absolute; + right: 10px; + font-family: ThemeIcons; + content: "\f054"; + line-height: 29px; +} + +.mytheme .v-menubar-popup .v-menubar-menuitem-selected { + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + color: #ecf2f8; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); +} + +.mytheme .v-menubar-popup .v-menubar-separator { + display: block; + margin: 4px 0; + height: 0; + overflow: hidden; + border-bottom: 1px solid #e4e4e4; +} + +.mytheme .v-menubar-popup [class*="checked"] .v-menubar-menuitem-caption:before { + content: "\f00c"; + font-family: ThemeIcons; + position: absolute; + left: 10px; +} + +.mytheme .v-menubar-popup [class*="unchecked"] .v-menubar-menuitem-caption:before { + content: ""; +} + +.mytheme .v-menubar-popup [class*="disabled"] { + cursor: default; +} + +.mytheme .v-menubar-small { + height: 31px; + padding: 0 14px; + + font-weight: 400; + + cursor: default; + border-radius: 4px; + padding: 0; + text-align: left; + line-height: 29px; + font-size: 14px; +} + +.mytheme .v-menubar-small:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-menubar-small > .v-menubar-menuitem { + padding: 0 12px; +} + +.mytheme .v-menubar-small > .v-menubar-menuitem[class*="-icon-only"] { + width: 31px; +} + +.mytheme .v-menubar-borderless { + border: none; + border-radius: 0; + padding: 1px; + -webkit-box-shadow: none; + box-shadow: none; + text-shadow: none; + background: transparent; + color: inherit; +} + +.mytheme .v-menubar-borderless:focus:after { + display: none; +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem { + -webkit-box-shadow: none; + box-shadow: none; + border: none; + margin-right: 1px; + border-radius: 4px; + color: #197de1; + padding: 0 12px; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem:first-child, .mytheme .v-menubar-borderless .v-menubar-menuitem:last-child, .mytheme .v-menubar-borderless .v-menubar-menuitem:first-child:last-child { + border-radius: 4px; +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem:before { + content: none; +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem:hover { + color: #4396ea; +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem:active { + color: inherit; +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem-checked, .mytheme .v-menubar-borderless .v-menubar-menuitem-checked:first-child { + border: 1px solid #c5c5c5; + color: #197de1; +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem-checked .v-menubar-menuitem-caption, .mytheme .v-menubar-borderless .v-menubar-menuitem-checked:first-child .v-menubar-menuitem-caption { + position: relative; + top: -1px; +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem-selected { + color: #ecf2f8; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem-selected:hover { + color: #ecf2f8; +} + +.mytheme .v-menubar-borderless .v-menubar-menuitem-disabled, .mytheme .v-menubar-borderless .v-menubar-menuitem-disabled:hover { + color: inherit; +} + +.mytheme .v-radiobutton { + position: relative; + line-height: 19px; + white-space: nowrap; +} + +.mytheme .v-radiobutton.v-has-width label { + white-space: normal; +} + +:root .mytheme .v-radiobutton { + padding-left: 25px; +} + +:root .mytheme .v-radiobutton label { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + display: inline-block; +} + +:root .mytheme .v-radiobutton > input { + position: absolute; + clip: rect(0, 0, 0, 0); + left: 0.2em; + top: 0.2em; + z-index: 0; + margin: 0; +} + +:root .mytheme .v-radiobutton > input:focus ~ label:before { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); +} + +:root .mytheme .v-radiobutton > input ~ label:before, :root .mytheme .v-radiobutton > input ~ label:after { + content: ""; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 19px; + height: 19px; + position: absolute; + top: 0; + left: 0; + border-radius: 4px; + font-size: 13px; + text-align: center; +} + +:root .mytheme .v-radiobutton > input ~ label:before { + height: 18.5px; + padding: 0 9px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + padding: 0; + height: 19px; +} + +:root .mytheme .v-radiobutton > input ~ label:after { + content: "\f00c"; + font-family: ThemeIcons; + color: transparent; + -webkit-transition: color 100ms; + -moz-transition: color 100ms; + transition: color 100ms; +} + +:root .mytheme .v-radiobutton > input:active ~ label:after { + background-color: rgba(125, 125, 125, 0.2); +} + +:root .mytheme .v-radiobutton > input:checked ~ label:after { + color: #197de1; +} + +.mytheme .v-radiobutton > .v-icon, .mytheme .v-radiobutton > label .v-icon { + margin: 0 6px 0 3px; + min-width: 1em; + cursor: pointer; +} + +.mytheme .v-radiobutton.v-disabled > label, .mytheme .v-radiobutton.v-disabled > .v-icon { + cursor: default; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-radiobutton.v-disabled > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-radiobutton.v-disabled > input:active ~ label:after { + background: transparent; +} + +.mytheme .v-radiobutton.v-readonly > label, .mytheme .v-radiobutton.v-readonly > .v-icon { + cursor: default; +} + +.mytheme .v-radiobutton.v-readonly > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-radiobutton.v-readonly > input:active ~ label:after { + background: transparent; +} + +:root .mytheme .v-radiobutton.v-readonly > input ~ label:after { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +:root .mytheme .v-radiobutton > input:checked ~ label:after { + width: 7px; + height: 7px; + top: 6px; + left: 6px; + background: #197de1; +} + +:root .mytheme .v-radiobutton > input ~ label:before, :root .mytheme .v-radiobutton > input ~ label:after { + border-radius: 50%; + content: ""; +} + +.mytheme .v-select-optiongroup .v-radiobutton, .mytheme .v-select-optiongroup .v-checkbox { + display: block; + margin: 9px 16px 0 0; +} + +.mytheme .v-select-optiongroup .v-radiobutton:first-child, .mytheme .v-select-optiongroup .v-checkbox:first-child { + margin-top: 6px; +} + +.mytheme .v-select-optiongroup .v-radiobutton:last-child, .mytheme .v-select-optiongroup .v-checkbox:last-child { + margin-bottom: 6px; +} + +.mytheme .v-select-optiongroup.v-has-width label { + white-space: normal; +} + +.mytheme .v-select-optiongroup-small { + font-size: 14px; +} + +.mytheme .v-select-optiongroup-small .v-checkbox { + position: relative; + line-height: 16px; + white-space: nowrap; +} + +.mytheme .v-select-optiongroup-small .v-checkbox.v-has-width label { + white-space: normal; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox { + padding-left: 21px; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox label { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + display: inline-block; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox > input { + position: absolute; + clip: rect(0, 0, 0, 0); + left: 0.2em; + top: 0.2em; + z-index: 0; + margin: 0; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox > input:focus ~ label:before { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:before, :root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:after { + content: ""; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 16px; + height: 16px; + position: absolute; + top: 0; + left: 0; + border-radius: 4px; + font-size: 11px; + text-align: center; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:before { + height: 15.5px; + padding: 0 7px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + padding: 0; + height: 16px; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox > input ~ label:after { + content: "\f00c"; + font-family: ThemeIcons; + color: transparent; + -webkit-transition: color 100ms; + -moz-transition: color 100ms; + transition: color 100ms; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox > input:active ~ label:after { + background-color: rgba(125, 125, 125, 0.2); +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox > input:checked ~ label:after { + color: #197de1; +} + +.mytheme .v-select-optiongroup-small .v-checkbox > .v-icon, .mytheme .v-select-optiongroup-small .v-checkbox > label .v-icon { + margin: 0 5px 0 3px; + min-width: 1em; + cursor: pointer; +} + +.mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > label, .mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > .v-icon { + cursor: default; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox.v-disabled > input:active ~ label:after { + background: transparent; +} + +.mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > label, .mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > .v-icon { + cursor: default; +} + +.mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > input:active ~ label:after { + background: transparent; +} + +:root .mytheme .v-select-optiongroup-small .v-checkbox.v-readonly > input ~ label:after { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton { + position: relative; + line-height: 16px; + white-space: nowrap; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton.v-has-width label { + white-space: normal; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton { + padding-left: 21px; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton label { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + display: inline-block; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton > input { + position: absolute; + clip: rect(0, 0, 0, 0); + left: 0.2em; + top: 0.2em; + z-index: 0; + margin: 0; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:focus ~ label:before { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:after { + content: ""; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 16px; + height: 16px; + position: absolute; + top: 0; + left: 0; + border-radius: 4px; + font-size: 11px; + text-align: center; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:before { + height: 15.5px; + padding: 0 7px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + padding: 0; + height: 16px; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:after { + content: "\f00c"; + font-family: ThemeIcons; + color: transparent; + -webkit-transition: color 100ms; + -moz-transition: color 100ms; + transition: color 100ms; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:active ~ label:after { + background-color: rgba(125, 125, 125, 0.2); +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:checked ~ label:after { + color: #197de1; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton > .v-icon, .mytheme .v-select-optiongroup-small .v-radiobutton > label .v-icon { + margin: 0 5px 0 3px; + min-width: 1em; + cursor: pointer; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > label, .mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > .v-icon { + cursor: default; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton.v-disabled > input:active ~ label:after { + background: transparent; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > label, .mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > .v-icon { + cursor: default; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > input:active ~ label:after { + background: transparent; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton.v-readonly > input ~ label:after { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton > input:checked ~ label:after { + width: 6px; + height: 6px; + top: 5px; + left: 5px; + background: #197de1; +} + +:root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-small .v-radiobutton > input ~ label:after { + border-radius: 50%; + content: ""; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton, .mytheme .v-select-optiongroup-small .v-checkbox { + display: block; + margin: 8px 16px 0 0; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton:first-child, .mytheme .v-select-optiongroup-small .v-checkbox:first-child { + margin-top: 5px; +} + +.mytheme .v-select-optiongroup-small .v-radiobutton:last-child, .mytheme .v-select-optiongroup-small .v-checkbox:last-child { + margin-bottom: 5px; +} + +.mytheme .v-select-optiongroup-small.v-has-width label { + white-space: normal; +} + +.mytheme .v-select-optiongroup-large { + font-size: 20px; +} + +.mytheme .v-select-optiongroup-large .v-checkbox { + position: relative; + line-height: 22px; + white-space: nowrap; +} + +.mytheme .v-select-optiongroup-large .v-checkbox.v-has-width label { + white-space: normal; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox { + padding-left: 29px; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox label { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + display: inline-block; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox > input { + position: absolute; + clip: rect(0, 0, 0, 0); + left: 0.2em; + top: 0.2em; + z-index: 0; + margin: 0; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox > input:focus ~ label:before { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:before, :root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:after { + content: ""; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 22px; + height: 22px; + position: absolute; + top: 0; + left: 0; + border-radius: 4px; + font-size: 15px; + text-align: center; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:before { + height: 22px; + padding: 0 10px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + padding: 0; + height: 22px; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox > input ~ label:after { + content: "\f00c"; + font-family: ThemeIcons; + color: transparent; + -webkit-transition: color 100ms; + -moz-transition: color 100ms; + transition: color 100ms; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox > input:active ~ label:after { + background-color: rgba(125, 125, 125, 0.2); +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox > input:checked ~ label:after { + color: #197de1; +} + +.mytheme .v-select-optiongroup-large .v-checkbox > .v-icon, .mytheme .v-select-optiongroup-large .v-checkbox > label .v-icon { + margin: 0 7px 0 4px; + min-width: 1em; + cursor: pointer; +} + +.mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > label, .mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > .v-icon { + cursor: default; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox.v-disabled > input:active ~ label:after { + background: transparent; +} + +.mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > label, .mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > .v-icon { + cursor: default; +} + +.mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > input:active ~ label:after { + background: transparent; +} + +:root .mytheme .v-select-optiongroup-large .v-checkbox.v-readonly > input ~ label:after { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton { + position: relative; + line-height: 22px; + white-space: nowrap; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton.v-has-width label { + white-space: normal; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton { + padding-left: 29px; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton label { + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; + cursor: pointer; + display: inline-block; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton > input { + position: absolute; + clip: rect(0, 0, 0, 0); + left: 0.2em; + top: 0.2em; + z-index: 0; + margin: 0; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:focus ~ label:before { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5), inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:after { + content: ""; + display: inline-block; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 22px; + height: 22px; + position: absolute; + top: 0; + left: 0; + border-radius: 4px; + font-size: 15px; + text-align: center; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:before { + height: 22px; + padding: 0 10px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + padding: 0; + height: 22px; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:after { + content: "\f00c"; + font-family: ThemeIcons; + color: transparent; + -webkit-transition: color 100ms; + -moz-transition: color 100ms; + transition: color 100ms; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:active ~ label:after { + background-color: rgba(125, 125, 125, 0.2); +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:checked ~ label:after { + color: #197de1; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton > .v-icon, .mytheme .v-select-optiongroup-large .v-radiobutton > label .v-icon { + margin: 0 7px 0 4px; + min-width: 1em; + cursor: pointer; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > label, .mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > .v-icon { + cursor: default; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton.v-disabled > input:active ~ label:after { + background: transparent; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > label, .mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > .v-icon { + cursor: default; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > label > .v-icon { + cursor: default; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > input:active ~ label:after { + background: transparent; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton.v-readonly > input ~ label:after { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton > input:checked ~ label:after { + width: 8px; + height: 8px; + top: 7px; + left: 7px; + background: #197de1; +} + +:root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:before, :root .mytheme .v-select-optiongroup-large .v-radiobutton > input ~ label:after { + border-radius: 50%; + content: ""; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton, .mytheme .v-select-optiongroup-large .v-checkbox { + display: block; + margin: 11px 16px 0 0; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton:first-child, .mytheme .v-select-optiongroup-large .v-checkbox:first-child { + margin-top: 7px; +} + +.mytheme .v-select-optiongroup-large .v-radiobutton:last-child, .mytheme .v-select-optiongroup-large .v-checkbox:last-child { + margin-bottom: 7px; +} + +.mytheme .v-select-optiongroup-large.v-has-width label { + white-space: normal; +} + +.mytheme .v-select-optiongroup-horizontal { + white-space: nowrap; +} + +.mytheme .v-select-optiongroup-horizontal .v-radiobutton, .mytheme .v-select-optiongroup-horizontal .v-checkbox { + display: inline-block; +} + +.mytheme .v-select-optiongroup-horizontal.v-has-width { + white-space: normal; +} + +.mytheme .v-select-optiongroup-horizontal.v-has-width label { + white-space: nowrap; +} + +.mytheme .v-link { + cursor: pointer; + color: #197de1; + text-decoration: underline; + font-weight: inherit; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-link:hover { + color: #4396ea; +} + +.mytheme .v-link.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-link a { + cursor: inherit; + color: inherit; + text-decoration: inherit; + -webkit-transition: inherit; + -moz-transition: inherit; + transition: inherit; +} + +.mytheme .v-link .v-icon { + cursor: inherit; +} + +.mytheme .v-link-small { + font-size: 14px; +} + +.mytheme .v-link-large { + font-size: 20px; +} + +.mytheme .v-window { + padding: 4px 4px; + border-radius: 4px; + background-color: white; + color: #474747; + -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1), 0 16px 80px -6px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.09098); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1), 0 16px 80px -6px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(0, 0, 0, 0.09098); + padding: 0; + min-width: 148px !important; + min-height: 37px !important; + white-space: nowrap; + overflow: hidden !important; + -webkit-transition: width 200ms, height 200ms, top 200ms, left 200ms; + -moz-transition: width 200ms, height 200ms, top 200ms, left 200ms; + transition: width 200ms, height 200ms, top 200ms, left 200ms; +} + +.mytheme .v-window[class*="animate-in"] { + -webkit-animation: valo-animate-in-fade 140ms; + -moz-animation: valo-animate-in-fade 140ms; + animation: valo-animate-in-fade 140ms; +} + +.mytheme .v-window[class*="animate-out"] { + -webkit-animation: valo-animate-out-scale-down-fade 100ms; + -moz-animation: valo-animate-out-scale-down-fade 100ms; + animation: valo-animate-out-scale-down-fade 100ms; +} + +.mytheme .v-window.v-window-animate-in { + -webkit-transition: none; + -moz-transition: none; + transition: none; +} + +.mytheme .v-window-modalitycurtain { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + background-color: #222; + background-image: -webkit-radial-gradient(50% 50%, circle, #222, #0e0e0e); + background-image: radial-gradient( circle at 50% 50%, #222, #0e0e0e); + opacity: 0.72; + filter: alpha(opacity=72) ; + -webkit-animation: valo-animate-in-fade 400ms 100ms backwards; + -moz-animation: valo-animate-in-fade 400ms 100ms backwards; + animation: valo-animate-in-fade 400ms 100ms backwards; +} + +.v-op12 .mytheme .v-window-modalitycurtain { + -webkit-animation: none; + -moz-animation: none; + animation: none; +} + +.mytheme .v-window-draggingCurtain { + position: fixed !important; +} + +.mytheme .v-window-resizingCurtain + .v-window, .mytheme .v-window-draggingCurtain + .v-window { + -webkit-transition: none; + -moz-transition: none; + transition: none; +} + +.mytheme .v-window-outerheader { + cursor: move; + position: absolute; + z-index: 2; + top: 0; + left: 0; + right: 0; + -webkit-transform: translatez(0); + -moz-transform: translatez(0); + -ms-transform: translatez(0); + -o-transform: translatez(0); + transform: translatez(0); +} + +.mytheme .v-window-outerheader:after { + content: ""; + position: absolute; + bottom: -1px; + right: 0; + left: 0; + height: 0; + border-top: 1px solid #dfdfdf; + border-color: rgba(197, 197, 197, 0.5); +} + +.mytheme .v-window-header { + line-height: 36px; + padding-left: 12px; + margin-right: 74px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + color: #7e7e7e; +} + +.mytheme .v-window-restorebox-disabled ~ .v-window-closebox ~ .v-window-header, .mytheme .v-window-maximizebox-disabled ~ .v-window-closebox ~ .v-window-header { + margin-right: 37px; +} + +.mytheme .v-window-restorebox-disabled ~ .v-window-closebox-disabled ~ .v-window-header, .mytheme .v-window-maximizebox-disabled ~ .v-window-closebox-disabled ~ .v-window-header { + margin-right: 12px; +} + +.mytheme .v-window-closebox, .mytheme .v-window-maximizebox, .mytheme .v-window-restorebox { + position: absolute; + z-index: 3; + top: 0; + right: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 33px; + height: 36px; + background-color: white; + line-height: 34px; + text-align: center; + cursor: pointer; + font-size: 21px; + color: #999999; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-window-closebox:focus, .mytheme .v-window-maximizebox:focus, .mytheme .v-window-restorebox:focus { + outline: none; +} + +.mytheme .v-window-closebox:hover, .mytheme .v-window-maximizebox:hover, .mytheme .v-window-restorebox:hover { + opacity: 1; + filter: none ; + color: #197de1; +} + +.mytheme .v-window-closebox:active, .mytheme .v-window-maximizebox:active, .mytheme .v-window-restorebox:active { + color: inherit; +} + +.mytheme .v-window-closebox { + padding-right: 4px; + border-radius: 0 4px 0 4px; +} + +.mytheme .v-window-closebox:before { + content: "\00d7"; +} + +.mytheme .v-window-maximizebox, .mytheme .v-window-restorebox { + right: 33px; + padding-left: 4px; + border-radius: 0 0 0 4px; +} + +.mytheme .v-window-maximizebox + .v-window-closebox, .mytheme .v-window-restorebox + .v-window-closebox { + border-bottom-left-radius: 0; +} + +.mytheme .v-window-closebox-disabled, .mytheme .v-window-resizebox-disabled, .mytheme .v-window-restorebox-disabled, .mytheme .v-window-maximizebox-disabled { + display: none; +} + +.mytheme .v-window-closebox-disabled + .v-window-closebox, .mytheme .v-window-resizebox-disabled + .v-window-closebox, .mytheme .v-window-restorebox-disabled + .v-window-closebox, .mytheme .v-window-maximizebox-disabled + .v-window-closebox { + width: 37px; + padding-right: 0; + border-bottom-left-radius: 4px; +} + +.mytheme .v-window-maximizebox:before { + content: "+"; +} + +.mytheme .v-window-restorebox:before { + content: "\2013"; +} + +.mytheme .v-window > .popupContent, .mytheme .v-window-wrap, .mytheme .v-window-contents, .mytheme .v-window-contents > .v-scrollable { + height: 100%; +} + +.mytheme .v-window-contents { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border-radius: 4px; + margin-top: 0 !important; +} + +.mytheme .v-window-contents > .v-scrollable { + position: relative; +} + +.mytheme .v-window-contents > .v-scrollable > .v-margin-top { + padding-top: 12px; +} + +.mytheme .v-window-contents > .v-scrollable > .v-margin-right { + padding-right: 12px; +} + +.mytheme .v-window-contents > .v-scrollable > .v-margin-bottom { + padding-bottom: 12px; +} + +.mytheme .v-window-contents > .v-scrollable > .v-margin-left { + padding-left: 12px; +} + +.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-top"] > tbody > [class*="firstrow"] > td { + padding-top: 12px; +} + +.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-bottom"] > tbody > [class*="lastrow"] > td { + padding-bottom: 12px; +} + +.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-left"] > tbody > [class*="row"] > [class*="captioncell"] { + padding-left: 12px; +} + +.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-left"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { + left: 12px; +} + +.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] { + padding-right: 12px; +} + +.mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h2, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h3, .mytheme .v-window-contents > .v-scrollable > .v-formlayout [class*="margin-right"] > tbody > [class*="row"] > [class*="contentcell"] > .v-label-h4 { + right: 12px; +} + +.mytheme .v-window-contents > .v-scrollable:focus { + outline: none; +} + +.mytheme .v-window-contents > .v-scrollable:before { + content: ""; + position: absolute; + z-index: 2; + top: 0; + height: 0; + border-top: 1px solid white; + left: 0; + right: 0; +} + +.mytheme .v-window-contents > .v-scrollable .v-panel-captionwrap:after { + border-color: #dfdfdf; +} + +.mytheme .v-window-contents > .v-scrollable .v-panel-content:before { + border-color: white; +} + +.mytheme .v-window-footer { + height: 0; +} + +.mytheme .v-window-resizebox { + position: absolute; + z-index: 1000; + right: 0; + bottom: 0; + width: 19px; + height: 19px; + cursor: nwse-resize; +} + +.v-ie8 .mytheme .v-window-resizebox { + background: #000; + filter: alpha(opacity=0.1); +} + +.v-ie8 .mytheme .v-window-resizebox, .v-ie9 .mytheme .v-window-resizebox { + cursor: se-resize; +} + +.mytheme .v-window-modalitycurtain:active ~ .v-window { + -webkit-animation: none; + -moz-animation: none; + animation: none; +} + +.mytheme .v-window-top-toolbar > .v-widget, .mytheme .v-window-bottom-toolbar > .v-widget { + vertical-align: top; +} + +.mytheme .v-window-top-toolbar .v-label, .mytheme .v-window-bottom-toolbar .v-label { + line-height: 36px; +} + +.mytheme .v-window-top-toolbar .v-spacing, .mytheme .v-window-bottom-toolbar .v-spacing { + width: 6px; +} + +.mytheme .v-window-top-toolbar.v-layout { + padding: 7px 12px; + position: relative; + z-index: 2; + border-top: 1px solid #dfdfdf; + border-bottom: 1px solid #dfdfdf; + background-color: #fafafa; +} + +.mytheme .v-window-top-toolbar.v-menubar { + margin: 12px 12px 6px; +} + +.mytheme .v-window-top-toolbar.v-menubar-borderless { + padding-left: 6px; + padding-right: 6px; + margin: 5px 0; +} + +.mytheme .v-window-bottom-toolbar.v-layout { + padding: 7px 12px; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #f0f0f0 0, #fafafa 4px); + background-image: linear-gradient(to bottom,#f0f0f0 0, #fafafa 4px); + border-top: 1px solid #dfdfdf; + border-radius: 0 0 4px 4px; +} + +.mytheme .v-margin-left.v-margin-right.v-margin-top .v-window-top-toolbar.v-layout { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + margin: -12px -12px 0; +} + +.mytheme .v-margin-left.v-margin-right.v-margin-top .v-window-top-toolbar.v-menubar { + margin: 0; +} + +.mytheme .v-margin-left.v-margin-right.v-margin-top .v-window-top-toolbar.v-menubar-borderless { + margin: -6px -6px 0; + padding: 0; +} + +.mytheme .v-margin-left.v-margin-right.v-margin-bottom .v-window-bottom-toolbar.v-layout { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + margin: 0 -12px -12px; +} + +.mytheme .v-tree { + position: relative; + white-space: nowrap; +} + +.mytheme .v-tree:focus { + outline: none; +} + +.mytheme .v-tree-node:before { + content: ""; + position: absolute; + display: inline-block; + z-index: 3; + width: 1.9em; + height: 28px; + cursor: pointer; + background: red; + opacity: 0; +} + +.v-ie8 .mytheme .v-tree-node:before { + position: static; + margin-left: -1.9em; + vertical-align: top; + content: "\f0da"; + font-family: ThemeIcons; + text-align: center; + background: transparent; +} + +.v-ie8 .mytheme .v-tree-node { + padding-left: 1.9em; +} + +.mytheme .v-tree-node-caption { + height: 28px; + line-height: 27px; + overflow: hidden; + white-space: nowrap; + vertical-align: top; +} + +.mytheme .v-tree-node-caption > div { + display: inline-block; + width: 100%; + position: relative; + z-index: 2; +} + +.mytheme .v-tree-node-caption > div:before { + content: "\f0da"; + font-family: ThemeIcons; + display: inline-block; + width: 0.5em; + text-align: center; + margin: 0 0.6em 0 0.8em; + -webkit-transition: all 100ms; + -moz-transition: all 100ms; + transition: all 100ms; +} + +.v-ie8 .mytheme .v-tree-node-caption > div:before { + display: none; +} + +.mytheme .v-tree-node-caption span { + padding-right: 28px; + cursor: pointer; + display: inline-block; + width: 100%; +} + +.v-ie .mytheme .v-tree-node-caption span { + width: auto; +} + +.mytheme .v-tree-node-caption .v-icon { + padding-right: 0; + width: auto; + min-width: 1em; +} + +.mytheme .v-tree-node-caption:after { + content: ""; + display: block; + vertical-align: top; + position: absolute; + z-index: 1; + left: 0; + margin-top: -28px; + width: 100%; + height: 28px; + border-radius: 4px; + opacity: 0; + -webkit-transition: opacity 120ms; + -moz-transition: opacity 120ms; + transition: opacity 120ms; +} + +.v-ie8 .mytheme .v-tree-node-caption:after { + content: none; +} + +.v-ie8 .mytheme .v-tree-node-caption { + display: inline-block; +} + +.mytheme .v-tree-node-expanded > .v-tree-node-caption > div:before { + -webkit-transform: rotate(90deg); + -moz-transform: rotate(90deg); + -ms-transform: rotate(90deg); + -o-transform: rotate(90deg); + transform: rotate(90deg); + content: "\f0da"; + font-family: ThemeIcons; +} + +.v-ie8 .mytheme .v-tree-node-expanded:before { + content: "\f0d7"; + font-family: ThemeIcons; +} + +.mytheme .v-tree-node-leaf:before, .mytheme .v-tree-node-leaf > .v-tree-node-caption > div:before { + visibility: hidden; +} + +.mytheme .v-tree-node-focused:after { + opacity: 1; + border: 1px solid #197de1; +} + +.v-ie8 .mytheme .v-tree-node-focused { + outline: 1px dotted #197de1; +} + +.mytheme .v-tree-node-selected { + color: #ecf2f8; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); +} + +.mytheme .v-tree-node-selected:after { + opacity: 1; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + border: none; +} + +.v-ie8 .mytheme .v-tree-node-selected { + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); +} + +.mytheme .v-tree-node-children { + padding-left: 19px; +} + +.v-ie8 .mytheme .v-tree-node-children { + padding-left: 0; +} + +.mytheme .v-tree-node-drag-top:before, .mytheme .v-tree-node-drag-bottom:after, .mytheme .v-tree-node-drag-bottom.v-tree-node-dragfolder.v-tree-node-expanded > .v-tree-node-children:before { + content: "\2022"; + display: block; + position: absolute; + height: 2px; + width: 100%; + background: #197de1; + font-size: 32px; + line-height: 2px; + color: #197de1; + text-indent: -4px; + text-shadow: 0 0 1px #fafafa, 0 0 1px #fafafa; + opacity: 1; + visibility: visible; +} + +.mytheme .v-tree-node-drag-bottom.v-tree-node-dragfolder.v-tree-node-expanded:after { + content: none; +} + +.mytheme .v-tree-node-caption-drag-center { + -webkit-box-shadow: 0 0 0 2px #197de1; + box-shadow: 0 0 0 2px #197de1; + position: relative; + border-radius: 4px; +} + +.v-ie8 .mytheme .v-tree-node-caption-drag-center { + outline: 2px solid #197de1; +} + +.v-ff .mytheme .v-tree-node-drag-top:before, .v-ff .mytheme .v-tree-node-drag-bottom:after { + line-height: 1px; +} + +.v-ie8 .mytheme .v-tree-node-drag-top:before, .v-ie8 .mytheme .v-tree-node-drag-bottom:after { + line-height: 0; +} + +.mytheme .v-table { + position: relative; + background: #fafafa; + color: #464646; + overflow: hidden; +} + +.mytheme .v-table-header table, .mytheme .v-table-footer table, .mytheme .v-table-table { + -webkit-box-shadow: 0 0 0 1px #d4d4d4; + box-shadow: 0 0 0 1px #d4d4d4; +} + +.v-ie8 .mytheme .v-table-header table, .v-ie8 .mytheme .v-table-footer table, .v-ie8 .mytheme .v-table-table { + outline: 1px solid #d4d4d4; +} + +.mytheme .v-table-header-wrap, .mytheme .v-table-footer-wrap, .mytheme .v-table-header-drag { + border: 1px solid #d4d4d4; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + white-space: nowrap; + font-size: 14px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); +} + +.mytheme .v-table-header-wrap { + position: relative; + border-bottom: none; +} + +.mytheme .v-table-footer-wrap { + border-top: none; +} + +.mytheme .v-table-footer td { + border-left: 1px solid #d4d4d4; +} + +.mytheme .v-table-footer-container, .mytheme .v-table-caption-container { + overflow: hidden; + line-height: 1; + min-height: 37px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.v-ie8 .mytheme .v-table-footer-container, .v-ie8 .mytheme .v-table-caption-container { + min-height: 14px; +} + +.mytheme .v-table-footer-container { + padding: 11px 12px 12px; + float: right; +} + +.mytheme [class^="v-table-header-cell"] { + position: relative; +} + +.mytheme .v-table-caption-container, .mytheme .v-table-header-drag { + padding: 12px 12px 11px; + border-left: 1px solid #d4d4d4; +} + +.mytheme .v-table-caption-container-align-right { + padding-right: 4px; +} + +.mytheme .v-table-resizer { + height: 37px; + width: 8px; + cursor: e-resize; + cursor: col-resize; + position: relative; + right: -4px; + z-index: 1; + margin-left: -8px; +} + +.mytheme .v-table-cell-content { + border-left: 1px solid #d4d4d4; + overflow: hidden; + height: 37px; + vertical-align: middle; +} + +.mytheme .v-table-cell-content:first-child { + border-left: none; + padding-left: 1px; +} + +.mytheme .v-table-header td:first-child .v-table-caption-container, .mytheme .v-table-footer td:first-child { + border-left-color: transparent; +} + +.mytheme .v-table-cell-wrapper { + line-height: 1; + padding: 0 12px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-right: 0 !important; +} + +.mytheme .v-table-cell-wrapper > .v-widget { + margin: 3px -6px; +} + +.mytheme .v-table-cell-wrapper > .v-widget.v-label, .mytheme .v-table-cell-wrapper > .v-widget.v-checkbox, .mytheme .v-table-cell-wrapper > .v-widget.v-select-optiongroup { + margin: 0; +} + +.mytheme .v-table-cell-wrapper > .v-widget.v-progressbar { + margin-left: 0; + margin-right: 0; +} + +.mytheme .v-table-body { + border: 1px solid #d4d4d4; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.mytheme .v-table-table { + background-color: white; + white-space: nowrap; +} + +.mytheme .v-table-table td { + border-top: 1px solid #d4d4d4; +} + +.mytheme .v-table-table tr:first-child > td { + border-top: none; +} + +.mytheme .v-table-row { + background-color: white; + cursor: pointer; +} + +.mytheme .v-table-row-odd { + background-color: #f5f5f5; + cursor: pointer; +} + +.mytheme .v-table-body-noselection .v-table-row, .mytheme .v-table-body-noselection .v-table-row-odd { + cursor: default; +} + +.mytheme .v-table [class*="-row"].v-selected { + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + background-origin: border-box; + color: #ecf2f8; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); +} + +.mytheme .v-table [class*="-row"].v-selected + .v-selected { + background: #166ed5; +} + +.mytheme .v-table [class*="-row"].v-selected + .v-selected td { + border-top-color: #166ed5; +} + +.mytheme .v-table [class*="-row"].v-selected .v-table-cell-content { + border-color: transparent; + border-left-color: #1d69b4; +} + +.mytheme .v-table [class*="-row"].v-selected .v-table-cell-content:first-child { + border-left-color: transparent; +} + +.mytheme .v-table-header-cell-asc .v-table-sort-indicator, .mytheme .v-table-header-cell-desc .v-table-sort-indicator { + background: transparent; + width: 19px; + height: 37px; + line-height: 37px; + margin-left: -19px; +} + +.mytheme .v-table-header-cell-asc .v-table-sort-indicator:before, .mytheme .v-table-header-cell-desc .v-table-sort-indicator:before { + font-style: normal; + font-weight: normal; + display: inline-block; +} + +.mytheme .v-table-header-cell-asc .v-table-sort-indicator:before { + content: "\f0de"; + font-family: ThemeIcons; +} + +.mytheme .v-table-header-cell-desc .v-table-sort-indicator:before { + content: "\f0dd"; + font-family: ThemeIcons; +} + +.mytheme [class*="rowheader"] span.v-icon { + min-width: 1em; +} + +.mytheme .v-table-focus { + outline: 1px solid #197de1; + outline-offset: -1px; +} + +.mytheme .v-drag-element.v-table-focus, .mytheme .v-drag-element .v-table-focus { + outline: none; +} + +.mytheme .v-table-header-drag { + position: absolute; + opacity: 0.9; + filter: alpha(opacity=90) ; + margin-top: -19px; + z-index: 30000; + line-height: 1; +} + +.mytheme .v-table-focus-slot-right { + border-right: 3px solid #197de1; + right: -2px; + margin-left: -11px !important; +} + +.mytheme .v-table-focus-slot-left { + float: left; + border-left: 3px solid #197de1; + left: -1px; + right: auto; + margin-left: 0 !important; + margin-right: -11px; +} + +.mytheme .v-table-column-selector { + height: 37px; + padding: 0 16px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + position: absolute; + z-index: 2; + top: 0; + right: 0; + width: 19px; + height: 19px; + line-height: 19px; + padding: 0; + border-top-width: 0; + border-right-width: 0; + border-radius: 0 0 0 4px; + cursor: pointer; + text-align: center; + opacity: 0; + filter: alpha(opacity=0) ; + -webkit-transition: opacity 200ms 2s; + -moz-transition: opacity 200ms 2s; + transition: opacity 200ms 2s; +} + +.mytheme .v-table-column-selector:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-table-column-selector:hover:after { + background-color: rgba(186, 186, 186, 0.1); +} + +.mytheme .v-table-column-selector:focus:after { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-table-column-selector:active:after { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-table-column-selector:after { + content: ""; + position: absolute; + border: none; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.mytheme .v-table-column-selector:active:after { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-table-column-selector:before { + font-family: ThemeIcons; + content: "\f013"; +} + +.mytheme .v-table-header-wrap:hover .v-table-column-selector { + opacity: 1; + filter: none ; + -webkit-transition-delay: 200ms; + -moz-transition-delay: 200ms; + transition-delay: 200ms; +} + +.mytheme .v-on:before, .mytheme .v-off:before { + content: "\f00c"; + font-family: ThemeIcons; + font-size: 0.9em; + margin-right: 6px; +} + +.mytheme .v-on div, .mytheme .v-off div { + display: inline; +} + +.mytheme .v-on.v-disabled, .mytheme .v-off.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-off:before { + visibility: hidden; +} + +.mytheme tbody.v-drag-element { + display: block; + overflow: visible; + -webkit-box-shadow: none; + box-shadow: none; + background: transparent; + opacity: 1; + filter: none ; +} + +.mytheme tbody.v-drag-element tr { + display: block; + + + -webkit-box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2); + border-radius: 4px; + overflow: hidden; + opacity: 0.5; + filter: alpha(opacity=50) ; + background: white; +} + +.mytheme .v-table-body { + position: relative; + z-index: 1; +} + +.mytheme .v-table-scrollposition { + position: absolute; + top: 50%; + width: 100%; + height: 37px; + line-height: 37px; + margin: -19px 0 0 !important; + text-align: center; +} + +.mytheme .v-table-drag { + overflow: visible; +} + +.mytheme .v-table-drag .v-table-body { + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + border-color: #197de1; +} + +.v-ie8 .mytheme .v-table-drag .v-table-body { + border-color: #197de1; +} + +.mytheme .v-table-drag .v-table-body .v-table-focus { + outline: none; +} + +.mytheme .v-table-row-drag-middle .v-table-cell-content { + background-color: #d1e5f9; + color: #214060; +} + +.mytheme .v-table-row-drag-bottom td.v-table-cell-content { + border-bottom: 2px solid #197de1; + height: 35px; +} + +.mytheme .v-table-row-drag-bottom .v-table-cell-wrapper { + margin-bottom: -2px; +} + +.mytheme .v-table-row-drag-top td.v-table-cell-content { + border-top: 2px solid #197de1; + height: 36px; +} + +.mytheme .v-table-row-drag-top .v-table-cell-wrapper { + margin-top: -1px; +} + +.mytheme .v-table-no-stripes .v-table-row, .mytheme .v-table-no-stripes .v-table-row-odd { + background: transparent; +} + +.mytheme .v-table-no-vertical-lines .v-table-cell-content { + border-left: none; + padding-left: 1px; +} + +.mytheme .v-table-no-vertical-lines.v-treetable .v-table-cell-content { + padding-left: 13px; +} + +.mytheme .v-table-no-horizontal-lines .v-table-cell-content { + border-top: none; + border-bottom: none; +} + +.mytheme .v-table-no-horizontal-lines .v-table-row-drag-top .v-table-cell-content, .mytheme .v-table-no-horizontal-lines .v-table-row-drag-bottom .v-table-cell-content { + height: 36px; +} + +.mytheme .v-table-no-header .v-table-header-wrap { + display: none; +} + +.mytheme .v-table-borderless .v-table-header-wrap, .mytheme .v-table-borderless .v-table-footer-wrap, .mytheme .v-table-borderless .v-table-header-drag, .mytheme .v-table-borderless .v-table-body { + border: none; +} + +.mytheme .v-table-borderless .v-table-header-wrap { + border-bottom: 1px solid #d9d9d9; +} + +.mytheme .v-table-borderless .v-table-footer-wrap { + border-top: 1px solid #d9d9d9; +} + +.mytheme .v-table-compact .v-table-header-wrap, .mytheme .v-table-compact .v-table-footer-wrap, .mytheme .v-table-compact .v-table-header-drag, .mytheme .v-table-small .v-table-header-wrap, .mytheme .v-table-small .v-table-footer-wrap, .mytheme .v-table-small .v-table-header-drag { + font-size: 14px; +} + +.mytheme .v-table-compact .v-table-footer-container, .mytheme .v-table-small .v-table-footer-container { + padding: 8px 7px 9px; +} + +.mytheme .v-table-compact .v-table-caption-container, .mytheme .v-table-compact .v-table-header-drag, .mytheme .v-table-small .v-table-caption-container, .mytheme .v-table-small .v-table-header-drag { + padding-top: 9px; + padding-bottom: 8px; + padding-left: 6px; + padding-right: 6px; +} + +.mytheme .v-table-compact .v-table-caption-container-align-right, .mytheme .v-table-small .v-table-caption-container-align-right { + padding-right: 0; +} + +.mytheme .v-table-compact .v-table-resizer, .mytheme .v-table-small .v-table-resizer { + height: 31px; +} + +.mytheme .v-table-compact .v-table-cell-content, .mytheme .v-table-small .v-table-cell-content { + height: 31px; +} + +.mytheme .v-table-compact .v-table-cell-wrapper, .mytheme .v-table-small .v-table-cell-wrapper { + padding-left: 6px; + padding-right: 6px; +} + +.mytheme .v-table-compact .v-table-cell-wrapper > .v-widget, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget { + margin: 2px -3px; +} + +.mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-label, .mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-checkbox, .mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-select-optiongroup, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-label, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-checkbox, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-select-optiongroup { + margin: 0; +} + +.mytheme .v-table-compact .v-table-cell-wrapper > .v-widget.v-progressbar, .mytheme .v-table-small .v-table-cell-wrapper > .v-widget.v-progressbar { + margin-left: 0; + margin-right: 0; +} + +.mytheme .v-table-compact .v-table-header-cell-asc .v-table-sort-indicator, .mytheme .v-table-compact .v-table-header-cell-desc .v-table-sort-indicator, .mytheme .v-table-small .v-table-header-cell-asc .v-table-sort-indicator, .mytheme .v-table-small .v-table-header-cell-desc .v-table-sort-indicator { + height: 31px; + line-height: 31px; +} + +.mytheme .v-table-compact .v-table-header-drag, .mytheme .v-table-small .v-table-header-drag { + margin-top: -16px; +} + +.mytheme .v-table-compact.v-treetable .v-table-cell-wrapper, .mytheme .v-table-small.v-treetable .v-table-cell-wrapper { + padding-left: 0; + padding-right: 0; + min-height: 16px; +} + +.mytheme .v-table-compact.v-treetable .v-table-cell-content, .mytheme .v-table-small.v-treetable .v-table-cell-content { + padding-left: 6px; + padding-right: 6px; +} + +.mytheme .v-table-compact.v-treetable .v-table-cell-content:first-child, .mytheme .v-table-small.v-treetable .v-table-cell-content:first-child { + padding-left: 7px; +} + +.mytheme .v-table-compact.v-treetable .v-table-footer-container, .mytheme .v-table-small.v-treetable .v-table-footer-container { + padding-left: 6px; + padding-right: 6px; +} + +.mytheme .v-table-compact .v-table-row-drag-top .v-table-cell-content, .mytheme .v-table-compact .v-table-row-drag-bottom .v-table-cell-content, .mytheme .v-table-small .v-table-row-drag-top .v-table-cell-content, .mytheme .v-table-small .v-table-row-drag-bottom .v-table-cell-content { + height: 30px; +} + +.mytheme .v-table-small { + font-size: 14px; +} + +.mytheme .v-table-small.v-treetable .v-table-cell-wrapper { + min-height: 14px; +} + +.mytheme .v-treetable [class*="caption-container"], .mytheme .v-treetable [class*="footer-container"], .mytheme .v-treetable [class*="cell-wrapper"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + padding-left: 0; + padding-right: 0; +} + +.mytheme .v-treetable [class*="caption-container"], .mytheme .v-treetable [class*="footer-container"] { + min-height: 14px; +} + +.mytheme .v-treetable [class*="cell-wrapper"] { + min-height: 16px; +} + +.mytheme .v-treetable [class*="caption-container"] { + padding-left: 12px; +} + +.mytheme .v-treetable [class*="caption-container-align-right"] { + padding-left: 20px; +} + +.mytheme .v-treetable [class*="footer-container"] { + padding-right: 12px; +} + +.mytheme .v-treetable [class*="cell-content"] { + padding-left: 12px; + padding-right: 12px; +} + +.mytheme .v-treetable [class*="cell-content"]:first-child { + padding-left: 13px; +} + +.mytheme .v-treetable-treespacer { + display: inline-block; + position: absolute; + width: 19px !important; + margin-left: -25px; + text-align: center; + cursor: pointer; +} + +.mytheme .v-treetable-node-closed:before { + content: "\f0da"; + font-family: ThemeIcons; +} + +.mytheme .v-treetable-node-open:before { + content: "\f0d7"; + font-family: ThemeIcons; +} + +.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter { + width: 1px; +} + +.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter:after { + left: -6px; + right: -6px; +} + +.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before { + height: 37px; + padding: 0 16px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + height: auto; + padding: 0; + border-radius: 0; + background-color: #fafafa; + background-image: -webkit-linear-gradient(left, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to right,#fafafa 2%, #efefef 98%); +} + +.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:hover:after { + background-color: rgba(186, 186, 186, 0.1); +} + +.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:focus:after { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-hsplitter div:before:active:after { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-splitpanel-horizontal > div > .v-splitpanel-second-container { + margin-left: 1px; +} + +.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter { + height: 1px; +} + +.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter:after { + top: -6px; + bottom: -6px; +} + +.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before { + height: 37px; + padding: 0 16px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + height: auto; + padding: 0; + border-radius: 0; +} + +.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:hover:after { + background-color: rgba(186, 186, 186, 0.1); +} + +.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:focus:after { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-splitpanel-vertical > div > .v-splitpanel-vsplitter div:before:active:after { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter { + width: 12px; +} + +.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter:after { + left: 0px; + right: 0px; +} + +.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before { + height: 37px; + padding: 0 16px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + height: auto; + padding: 0; + border-radius: 0; + background-color: #fafafa; + background-image: -webkit-linear-gradient(left, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to right,#fafafa 2%, #efefef 98%); +} + +.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:hover:after { + background-color: rgba(186, 186, 186, 0.1); +} + +.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:focus:after { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:before:active:after { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-hsplitter div:after { + content: ""; + border: 1px solid #dadada; + border-top-color: #bababa; + border-left-color: #bababa; + position: absolute; + top: 50%; + left: 50%; + width: 0; + height: 37px; + margin-left: -1px; + margin-top: -19px; +} + +.mytheme .v-splitpanel-horizontal.large > div > .v-splitpanel-second-container { + margin-left: 12px; +} + +.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter { + height: 12px; +} + +.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter:after { + top: 0px; + bottom: 0px; +} + +.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before { + height: 37px; + padding: 0 16px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, none; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + height: auto; + padding: 0; + border-radius: 0; +} + +.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:hover:after { + background-color: rgba(186, 186, 186, 0.1); +} + +.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:focus:after { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:before:active:after { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-splitpanel-vertical.large > div > .v-splitpanel-vsplitter div:after { + content: ""; + border: 1px solid #dadada; + border-top-color: #bababa; + border-left-color: #bababa; + position: absolute; + top: 50%; + left: 50%; + width: 37px; + height: 0; + margin-left: -19px; + margin-top: -1px; +} + +.mytheme .v-progressbar-wrapper { + border-radius: 4px; + height: 9px; + background-color: #d4d4d4; + background-image: -webkit-linear-gradient(bottom, #d7d7d7 2%, #c7c7c7 98%); + background-image: linear-gradient(to top,#d7d7d7 2%, #c7c7c7 98%); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + min-width: 74px; +} + +.mytheme .v-progressbar-indicator { + border-radius: 4px; + height: inherit; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + + + border: 1px solid #1362b1; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + max-width: 100%; + min-width: 8px; + -webkit-transition: width 160ms; + -moz-transition: width 160ms; + transition: width 160ms; +} + +.mytheme .v-progressbar-point .v-progressbar-indicator { + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; + border: none; + text-align: right; + overflow: hidden; +} + +.mytheme .v-progressbar-point .v-progressbar-indicator:before { + content: ""; + display: inline-block; + border-radius: 4px; + height: inherit; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + + + border: 1px solid #1362b1; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + max-width: 100%; + width: 9px; + vertical-align: top; +} + +.mytheme .v-progressbar-indeterminate { + height: 24px !important; + width: 24px !important; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 2px solid rgba(25, 125, 225, 0.2); + border-top-color: #197de1; + border-right-color: #197de1; + border-radius: 100%; + -webkit-animation: v-rotate-360 500ms infinite linear; + -moz-animation: v-rotate-360 500ms infinite linear; + animation: v-rotate-360 500ms infinite linear; + pointer-events: none; +} + +.v-ie8 .mytheme .v-progressbar-indeterminate, .v-ie9 .mytheme .v-progressbar-indeterminate { + border: none; + border-radius: 4px; + background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; + background-size: 80%; +} + +.v-ie8 .mytheme .v-progressbar-indeterminate { + min-width: 30px; + min-height: 30px; +} + +.mytheme .v-progressbar-indeterminate .v-progressbar-wrapper { + display: none; +} + +.mytheme .v-slider { + position: relative; +} + +.mytheme .v-slider:focus { + outline: none; +} + +.mytheme .v-slider:focus .v-slider-handle:after { + opacity: 1; +} + +.v-ie8 .mytheme .v-slider:focus .v-slider-handle:after { + visibility: visible; +} + +.mytheme .v-slider.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-slider-base { + border-radius: 4px; + height: 9px; + background-color: #d4d4d4; + background-image: -webkit-linear-gradient(bottom, #d7d7d7 2%, #c7c7c7 98%); + background-image: linear-gradient(to top,#d7d7d7 2%, #c7c7c7 98%); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + min-width: 74px; + height: 6px; + margin: 16px 11px; + white-space: nowrap; + overflow: hidden; + +} + +.mytheme .v-slider-base:before { + content: ""; + position: absolute; + top: 16px; + bottom: 16px; + left: 11px; + width: 8px; + border-radius: 4px; + border-left: 1px solid #1362b1; +} + +.mytheme .v-slider-base:after { + border-radius: 4px; + height: inherit; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + + + border: 1px solid #1362b1; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + max-width: 100%; + content: ""; + display: inline-block; + margin-left: -100%; + width: 100%; + vertical-align: top; +} + +.v-ie8 .mytheme .v-slider-base:after { + position: relative; + left: -11px; +} + +.mytheme .v-has-width > .v-slider-base { + min-width: 0; +} + +.mytheme .v-slider-handle { + margin-top: -16px; + width: 0.1px; + display: inline-block; + vertical-align: top; +} + +.mytheme .v-slider-handle:before { + height: 37px; + padding: 0 16px; + color: #191919; + font-weight: 400; + + + border-radius: 4px; + border: 1px solid #c5c5c5; + border-top-color: #c5c5c5; + border-bottom-color: #bcbcbc; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7, 0 2px 3px rgba(0, 0, 0, 0.05); + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); +} + +.mytheme .v-slider-handle:before:after { + border: inherit; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; +} + +.mytheme .v-slider-handle:before:hover:after { + background-color: rgba(186, 186, 186, 0.1); +} + +.mytheme .v-slider-handle:before:focus:after { + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-slider-handle:before:active:after { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-slider-handle:after { + border: 1px solid #c5c5c5; + border-color: #197de1; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + opacity: 0; + -webkit-transition: opacity 200ms; + -moz-transition: opacity 200ms; + transition: opacity 200ms; +} + +.v-ie8 .mytheme .v-slider-handle:after { + visibility: hidden; +} + +.mytheme .v-slider-handle:before, .mytheme .v-slider-handle:after { + content: ""; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; + width: 22px; + height: 22px; + border-radius: 11px; + position: absolute; + z-index: 1; + margin-top: 8px; + margin-left: -11px; +} + +.mytheme .v-slider-feedback { + background-color: #323232; + background-color: rgba(50, 50, 50, 0.9); + -webkit-box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); + box-shadow: 0 2px 12px rgba(0, 0, 0, 0.2); + color: white; + padding: 5px 9px; + border-radius: 3px; + max-width: 35em; + overflow: hidden !important; + font-size: 14px; +} + +.mytheme .v-slider-vertical { + padding: 11px 0; + height: 96px; +} + +.mytheme .v-slider-vertical .v-slider-base { + background-color: #d4d4d4; + background-image: -webkit-linear-gradient(right, #d7d7d7 2%, #c7c7c7 98%); + background-image: linear-gradient(to left,#d7d7d7 2%, #c7c7c7 98%); + width: 6px; + height: 100% !important; + min-width: 0; + margin: 0 16px; +} + +.mytheme .v-slider-vertical .v-slider-base:before { + top: auto; + bottom: 11px; + left: 16px; + right: 16px; + width: auto; + height: 8px; + border-left: none; + border-bottom: 1px solid #1362b1; +} + +.mytheme .v-slider-vertical .v-slider-base:after { + height: 101%; + margin-left: 0; + background-color: #197de1; + background-image: -webkit-linear-gradient(left, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to right,#1b87e3 2%, #166ed5 98%); +} + +.v-ie8 .mytheme .v-slider-vertical .v-slider-base:after { + top: 11px; + left: 0; + height: 130%; +} + +.mytheme .v-slider-vertical .v-slider-handle { + width: 0; + height: 0.1px; + width: 37px; + display: block; +} + +.mytheme .v-slider-vertical .v-slider-handle:before, .mytheme .v-slider-vertical .v-slider-handle:after { + width: 22px; + height: 22px; + margin-top: -11px; + margin-left: -8px; +} + +.mytheme .v-slider-no-indicator .v-slider-base:before, .mytheme .v-slider-no-indicator .v-slider-base:after { + display: none; +} + +.mytheme .v-tabsheet:not(.v-has-width) { + width: auto !important; +} + +.mytheme .v-tabsheet-spacertd { + display: none !important; +} + +.mytheme .v-tabsheet-tabcontainer { + position: relative; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mytheme .v-tabsheet-tabcontainer:before { + content: ""; + position: absolute; + height: 0; + border-top: 1px solid #dfdfdf; + bottom: 0; + left: 0; + right: 0; +} + +.mytheme .v-tabsheet-tabcontainer .v-tabsheet-tabs { + position: relative; +} + +.mytheme .v-tabsheet-tabitemcell { + vertical-align: bottom; +} + +.mytheme .v-tabsheet-tabitemcell .v-tabsheet-tabitem { + line-height: 0; + overflow: hidden; +} + +.mytheme .v-tabsheet-tabitemcell .v-caption { + margin-left: 19px; + padding: 0 4px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + cursor: pointer; + text-align: center; + line-height: 37px; + font-size: 15px; + font-weight: 300; + color: #696969; + width: auto !important; + overflow: hidden; + text-overflow: ellipsis; + border-bottom: 2px solid transparent; + position: relative; + -webkit-transition: border-bottom 200ms, color 200ms; + -moz-transition: border-bottom 200ms, color 200ms; + transition: border-bottom 200ms, color 200ms; +} + +.mytheme .v-tabsheet-tabitemcell .v-caption .v-captiontext { + display: inline; +} + +.mytheme .v-tabsheet-tabitemcell .v-caption .v-icon + .v-captiontext { + margin-left: 9px; +} + +.mytheme .v-tabsheet-tabitemcell .v-caption:hover { + color: #197de1; +} + +.mytheme .v-tabsheet-tabitemcell .v-caption.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; + cursor: default; + color: inherit !important; +} + +.mytheme .v-tabsheet-tabitemcell:first-child .v-caption, .mytheme .v-tabsheet-tabitemcell[aria-hidden="true"] + td .v-caption { + margin-left: 0; +} + +.mytheme .v-tabsheet-tabitemcell:focus { + outline: none; +} + +.mytheme .v-tabsheet-tabitemcell:focus .v-caption { + color: #197de1; +} + +.mytheme .v-tabsheet-tabitemcell .v-tabsheet-tabitem-selected .v-caption.v-caption { + border-bottom-color: #197de1; + color: #197de1; +} + +.mytheme .v-tabsheet-tabitemcell .v-caption-closable { + padding-right: 22px; +} + +.mytheme .v-tabsheet-tabitemcell.icons-on-top .v-caption-closable { + padding-right: 4px; +} + +.mytheme .v-tabsheet-tabitemcell .v-tabsheet-caption-close { + position: absolute; + right: 0; + top: 50%; + margin: -8px 0 0; + font-size: 18px; + line-height: 18px; + width: 18px; + text-align: center; + border-radius: 2px; + color: #969696; +} + +.mytheme .v-tabsheet-tabitemcell .v-tabsheet-caption-close:hover { + background: rgba(0, 0, 0, 0.03); + color: #197de1; +} + +.mytheme .v-tabsheet-tabitemcell .v-tabsheet-caption-close:active { + background: #197de1; + color: #c8dbed; +} + +.mytheme .v-tabsheet-scroller { + position: absolute; + top: 0; + right: 0; + bottom: 0; + padding-left: 19px; + background-color: transparent; + background-image: -webkit-linear-gradient(right, #fafafa 70%, rgba(250, 250, 250, 0) 100%); + background-image: linear-gradient(to left,#fafafa 70%, rgba(250, 250, 250, 0) 100%); + pointer-events: none; +} + +.mytheme .v-tabsheet-scroller:after { + content: ""; + height: 1px; + position: absolute; + bottom: 0; + left: 0; + right: 0; + display: block; + background-color: transparent; + background-image: -webkit-linear-gradient(right, #dfdfdf 70%, rgba(223, 223, 223, 0) 100%); + background-image: linear-gradient(to left,#dfdfdf 70%, rgba(223, 223, 223, 0) 100%); +} + +.v-ie8 .mytheme .v-tabsheet-scroller, .v-ie9 .mytheme .v-tabsheet-scroller { + background-color: #fafafa; +} + +.v-ie8 .mytheme .v-tabsheet-scroller:after, .v-ie9 .mytheme .v-tabsheet-scroller:after { + background-color: #dfdfdf; +} + +.mytheme .v-tabsheet-scroller button { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + border: none; + background: transparent; + font: inherit; + color: inherit; + height: 100%; + margin: 0; + padding: 0 9px; + outline: none; + cursor: pointer; + pointer-events: auto; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-tabsheet-scroller button:hover { + opacity: 1; + filter: none ; + color: #197de1; +} + +.mytheme .v-tabsheet-scroller button:active { + opacity: 0.7; + filter: alpha(opacity=70) ; + color: #197de1; +} + +.mytheme .v-tabsheet-scroller button::-moz-focus-inner { + padding: 0; + border: 0; +} + +.mytheme .v-tabsheet-scroller [class*="Next"] { + padding-left: 5px; +} + +.mytheme .v-tabsheet-scroller [class*="Next"]:before { + font-family: ThemeIcons; + content: "\f054"; +} + +.mytheme .v-tabsheet-scroller [class*="Prev"] { + padding-right: 5px; +} + +.mytheme .v-tabsheet-scroller [class*="Prev"]:before { + font-family: ThemeIcons; + content: "\f053"; +} + +.mytheme .v-tabsheet-scroller [class*="disabled"] { + cursor: default; + color: inherit !important; + opacity: 0.1 !important; + filter: alpha(opacity=10) !important; +} + +.mytheme .v-tabsheet-tabsheetpanel > .v-scrollable > .v-widget { + -webkit-animation: valo-animate-in-fade 300ms backwards; + -moz-animation: valo-animate-in-fade 300ms backwards; + animation: valo-animate-in-fade 300ms backwards; +} + +.mytheme .v-tabsheet-deco { + height: 20px !important; + width: 20px !important; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 2px solid rgba(25, 125, 225, 0.2); + border-top-color: #197de1; + border-right-color: #197de1; + border-radius: 100%; + -webkit-animation: v-rotate-360 500ms infinite linear; + -moz-animation: v-rotate-360 500ms infinite linear; + animation: v-rotate-360 500ms infinite linear; + pointer-events: none; + display: none; + position: absolute; + z-index: 1; + bottom: 50%; + margin-bottom: -29px; + left: 50%; + margin-left: -10px; +} + +.v-ie8 .mytheme .v-tabsheet-deco, .v-ie9 .mytheme .v-tabsheet-deco { + border: none; + border-radius: 4px; + background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; + background-size: 80%; +} + +.v-ie8 .mytheme .v-tabsheet-deco { + min-width: 30px; + min-height: 30px; +} + +.mytheme .v-tabsheet-loading .v-tabsheet-deco { + display: block; +} + +.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer table, .mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer tbody, .mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer tr { + width: 100%; +} + +.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer tr { + display: table; + table-layout: fixed; +} + +.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer td { + display: table-cell; +} + +.mytheme .v-tabsheet-equal-width-tabs > .v-tabsheet-tabcontainer .v-caption { + margin: 0; + display: block; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption { + margin-left: 4px; + padding: 0 12px; + background-color: #fafafa; + border: 1px solid transparent; + line-height: 36px; + border-radius: 4px 4px 0 0; + font-weight: 400; + -webkit-transition: background-color 160ms; + -moz-transition: background-color 160ms; + transition: background-color 160ms; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption:hover { + background-color: #f2f2f2; + border-bottom-color: #dfdfdf; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption.v-disabled:hover { + background-color: #fafafa; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-caption-closable { + padding-right: 30px; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-tabsheet-caption-close { + top: 4px; + right: 4px; + margin-top: 0; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer td:first-child .v-caption, .mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer [aria-hidden="true"] + td .v-caption { + margin-left: 0; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-tabsheet-tabitem .v-caption { + border-color: #dfdfdf; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-tabcontainer .v-tabsheet-tabitem-selected .v-caption { + background: white; + border-color: #dfdfdf; + border-bottom: none; + padding-bottom: 1px; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-content { + border: 1px solid #dfdfdf; + border-top: none; +} + +.mytheme .v-tabsheet-framed > .v-tabsheet-content > div { + background: white; +} + +.mytheme .v-tabsheet-framed.padded-tabbar > .v-tabsheet-tabcontainer { + border: 1px solid #dfdfdf; + border-bottom: none; + background: #fafafa; + padding-top: 6px; +} + +.mytheme .v-tabsheet-framed.icons-on-top > .v-tabsheet-tabcontainer .v-tabsheet-tabitem-selected .v-caption { + padding-bottom: 7px; +} + +.mytheme .v-tabsheet-centered-tabs > .v-tabsheet-tabcontainer { + text-align: center; +} + +.mytheme .v-tabsheet-right-aligned-tabs > .v-tabsheet-tabcontainer { + text-align: right; +} + +.mytheme .v-tabsheet-padded-tabbar > .v-tabsheet-tabcontainer .v-tabsheet-tabs { + padding: 0 9px; +} + +.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-caption { + padding-top: 6px; + padding-bottom: 6px; + line-height: 1.2; +} + +.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-icon { + display: block; +} + +.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-icon + .v-captiontext.v-captiontext { + margin-left: 0; +} + +.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-caption-closable { + padding-right: 12px; +} + +.mytheme .v-tabsheet-icons-on-top > .v-tabsheet-tabcontainer .v-tabsheet-caption-close { + top: 4px; + margin-top: 0; +} + +.mytheme .v-tabsheet-compact-tabbar > .v-tabsheet-tabcontainer-compact-tabbar .v-caption { + line-height: 1.8; +} + +.mytheme .v-tabsheet-only-selected-closable > .v-tabsheet-tabcontainer .v-tabsheet-caption-close { + visibility: hidden; +} + +.mytheme .v-tabsheet-only-selected-closable > .v-tabsheet-tabcontainer .v-tabsheet-tabitem-selected .v-tabsheet-caption-close { + visibility: visible; +} + +.mytheme .v-colorpicker-popup.v-window { + min-width: 220px !important; +} + +.mytheme .v-colorpicker-popup .v-tabsheet-tabs { + padding: 0 9px; +} + +.mytheme .v-colorpicker-popup [class$="sliders"] { + padding: 12px; +} + +.mytheme .v-colorpicker-popup [class$="sliders"] .v-widget { + width: 100% !important; + vertical-align: middle; +} + +.mytheme .v-colorpicker-popup [class$="sliders"] .v-has-caption { + white-space: nowrap; + padding-left: 48px; +} + +.mytheme .v-colorpicker-popup [class$="sliders"] .v-caption { + display: inline-block; + margin-left: -48px; + width: 48px; +} + +.mytheme .v-colorpicker-popup [class$="sliders"] .v-slot-hue-slider + .v-slot .v-has-caption { + padding-left: 80px; +} + +.mytheme .v-colorpicker-popup [class$="sliders"] .v-slot-hue-slider + .v-slot .v-caption { + margin-left: -80px; + width: 80px; +} + +.mytheme .v-colorpicker-popup .v-slider-red .v-slider-base:after { + background: red; + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-colorpicker-popup .v-slider-green .v-slider-base:after { + background: green; + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-colorpicker-popup .v-slider-blue .v-slider-base:after { + background: blue; + border: none; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-colorpicker-popup .v-margin-bottom { + padding-bottom: 0; +} + +.mytheme .v-colorpicker-popup .resize-button { + width: 100% !important; + height: auto !important; + text-align: center; + outline: none; +} + +.mytheme .v-colorpicker-popup .resize-button:before { + font-family: ThemeIcons; + content: "\f141"; +} + +.mytheme .v-colorpicker-popup .resize-button-caption { + display: none; +} + +.mytheme .v-colorpicker-popup .v-horizontallayout { + height: auto !important; + padding: 9px 0; + background-color: #fafafa; + border-top: 1px solid #ededed; +} + +.mytheme .v-colorpicker-popup .v-horizontallayout .v-expand { + overflow: visible; +} + +.mytheme .v-colorpicker-popup .v-horizontallayout .v-button { + width: 80% !important; +} + +.mytheme .v-colorpicker-preview { + width: 100% !important; + height: auto !important; + padding: 9px; +} + +.mytheme .v-colorpicker-preview-textfield { + height: auto !important; + text-align: center; + border: none; +} + +.mytheme .v-colorpicker { + width: auto; +} + +.mytheme .v-colorpicker-button-color { + position: absolute; + top: 6px; + right: 6px; + bottom: 6px; + left: 6px; + border-radius: 3px; + border: 1px solid rgba(0, 0, 0, 0.5); + max-width: 23px; +} + +.mytheme .v-colorpicker-button-color + .v-button-caption:not(:empty) { + margin-left: 19px; +} + +.v-ie8 .mytheme .v-colorpicker-button-color { + position: relative; + top: auto; + right: auto; + bottom: auto; + left: auto; + width: 16px; + height: 16px; + display: inline-block; + vertical-align: middle; + margin: 0 -8px; +} + +.v-ie8 .mytheme .v-colorpicker-button-color + .v-button-caption { + margin-left: 19px; +} + +.mytheme .v-panel { + background: white; + color: #474747; + border-radius: 4px; + border: 1px solid #d5d5d5; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + overflow: visible !important; +} + +.mytheme .v-panel-caption { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0 12px; + line-height: 36px; + border-bottom: 1px solid #d5d5d5; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #f6f6f6 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #f6f6f6 98%); + color: #464646; + font-weight: 400; + font-size: 14px; + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee; + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + border-radius: 3px 3px 0 0; +} + +.mytheme .v-panel-content { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + height: 100%; +} + +.mytheme .v-panel-content > .v-margin-top { + padding-top: 12px; +} + +.mytheme .v-panel-content > .v-margin-right { + padding-right: 12px; +} + +.mytheme .v-panel-content > .v-margin-bottom { + padding-bottom: 12px; +} + +.mytheme .v-panel-content > .v-margin-left { + padding-left: 12px; +} + +.mytheme .v-panel-borderless { + background: transparent; + color: inherit; + border: none; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-panel-borderless > div > [class*="-caption"] { + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; + color: inherit; + padding: 0; + margin: 0 12px; + border-bottom: none; +} + +.mytheme .v-panel-well { + background: #f5f5f5; + color: #454545; + -webkit-box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 0 0 rgba(255, 255, 255, 0.05), inset 0 2px 3px rgba(0, 0, 0, 0.05); + border-radius: 4px; + border: 1px solid #c5c5c5; +} + +.mytheme .v-panel-well > div > [class*="-caption"] { + background: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-panel-scroll-divider > [class*="-captionwrap"] { + position: relative; + z-index: 2; +} + +.mytheme .v-panel-scroll-divider > [class*="-captionwrap"]:after { + content: ""; + position: absolute; + bottom: -1px; + right: 0; + left: 0; + height: 0; + border-top: 1px solid #dfdfdf; + border-color: rgba(197, 197, 197, 0.5); +} + +.mytheme .v-panel-scroll-divider > [class*="-content"]:before { + content: ""; + position: absolute; + z-index: 2; + top: 0; + height: 0; + border-top: 1px solid #fafafa; + left: 0; + right: 0; +} + +.mytheme .v-panel-caption.v-horizontallayout { + height: auto !important; + line-height: 0; +} + +.mytheme .v-panel-caption.v-horizontallayout .v-slot { + vertical-align: middle; +} + +.mytheme .v-panel-caption.v-horizontallayout .v-label { + line-height: 37px; +} + +.mytheme .v-accordion { + background: white; + color: #474747; + border-radius: 4px; + border: 1px solid #d5d5d5; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #f4f4f4 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #f4f4f4 98%); + overflow: hidden; +} + +.mytheme .v-accordion-item { + position: relative; +} + +.mytheme .v-accordion-item:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} + +.mytheme .v-accordion-item:last-child { + border-bottom-left-radius: 3px; + border-bottom-right-radius: 3px; +} + +.mytheme .v-accordion-item:last-child [class*="item-content"] { + border-radius: inherit; +} + +.mytheme .v-accordion-item[class*="item-open"]:last-child > div > .v-caption { + border-radius: 0; +} + +.mytheme .v-accordion-item:not([class*="item-open"]):last-child > div > .v-caption { + border-bottom: none; + margin-bottom: 0; +} + +.mytheme .v-accordion-item[class*="item-open"] + [class*="item"] { + border-top: 1px solid #d9d9d9; +} + +.mytheme .v-accordion-item-caption { + border-radius: inherit; +} + +.mytheme .v-accordion-item-caption > .v-caption { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0 12px; + line-height: 36px; + border-bottom: 1px solid #d5d5d5; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #f6f6f6 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #f6f6f6 98%); + color: #464646; + font-weight: 400; + font-size: 14px; + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee; + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #eeeeee; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); + display: block; + background: transparent; + border-bottom-color: #c9c9c9; + border-radius: inherit; + cursor: pointer; + position: relative; +} + +.mytheme .v-accordion-item-caption > .v-caption:hover:before, .mytheme .v-accordion-item-caption > .v-caption:active:before { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + border-radius: inherit; +} + +.mytheme .v-accordion-item-caption > .v-caption:hover:before { + background-color: rgba(186, 186, 186, 0.1); + border: none; +} + +.mytheme .v-accordion-item-caption > .v-caption:active:before { + background-color: rgba(125, 125, 125, 0.2); +} + +.mytheme .v-accordion-item-content { + -webkit-box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 3px rgba(0, 0, 0, 0.05); + background-color: white; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +.mytheme .v-accordion-item-content > .v-margin-top { + padding-top: 12px; +} + +.mytheme .v-accordion-item-content > .v-margin-right { + padding-right: 12px; +} + +.mytheme .v-accordion-item-content > .v-margin-bottom { + padding-bottom: 12px; +} + +.mytheme .v-accordion-item-content > .v-margin-left { + padding-left: 12px; +} + +.mytheme .v-accordion-borderless { + border: none; + border-radius: 0; + -webkit-box-shadow: none; + box-shadow: none; +} + +.mytheme .v-accordion-borderless > .v-accordion-item, .mytheme .v-accordion-borderless > .v-accordion-item > div > .v-caption, .mytheme .v-accordion-borderless > .v-accordion-item > .v-accordion-item-content { + border-radius: 0; +} + +.mytheme .v-select-twincol { + white-space: normal; +} + +.mytheme .v-select-twincol select { + border: 1px solid #c5c5c5; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + color: #464646; +} + +.mytheme .v-select-twincol select:focus { + outline: none; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-select-twincol .v-textfield, .mytheme .v-select-twincol .v-nativebutton { + width: auto !important; + margin-top: 9px; +} + +.mytheme .v-select-twincol .v-nativebutton { + margin-left: 9px; +} + +.mytheme .v-select-twincol-caption-left, .mytheme .v-select-twincol-caption-right { + font-size: 14px; + font-weight: 400; + padding-bottom: 0.3em; + padding-left: 1px; +} + +.mytheme .v-select-twincol-buttons { + white-space: nowrap; + display: inline-block; + vertical-align: top; + position: relative; + min-width: 3.5em; +} + +.mytheme .v-select-twincol-buttons .v-button { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + vertical-align: top; + text-align: left; + white-space: normal; + position: absolute; + left: 9px; + right: 9px; + top: 36px; + padding: 0; + text-align: center; +} + +.mytheme .v-select-twincol-buttons .v-button:first-child { + top: 0; +} + +.mytheme .v-select-twincol-buttons .v-button-caption { + display: none; +} + +.mytheme .v-select-twincol-buttons .v-button:focus { + z-index: 1; +} + +.mytheme .v-select-twincol-buttons .v-button:first-child { + border-radius: 4px 4px 0 0; +} + +.mytheme .v-select-twincol-buttons .v-button:last-child { + border-radius: 0 0 4px 4px; +} + +.mytheme .v-select-twincol-buttons .v-button-wrap:before { + font-family: ThemeIcons; + content: "\f053"; +} + +.mytheme .v-select-twincol-buttons .v-button:first-child .v-button-wrap:before { + font-family: ThemeIcons; + content: "\f054"; +} + +.mytheme .v-select-twincol-error .v-select-twincol-options, .mytheme .v-select-twincol-error .v-select-twincol-selections { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.mytheme .v-select select { + border: 1px solid #c5c5c5; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + color: #464646; +} + +.mytheme .v-select select:focus { + outline: none; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-select-select { + display: block; +} + +.mytheme .v-select-select + .v-textfield { + width: auto !important; + margin-top: 9px; +} + +.mytheme .v-select-select + .v-textfield + .v-nativebutton { + margin-top: 9px; + margin-left: 9px; +} + +.mytheme .v-select-error .v-select-select { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.mytheme .v-calendar-header-day { + font-weight: 400; + text-align: center; + padding: 7px 0; +} + +.mytheme .v-calendar-header-week .v-calendar-back, .mytheme .v-calendar-header-week .v-calendar-next { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + background: transparent; + border: none; + padding: 0; + margin: 0; + cursor: pointer; + outline: none; + color: inherit; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-calendar-header-week .v-calendar-back:focus, .mytheme .v-calendar-header-week .v-calendar-next:focus { + outline: none; +} + +.mytheme .v-calendar-header-week .v-calendar-back:hover, .mytheme .v-calendar-header-week .v-calendar-next:hover { + opacity: 1; + filter: none ; +} + +.mytheme .v-calendar-header-week .v-calendar-back:active, .mytheme .v-calendar-header-week .v-calendar-next:active { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-calendar-header-week .v-calendar-back:before { + font-family: ThemeIcons; + content: "\f053"; +} + +.mytheme .v-calendar-header-week .v-calendar-next:before { + font-family: ThemeIcons; + content: "\f054"; +} + +.mytheme .v-calendar-month { + outline: none; + overflow: hidden; +} + +.mytheme .v-calendar-month td { + vertical-align: top; +} + +.mytheme .v-calendar-week-number { + cursor: pointer; + width: 20px; + text-align: center; + font-size: 0.8em; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-calendar-week-number:hover { + opacity: 1; + filter: none ; +} + +.mytheme .v-calendar-month-day { + outline: none; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + line-height: 1.2; +} + +.mytheme .v-calendar-bottom-spacer, .mytheme .v-calendar-spacer, .mytheme .v-calendar-bottom-spacer-empty { + height: 19px; + margin-bottom: 3px; +} + +.mytheme .v-calendar-bottom-spacer { + font-size: 0.8em; + padding: 0 5px; + cursor: pointer; +} + +.mytheme .v-calendar-bottom-spacer:hover { + color: #197de1; +} + +.mytheme .v-calendar-day-number { + line-height: 25px; + font-size: 16px; + text-align: right; + margin: 0 5px; + white-space: nowrap; + border-top: 1px solid #f2f2f2; + cursor: pointer; +} + +.mytheme .v-calendar-day-number:hover { + color: #197de1; +} + +.mytheme .v-calendar-month-day-today { + background: #eef3f8; +} + +.mytheme .v-calendar-month-day-today .v-calendar-day-number { + font-weight: 400; + color: #197de1; + border-top: 2px solid #197de1; + line-height: 24px; + margin: 0; + padding: 0 5px; +} + +.mytheme .v-calendar-month-day-selected { + background-color: #e3edf7; +} + +.mytheme .v-calendar-month-day-dragemphasis { + background-color: #a8a8a8; +} + +.mytheme .v-calendar-month-day-scrollable { + overflow-y: scroll; +} + +.mytheme .v-calendar-weekly-longevents { + margin-left: 50px; + border-bottom: 3px solid #e0e0e0; +} + +.mytheme .v-calendar-weekly-longevents .v-calendar-event-all-day { + height: 22px; + line-height: 1.6; + margin-bottom: 3px; +} + +.mytheme .v-calendar-header-week td { + vertical-align: middle !important; +} + +.mytheme .v-calendar-header-week .v-calendar-header-day { + cursor: pointer; +} + +.mytheme .v-calendar-times { + width: 50px; + font-size: 0.77em; + line-height: 1; + white-space: nowrap; +} + +.mytheme .v-calendar-time { + text-align: right; + padding-right: 9px; + margin-top: -6px; + padding-bottom: 6px; +} + +.mytheme .v-calendar-day-times, .mytheme .v-calendar-day-times-today { + outline: none; + border-right: 1px solid transparent; +} + +.mytheme .v-calendar-day-times:focus, .mytheme .v-calendar-day-times-today:focus { + outline: none; +} + +.mytheme .v-calendar .v-datecellslot, .mytheme .v-calendar .v-datecellslot-even { + border-top: 1px solid #dfdfdf; +} + +.mytheme .v-calendar .v-datecellslot:first-child, .mytheme .v-calendar .v-datecellslot-even:first-child { + border-top-color: transparent; +} + +.mytheme .v-calendar .v-datecellslot { + border-top-style: dotted; +} + +.mytheme .v-calendar .v-datecellslot, .mytheme .v-calendar .v-datecellslot-even { + margin-right: 5px; +} + +.mytheme .v-calendar-current-time { + background: #197de1; + line-height: 1px; + pointer-events: none; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-calendar-current-time:before { + content: "\2022"; + color: #197de1; + font-size: 22px; + margin-left: -0.07em; +} + +.mytheme .v-calendar .v-daterange { + position: relative; +} + +.mytheme .v-calendar .v-daterange:before { + content: ""; + position: absolute; + top: 0; + right: 0; + bottom: -1px; + left: 0; + background: #197de1; + opacity: 0.5; + filter: alpha(opacity=50) ; + border-radius: 4px 4px 0 0; +} + +.mytheme .v-calendar .v-daterange + .v-daterange { + border-color: transparent; +} + +.mytheme .v-calendar .v-daterange + .v-daterange:before { + border-radius: 0; +} + +.mytheme .v-calendar-event { + font-size: 0.85em; + overflow: hidden; + cursor: pointer; + outline: none; + border-radius: 4px; +} + +.mytheme .v-calendar-event:focus { + outline: none; +} + +.mytheme .v-calendar-event-month { + padding: 0 5px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin-bottom: 3px; + white-space: nowrap; + text-overflow: ellipsis; + height: 19px; + line-height: 19px; +} + +.mytheme .v-calendar-event-month .v-calendar-event-time { + float: right; + font-size: 0.9em; + line-height: 19px; + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-calendar-event-month:before { + content: "\25cf"; + margin-right: 0.2em; +} + +.mytheme .v-calendar-event-all-day { + padding: 0 5px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + height: 19px; + line-height: 19px; + border-radius: 0; + margin-left: -1px; + white-space: nowrap; +} + +.mytheme .v-calendar-event-all-day:before { + content: ""; +} + +.mytheme .v-calendar-event-start { + overflow: visible; + margin-left: 0; +} + +.mytheme .v-calendar-event-start.v-calendar-event-continued-to, .mytheme .v-calendar-event-start.v-calendar-event-end { + overflow: hidden; + text-overflow: ellipsis; +} + +.mytheme .v-calendar-event-start { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; + margin-left: 5px; +} + +.mytheme .v-calendar-event-end { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; + margin-right: 5px; +} + +.mytheme .v-calendar-event-caption { + font-weight: 500; + line-height: 1.2; + padding: 5px 0; + position: absolute; + overflow: hidden; + right: 9px; + left: 5px; + bottom: 0; + top: 0; +} + +.mytheme .v-calendar-event-caption span { + font-weight: 300; + white-space: nowrap; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event { + overflow: visible; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event-content { + margin-top: -1px; + border-radius: 5px; + border: 1px solid #fafafa; + padding-top: 3px; + margin-right: 5px; +} + +.mytheme .v-calendar-event-month:before { + color: #00ace0; +} + +.mytheme .v-calendar-event-all-day { + background-color: #c8eaf4; + background-color: rgba(200, 234, 244, 0.8); + color: #00ace0; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event { + color: #00ace0; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event .v-calendar-event-content { + background-color: #c8eaf4; + background-color: rgba(200, 234, 244, 0.8); +} + +.mytheme .v-calendar-event-month[class*="color2"]:before { + color: #2d9f19; +} + +.mytheme .v-calendar-event-all-day[class*="color2"] { + background-color: #d1e7cd; + background-color: rgba(209, 231, 205, 0.8); + color: #2d9f19; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color2"] { + color: #2d9f19; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color2"] .v-calendar-event-content { + background-color: #d1e7cd; + background-color: rgba(209, 231, 205, 0.8); +} + +.mytheme .v-calendar-event-month[class*="color3"]:before { + color: #d18100; +} + +.mytheme .v-calendar-event-all-day[class*="color3"] { + background-color: #f1e1c8; + background-color: rgba(241, 225, 200, 0.8); + color: #d18100; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color3"] { + color: #d18100; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color3"] .v-calendar-event-content { + background-color: #f1e1c8; + background-color: rgba(241, 225, 200, 0.8); +} + +.mytheme .v-calendar-event-month[class*="color4"]:before { + color: #ce3812; +} + +.mytheme .v-calendar-event-all-day[class*="color4"] { + background-color: #f1d3cb; + background-color: rgba(241, 211, 203, 0.8); + color: #ce3812; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color4"] { + color: #ce3812; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color4"] .v-calendar-event-content { + background-color: #f1d3cb; + background-color: rgba(241, 211, 203, 0.8); +} + +.mytheme .v-calendar-event-month[class*="color5"]:before { + color: #2d55cd; +} + +.mytheme .v-calendar-event-all-day[class*="color5"] { + background-color: #d1d9f1; + background-color: rgba(209, 217, 241, 0.8); + color: #2d55cd; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color5"] { + color: #2d55cd; +} + +.mytheme .v-calendar-week-wrapper .v-calendar-event[class*="color5"] .v-calendar-event-content { + background-color: #d1d9f1; + background-color: rgba(209, 217, 241, 0.8); +} + +.mytheme .v-calendar.v-disabled * { + cursor: default; +} + +.mytheme .v-label { + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; +} + +.mytheme .v-label.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-label-undef-w { + white-space: nowrap; +} + +.mytheme h1, .mytheme .v-label-h1, .mytheme h2, .mytheme .v-label-h2, .mytheme h3, .mytheme .v-label-h3 { + line-height: 1.1; + font-weight: 200; + color: #141414; +} + +.mytheme h1, .mytheme .v-label-h1 { + font-size: 2.4em; + margin-top: 1.4em; + margin-bottom: 1em; + + letter-spacing: -0.03em; +} + +.mytheme h2, .mytheme .v-label-h2 { + font-size: 1.6em; + + margin-top: 1.6em; + margin-bottom: 0.77em; + letter-spacing: -0.02em; +} + +.mytheme h3, .mytheme .v-label-h3 { + font-size: 1.2em; + + margin-top: 1.8em; + margin-bottom: 0.77em; + letter-spacing: 0; +} + +.mytheme h4, .mytheme .v-label-h4 { + line-height: 1.1; + font-weight: 500; + font-size: 14px; + color: #414141; + text-transform: uppercase; + letter-spacing: 0; + margin-top: 2.4em; + margin-bottom: 0.8em; +} + +.mytheme .v-csslayout > h1:first-child, .mytheme .v-csslayout > h2:first-child, .mytheme .v-csslayout > h3:first-child, .mytheme .v-csslayout > h4 > .v-label-h1:first-child, .mytheme .v-csslayout > .v-label-h2:first-child, .mytheme .v-csslayout > .v-label-h3:first-child, .mytheme .v-csslayout > .v-label-h4:first-child { + margin-top: 16px; +} + +.mytheme .v-verticallayout > .v-slot:first-child h1, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h1, .mytheme .v-verticallayout > .v-slot:first-child h2, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h2, .mytheme .v-verticallayout > .v-slot:first-child h3, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h3, .mytheme .v-verticallayout > .v-slot:first-child h4, .mytheme .v-verticallayout > .v-slot:first-child .v-label-h4, .mytheme .v-verticallayout > div > .v-slot:first-child h1, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h1, .mytheme .v-verticallayout > div > .v-slot:first-child h2, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h2, .mytheme .v-verticallayout > div > .v-slot:first-child h3, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h3, .mytheme .v-verticallayout > div > .v-slot:first-child h4, .mytheme .v-verticallayout > div > .v-slot:first-child .v-label-h4 { + margin-top: 16px; +} + +.mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h1, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h1, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h2, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h2, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h3, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h3, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell h4, .mytheme .v-verticallayout > .v-slot:first-child .v-formlayout-contentcell .v-label-h4, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h1, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h1, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h2, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h2, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h3, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h3, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell h4, .mytheme .v-verticallayout > div > .v-slot:first-child .v-formlayout-contentcell .v-label-h4 { + margin-top: -0.5em; +} + +.mytheme h1.no-margin, .mytheme .v-label-h1.no-margin, .mytheme h2.no-margin, .mytheme .v-label-h2.no-margin, .mytheme h3.no-margin, .mytheme .v-label-h3.no-margin, .mytheme h4.no-margin, .mytheme .v-label-h4.no-margin { + margin: 0 !important; +} + +.mytheme .v-label-colored { + color: #197de1; +} + +.mytheme .v-label-large { + font-size: 20px; +} + +.mytheme .v-label-small { + font-size: 14px; +} + +.mytheme .v-label-tiny { + font-size: 12px; +} + +.mytheme .v-label-huge { + font-size: 26px; +} + +.mytheme .v-label-bold { + font-weight: 500; +} + +.mytheme .v-label-light { + font-weight: 200; + color: #7d7d7d; +} + +.mytheme .v-label-align-right { + text-align: right; +} + +.mytheme .v-label-align-center { + text-align: center; +} + +.mytheme .v-label-spinner { + height: 24px !important; + width: 24px !important; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 2px solid rgba(25, 125, 225, 0.2); + border-top-color: #197de1; + border-right-color: #197de1; + border-radius: 100%; + -webkit-animation: v-rotate-360 500ms infinite linear; + -moz-animation: v-rotate-360 500ms infinite linear; + animation: v-rotate-360 500ms infinite linear; + pointer-events: none; +} + +.v-ie8 .mytheme .v-label-spinner, .v-ie9 .mytheme .v-label-spinner { + border: none; + border-radius: 4px; + background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; + background-size: 80%; +} + +.v-ie8 .mytheme .v-label-spinner { + min-width: 30px; + min-height: 30px; +} + +.mytheme .v-label-success, .mytheme .v-label-failure { + background: white; + color: #474747; + border: 2px solid #2c9720; + border-radius: 4px; + padding: 7px 19px 7px 37px; + font-weight: 400; + font-size: 15px; +} + +.mytheme .v-label-success:before, .mytheme .v-label-failure:before { + font-family: ThemeIcons; + content: "\f00c"; + margin-right: 0.5em; + margin-left: -19px; + color: #2c9720; +} + +.mytheme .v-label-failure { + border-color: #ed473b; +} + +.mytheme .v-label-failure:before { + content: "\f05e"; + color: #ed473b; +} + +.mytheme [draggable=true] { + -khtml-user-drag: element; + -webkit-user-drag: element; +} + +.mytheme .v-ddwrapper { + position: relative; +} + +.mytheme .v-ddwrapper-over:before, .mytheme .v-ddwrapper-over:after { + content: ""; + position: absolute; + z-index: 10; + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; + border: 0 solid #197de1; +} + +.mytheme .v-ddwrapper-over-top:before { + border-top-width: 2px; +} + +.mytheme .v-ddwrapper-over-right:before { + border-right-width: 2px; +} + +.mytheme .v-ddwrapper-over-bottom:before { + border-bottom-width: 2px; +} + +.mytheme .v-ddwrapper-over-left:before { + border-left-width: 2px; +} + +.mytheme .no-vertical-drag-hints .v-ddwrapper-over-top:before, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-top:before { + border-top-width: 0; +} + +.mytheme .no-vertical-drag-hints .v-ddwrapper-over-top:after, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-top:after { + border-width: 2px; + border-radius: 4px; + opacity: 0.3; + filter: alpha(opacity=30.0) ; + background: #8abef2; +} + +.mytheme .no-vertical-drag-hints .v-ddwrapper-over-bottom:before, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-bottom:before { + border-bottom-width: 0; +} + +.mytheme .no-vertical-drag-hints .v-ddwrapper-over-bottom:after, .mytheme .no-vertical-drag-hints.v-ddwrapper-over-bottom:after { + border-width: 2px; + border-radius: 4px; + opacity: 0.3; + filter: alpha(opacity=30.0) ; + background: #8abef2; +} + +.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-left:before, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-left:before { + border-left-width: 0; +} + +.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-left:after, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-left:after { + border-width: 2px; + border-radius: 4px; + opacity: 0.3; + filter: alpha(opacity=30.0) ; + background: #8abef2; +} + +.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-right:before, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-right:before { + border-right-width: 0; +} + +.mytheme .no-horizontal-drag-hints.v-ddwrapper-over-right:after, .mytheme .no-horizontal-drag-hints .v-ddwrapper-over-right:after { + border-width: 2px; + border-radius: 4px; + opacity: 0.3; + filter: alpha(opacity=30.0) ; + background: #8abef2; +} + +.mytheme .v-ddwrapper-over-middle:after, .mytheme .v-ddwrapper-over-center:after { + border-width: 2px; + border-radius: 4px; + opacity: 0.3; + filter: alpha(opacity=30.0) ; + background: #8abef2; +} + +.mytheme .no-box-drag-hints.v-ddwrapper:after, .mytheme .no-box-drag-hints .v-ddwrapper:after { + display: none !important; + content: none; +} + +.mytheme .v-nativebutton { + -webkit-touch-callout: none; +} + +.mytheme .v-select select { + border: 1px solid #c5c5c5; + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + color: #464646; +} + +.mytheme .v-select select:focus { + outline: none; + -webkit-box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); + box-shadow: 0 0 0 2px rgba(25, 125, 225, 0.5); +} + +.mytheme .v-select-select { + display: block; +} + +.mytheme .v-select-select + .v-textfield { + width: auto !important; + margin-top: 9px; +} + +.mytheme .v-select-select + .v-textfield + .v-nativebutton { + margin-top: 9px; + margin-left: 9px; +} + +.mytheme .v-select-error .v-select-select { + border-color: #ed473b !important; + background: #fffbfb; + color: #6c2621; +} + +.mytheme .v-popupview { + cursor: pointer; + color: #197de1; + text-decoration: underline; + font-weight: inherit; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-popupview:hover { + color: #4396ea; +} + +.mytheme .v-popupview.v-disabled { + opacity: 0.5; + filter: alpha(opacity=50) ; +} + +.mytheme .v-popupview-popup { + padding: 4px 4px; + border-radius: 4px; + background-color: white; + color: #474747; + -webkit-box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + box-shadow: 0 4px 10px 0 rgba(0, 0, 0, 0.1), 0 3px 5px 0 rgba(0, 0, 0, 0.05), 0 0 0 1px rgba(0, 0, 0, 0.09098); + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; +} + +.mytheme .v-popupview-popup[class*="animate-in"] { + -webkit-animation: v-popupview-animate-in 120ms; + -moz-animation: v-popupview-animate-in 120ms; + animation: v-popupview-animate-in 120ms; +} + +.mytheme .v-popupview-popup[class*="animate-out"] { + -webkit-animation: valo-animate-out-fade 120ms; + -moz-animation: valo-animate-out-fade 120ms; + animation: valo-animate-out-fade 120ms; +} + +.mytheme .v-popupview-popup .popupContent > .v-margin-top { + padding-top: 12px; +} + +.mytheme .v-popupview-popup .popupContent > .v-margin-right { + padding-right: 12px; +} + +.mytheme .v-popupview-popup .popupContent > .v-margin-bottom { + padding-bottom: 12px; +} + +.mytheme .v-popupview-popup .popupContent > .v-margin-left { + padding-left: 12px; +} + +.mytheme .v-popupview-loading { + margin: 12px 12px; + height: 24px !important; + width: 24px !important; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + border: 2px solid rgba(25, 125, 225, 0.2); + border-top-color: #197de1; + border-right-color: #197de1; + border-radius: 100%; + -webkit-animation: v-rotate-360 500ms infinite linear; + -moz-animation: v-rotate-360 500ms infinite linear; + animation: v-rotate-360 500ms infinite linear; + pointer-events: none; +} + +.v-ie8 .mytheme .v-popupview-loading, .v-ie9 .mytheme .v-popupview-loading { + border: none; + border-radius: 4px; + background: #fff url(../valo/shared/img/spinner.gif) no-repeat 50% 50%; + background-size: 80%; +} + +.v-ie8 .mytheme .v-popupview-loading { + min-width: 30px; + min-height: 30px; +} + +.mytheme .v-richtextarea { + -webkit-appearance: none; + -moz-appearance: none; + -ms-appearance: none; + -o-appearance: none; + appearance: none; + -webkit-user-select: text; + -moz-user-select: text; + -ms-user-select: text; + user-select: text; + margin: 0; + font: inherit; + + font-weight: 400; + line-height: normal; + height: 37px; + border-radius: 4px; + padding: 0; + border: 1px solid #c5c5c5; + background: white; + color: #474747; + -webkit-box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 #f7f7f7, 0 1px 0 rgba(255, 255, 255, 0.1); + -webkit-transition: box-shadow 180ms, border 180ms; + -moz-transition: box-shadow 180ms, border 180ms; + transition: box-shadow 180ms, border 180ms; + height: auto; + overflow: hidden; +} + +.v-ie8 .mytheme .v-richtextarea, .v-ie9 .mytheme .v-richtextarea { + line-height: 37px; + padding-top: 0; + padding-bottom: 0; +} + +.mytheme .v-richtextarea[class*="prompt"] { + color: #a3a3a3; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar { + background-color: #fafafa; + background-image: -webkit-linear-gradient(top, #fafafa 2%, #efefef 98%); + background-image: linear-gradient(to bottom,#fafafa 2%, #efefef 98%); + -webkit-box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; + box-shadow: inset 0 1px 0 white, inset 0 -1px 0 #e7e7e7; + border-bottom: 1px solid #c5c5c5; + color: #464646; +} + +.mytheme .v-richtextarea .gwt-ToggleButton, .mytheme .v-richtextarea .gwt-PushButton { + display: inline-block; + line-height: 37px; + width: 37px; + text-align: center; + outline: none; +} + +.mytheme .v-richtextarea .gwt-ToggleButton:hover, .mytheme .v-richtextarea .gwt-PushButton:hover { + color: black; +} + +.mytheme .v-richtextarea .gwt-ToggleButton-down, .mytheme .v-richtextarea .gwt-ToggleButton-down-hovering { + background-color: #e0e0e0; + background-image: -webkit-linear-gradient(bottom, #e0e0e0 2%, #dcdcdc 98%); + background-image: linear-gradient(to top,#e0e0e0 2%, #dcdcdc 98%); +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top img { + display: none; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div:before { + font-family: ThemeIcons; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Bold"]:before { + content: "\f032"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Italic"]:before { + content: "\f033"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Underline"]:before { + content: "\f0cd"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Subscript"]:before { + content: "\f12c"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Superscript"]:before { + content: "\f12b"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Left Justify"]:before { + content: "\f036"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Center"]:before { + content: "\f037"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Right Justify"]:before { + content: "\f038"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Toggle Strikethrough"]:before { + content: "\f0cc"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Indent Right"]:before { + content: "\f03c"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Indent Left"]:before { + content: "\f03b"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Horizontal Rule"]:before { + content: "\2014"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Ordered List"]:before { + content: "\f0cb"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Unordered List"]:before { + content: "\f0ca"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Insert Image"]:before { + content: "\f03e"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Create Link"]:before { + content: "\f0c1"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Remove Link"]:before { + content: "\f127"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-top div[title="Remove Formatting"]:before { + content: "\f12d"; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-bottom { + font-size: 13px; + padding: 0 9px 9px 0; +} + +.mytheme .v-richtextarea .gwt-RichTextToolbar-bottom select { + margin: 9px 0 0 9px; +} + +.mytheme .v-richtextarea .gwt-RichTextArea { + background: #fff; + border: none; + display: block; +} + +.mytheme .v-richtextarea-readonly { + padding: 5px 7px; + background: transparent; +} + +.mytheme .v-upload .v-button { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + vertical-align: top; + text-align: left; + white-space: normal; +} + +.mytheme .v-upload-immediate .v-button { + width: 100%; +} + +.mytheme .v-upload-immediate input[type="file"] { + opacity: 0; + filter: alpha(opacity=0) ; + z-index: -1; + position: absolute; + right: 0; + height: 37px; + text-align: right; + border: none; + background: transparent; +} + +.mytheme .v-Notification.v-position-top { + top: 12px; +} + +.mytheme .v-Notification.v-position-right { + right: 12px; +} + +.mytheme .v-Notification.v-position-bottom { + bottom: 12px; +} + +.mytheme .v-Notification.v-position-left { + left: 12px; +} + +.mytheme .v-Notification.v-position-assistive { + top: -9999px; + left: -9999px; +} + +.mytheme .v-Notification-animate-in { + -webkit-animation: valo-animate-in-fade 180ms 10ms backwards; + -moz-animation: valo-animate-in-fade 180ms 10ms backwards; + animation: valo-animate-in-fade 180ms 10ms backwards; +} + +.mytheme .v-Notification-animate-in.v-position-top { + -webkit-animation: valo-animate-in-slide-down 400ms 10ms backwards; + -moz-animation: valo-animate-in-slide-down 400ms 10ms backwards; + animation: valo-animate-in-slide-down 400ms 10ms backwards; +} + +.mytheme .v-Notification-animate-in.v-position-bottom { + -webkit-animation: valo-animate-in-slide-up 400ms 10ms backwards; + -moz-animation: valo-animate-in-slide-up 400ms 10ms backwards; + animation: valo-animate-in-slide-up 400ms 10ms backwards; +} + +.mytheme .v-Notification-animate-out { + -webkit-animation: valo-animate-out-fade 150ms; + -moz-animation: valo-animate-out-fade 150ms; + animation: valo-animate-out-fade 150ms; +} + +.mytheme .v-Notification-animate-out.v-position-top, .mytheme .v-Notification-animate-out.v-position-bottom { + -webkit-animation: valo-animate-out-slide-down-fade 200ms; + -moz-animation: valo-animate-out-slide-down-fade 200ms; + animation: valo-animate-out-slide-down-fade 200ms; +} + +.mytheme .v-Notification { + border-radius: 4px; + text-align: center; + position: fixed !important; + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + backface-visibility: hidden; + background: white; + -webkit-box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.15); + box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.15); + padding: 19px 22px; +} + +.mytheme .v-Notification .v-Notification-caption { + color: #197de1; + font-size: 19px; + line-height: 1; +} + +.mytheme .v-Notification .v-Notification-description { + line-height: 1.4; +} + +.mytheme .v-Notification-caption { + margin: 0; + display: inline-block; + text-align: left; + font-weight: inherit; + line-height: inherit; + white-space: nowrap; + letter-spacing: 0; +} + +.mytheme .v-Notification-description, .mytheme .v-Notification-details { + margin: 0; + display: inline-block; + vertical-align: middle; + max-width: 30em; + text-align: left; + max-height: 20em; + overflow: auto; +} + +.mytheme .v-Notification-caption ~ .v-Notification-description, .mytheme .v-Notification-caption ~ .v-Notification-details { + margin-left: 24px; +} + +.mytheme .v-icon + .v-Notification-caption { + margin-left: 16px; +} + +.mytheme .v-Notification-system { + left: 0 !important; + right: 0; + max-width: 100%; + margin: 0 !important; + border-radius: 0; + -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); + padding: 12px 15px; + background-color: #444; + background-color: rgba(68, 68, 68, 0.9); + font-weight: 400; + line-height: 22px; +} + +.mytheme .v-Notification-system .v-Notification-description, .mytheme .v-Notification-system .v-Notification-details { + max-width: 50em; +} + +.mytheme .v-Notification-system.v-position-top { + top: 0; +} + +.mytheme .v-Notification-system.v-position-top[class*="animate-in"] { + -webkit-animation: valo-animate-in-slide-down 300ms 10ms backwards; + -moz-animation: valo-animate-in-slide-down 300ms 10ms backwards; + animation: valo-animate-in-slide-down 300ms 10ms backwards; +} + +.mytheme .v-Notification-system.v-position-top[class*="animate-out"] { + -webkit-animation: valo-animate-out-slide-up 200ms; + -moz-animation: valo-animate-out-slide-up 200ms; + animation: valo-animate-out-slide-up 200ms; +} + +.mytheme .v-Notification-system.v-position-bottom { + bottom: 0; +} + +.mytheme .v-Notification-system.v-position-bottom[class*="animate-in"] { + -webkit-animation: valo-animate-in-slide-up 300ms 10ms backwards; + -moz-animation: valo-animate-in-slide-up 300ms 10ms backwards; + animation: valo-animate-in-slide-up 300ms 10ms backwards; +} + +.mytheme .v-Notification-system.v-position-bottom[class*="animate-out"] { + -webkit-animation: valo-animate-out-slide-down 200ms; + -moz-animation: valo-animate-out-slide-down 200ms; + animation: valo-animate-out-slide-down 200ms; +} + +.mytheme .v-Notification-system .v-Notification-caption { + color: #fff; + vertical-align: middle; +} + +.mytheme .v-Notification-system .v-Notification-description, .mytheme .v-Notification-system .v-Notification-details { + color: #e6e6e6; +} + +.mytheme .v-Notification-system u { + text-decoration: none; +} + +.mytheme .v-Notification.tray { + text-align: left; +} + +.mytheme .v-Notification.tray .v-Notification-caption + .v-Notification-description { + display: block; + margin: 0.5em 0 0; +} + +.mytheme .v-Notification.warning { + background: #FFF3D2; +} + +.mytheme .v-Notification.warning .v-Notification-caption { + color: #AC7C00; +} + +.mytheme .v-Notification.warning .v-Notification-description { + color: #9D874D; +} + +.mytheme .v-Notification.error { + background: #ed473b; + font-weight: 400; + -webkit-box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.25); + box-shadow: 0px 5px 15px 0px rgba(0, 0, 0, 0.25); +} + +.mytheme .v-Notification.error .v-Notification-caption { + color: white; +} + +.mytheme .v-Notification.error .v-Notification-description { + color: #f4e0df; +} + +.mytheme .v-Notification.dark { + background-color: #444; + background-color: rgba(68, 68, 68, 0.9); + font-weight: 400; + line-height: 22px; +} + +.mytheme .v-Notification.dark .v-Notification-caption { + color: #fff; + vertical-align: middle; +} + +.mytheme .v-Notification.dark .v-Notification-description, .mytheme .v-Notification.dark .v-Notification-details { + color: #e6e6e6; +} + +.mytheme .v-Notification.bar { + left: 0 !important; + right: 0; + max-width: 100%; + margin: 0 !important; + border-radius: 0; + -webkit-box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 0 20px 0 rgba(0, 0, 0, 0.25); + padding: 12px 15px; +} + +.mytheme .v-Notification.bar .v-Notification-description, .mytheme .v-Notification.bar .v-Notification-details { + max-width: 50em; +} + +.mytheme .v-Notification.bar.v-position-top { + top: 0; +} + +.mytheme .v-Notification.bar.v-position-top[class*="animate-in"] { + -webkit-animation: valo-animate-in-slide-down 300ms 10ms backwards; + -moz-animation: valo-animate-in-slide-down 300ms 10ms backwards; + animation: valo-animate-in-slide-down 300ms 10ms backwards; +} + +.mytheme .v-Notification.bar.v-position-top[class*="animate-out"] { + -webkit-animation: valo-animate-out-slide-up 200ms; + -moz-animation: valo-animate-out-slide-up 200ms; + animation: valo-animate-out-slide-up 200ms; +} + +.mytheme .v-Notification.bar.v-position-bottom { + bottom: 0; +} + +.mytheme .v-Notification.bar.v-position-bottom[class*="animate-in"] { + -webkit-animation: valo-animate-in-slide-up 300ms 10ms backwards; + -moz-animation: valo-animate-in-slide-up 300ms 10ms backwards; + animation: valo-animate-in-slide-up 300ms 10ms backwards; +} + +.mytheme .v-Notification.bar.v-position-bottom[class*="animate-out"] { + -webkit-animation: valo-animate-out-slide-down 200ms; + -moz-animation: valo-animate-out-slide-down 200ms; + animation: valo-animate-out-slide-down 200ms; +} + +.mytheme .v-Notification.small { + padding: 11px 13px; +} + +.mytheme .v-Notification.small .v-Notification-caption { + font-size: 16px; +} + +.mytheme .v-Notification.small .v-Notification-description { + font-size: 14px; +} + +.mytheme .v-Notification.closable { + padding-right: 59px; + overflow: hidden !important; + cursor: pointer; +} + +.mytheme .v-Notification.closable:after { + content: "\00d7"; + font-size: 1.5em; + position: absolute; + top: 50%; + margin-top: -12px; + right: 12px; + width: 25px; + height: 25px; + line-height: 24px; + cursor: pointer; + color: #000; + opacity: 0.5; + filter: alpha(opacity=50) ; + text-align: center; + border: 1px solid #000; + border-color: rgba(0, 0, 0, 0.3); + border-radius: 50%; + -webkit-transition: opacity 200ms; + -moz-transition: opacity 200ms; + transition: opacity 200ms; +} + +.mytheme .v-Notification.closable:hover:after { + opacity: 1; + filter: none ; +} + +.mytheme .v-Notification.closable:active:after { + background-color: #000; + color: #fff; + opacity: 0.3; + filter: alpha(opacity=30.0) ; + -webkit-transition: none 200ms; + -moz-transition: none 200ms; + transition: none 200ms; +} + +.mytheme .v-Notification.closable.dark:after, .mytheme .v-Notification.closable.error:after, .mytheme .v-Notification.closable.system:after { + color: #fff; + border-color: #fff; + border-color: rgba(255, 255, 255, 0.3); +} + +.mytheme .v-Notification.closable.dark:active:after, .mytheme .v-Notification.closable.error:active:after, .mytheme .v-Notification.closable.system:active:after { + background-color: #fff; + color: #000; +} + +.mytheme .v-Notification.closable.tray:after { + top: 16px; + margin-top: 0; +} + +.mytheme .v-Notification.success, .mytheme .v-Notification.failure { + background: #fff; + color: #555; + border: 2px solid #2c9720; +} + +.mytheme .v-Notification.success .v-Notification-caption, .mytheme .v-Notification.failure .v-Notification-caption { + color: #2c9720; + font-weight: 400; +} + +.mytheme .v-Notification.success .v-Notification-caption:before, .mytheme .v-Notification.failure .v-Notification-caption:before { + font-family: ThemeIcons; + content: "\f00c"; + margin-right: 0.5em; +} + +.mytheme .v-Notification.success.bar, .mytheme .v-Notification.failure.bar { + margin: -2px !important; +} + +.mytheme .v-Notification.failure { + border-color: #ed473b; +} + +.mytheme .v-Notification.failure .v-Notification-caption { + color: #ed473b; +} + +.mytheme .v-Notification.failure .v-Notification-caption:before { + content: "\f05e"; +} + +.mytheme .valo-menu { + height: 100%; + background-color: #4b4b4b; + background-image: -webkit-linear-gradient(right, #414141 0%, #4b4b4b 9px); + background-image: linear-gradient(to left,#414141 0%, #4b4b4b 9px); + color: #a5a5a5; + font-size: 14px; + line-height: 30px; + border-right: 1px solid #3b3b3b; + white-space: nowrap; +} + +.mytheme .valo-menu-toggle { + display: none; + position: fixed; + z-index: 200; + top: 3px; + left: 3px; + min-width: 0; +} + +.mytheme .valo-menu-part { + border-left: 1px solid #414141; + height: 100%; + padding-bottom: 37px; + overflow: auto; +} + +.mytheme .valo-menu-part:first-child { + border-left: none; +} + +.mytheme .valo-menu-title, .mytheme .valo-menu-subtitle, .mytheme .valo-menu-item { + display: block; + line-height: inherit; + white-space: nowrap; + position: relative; +} + +.mytheme .valo-menu-title .valo-menu-badge, .mytheme .valo-menu-subtitle .valo-menu-badge, .mytheme .valo-menu-item .valo-menu-badge { + position: absolute; + right: 19px; +} + +.mytheme .valo-menu-title { + line-height: 1.2; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + color: white; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); + padding: 12px 19px; + font-size: 14px; + border-bottom: 1px solid #1362b1; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + text-align: center; +} + +.mytheme .valo-menu-title .v-menubar.v-menubar { + background: transparent; + border-color: #1362b1; + color: inherit; + -webkit-box-shadow: none; + box-shadow: none; + text-shadow: inherit; +} + +.mytheme .valo-menu-title .v-menubar-menuitem { + background: transparent; + -webkit-box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca; + box-shadow: inset 0 1px 0 #4d98e6, inset 0 -1px 0 #166bca; + text-shadow: inherit; + font-size: 16px; + border-color: inherit; +} + +.mytheme .valo-menu-title h1, .mytheme .valo-menu-title .v-label-h1, .mytheme .valo-menu-title h2, .mytheme .valo-menu-title .v-label-h2, .mytheme .valo-menu-title h3, .mytheme .valo-menu-title .v-label-h3, .mytheme .valo-menu-title h4, .mytheme .valo-menu-title .v-label-h4 { + margin-top: 0; + margin-bottom: 0; + color: inherit; +} + +.mytheme .v-menubar-user-menu { + border: none; + border-radius: 0; + padding: 1px; + -webkit-box-shadow: none; + box-shadow: none; + text-shadow: none; + background: transparent; + color: inherit; + margin: 19px 7px; + display: block; + overflow: hidden; + text-align: center; + height: auto; + color: inherit; +} + +.mytheme .v-menubar-user-menu:focus:after { + display: none; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem { + -webkit-box-shadow: none; + box-shadow: none; + border: none; + margin-right: 1px; + border-radius: 4px; + color: #197de1; + padding: 0 12px; + -webkit-transition: color 140ms; + -moz-transition: color 140ms; + transition: color 140ms; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem:first-child, .mytheme .v-menubar-user-menu .v-menubar-menuitem:last-child, .mytheme .v-menubar-user-menu .v-menubar-menuitem:first-child:last-child { + border-radius: 4px; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem:before { + content: none; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem:hover { + color: #4396ea; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem:active { + color: inherit; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem-checked, .mytheme .v-menubar-user-menu .v-menubar-menuitem-checked:first-child { + border: 1px solid #c5c5c5; + color: #197de1; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem-checked .v-menubar-menuitem-caption, .mytheme .v-menubar-user-menu .v-menubar-menuitem-checked:first-child .v-menubar-menuitem-caption { + position: relative; + top: -1px; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem-selected { + color: #ecf2f8; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.05); +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem-selected:hover { + color: #ecf2f8; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem-disabled, .mytheme .v-menubar-user-menu .v-menubar-menuitem-disabled:hover { + color: inherit; +} + +.mytheme .v-menubar-user-menu > .v-menubar-menuitem { + color: inherit; + white-space: normal; + line-height: 1.4; + margin: 0; +} + +.mytheme .v-menubar-user-menu > .v-menubar-menuitem img.v-icon { + width: 56px; + height: 56px; + border-radius: 29px; + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + display: block; + margin: 0 auto 0.3em; + border: 1px solid #c5c5c5; +} + +.mytheme .v-menubar-user-menu > .v-menubar-menuitem:after { + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +.mytheme .v-menubar-user-menu .v-menubar-menuitem-selected { + background: transparent; +} + +.mytheme .valo-menu-subtitle { + color: #868686; + margin: 7px 0 7px 19px; + border-bottom: 1px solid #666666; +} + +.mytheme .valo-menu-subtitle [class*="badge"] { + color: #73a5d7; +} + +.mytheme .valo-menuitems { + display: block; +} + +.mytheme .valo-menu-item { + outline: none; + font-weight: 400; + padding: 0 37px 0 19px; + cursor: pointer; + position: relative; + overflow: hidden; + text-shadow: 0 2px 0 rgba(0, 0, 0, 0.05); + -webkit-transition: background-color 300ms, color 60ms; + -moz-transition: background-color 300ms, color 60ms; + transition: background-color 300ms, color 60ms; +} + +.mytheme .valo-menu-item [class*="caption"] { + vertical-align: middle; + display: inline-block; + width: 90%; + max-width: 15em; + padding-right: 19px; + text-overflow: ellipsis; + overflow: hidden; +} + +.mytheme .valo-menu-item [class*="badge"] { + color: #73a5d7; +} + +.mytheme .valo-menu-item.selected { + background: #434343; +} + +.mytheme .valo-menu-item.selected .v-icon { + color: #197de1; +} + +.mytheme .valo-menu-item.selected [class*="badge"] { + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + color: #c8dbed; +} + +.mytheme .valo-menu-item:focus, .mytheme .valo-menu-item:hover, .mytheme .valo-menu-item.selected { + color: white; +} + +.mytheme .valo-menu-item span.v-icon { + min-width: 1em; + margin-right: 19px; + text-align: center; + vertical-align: middle; + -webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(black), to(rgba(0, 0, 0, 0.75))); +} + +.mytheme .valo-menu-item span.v-icon + span { + margin-left: 0; +} + +.mytheme .valo-menu-item [class*="badge"] { + background-color: #585858; + -webkit-transition: background-color 300ms; + -moz-transition: background-color 300ms; + transition: background-color 300ms; + line-height: 1; + padding: 4px 6px; + min-width: 11px; + text-align: center; + top: 4px; + border-radius: 4px; +} + +.mytheme .valo-menu-part.large-icons { + background-color: #4b4b4b; + min-width: 74px; + max-width: 111px; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-title { + font-size: 12px; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-title .v-label-undef-w { + white-space: normal; +} + +.mytheme .valo-menu-part.large-icons .v-menubar-user-menu { + margin-left: 0; + margin-right: 0; + font-size: 11px; +} + +.mytheme .valo-menu-part.large-icons .v-menubar-user-menu img.v-icon { + width: 28px; + height: 28px; +} + +.mytheme .valo-menu-part.large-icons [class*="subtitle"] { + margin: 9px 0 0; + padding: 7px 25px 7px 9px; + line-height: 1; + border: none; + text-overflow: ellipsis; + overflow: hidden; + background: #3c3c3c; + font-size: 13px; + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); +} + +.mytheme .valo-menu-part.large-icons [class*="subtitle"] [class*="badge"] { + right: 9px; +} + +.mytheme .valo-menu-part.large-icons [class*="subtitle"] + .valo-menu-item { + border-top: none; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-item { + display: block; + font-size: 26px; + line-height: 1; + padding: 12px; + text-align: center; + border-top: 1px solid #555555; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-item:first-child { + border-top: none; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-item [class*="caption"] { + display: block; + width: auto; + margin: 0.3em 0 0; + padding: 0; + font-size: 11px; + line-height: 1.3; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-item .v-icon { + margin: 0; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-item span.v-icon { + opacity: 0.8; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-item.selected { + background: #434343; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-item.selected .v-icon { + opacity: 1; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-item.selected [class*="badge"] { + border-color: #434343; +} + +.mytheme .valo-menu-part.large-icons .valo-menu-item [class*="badge"] { + padding-left: 4px; + padding-right: 4px; + top: 7px; + right: 7px; + border: 2px solid #4b4b4b; +} + +.mytheme .valo-menu-logo { + display: block; + overflow: hidden; + width: 44px !important; + height: 44px; + border-radius: 4px; + text-align: center; + background-color: #197de1; + background-image: -webkit-linear-gradient(top, #1b87e3 2%, #166ed5 98%); + background-image: linear-gradient(to bottom,#1b87e3 2%, #166ed5 98%); + color: white; + font-size: 25px; + line-height: 44px; + margin: 19px auto; + -webkit-box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); +} + +.mytheme .valo-menu-logo:focus { + outline: none; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part { + background-color: #4b4b4b; + min-width: 74px; + max-width: 111px; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-title { + font-size: 12px; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-title .v-label-undef-w { + white-space: normal; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .v-menubar-user-menu { + margin-left: 0; + margin-right: 0; + font-size: 11px; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .v-menubar-user-menu img.v-icon { + width: 28px; + height: 28px; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part [class*="subtitle"] { + margin: 9px 0 0; + padding: 7px 25px 7px 9px; + line-height: 1; + border: none; + text-overflow: ellipsis; + overflow: hidden; + background: #3c3c3c; + font-size: 13px; + box-shadow: 0 2px 3px rgba(0, 0, 0, 0.05); +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part [class*="subtitle"] [class*="badge"] { + right: 9px; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part [class*="subtitle"] + .valo-menu-item { + border-top: none; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item { + display: block; + font-size: 26px; + line-height: 1; + padding: 12px; + text-align: center; + border-top: 1px solid #555555; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item:first-child { + border-top: none; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item [class*="caption"] { + display: block; + width: auto; + margin: 0.3em 0 0; + padding: 0; + font-size: 11px; + line-height: 1.3; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item .v-icon { + margin: 0; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item span.v-icon { + opacity: 0.8; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item.selected { + background: #434343; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item.selected .v-icon { + opacity: 1; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item.selected [class*="badge"] { + border-color: #434343; +} + +.mytheme .valo-menu-responsive[width-range~="801px-1100px"] .valo-menu-part .valo-menu-item [class*="badge"] { + padding-left: 4px; + padding-right: 4px; + top: 7px; + right: 7px; + border: 2px solid #4b4b4b; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] { + padding-top: 37px; + -webkit-box-sizing: border-box; + box-sizing: border-box; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .v-loading-indicator { + top: 37px; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] > .v-widget { + position: relative !important; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu { + border-right: none; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-part { + overflow: visible; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-toggle { + display: inline-block; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-title { + position: fixed; + z-index: 100; + top: 0; + left: 0; + right: 0; + height: 37px !important; + padding-top: 0; + padding-bottom: 0; + -webkit-backface-visibility: hidden; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu .v-menubar-user-menu { + position: fixed; + z-index: 100; + top: 0; + right: 0; + margin: 0; + padding: 0; + height: 37px; + color: #97bee5; + max-width: 30%; + -webkit-backface-visibility: hidden; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu .v-menubar-user-menu .v-menubar-menuitem { + line-height: 36px; + white-space: nowrap; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu .v-menubar-user-menu img.v-icon { + display: inline-block; + margin: 0 6px 0 0; + width: 19px; + height: 19px; + border-radius: 10px; + border: none; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menuitems { + height: 100%; + background-color: #4b4b4b; + background-image: -webkit-linear-gradient(right, #414141 0%, #4b4b4b 9px); + background-image: linear-gradient(to left,#414141 0%, #4b4b4b 9px); + color: #a5a5a5; + font-size: 14px; + line-height: 30px; + border-right: 1px solid #3b3b3b; + white-space: nowrap; + position: fixed; + z-index: 9000; + top: 37px; + bottom: 0; + height: auto; + max-width: 100%; + overflow: auto; + padding: 19px 0; + -webkit-transform: translatex(-100%); + -moz-transform: translatex(-100%); + -ms-transform: translatex(-100%); + -o-transform: translatex(-100%); + transform: translatex(-100%); + -webkit-transition: all 300ms; + -moz-transition: all 300ms; + transition: all 300ms; +} + +.mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-visible .valo-menuitems, .mytheme .valo-menu-responsive[width-range~="0-800px"] .valo-menu-hover:hover .valo-menuitems { + -webkit-transform: translatex(0%); + -moz-transform: translatex(0%); + -ms-transform: translatex(0%); + -o-transform: translatex(0%); + transform: translatex(0%); +} + +.mytheme .valo-menu-responsive[width-range~="0-500px"] .valo-menu-toggle .v-button-caption { + display: none; +} + +.mytheme .valo-menu-responsive[width-range~="0-500px"] .valo-menu .v-menubar-user-menu .v-menubar-menuitem-caption { + display: inline-block; + width: 19px; + overflow: hidden; +} \ No newline at end of file From bfd84477ee18459cc62eaaf8ad230ad5d0b9addb Mon Sep 17 00:00:00 2001 From: Harsha Veeravalli Date: Thu, 29 Aug 2019 06:46:47 +0200 Subject: [PATCH 065/396] [BAEL-3211] Generate Integers within a range in Java (#7668) * [BAEL-3211] Generate Integers within a range in Java * [BAEL-3211] Generate Integers within a range in Java * Moved files from java-numbers to java-numbers-2 --- .../numbersinrange/NumbersInARange.java | 36 ++++++++++++++++ .../numbersinrange/RandomNumbersInARange.java | 22 ++++++++++ .../NumbersInARangeUnitTest.java | 43 +++++++++++++++++++ .../RandomNumbersInARangeUnitTest.java | 35 +++++++++++++++ 4 files changed, 136 insertions(+) create mode 100644 java-numbers-2/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java create mode 100644 java-numbers-2/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java create mode 100644 java-numbers-2/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java create mode 100644 java-numbers-2/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java diff --git a/java-numbers-2/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java b/java-numbers-2/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java new file mode 100644 index 0000000000..937583cdb5 --- /dev/null +++ b/java-numbers-2/src/main/java/com/baeldung/numbersinrange/NumbersInARange.java @@ -0,0 +1,36 @@ +package com.baeldung.numbersinrange; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class NumbersInARange { + + public List getNumbersInRange(int start, int end) { + List result = new ArrayList<>(); + for (int i = start; i < end; i++) { + result.add(i); + } + return result; + } + + public List getNumbersUsingIntStreamRange(int start, int end) { + return IntStream.range(start, end) + .boxed() + .collect(Collectors.toList()); + } + + public List getNumbersUsingIntStreamRangeClosed(int start, int end) { + return IntStream.rangeClosed(start, end) + .boxed() + .collect(Collectors.toList()); + } + + public List getNumbersUsingIntStreamIterate(int start, int limit) { + return IntStream.iterate(start, i -> i + 1) + .limit(limit) + .boxed() + .collect(Collectors.toList()); + } +} diff --git a/java-numbers-2/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java b/java-numbers-2/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java new file mode 100644 index 0000000000..dc6ddfe781 --- /dev/null +++ b/java-numbers-2/src/main/java/com/baeldung/numbersinrange/RandomNumbersInARange.java @@ -0,0 +1,22 @@ +package com.baeldung.numbersinrange; + +import java.util.Random; + +public class RandomNumbersInARange { + + public int getRandomNumber(int min, int max) { + return (int) ((Math.random() * (max - min)) + min); + } + + public int getRandomNumberUsingNextInt(int min, int max) { + Random random = new Random(); + return random.nextInt(max - min) + min; + } + + public int getRandomNumberUsingInts(int min, int max) { + Random random = new Random(); + return random.ints(min, max) + .findFirst() + .getAsInt(); + } +} diff --git a/java-numbers-2/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java new file mode 100644 index 0000000000..3225257166 --- /dev/null +++ b/java-numbers-2/src/test/java/com/baeldung/numbersinrange/NumbersInARangeUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.numbersinrange; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +public class NumbersInARangeUnitTest { + + @Test + public void givenTheRange1To10_andUsingForLoop_thenExpectCorrectResult() { + NumbersInARange numbersInARange = new NumbersInARange(); + List numbers = numbersInARange.getNumbersInRange(1, 10); + + assertEquals(Arrays.asList(1,2,3,4,5,6,7,8,9), numbers); + } + + @Test + public void givenTheRange1To10_andUsingIntStreamRange_thenExpectCorrectResult() { + NumbersInARange numbersInARange = new NumbersInARange(); + List numbers = numbersInARange.getNumbersUsingIntStreamRange(1, 10); + + assertEquals(Arrays.asList(1,2,3,4,5,6,7,8,9), numbers); + } + + @Test + public void givenTheRange1To10_andUsingIntStreamRangeClosed_thenExpectCorrectResult() { + NumbersInARange numbersInARange = new NumbersInARange(); + List numbers = numbersInARange.getNumbersUsingIntStreamRangeClosed(1, 10); + + assertEquals(Arrays.asList(1,2,3,4,5,6,7,8,9,10), numbers); + } + + @Test + public void givenTheRange1To10_andUsingIntStreamIterate_thenExpectCorrectResult() { + NumbersInARange numbersInARange = new NumbersInARange(); + List numbers = numbersInARange.getNumbersUsingIntStreamIterate(1, 10); + + assertEquals(Arrays.asList(1,2,3,4,5,6,7,8,9,10), numbers); + } +} diff --git a/java-numbers-2/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java new file mode 100644 index 0000000000..77b2cbbfef --- /dev/null +++ b/java-numbers-2/src/test/java/com/baeldung/numbersinrange/RandomNumbersInARangeUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.numbersinrange; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class RandomNumbersInARangeUnitTest { + + @Test + public void givenTheRange1To10_andUsingMathRandom_thenExpectCorrectResult() { + RandomNumbersInARange randomNumbersInARange = new RandomNumbersInARange(); + int number = randomNumbersInARange.getRandomNumber(1, 10); + + assertTrue(number >= 1); + assertTrue(number < 10); + } + + @Test + public void givenTheRange1To10_andUsingRandomInts_thenExpectCorrectResult() { + RandomNumbersInARange randomNumbersInARange = new RandomNumbersInARange(); + int number = randomNumbersInARange.getRandomNumberUsingInts(1, 10); + + assertTrue(number >= 1); + assertTrue(number < 10); + } + + @Test + public void givenTheRange1To10_andUsingRandomNextInt_thenExpectCorrectResult() { + RandomNumbersInARange randomNumbersInARange = new RandomNumbersInARange(); + int number = randomNumbersInARange.getRandomNumberUsingNextInt(1, 10); + + assertTrue(number >= 1); + assertTrue(number < 10); + } +} From 6b76d5ed0e7bb3eecea0bb3c564f0159353b1c48 Mon Sep 17 00:00:00 2001 From: Devender Kumar <47500074+kumar-devender@users.noreply.github.com> Date: Thu, 29 Aug 2019 10:36:53 +0200 Subject: [PATCH 066/396] adde validation group code (#7646) * Added cascading type mudule * fix compile error * updated dependency version in pom * Added BigDecimal validation classes * Updated test cases * Remove syso from test cases * Updated test cases * Added validation group code * Added validation group code * Added validation group code --- .../validationgroup/AdvanceInfo.java | 5 + .../validationgroup/BasicInfo.java | 5 + .../validationgroup/RegistrationForm.java | 99 +++++++++++++++++++ .../bigdecimal/InvoiceUnitTest.java | 9 +- .../RegistrationFormUnitTest.java | 80 +++++++++++++++ 5 files changed, 195 insertions(+), 3 deletions(-) create mode 100644 javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java create mode 100644 javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java create mode 100644 javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java create mode 100644 javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java new file mode 100644 index 0000000000..4d5df052c2 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java @@ -0,0 +1,5 @@ +package org.baeldung.javabeanconstraints.validationgroup; + +public interface AdvanceInfo { + +} diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java new file mode 100644 index 0000000000..4564a7a702 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java @@ -0,0 +1,5 @@ +package org.baeldung.javabeanconstraints.validationgroup; + +public interface BasicInfo { + +} diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java new file mode 100644 index 0000000000..57c06648a7 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java @@ -0,0 +1,99 @@ +package org.baeldung.javabeanconstraints.validationgroup; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; + +public class RegistrationForm { + @NotBlank(groups=BasicInfo.class) + private String firstName; + @NotBlank(groups=BasicInfo.class) + private String lastName; + @Email(groups=BasicInfo.class) + private String email; + @NotBlank(groups=BasicInfo.class) + private String phone; + + @NotBlank(groups=AdvanceInfo.class) + private String street; + @NotBlank(groups=AdvanceInfo.class) + private String houseNumber; + @NotBlank(groups=AdvanceInfo.class) + private String zipCode; + @NotBlank(groups=AdvanceInfo.class) + private String city; + @NotBlank(groups=AdvanceInfo.class) + private String contry; + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getHouseNumber() { + return houseNumber; + } + + public void setHouseNumber(String houseNumber) { + this.houseNumber = houseNumber; + } + + public String getZipCode() { + return zipCode; + } + + public void setZipCode(String zipCode) { + this.zipCode = zipCode; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public String getContry() { + return contry; + } + + public void setContry(String contry) { + this.contry = contry; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + +} diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java index 525dd7d1ad..860177f4c9 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java @@ -26,7 +26,8 @@ public class InvoiceUnitTest { Invoice invoice = new Invoice(new BigDecimal(10.21), "Book purchased"); Set> violations = validator.validate(invoice); assertThat(violations.size()).isEqualTo(1); - violations.forEach(action-> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)")); + violations.forEach(action-> assertThat(action.getMessage()) + .isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)")); } @Test @@ -41,7 +42,8 @@ public class InvoiceUnitTest { Invoice invoice = new Invoice(new BigDecimal(1021.21), "Book purchased"); Set> violations = validator.validate(invoice); assertThat(violations.size()).isEqualTo(1); - violations.forEach(action-> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)")); + violations.forEach(action-> assertThat(action.getMessage()) + .isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)")); } @Test @@ -49,7 +51,8 @@ public class InvoiceUnitTest { Invoice invoice = new Invoice(new BigDecimal(000.00), "Book purchased"); Set> violations = validator.validate(invoice); assertThat(violations.size()).isEqualTo(1); - violations.forEach(action-> assertThat(action.getMessage()).isEqualTo("must be greater than 0.0")); + violations.forEach(action-> assertThat(action.getMessage()) + .isEqualTo("must be greater than 0.0")); } @Test diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java new file mode 100644 index 0000000000..91792a0c7e --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java @@ -0,0 +1,80 @@ +package org.baeldung.javabeanconstraints.validationgroup; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +import org.junit.BeforeClass; +import org.junit.Test; + +public class RegistrationFormUnitTest { + private static Validator validator; + + @BeforeClass + public static void setupValidatorInstance() { + validator = Validation.buildDefaultValidatorFactory().getValidator(); + } + + @Test + public void whenBasicInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForBasicInfo() { + RegistrationForm form = buildRegistrationFormWithBasicInfo(); + form.setFirstName(""); + Set> violations = validator.validate(form, BasicInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath().toString()).isEqualTo("firstName"); + }); + } + + @Test + public void whenAdvanceInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForAdvanceInfo() { + RegistrationForm form = buildRegistrationFormWithAdvanceInfo(); + form.setZipCode(""); + Set> violations = validator.validate(form, AdvanceInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath().toString()).isEqualTo("zipCode"); + }); + } + + @Test + public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolations() { + RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); + Set> violations = validator.validate(form); + assertThat(violations.size()).isEqualTo(0); + } + + private RegistrationForm buildRegistrationFormWithBasicInfo() { + RegistrationForm form = new RegistrationForm(); + form.setFirstName("devender"); + form.setLastName("kumar"); + form.setEmail("anyemail@yopmail.com"); + form.setPhone("12345"); + return form; + } + + private RegistrationForm buildRegistrationFormWithAdvanceInfo() { + RegistrationForm form = new RegistrationForm(); + return popultaeAdvanceInfo(form); + } + + private RegistrationForm popultaeAdvanceInfo(RegistrationForm form) { + form.setCity("Berlin"); + form.setContry("DE"); + form.setStreet("alexa str."); + form.setZipCode("19923"); + form.setHouseNumber("2a"); + return form; + } + + private RegistrationForm buildRegistrationFormWithBasicAndAdvanceInfo() { + RegistrationForm form = buildRegistrationFormWithBasicInfo(); + return popultaeAdvanceInfo(form); + } +} From 52a90adf92e086cab6d2900064ed257f9ca070d8 Mon Sep 17 00:00:00 2001 From: maryarm Date: Thu, 29 Aug 2019 16:25:30 +0430 Subject: [PATCH 067/396] BAEL-3009: Apply review notes and formatting standards. --- spring-5-reactive-client/pom.xml | 2 +- .../WebClientLoggingIntegrationTest.java | 4 +- .../reactive/logging/filters/LogFilters.java | 41 +++++++++++++---- .../logging/jetty/RequestLogEnhancer.java | 46 ++++++++++--------- .../reactive/logging/netty/CustomLogger.java | 35 ++++++++------ 5 files changed, 80 insertions(+), 48 deletions(-) diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index 5e9fdd9fb4..70771f6832 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -1,6 +1,6 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-5-reactive-client spring-5-reactive-client diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java index bb88502132..d5f1ef77a0 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -116,7 +116,9 @@ public class WebClientLoggingIntegrationTest { reactor.netty.http.client.HttpClient httpClient = HttpClient .create() - .tcpConfiguration(tcpClient -> tcpClient.bootstrap(b -> BootstrapHandlers.updateLogSupport(b, new CustomLogger(HttpClient.class)))); + .tcpConfiguration( + tc -> tc.bootstrap( + b -> BootstrapHandlers.updateLogSupport(b, new CustomLogger(HttpClient.class)))); WebClient .builder() .clientConnector(new ReactorClientHttpConnector(httpClient)) diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java index 8bb4c2aecd..c1c3d3e895 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/filters/LogFilters.java @@ -8,26 +8,47 @@ import reactor.core.publisher.Mono; @Slf4j public class LogFilters { - public static List prepareFilters(){ - return Arrays.asList(ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { - if ( log.isDebugEnabled()) { - StringBuilder sb = new StringBuilder("Request: \n").append(clientRequest.method()).append(" ").append(clientRequest.url()); + public static List prepareFilters() { + return Arrays.asList(logRequest(), logResponse()); + } + + private static ExchangeFilterFunction logRequest() { + return ExchangeFilterFunction.ofRequestProcessor(clientRequest -> { + if (log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Request: \n") + .append(clientRequest.method()) + .append(" ") + .append(clientRequest.url()); clientRequest .headers() - .forEach((name, values) -> values.forEach(value -> sb.append("\n").append(name).append(":").append(value))); + .forEach((name, values) -> values.forEach(value -> sb + .append("\n") + .append(name) + .append(":") + .append(value))); log.debug(sb.toString()); } return Mono.just(clientRequest); - }), ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { - if ( log.isDebugEnabled()) { - StringBuilder sb = new StringBuilder("Response: \n").append("Status: ").append(clientResponse.rawStatusCode()); + }); + } + + private static ExchangeFilterFunction logResponse() { + return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> { + if (log.isDebugEnabled()) { + StringBuilder sb = new StringBuilder("Response: \n") + .append("Status: ") + .append(clientResponse.rawStatusCode()); clientResponse .headers() .asHttpHeaders() - .forEach((key, value1) -> value1.forEach(value -> sb.append("\n").append(key).append(":").append(value))); + .forEach((key, value1) -> value1.forEach(value -> sb + .append("\n") + .append(key) + .append(":") + .append(value))); log.debug(sb.toString()); } return Mono.just(clientResponse); - })); + }); } } diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java index 334faf2c91..ac333feb6c 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java @@ -27,7 +27,9 @@ public class RequestLogEnhancer { .append(header) .append("\n"); }); - request.onRequestContent((theRequest, content) -> group.append(toString(content, getCharset(theRequest.getHeaders())))); + request.onRequestContent((theRequest, content) -> { + group.append(toString(content, getCharset(theRequest.getHeaders()))); + }); request.onRequestSuccess(theRequest -> { log.debug(group.toString()); group.delete(0, group.length()); @@ -35,13 +37,15 @@ public class RequestLogEnhancer { group.append("\n"); request.onResponseBegin(theResponse -> { group - .append("Response \n ") + .append("Response \n") .append(theResponse.getVersion()) .append(" ") .append(theResponse.getStatus()); - if (theResponse.getReason() != null) group - .append(" ") - .append(theResponse.getReason()); + if (theResponse.getReason() != null) { + group + .append(" ") + .append(theResponse.getReason()); + } group.append("\n"); }); request.onResponseHeaders(theResponse -> { @@ -50,39 +54,39 @@ public class RequestLogEnhancer { .append(header) .append("\n"); }); - request.onResponseContent((theResponse, content) -> group.append(toString(content, getCharset(theResponse.getHeaders())))); + request.onResponseContent((theResponse, content) -> { + group.append(toString(content, getCharset(theResponse.getHeaders()))); + }); request.onResponseSuccess(theResponse -> { log.debug(group.toString()); }); return request; } - - private String toString(ByteBuffer buffer, Charset charset) - { + private String toString(ByteBuffer buffer, Charset charset) { byte[] bytes; if (buffer.hasArray()) { bytes = new byte[buffer.capacity()]; - System.arraycopy(buffer.array(), 0, bytes, 0, buffer.capacity() ); - } - else - { + System.arraycopy(buffer.array(), 0, bytes, 0, buffer.capacity()); + } else { bytes = new byte[buffer.remaining()]; buffer.get(bytes, 0, bytes.length); } return new String(bytes, charset); } - private Charset getCharset(HttpFields headers) { String contentType = headers.get(HttpHeader.CONTENT_TYPE); - if (contentType == null) return StandardCharsets.UTF_8; - String[] tokens = contentType - .toLowerCase(Locale.US) - .split("charset="); - if (tokens.length != 2) return StandardCharsets.UTF_8; - String encoding = tokens[1].replaceAll("[;\"]", ""); - return Charset.forName(encoding); + if (contentType != null) { + String[] tokens = contentType + .toLowerCase(Locale.US) + .split("charset="); + if (tokens.length == 2) { + String encoding = tokens[1].replaceAll("[;\"]", ""); + return Charset.forName(encoding); + } + } + return StandardCharsets.UTF_8; } } diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java index df7c65f33f..529549f99b 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java @@ -3,35 +3,40 @@ package com.baeldung.reactive.logging.netty; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.logging.LoggingHandler; -import io.netty.util.internal.PlatformDependent; import java.nio.charset.Charset; +import static io.netty.util.internal.PlatformDependent.allocateUninitializedArray; +import static java.lang.Math.max; +import static java.nio.charset.Charset.defaultCharset; + public class CustomLogger extends LoggingHandler { public CustomLogger(Class clazz) { super(clazz); } @Override - protected String format(ChannelHandlerContext ctx, String eventName, Object arg) { + protected String format(ChannelHandlerContext ctx, String event, Object arg) { if (arg instanceof ByteBuf) { ByteBuf msg = (ByteBuf) arg; - return decodeString(msg, msg.readerIndex(), msg.readableBytes(), Charset.defaultCharset()); + return decode(msg, msg.readerIndex(), msg.readableBytes(), defaultCharset()); } return ""; } - private String decodeString(ByteBuf src, int readerIndex, int len, Charset charset) { - if (len == 0) return ""; - byte[] array; - int offset; - if (src.hasArray()) { - array = src.array(); - offset = src.arrayOffset() + readerIndex; - } else { - array = PlatformDependent.allocateUninitializedArray(Math.max(len, 1024)); - offset = 0; - src.getBytes(readerIndex, array, 0, len); + private String decode(ByteBuf src, int readerIndex, int len, Charset charset) { + if (len != 0) { + byte[] array; + int offset; + if (src.hasArray()) { + array = src.array(); + offset = src.arrayOffset() + readerIndex; + } else { + array = allocateUninitializedArray(max(len, 1024)); + offset = 0; + src.getBytes(readerIndex, array, 0, len); + } + return new String(array, offset, len, charset); } - return new String(array, offset, len, charset); + return ""; } } From e8f83431b3fe473dacefad23f44b74c28fe126b1 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 29 Aug 2019 20:16:51 +0530 Subject: [PATCH 068/396] BAEL-17341 Slice 8 | The top 100 articles should have their own package in the module (#7664) --- .../ApacheCommonsEncodeDecodeUnitTest.java | 2 +- .../Java8EncodeDecodeUnitTest.java | 2 +- .../StringToByteArrayUnitTest.java | 2 +- .../baeldung/{spring => security}/SecurityJavaConfig.java | 6 +++--- .../MySavedRequestAwareAuthenticationSuccessHandler.java | 2 +- .../security/{ => web}/RestAuthenticationEntryPoint.java | 2 +- .../java/org/baeldung/SpringContextIntegrationTest.java | 2 +- .../src/test/java/org/baeldung/SpringContextTest.java | 2 +- .../org/baeldung/web/AsyncControllerIntegrationTest.java | 2 +- 9 files changed, 11 insertions(+), 11 deletions(-) rename java-strings-2/src/test/java/com/baeldung/{java8/base64 => base64encodinganddecoding}/ApacheCommonsEncodeDecodeUnitTest.java (97%) rename java-strings-2/src/test/java/com/baeldung/{java8/base64 => base64encodinganddecoding}/Java8EncodeDecodeUnitTest.java (98%) rename java-strings-2/src/test/java/com/baeldung/{java8/base64 => base64encodinganddecoding}/StringToByteArrayUnitTest.java (97%) rename spring-security-rest/src/main/java/org/baeldung/{spring => security}/SecurityJavaConfig.java (94%) rename spring-security-rest/src/main/java/org/baeldung/security/{ => web}/MySavedRequestAwareAuthenticationSuccessHandler.java (98%) rename spring-security-rest/src/main/java/org/baeldung/security/{ => web}/RestAuthenticationEntryPoint.java (95%) diff --git a/java-strings-2/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/ApacheCommonsEncodeDecodeUnitTest.java similarity index 97% rename from java-strings-2/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java rename to java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/ApacheCommonsEncodeDecodeUnitTest.java index 7889e6ad53..a0fc845d52 100644 --- a/java-strings-2/src/test/java/com/baeldung/java8/base64/ApacheCommonsEncodeDecodeUnitTest.java +++ b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/ApacheCommonsEncodeDecodeUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8.base64; +package com.baeldung.base64encodinganddecoding; import org.apache.commons.codec.binary.Base64; import org.junit.Test; diff --git a/java-strings-2/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java similarity index 98% rename from java-strings-2/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java rename to java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java index 62cfa4c0a1..191a3628e8 100644 --- a/java-strings-2/src/test/java/com/baeldung/java8/base64/Java8EncodeDecodeUnitTest.java +++ b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/Java8EncodeDecodeUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8.base64; +package com.baeldung.base64encodinganddecoding; import org.junit.Test; diff --git a/java-strings-2/src/test/java/com/baeldung/java8/base64/StringToByteArrayUnitTest.java b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/StringToByteArrayUnitTest.java similarity index 97% rename from java-strings-2/src/test/java/com/baeldung/java8/base64/StringToByteArrayUnitTest.java rename to java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/StringToByteArrayUnitTest.java index c5f7051c25..e2bb7bb64d 100644 --- a/java-strings-2/src/test/java/com/baeldung/java8/base64/StringToByteArrayUnitTest.java +++ b/java-strings-2/src/test/java/com/baeldung/base64encodinganddecoding/StringToByteArrayUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8.base64; +package com.baeldung.base64encodinganddecoding; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; diff --git a/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java b/spring-security-rest/src/main/java/org/baeldung/security/SecurityJavaConfig.java similarity index 94% rename from spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java rename to spring-security-rest/src/main/java/org/baeldung/security/SecurityJavaConfig.java index cc023110b6..74623080b5 100644 --- a/spring-security-rest/src/main/java/org/baeldung/spring/SecurityJavaConfig.java +++ b/spring-security-rest/src/main/java/org/baeldung/security/SecurityJavaConfig.java @@ -1,7 +1,7 @@ -package org.baeldung.spring; +package org.baeldung.security; -import org.baeldung.security.MySavedRequestAwareAuthenticationSuccessHandler; -import org.baeldung.security.RestAuthenticationEntryPoint; +import org.baeldung.security.web.MySavedRequestAwareAuthenticationSuccessHandler; +import org.baeldung.security.web.RestAuthenticationEntryPoint; import org.baeldung.web.error.CustomAccessDeniedHandler; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; diff --git a/spring-security-rest/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java b/spring-security-rest/src/main/java/org/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java similarity index 98% rename from spring-security-rest/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java rename to spring-security-rest/src/main/java/org/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java index 6018264632..c56568e979 100644 --- a/spring-security-rest/src/main/java/org/baeldung/security/MySavedRequestAwareAuthenticationSuccessHandler.java +++ b/spring-security-rest/src/main/java/org/baeldung/security/web/MySavedRequestAwareAuthenticationSuccessHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package org.baeldung.security.web; import java.io.IOException; diff --git a/spring-security-rest/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java b/spring-security-rest/src/main/java/org/baeldung/security/web/RestAuthenticationEntryPoint.java similarity index 95% rename from spring-security-rest/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java rename to spring-security-rest/src/main/java/org/baeldung/security/web/RestAuthenticationEntryPoint.java index e448e6537f..643e2f0575 100644 --- a/spring-security-rest/src/main/java/org/baeldung/security/RestAuthenticationEntryPoint.java +++ b/spring-security-rest/src/main/java/org/baeldung/security/web/RestAuthenticationEntryPoint.java @@ -1,4 +1,4 @@ -package org.baeldung.security; +package org.baeldung.security.web; import java.io.IOException; diff --git a/spring-security-rest/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-security-rest/src/test/java/org/baeldung/SpringContextIntegrationTest.java index e2e9f2af2b..ae0d80bb45 100644 --- a/spring-security-rest/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-security-rest/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -1,7 +1,7 @@ package org.baeldung; +import org.baeldung.security.SecurityJavaConfig; import org.baeldung.spring.ClientWebConfig; -import org.baeldung.spring.SecurityJavaConfig; import org.baeldung.spring.WebConfig; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-security-rest/src/test/java/org/baeldung/SpringContextTest.java b/spring-security-rest/src/test/java/org/baeldung/SpringContextTest.java index d984cf5c35..11586ce670 100644 --- a/spring-security-rest/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-security-rest/src/test/java/org/baeldung/SpringContextTest.java @@ -1,7 +1,7 @@ package org.baeldung; +import org.baeldung.security.SecurityJavaConfig; import org.baeldung.spring.ClientWebConfig; -import org.baeldung.spring.SecurityJavaConfig; import org.baeldung.spring.WebConfig; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-security-rest/src/test/java/org/baeldung/web/AsyncControllerIntegrationTest.java b/spring-security-rest/src/test/java/org/baeldung/web/AsyncControllerIntegrationTest.java index a09c225a4a..1e5e1b7d85 100644 --- a/spring-security-rest/src/test/java/org/baeldung/web/AsyncControllerIntegrationTest.java +++ b/spring-security-rest/src/test/java/org/baeldung/web/AsyncControllerIntegrationTest.java @@ -1,7 +1,7 @@ package org.baeldung.web; +import org.baeldung.security.SecurityJavaConfig; import org.baeldung.spring.ClientWebConfig; -import org.baeldung.spring.SecurityJavaConfig; import org.baeldung.spring.WebConfig; import org.baeldung.web.controller.AsyncController; import org.junit.Before; From f24178a39f73f8879bf7d2b7d20e799ccb30332a Mon Sep 17 00:00:00 2001 From: amit2103 Date: Fri, 30 Aug 2019 00:53:00 +0530 Subject: [PATCH 069/396] [BAEL-16768] - Fixed the integrations tests in spring-boot-persistence-mongodb --- .../MongoDbAutoGeneratedFieldIntegrationTest.java | 9 ++++++--- .../baeldung/mongodb/MongoDbSpringIntegrationTest.java | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java index cec1ad5fea..e20a229f36 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java @@ -1,18 +1,21 @@ package com.baeldung.mongodb; -import com.baeldung.mongodb.daos.UserRepository; -import com.baeldung.mongodb.models.User; +import static org.assertj.core.api.Assertions.assertThat; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; -import static org.assertj.core.api.Assertions.assertThat; +import com.baeldung.mongodb.daos.UserRepository; +import com.baeldung.mongodb.models.User; @RunWith(SpringRunner.class) @SpringBootTest +@DirtiesContext public class MongoDbAutoGeneratedFieldIntegrationTest { @Autowired diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java index 954bae3684..cbb2bf45d7 100644 --- a/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java @@ -8,6 +8,7 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.data.mongo.DataMongoTest; import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -18,6 +19,7 @@ import com.mongodb.DBObject; @ContextConfiguration(classes = SpringBootPersistenceApplication.class) @DataMongoTest @ExtendWith(SpringExtension.class) +@DirtiesContext public class MongoDbSpringIntegrationTest { @DisplayName("Given object When save object using MongoDB template Then object can be found") @Test From d3a6a7e0342f6d039cd5570670e6b96fffd1bf5d Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Fri, 30 Aug 2019 20:19:46 +0430 Subject: [PATCH 070/396] Sample Codes for Counting Sort in Java (#7684) * Added the code samples. * Updated the Readme. --- algorithms-sorting/README.md | 1 + .../algorithms/counting/CountingSort.java | 48 +++++++++++++++++++ .../counting/CountingSortUnitTest.java | 32 +++++++++++++ 3 files changed, 81 insertions(+) create mode 100644 algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java create mode 100644 algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md index 48c75f88cd..968d51aecf 100644 --- a/algorithms-sorting/README.md +++ b/algorithms-sorting/README.md @@ -6,3 +6,4 @@ - [Insertion Sort in Java](https://www.baeldung.com/java-insertion-sort) - [Heap Sort in Java](https://www.baeldung.com/java-heap-sort) - [Shell Sort in Java](https://www.baeldung.com/java-shell-sort) +- [Counting Sort in Java](https://www.baeldung.com/java-counting-sort) diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java new file mode 100644 index 0000000000..823f372849 --- /dev/null +++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/counting/CountingSort.java @@ -0,0 +1,48 @@ +package com.baeldung.algorithms.counting; + +import java.util.Arrays; +import java.util.stream.IntStream; + +public class CountingSort { + + public static int[] sort(int[] input, int k) { + verifyPreconditions(input, k); + if (input.length == 0) return input; + + int[] c = countElements(input, k); + int[] sorted = new int[input.length]; + for (int i = input.length - 1; i >= 0; i--) { + int current = input[i]; + sorted[c[current] - 1] = current; + c[current] -= 1; + } + + return sorted; + } + + static int[] countElements(int[] input, int k) { + int[] c = new int[k + 1]; + Arrays.fill(c, 0); + for (int i : input) { + c[i] += 1; + } + + for (int i = 1; i < c.length; i++) { + c[i] += c[i - 1]; + } + return c; + } + + private static void verifyPreconditions(int[] input, int k) { + if (input == null) { + throw new IllegalArgumentException("Input is required"); + } + + int min = IntStream.of(input).min().getAsInt(); + int max = IntStream.of(input).max().getAsInt(); + + if (min < 0 || max > k) { + throw new IllegalArgumentException("The input numbers should be between zero and " + k); + } + } +} diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java new file mode 100644 index 0000000000..ec6cf0784e --- /dev/null +++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/counting/CountingSortUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.algorithms.counting; + +import java.util.Arrays; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; + +import org.junit.jupiter.api.Test; + +class CountingSortUnitTest { + + @Test + void countElements_GivenAnArray_ShouldCalculateTheFrequencyArrayAsExpected() { + int k = 5; + int[] input = { 4, 3, 2, 5, 4, 3, 5, 1, 0, 2, 5 }; + + int[] c = CountingSort.countElements(input, k); + int[] expected = { 1, 2, 4, 6, 8, 11 }; + assertArrayEquals(expected, c); + } + + @Test + void sort_GivenAnArray_ShouldSortTheInputAsExpected() { + int k = 5; + int[] input = { 4, 3, 2, 5, 4, 3, 5, 1, 0, 2, 5 }; + + int[] sorted = CountingSort.sort(input, k); + + // Our sorting algorithm and Java's should return the same result + Arrays.sort(input); + assertArrayEquals(input, sorted); + } +} \ No newline at end of file From ff871516eefbf199d76e2583e7a454410d353e5f Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sat, 31 Aug 2019 11:38:35 +0100 Subject: [PATCH 071/396] [BAEL-16669] moved testing-modules/testing modules into relevant folders --- assertion-libraries/pom.xml | 81 ++++ .../main/java/com/baeldung}/assertj/Dog.java | 2 +- .../java/com/baeldung}/assertj/Member.java | 2 +- .../java/com/baeldung}/assertj/Person.java | 2 +- .../com/baeldung}/assertj/custom/Person.java | 2 +- .../main/java/com/baeldung/jspec/Animal.java | 0 .../main/java/com/baeldung/jspec/Cage.java | 0 .../src/main/java/com/baeldung/jspec/Cat.java | 0 .../src/main/java/com/baeldung/jspec/Dog.java | 0 .../java/com/baeldung/junit/Calculator.java | 0 .../main/java/com/baeldung}/truth/User.java | 2 +- .../java/com/baeldung}/truth/UserSubject.java | 2 +- .../assertj/AssertJConditionUnitTest.java | 2 +- .../assertj/AssertJCoreUnitTest.java | 2 +- .../assertj/AssertJGuavaUnitTest.java | 2 +- .../assertj/AssertJJava8UnitTest.java | 2 +- .../AssertJCustomAssertionsUnitTest.java | 4 +- .../baeldung}/assertj/custom/Assertions.java | 2 +- .../assertj/custom/PersonAssert.java | 2 +- .../exceptions/Java7StyleAssertions.java | 2 +- .../exceptions/Java8StyleAssertions.java | 2 +- .../jgotesting/JGoTestingUnitTest.java | 0 .../java/com/baeldung/jspec/CageUnitTest.java | 0 .../com/baeldung/jspec/JSpecUnitTest.java | 0 .../com/baeldung/junit/AdditionUnitTest.java | 0 .../baeldung/junit/AssertionsUnitTest.java | 0 .../baeldung/junit/BlockingTestRunner.java | 0 .../baeldung/junit/CalculatorUnitTest.java | 0 .../baeldung/junit/SubstractionUnitTest.java | 0 .../com/baeldung/junit/SuiteUnitTest.java | 0 .../java/com/baeldung/junit/TestRunner.java | 0 .../baeldung}/truth/GoogleTruthUnitTest.java | 4 +- pom.xml | 8 +- testing-libraries-2/README.md | 5 + testing-libraries-2/cucumber/pom.xml | 41 ++ .../com/baeldung/cucumber/Calculator.java | 0 .../calculator/CalculatorIntegrationTest.java | 2 +- .../calculator/CalculatorRunSteps.java | 2 +- .../shopping/ShoppingIntegrationTest.java | 2 +- .../baeldung}/shopping/ShoppingStepsDef.java | 2 +- .../calculator-scenario-outline.feature | 0 .../resources/features/calculator.feature | 0 .../test/resources/features/shopping.feature | 0 testing-libraries-2/lambdabehave/pom.xml | 28 ++ .../com/baeldung/lambdabehave/Calculator.java | 0 .../lambdabehave/CalculatorUnitTest.java | 0 testing-libraries-2/mutations/pom.xml | 16 + .../com/baeldung}/mutation/Palindrome.java | 0 .../mutation}/PalindromeUnitTest.java | 4 +- testing-libraries-2/pom.xml | 22 + .../README.md | 0 .../easy-random/README.md | 0 .../easy-random/pom.xml | 0 .../easy/random/model/Department.java | 0 .../baeldung/easy/random/model/Employee.java | 0 .../org/baeldung/easy/random/model/Grade.java | 0 .../baeldung/easy/random/model/Person.java | 0 .../easy/random/model/YearQuarter.java | 0 .../randomizer/YearQuarterRandomizer.java | 0 .../easy/random/EasyRandomUnitTest.java | 0 .../easymock/pom.xml | 0 .../testing/easymock/ForecastProcessor.java | 0 .../baeldung/testing/easymock/Location.java | 0 .../easymock/ServiceUnavailableException.java | 0 .../testing/easymock/WeatherService.java | 0 .../easymock/ForecastProcessorUnitTest.java | 0 .../gatling/README.md | 0 .../gatling/pom.xml | 272 ++++++------ .../gatling/src/test/resources/gatling.conf | 0 .../gatling/src/test/resources/logback.xml | 0 .../gatling/src/test/resources/recorder.conf | 0 .../gatling/src/test/scala/Engine.scala | 26 +- .../src/test/scala/IDEPathHelper.scala | 44 +- .../gatling/src/test/scala/Recorder.scala | 24 +- .../org/baeldung/RecordedSimulation.scala | 0 .../groovy-spock/.gitignore | 0 .../groovy-spock/README.md | 0 .../groovy-spock/pom.xml | 0 .../src/main/java/mocks/EventPublisher.java | 0 .../mocks/ExternalItemProviderException.java | 0 .../src/main/java/mocks/Item.java | 0 .../src/main/java/mocks/ItemProvider.java | 0 .../src/main/java/mocks/ItemService.java | 0 .../java/mocks/LoggingEventPublisher.java | 0 .../src/test/groovy/FirstSpecification.groovy | 0 .../src/test/groovy/Notifier.groovy | 0 .../src/test/groovy/PaymentGateway.groovy | 0 .../groovy/extensions/CustomTitleTest.groovy | 0 .../groovy/extensions/IgnoreIfTest.groovy | 0 .../groovy/extensions/IgnoreRestTest.groovy | 0 .../test/groovy/extensions/IgnoreTest.groovy | 0 .../test/groovy/extensions/IssueTest.groovy | 0 .../extensions/PendingFeatureTest.groovy | 0 .../groovy/extensions/RequiresTest.groovy | 0 .../RestoreSystemPropertiesTest.groovy | 0 .../test/groovy/extensions/RetryTest.groovy | 0 .../src/test/groovy/extensions/SeeTest.groovy | 0 .../groovy/extensions/StackTraceTest.groovy | 0 .../groovy/extensions/StepwiseTest.groovy | 0 .../test/groovy/extensions/SubjectTest.groovy | 0 .../test/groovy/extensions/TimeoutTest.groovy | 0 .../groovy/mocks/ItemServiceUnitTest.groovy | 0 .../src/test/resources/SpockConfig.groovy | 0 .../junit-4/README.md | 0 .../junit-4/pom.xml | 13 + .../junitparams/SafeAdditionUtil.java | 0 .../junit-4/src/main/resources/logback.xml | 0 .../junitparams/SafeAdditionUtilUnitTest.java | 0 .../junitparams/TestDataProvider.java | 0 .../com/baeldung/rules/MessageLogger.java | 0 .../com/baeldung/rules/RuleChainUnitTest.java | 0 .../com/baeldung/rules/RulesUnitTest.java | 0 .../baeldung/rules/TestMethodNameLogger.java | 0 .../baeldung/rules/VerifierRuleUnitTest.java | 0 .../baeldung/runfromjava/FirstUnitTest.java | 0 .../com/baeldung/runfromjava/MyTestSuite.java | 0 .../runfromjava/RunJUnit4TestsFromJava.java | 0 .../baeldung/runfromjava/SecondUnitTest.java | 0 .../resources/JunitParamsTestParameters.csv | 0 .../junit-5-advanced/README.md | 0 .../junit-5-advanced/pom.xml | 0 .../failure_vs_error/SimpleCalculator.java | 0 .../baeldung/junit5/testinstance/Tweet.java | 0 .../junit5/testinstance/TweetException.java | 0 .../junit5/testinstance/TweetSerializer.java | 0 .../src/main/resources/logback.xml | 0 .../DisplayNameGeneratorUnitTest.java | 0 .../ReplaceUnderscoresGeneratorUnitTest.java | 0 .../TestResultLoggerExtension.java | 0 .../testwatcher/TestWatcherAPIUnitTest.java | 0 .../SimpleCalculatorUnitTest.java | 0 .../junit5/testinstance/AdditionUnitTest.java | 0 .../junit5/testinstance/OrderUnitTest.java | 0 .../TweetSerializerJUnit4UnitTest.java | 0 .../testinstance/TweetSerializerUnitTest.java | 0 .../src/test/resources/lorem-ipsum.txt | 0 .../junit-5-basics/README.md | 0 .../junit-5-basics/pom.xml | 0 .../failure_vs_error/SimpleCalculator.java | 0 .../baeldung/junit/tags/example/Employee.java | 0 .../junit/tags/example/EmployeeDAO.java | 0 .../junit/tags/example/EmployeeRowMapper.java | 0 .../junit/tags/example/SpringJdbcConfig.java | 0 .../java/com/baeldung/junit5/Greetings.java | 0 .../com/baeldung/junit5/bean/NumbersBean.java | 0 .../src/main/resources/jdbc/schema.sql | 0 .../main/resources/jdbc/springJdbc-config.xml | 0 .../src/main/resources/jdbc/test-data.sql | 0 .../java/com/baeldung/ExceptionUnitTest.java | 0 .../test/java/com/baeldung/FirstUnitTest.java | 0 .../java/com/baeldung/GreetingsUnitTest.java | 0 .../baeldung/JUnit5NewFeaturesUnitTest.java | 0 .../src/test/java/com/baeldung/LiveTest.java | 0 .../EmployeeDAOCategoryIntegrationTest.java | 0 .../categories/EmployeeDAOUnitTestSuite.java | 0 .../baeldung/categories/IntegrationTest.java | 0 .../com/baeldung/categories/UnitTest.java | 0 .../example/EmployeeDAOIntegrationTest.java | 0 .../baeldung/example/EmployeeUnitTest.java | 0 .../exception/ExceptionAssertionUnitTest.java | 0 .../SharedTemporaryDirectoryUnitTest.java | 0 .../tempdir/TemporaryDirectoryUnitTest.java | 0 .../SimpleCalculatorUnitTest.java | 0 .../junit5/bean/test/NumbersBeanUnitTest.java | 0 .../spring/GreetingsSpringUnitTest.java | 0 .../spring/SpringTestConfiguration.java | 0 .../junit4/AnnotationTestExampleUnitTest.java | 0 .../junit4/AssertionsExampleUnitTest.java | 0 .../BeforeAndAfterAnnotationsUnitTest.java | 0 ...ClassAndAfterClassAnnotationsUnitTest.java | 0 .../junit4/ExceptionAssertionUnitTest.java | 0 .../migration/junit4/RuleExampleUnitTest.java | 0 .../junit4/categories/Annotations.java | 0 .../junit4/categories/JUnit4UnitTest.java | 0 .../junit4/rules/TraceUnitTestRule.java | 0 .../junit5/AnnotationTestExampleUnitTest.java | 0 .../junit5/AssertionsExampleUnitTest.java | 0 .../migration/junit5/AssumptionUnitTest.java | 0 ...foreAllAndAfterAllAnnotationsUnitTest.java | 0 ...reEachAndAfterEachAnnotationsUnitTest.java | 0 .../migration/junit5/RuleExampleUnitTest.java | 0 .../junit5/extensions/TraceUnitExtension.java | 0 .../ReadResourceDirectoryUnitTest.java | 0 .../java/com/baeldung/suites/AllUnitTest.java | 0 .../tags/EmployeeDAOIntegrationTest.java | 0 .../baeldung/tags/EmployeeDAOTestSuite.java | 0 .../src/test/resources/example_resource.txt | 0 .../junit-5/README.md | 0 .../junit-5/pom.xml | 0 .../abstractmethod/AbstractMethodCalling.java | 0 .../indepedentmethod/AbstractIndependent.java | 0 .../indepedentmethod/ConcreteImpl.java | 0 .../AbstractInstanceFields.java | 0 .../privatemethod/AbstractPrivateMethods.java | 0 .../com/baeldung/junit5/mockito/User.java | 0 .../junit5/mockito/repository/MailClient.java | 0 .../mockito/repository/SettingRepository.java | 0 .../mockito/repository/UserRepository.java | 0 .../mockito/service/DefaultUserService.java | 0 .../junit5/mockito/service/Errors.java | 0 .../junit5/mockito/service/UserService.java | 0 .../baeldung/junit5vstestng/Calculator.java | 0 .../junit5vstestng/DivideByZeroException.java | 0 .../junit-5/src/main/resources/logback.xml | 0 .../java/com/baeldung/AssertionUnitTest.java | 0 .../com/baeldung/DynamicTestsExample.java | 0 .../java/com/baeldung/EmployeesUnitTest.java | 0 .../baeldung/MultipleExtensionsUnitTest.java | 0 .../java/com/baeldung/NestedUnitTest.java | 0 .../ProgrammaticEmployeesUnitTest.java | 0 .../baeldung/RegisterExtensionUnitTest.java | 0 .../com/baeldung/RepeatedTestExample.java | 0 .../test/java/com/baeldung/StringUtils.java | 0 .../java/com/baeldung/TaggedUnitTest.java | 0 .../test/java/com/baeldung/TestLauncher.java | 0 .../AbstractMethodCallingUnitTest.java | 0 .../AbstractIndependentUnitTest.java | 0 .../AbstractInstanceFieldsUnitTest.java | 0 .../AbstractPrivateMethodsUnitTest.java | 0 .../ConditionalAnnotationsUnitTest.java | 0 .../EmployeeDaoParameterResolver.java | 0 .../EmployeeDatabaseSetupExtension.java | 0 .../extensions/EnvironmentExtension.java | 0 .../IgnoreFileNotFoundExceptionExtension.java | 0 .../baeldung/extensions/LoggingExtension.java | 0 .../RegisterExtensionSampleExtension.java | 0 .../java/com/baeldung/helpers/Employee.java | 0 .../com/baeldung/helpers/EmployeeDao.java | 0 .../com/baeldung/helpers/EmployeeJdbcDao.java | 0 .../baeldung/helpers/JdbcConnectionUtil.java | 0 .../junit4vstestng/SortedUnitTest.java | 0 .../SummationServiceIntegrationTest.java | 0 .../junit5/mockito/UserServiceUnitTest.java | 252 +++++------ .../order/AlphanumericOrderUnitTest.java | 0 .../baeldung/junit5/order/CustomOrder.java | 0 .../junit5/order/CustomOrderUnitTest.java | 0 .../junit5/order/OrderAnnotationUnitTest.java | 0 .../junit5vstestng/CalculatorUnitTest.java | 0 .../junit5vstestng/Class1UnitTest.java | 0 .../junit5vstestng/Class2UnitTest.java | 0 .../junit5vstestng/CustomNameUnitTest.java | 0 .../junit5vstestng/ParameterizedUnitTest.java | 0 .../junit5vstestng/PizzaDeliveryStrategy.java | 0 .../SelectClassesSuiteUnitTest.java | 0 .../SelectPackagesSuiteUnitTest.java | 0 .../SummationServiceUnitTest.java | 0 .../DefaultOrderOfExecutionUnitTest.java | 0 .../JVMOrderOfExecutionUnitTest.java | 0 ...NameAscendingOrderOfExecutionUnitTest.java | 0 .../param/InvalidPersonParameterResolver.java | 0 .../test/java/com/baeldung/param/Person.java | 0 .../com/baeldung/param/PersonValidator.java | 0 .../param/PersonValidatorUnitTest.java | 0 .../param/ValidPersonParameterResolver.java | 0 .../BlankStringsArgumentsProvider.java | 0 .../baeldung/parameterized/EnumsUnitTest.java | 0 .../parameterized/LocalDateUnitTest.java | 0 .../com/baeldung/parameterized/Numbers.java | 0 .../parameterized/NumbersUnitTest.java | 0 .../com/baeldung/parameterized/Person.java | 0 .../parameterized/PersonAggregator.java | 0 .../parameterized/PersonUnitTest.java | 0 .../parameterized/SlashyDateConverter.java | 0 .../baeldung/parameterized/StringParams.java | 0 .../com/baeldung/parameterized/Strings.java | 0 .../parameterized/StringsUnitTest.java | 0 .../VariableArgumentsProvider.java | 0 .../parameterized/VariableSource.java | 0 .../baeldung/runfromjava/FirstUnitTest.java | 0 .../runfromjava/RunJUnit5TestsFromJava.java | 0 .../baeldung/runfromjava/SecondUnitTest.java | 0 .../org.junit.jupiter.api.extension.Extension | 0 .../extensions/application.properties | 0 .../com/baeldung/helpers/jdbc.properties | 0 .../junit-5/src/test/resources/data.csv | 0 .../junit5-migration/README.md | 0 .../junit5-migration/pom.xml | 0 .../junit4/AnnotationTestExampleUnitTest.java | 0 .../baeldung/junit4/AssertionUnitTest.java | 0 .../com/baeldung/junit4/AssumeUnitTest.java | 0 .../junit4/ExceptionAssertionUnitTest.java | 0 .../baeldung/junit4/RuleExampleUnitTest.java | 0 .../junit4/TestAnnotationsUnitTest.java | 0 .../baeldung/junit4/TraceUnitTestRule.java | 0 .../junit4/categories/Annotations.java | 0 .../junit4/categories/JUnit4UnitTest.java | 0 .../junit5/AnnotationTestExampleUnitTest.java | 0 .../baeldung/junit5/AssertionUnitTest.java | 0 .../baeldung/junit5/AssumptionUnitTest.java | 0 .../junit5/ConditionalExecutionUnitTest.java | 0 .../com/baeldung/junit5/NestedUnitTest.java | 0 .../baeldung/junit5/RuleExampleUnitTest.java | 0 .../junit5/RuleMigrationSupportUnitTest.java | 0 .../junit5/TestAnnotationsUnitTest.java | 0 .../baeldung/junit5/TraceUnitExtension.java | 0 .../load-testing-comparison/README.md | 0 .../load-testing-comparison/pom.xml | 0 .../com/baeldung/loadtesting/Application.java | 0 .../loadtesting/RewardsController.java | 0 .../loadtesting/TransactionController.java | 0 .../model/CustomerRewardsAccount.java | 0 .../loadtesting/model/Transaction.java | 0 .../repository/CustomerRewardsRepository.java | 0 .../repository/TransactionRepository.java | 0 .../scripts/Gatling/GatlingScenario.scala | 0 .../resources/scripts/JMeter/Test Plan.jmx | 0 .../scripts/The Grinder/grinder.properties | 0 .../resources/scripts/The Grinder/grinder.py | 0 .../mockito-2/.gitignore | 0 .../mockito-2/README.md | 0 .../mockito-2/pom.xml | 0 .../baeldung/mockito/java8/JobPosition.java | 0 .../baeldung/mockito/java8/JobService.java | 0 .../com/baeldung/mockito/java8/Person.java | 0 .../mockito/java8/UnemploymentService.java | 0 .../java8/UnemploymentServiceImpl.java | 0 .../mockito-2/src/main/resources/logback.xml | 0 .../ArgumentMatcherWithLambdaUnitTest.java | 0 .../ArgumentMatcherWithoutLambdaUnitTest.java | 0 .../java8/CustomAnswerWithLambdaUnitTest.java | 0 .../CustomAnswerWithoutLambdaUnitTest.java | 0 .../mockito/java8/JobServiceUnitTest.java | 0 .../java8/LazyVerificationUnitTest.java | 0 .../UnemploymentServiceImplUnitTest.java | 0 .../misusing/ExpectedTestFailureRule.java | 0 .../MockitoUnecessaryStubUnitTest.java | 0 .../mockito/.gitignore | 0 .../mockito/README.md | 0 .../mockito/pom.xml | 0 .../main/java/org/baeldung/hamcrest/City.java | 0 .../java/org/baeldung/hamcrest/Location.java | 0 .../custommatchers/IsDivisibleBy.java | 0 .../hamcrest/custommatchers/IsOnlyDigits.java | 0 .../hamcrest/custommatchers/IsUppercase.java | 0 .../mockito/service/ActionHandler.java | 0 .../baeldung/mockito/service/Callback.java | 0 .../org/baeldung/mockito/service/Data.java | 0 .../baeldung/mockito/service/Response.java | 0 .../org/baeldung/mockito/service/Service.java | 0 .../mockito/src/main/resources/logback.xml | 0 .../CollaboratorForPartialMocking.java | 0 .../CollaboratorWithFinalMethods.java | 0 .../CollaboratorWithStaticMethods.java | 0 .../introduction/LuckyNumberGenerator.java | 0 .../LuckyNumberGeneratorIntegrationTest.java | 0 .../PowerMockitoIntegrationTest.java | 0 .../bddmockito/BDDMockitoIntegrationTest.java | 208 ++++----- .../bddmockito/PhoneBookRepository.java | 52 +-- .../baeldung/bddmockito/PhoneBookService.java | 68 +-- .../hamcrest/HamcrestBeansUnitTest.java | 0 .../HamcrestCoreMatchersUnitTest.java | 0 .../hamcrest/HamcrestCustomUnitTest.java | 0 .../hamcrest/HamcrestFileUnitTest.java | 0 .../hamcrest/HamcrestNumberUnitTest.java | 0 .../hamcrest/HamcrestObjectUnitTest.java | 0 .../hamcrest/HamcrestTextUnitTest.java | 0 .../java/org/baeldung/mockito/FinalList.java | 0 .../java/org/baeldung/mockito/MockFinals.java | 0 .../MockitoAnnotationIntegrationTest.java | 0 .../MockitoConfigExamplesIntegrationTest.java | 0 .../MockitoExceptionIntegrationTest.java | 0 .../mockito/MockitoInjectIntoSpyUnitTest.java | 0 .../mockito/MockitoMockIntegrationTest.java | 0 .../mockito/MockitoSpyIntegrationTest.java | 0 .../MockitoVerifyExamplesIntegrationTest.java | 0 .../mockito/MockitoVoidMethodsUnitTest.java | 0 .../org/baeldung/mockito/MyDictionary.java | 0 .../java/org/baeldung/mockito/MyList.java | 0 .../misusing/MockitoMisusingUnitTest.java | 0 .../service/ActionHandlerUnitTest.java | 0 .../org.mockito.plugins.MockMaker | 0 .../mockito/src/test/resources/test1.in | 0 .../mocks/README.md | 0 testing-libraries/mocks/javafaker/pom.xml | 26 ++ .../baeldung/javafaker/JavaFakerUnitTest.java | 0 .../mocks/jmockit/README.md | 0 .../mocks/jmockit/pom.xml | 0 .../baeldung/mocks/jmockit/AppManager.java | 0 .../mocks/jmockit/AdvancedCollaborator.java | 0 .../baeldung/mocks/jmockit/Collaborator.java | 0 .../jmockit/ExpectationsCollaborator.java | 0 .../org/baeldung/mocks/jmockit/Model.java | 0 .../org/baeldung/mocks/jmockit/Performer.java | 0 .../jmockit/src/main/resources/logback.xml | 0 .../mocks/jmockit/AppManagerUnitTest.java | 0 .../AdvancedCollaboratorIntegrationTest.java | 0 .../jmockit/ExpectationsIntegrationTest.java | 0 .../jmockit/PerformerIntegrationTest.java | 0 .../mocks/jmockit/ReusingIntegrationTest.java | 0 testing-libraries/mocks/jukito/pom.xml | 27 ++ .../introductionjukito/Calculator.java | 0 .../ScientificCalculator.java | 0 .../introductionjukito/SimpleCalculator.java | 0 .../CalculatorUnitTest.java | 0 .../mocks/mock-comparisons/README.md | 0 .../mocks/mock-comparisons/pom.xml | 0 .../com/baeldung/easymock/ArticleReader.java | 70 +-- .../baeldung/easymock/BaeldungArticle.java | 48 +-- .../com/baeldung/easymock/BaeldungReader.java | 78 ++-- .../com/baeldung/easymock/IArticleWriter.java | 12 +- .../com/baeldung/easymock/IUserService.java | 0 .../main/java/com/baeldung/easymock/User.java | 0 .../mocks/testCase/LoginController.java | 0 .../org/baeldung/mocks/testCase/LoginDao.java | 0 .../baeldung/mocks/testCase/LoginService.java | 0 .../org/baeldung/mocks/testCase/UserForm.java | 0 .../src/main/resources/logback.xml | 0 .../easymock/ArgumentMatchersUnitTest.java | 0 .../BaeldungReaderAnnotatedUnitTest.java | 114 ++--- ...eldungReaderAnnotatedWithRuleUnitTest.java | 114 ++--- .../BaeldungReaderMockDelegationUnitTest.java | 52 +-- .../BaeldungReaderMockSupportUnitTest.java | 82 ++-- .../easymock/BaeldungReaderUnitTest.java | 208 ++++----- .../LoginControllerIntegrationTest.java | 0 .../LoginControllerIntegrationTest.java | 0 .../LoginControllerIntegrationTest.java | 0 .../mocks/pom.xml | 0 .../mockserver/README.md | 0 .../mockserver/pom.xml | 0 .../server/ExpectationCallbackHandler.java | 0 .../mockserver/src/main/resources/logback.xml | 0 .../mock/server/MockServerLiveTest.java | 0 .../parallel-tests-junit/README.md | 0 .../math-test-functions/pom.xml | 0 .../baeldung/ArithmeticFunctionUnitTest.java | 0 .../baeldung/ComparisonFunctionUnitTest.java | 0 .../java/com/baeldung/FunctionTestSuite.java | 0 .../parallel-tests-junit/pom.xml | 0 .../string-test-functions/pom.xml | 0 .../com/baeldung/StringFunctionUnitTest.java | 0 .../pom.xml | 5 +- .../rest-assured/.gitignore | 0 .../rest-assured/README.md | 0 .../rest-assured/pom.xml | 0 .../com/baeldung/restassured/Application.java | 0 .../restassured/controller/AppController.java | 0 .../baeldung/restassured/learner/Course.java | 0 .../restassured/learner/CourseController.java | 0 .../CourseControllerExceptionHandler.java | 0 .../learner/CourseNotFoundException.java | 0 .../restassured/learner/CourseService.java | 0 .../com/baeldung/restassured/model/Movie.java | 0 .../restassured/service/AppService.java | 0 .../rest-assured/src/main/resources/1 | 0 .../rest-assured/src/main/resources/2 | 0 .../java/com/baeldung/restassured/Odd.java | 98 ++--- .../RestAssured2IntegrationTest.java | 0 .../RestAssuredAdvancedLiveTest.java | 0 .../RestAssuredIntegrationTest.java | 0 .../RestAssuredXML2IntegrationTest.java | 0 .../RestAssuredXMLIntegrationTest.java | 0 .../java/com/baeldung/restassured/Util.java | 0 .../BasicAuthenticationLiveTest.java | 0 .../BasicPreemtiveAuthenticationLiveTest.java | 0 .../DigestAuthenticationLiveTest.java | 0 .../FormAuthenticationLiveTest.java | 0 .../FormAutoconfAuthenticationLiveTest.java | 0 .../OAuth2AuthenticationLiveTest.java | 0 .../OAuthAuthenticationLiveTest.java | 0 .../AppControllerIntegrationTest.java | 0 .../CourseControllerIntegrationTest.java | 0 .../learner/CourseControllerUnitTest.java | 0 .../src/test/resources/employees.xml | 0 .../src/test/resources/event_0.json | 0 .../src/test/resources/logback.xml | 0 .../rest-assured/src/test/resources/odds.json | 0 .../src/test/resources/teachers.xml | 0 .../rest-assured/src/test/resources/test.txt | 0 .../rest-testing/.gitignore | 0 .../rest-testing/README.md | 0 .../rest-testing/pom.xml | 0 .../src/main/resources/cucumber.json | 0 .../main/resources/karate/cucumber.feature | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/wiremock_intro.json | 0 .../cucumber/CucumberIntegrationTest.java | 0 .../rest/cucumber/StepDefinition.java | 0 .../baeldung/rest/jbehave/AbstractStory.java | 0 .../rest/jbehave/GithubUserNotFoundSteps.java | 0 .../GithubUserNotFoundStoryLiveTest.java | 0 .../GithubUserResponseMediaTypeSteps.java | 0 ...hubUserResponseMediaTypeStoryLiveTest.java | 0 .../GithubUserResponsePayloadSteps.java | 0 ...ithubUserResponsePayloadStoryLiveTest.java | 0 .../baeldung/rest/jbehave/IncreaseSteps.java | 0 .../rest/jbehave/IncreaseStoryLiveTest.java | 0 .../rest/karate/KarateIntegrationTest.java | 0 .../JUnitManagedIntegrationTest.java | 0 .../ProgrammaticallyManagedLiveTest.java | 0 ...ireMockScenarioExampleIntegrationTest.java | 0 .../java/org/baeldung/rest/GitHubUser.java | 0 .../java/org/baeldung/rest/RetrieveUtil.java | 0 .../test/resources/Feature/cucumber.feature | 0 .../resources/github_user_not_found.story | 0 .../github_user_response_mediatype.story | 0 .../github_user_response_payload.story | 0 .../src/test/resources/increase.story | 0 .../src/test/resources/karate/user.feature | 0 .../src/main/resources/logback.xml | 0 .../junit4/runfromjava/FirstUnitTest.java | 0 .../junit4/runfromjava/SecondUnitTest.java | 0 .../junit5/runfromjava/FirstUnitTest.java | 0 .../junit5/runfromjava/SecondUnitTest.java | 0 .../selenium-junit-testng/README.md | 0 .../selenium-junit-testng/geckodriver.mac | Bin .../selenium-junit-testng/pom.xml | 0 .../baeldung/selenium/SeleniumExample.java | 0 .../selenium/config/SeleniumConfig.java | 0 .../selenium/models/BaeldungAbout.java | 0 .../selenium/pages/BaeldungAboutPage.java | 0 .../selenium/pages/BaeldungHomePage.java | 0 .../selenium/pages/StartHerePage.java | 0 .../src/main/resources/logback.xml | 0 .../junit/SeleniumPageObjectLiveTest.java | 0 .../junit/SeleniumWithJUnitLiveTest.java | 0 .../testng/SeleniumWithTestNGLiveTest.java | 0 .../spring-testing/README.md | 0 .../spring-testing/pom.xml | 0 .../com/baeldung/config/ScheduledConfig.java | 0 .../java/com/baeldung/config/WebConfig.java | 0 .../parameterized/EmployeeRoleController.java | 0 .../overrideproperties/Application.java | 0 .../resolver/PropertySourceResolver.java | 0 .../java/com/baeldung/scheduled/Counter.java | 0 .../ClassUsingProperty.java | 0 .../org/baeldung/mockito/repository/User.java | 0 .../mockito/repository/UserRepository.java | 0 .../repository/Employee.java | 46 +- .../repository/EmployeeService.java | 28 +- .../repository/HRService.java | 22 +- .../src/main/resources/logback.xml | 0 .../RoleControllerIntegrationTest.java | 0 ...ParameterizedClassRuleIntegrationTest.java | 0 ...ontrollerParameterizedIntegrationTest.java | 0 ...PropertySourceResolverIntegrationTest.java | 0 ...PropertySourceResolverIntegrationTest.java | 0 .../PropertyOverrideContextInitializer.java | 0 ...PropertySourceResolverIntegrationTest.java | 0 ...PropertySourceResolverIntegrationTest.java | 0 .../ScheduledAwaitilityIntegrationTest.java | 0 .../scheduled/ScheduledIntegrationTest.java | 0 ...aultTestPropertySourceIntegrationTest.java | 0 ...tionTestPropertySourceIntegrationTest.java | 0 ...tiesTestPropertySourceIntegrationTest.java | 0 .../mockito/MockAnnotationUnitTest.java | 0 .../MockBeanAnnotationIntegrationTest.java | 0 .../ReflectionTestUtilsUnitTest.java | 92 ++-- .../resources/application-test.properties | 0 .../src/test/resources/application.properties | 0 ...stPropertySourceIntegrationTest.properties | 0 .../context-override-application.properties | 0 .../test/resources/other-location.properties | 0 .../test-containers/README.md | 0 .../test-containers/pom.xml | 0 .../DockerComposeContainerLiveTest.java | 0 .../GenericContainerLiveTest.java | 0 .../PostgreSqlContainerLiveTest.java | 0 .../WebDriverContainerLiveTest.java | 0 .../src/test/resources/test-compose.yml | 0 .../testng/README.md | 0 .../testng/pom.xml | 94 ++-- .../DependentLongRunningUnitTest.java | 0 .../com/baeldung/GroupIntegrationTest.java | 0 .../MultiThreadedIntegrationTest.java | 0 .../ParametrizedLongRunningUnitTest.java | 0 .../baeldung/PriorityLongRunningUnitTest.java | 0 .../RegistrationLongRunningUnitTest.java | 0 .../baeldung/SignInLongRunningUnitTest.java | 0 .../baeldung/SimpleLongRunningUnitTest.java | 0 .../SummationServiceIntegrationTest.java | 0 .../com/baeldung/TimeOutIntegrationTest.java | 0 .../baeldung/reports/CustomisedListener.java | 134 +++--- .../baeldung/reports/CustomisedReports.java | 222 +++++----- .../testng/src/test/resources/logback.xml | 36 +- .../test/resources/parametrized_testng.xml | 24 +- .../src/test/resources/reportTemplate.html | 0 .../testng/src/test/resources/test_group.xml | 24 +- .../testng/src/test/resources/test_setup.xml | 32 +- .../testng/src/test/resources/test_suite.xml | 24 +- .../xmlunit-2/README.md | 0 .../xmlunit-2/pom.xml | 0 .../IgnoreAttributeDifferenceEvaluator.java | 0 .../xmlunit-2}/src/main/resources/logback.xml | 0 .../com/baeldung/xmlunit/XMLUnitTest.java | 0 .../xmlunit-2/src/test/resources/control.xml | 0 .../xmlunit-2/src/test/resources/students.xml | 0 .../xmlunit-2/src/test/resources/students.xsd | 0 .../test/resources/students_with_error.xml | 0 .../xmlunit-2/src/test/resources/teachers.xml | 0 .../xmlunit-2/src/test/resources/test.xml | 0 .../groovy-spock/report-2019-03-29.json | 402 ------------------ testing-modules/testing/README.md | 24 -- testing-modules/testing/pom.xml | 183 -------- .../xmlunit-2/src/main/resources/logback.xml | 13 - 594 files changed, 1591 insertions(+), 1951 deletions(-) create mode 100644 assertion-libraries/pom.xml rename {testing-modules/testing/src/main/java/com/baeldung/testing => assertion-libraries/src/main/java/com/baeldung}/assertj/Dog.java (88%) rename {testing-modules/testing/src/main/java/com/baeldung/testing => assertion-libraries/src/main/java/com/baeldung}/assertj/Member.java (88%) rename {testing-modules/testing/src/main/java/com/baeldung/testing => assertion-libraries/src/main/java/com/baeldung}/assertj/Person.java (88%) rename {testing-modules/testing/src/main/java/com/baeldung/testing => assertion-libraries/src/main/java/com/baeldung}/assertj/custom/Person.java (93%) rename {testing-modules/testing => assertion-libraries}/src/main/java/com/baeldung/jspec/Animal.java (100%) rename {testing-modules/testing => assertion-libraries}/src/main/java/com/baeldung/jspec/Cage.java (100%) rename {testing-modules/testing => assertion-libraries}/src/main/java/com/baeldung/jspec/Cat.java (100%) rename {testing-modules/testing => assertion-libraries}/src/main/java/com/baeldung/jspec/Dog.java (100%) rename {testing-modules/testing => assertion-libraries}/src/main/java/com/baeldung/junit/Calculator.java (100%) rename {testing-modules/testing/src/main/java/com/baeldung/testing => assertion-libraries/src/main/java/com/baeldung}/truth/User.java (97%) rename {testing-modules/testing/src/main/java/com/baeldung/testing => assertion-libraries/src/main/java/com/baeldung}/truth/UserSubject.java (97%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/assertj/AssertJConditionUnitTest.java (98%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/assertj/AssertJCoreUnitTest.java (98%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/assertj/AssertJGuavaUnitTest.java (98%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/assertj/AssertJJava8UnitTest.java (98%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/assertj/custom/AssertJCustomAssertionsUnitTest.java (91%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/assertj/custom/Assertions.java (81%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/assertj/custom/PersonAssert.java (95%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/assertj/exceptions/Java7StyleAssertions.java (94%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/assertj/exceptions/Java8StyleAssertions.java (97%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/jgotesting/JGoTestingUnitTest.java (100%) rename {testing-modules/testing => assertion-libraries}/src/test/java/com/baeldung/jspec/CageUnitTest.java (100%) rename {testing-modules/testing => assertion-libraries}/src/test/java/com/baeldung/jspec/JSpecUnitTest.java (100%) rename {testing-modules/testing => assertion-libraries}/src/test/java/com/baeldung/junit/AdditionUnitTest.java (100%) rename {testing-modules/testing => assertion-libraries}/src/test/java/com/baeldung/junit/AssertionsUnitTest.java (100%) rename {testing-modules/testing => assertion-libraries}/src/test/java/com/baeldung/junit/BlockingTestRunner.java (100%) rename {testing-modules/testing => assertion-libraries}/src/test/java/com/baeldung/junit/CalculatorUnitTest.java (100%) rename {testing-modules/testing => assertion-libraries}/src/test/java/com/baeldung/junit/SubstractionUnitTest.java (100%) rename {testing-modules/testing => assertion-libraries}/src/test/java/com/baeldung/junit/SuiteUnitTest.java (100%) rename {testing-modules/testing => assertion-libraries}/src/test/java/com/baeldung/junit/TestRunner.java (100%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => assertion-libraries/src/test/java/com/baeldung}/truth/GoogleTruthUnitTest.java (99%) create mode 100644 testing-libraries-2/README.md create mode 100644 testing-libraries-2/cucumber/pom.xml rename {testing-modules/testing => testing-libraries-2/cucumber}/src/main/java/com/baeldung/cucumber/Calculator.java (100%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => testing-libraries-2/cucumber/src/test/java/com/baeldung}/calculator/CalculatorIntegrationTest.java (91%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => testing-libraries-2/cucumber/src/test/java/com/baeldung}/calculator/CalculatorRunSteps.java (95%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => testing-libraries-2/cucumber/src/test/java/com/baeldung}/shopping/ShoppingIntegrationTest.java (86%) rename {testing-modules/testing/src/test/java/com/baeldung/testing => testing-libraries-2/cucumber/src/test/java/com/baeldung}/shopping/ShoppingStepsDef.java (92%) rename {testing-modules/testing => testing-libraries-2/cucumber}/src/test/resources/features/calculator-scenario-outline.feature (100%) rename {testing-modules/testing => testing-libraries-2/cucumber}/src/test/resources/features/calculator.feature (100%) rename {testing-modules/testing => testing-libraries-2/cucumber}/src/test/resources/features/shopping.feature (100%) create mode 100644 testing-libraries-2/lambdabehave/pom.xml rename {testing-modules/testing => testing-libraries-2/lambdabehave}/src/main/java/com/baeldung/lambdabehave/Calculator.java (100%) rename {testing-modules/testing => testing-libraries-2/lambdabehave}/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java (100%) create mode 100644 testing-libraries-2/mutations/pom.xml rename {testing-modules/testing/src/main/java/com/baeldung/testing => testing-libraries-2/mutations/src/main/java/com/baeldung}/mutation/Palindrome.java (100%) rename {testing-modules/testing/src/test/java/com/baeldung/mutation/test => testing-libraries-2/mutations/src/test/java/com/baeldung/mutation}/PalindromeUnitTest.java (90%) create mode 100644 testing-libraries-2/pom.xml rename {testing-modules => testing-libraries}/README.md (100%) rename {testing-modules => testing-libraries}/easy-random/README.md (100%) rename {testing-modules => testing-libraries}/easy-random/pom.xml (100%) rename {testing-modules => testing-libraries}/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java (100%) rename {testing-modules => testing-libraries}/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java (100%) rename {testing-modules => testing-libraries}/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java (100%) rename {testing-modules => testing-libraries}/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java (100%) rename {testing-modules => testing-libraries}/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java (100%) rename {testing-modules => testing-libraries}/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java (100%) rename {testing-modules => testing-libraries}/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java (100%) rename {testing-modules => testing-libraries}/easymock/pom.xml (100%) rename {testing-modules => testing-libraries}/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java (100%) rename {testing-modules => testing-libraries}/easymock/src/main/java/com/baeldung/testing/easymock/Location.java (100%) rename {testing-modules => testing-libraries}/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java (100%) rename {testing-modules => testing-libraries}/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java (100%) rename {testing-modules => testing-libraries}/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java (100%) rename {testing-modules => testing-libraries}/gatling/README.md (100%) rename {testing-modules => testing-libraries}/gatling/pom.xml (96%) rename {testing-modules => testing-libraries}/gatling/src/test/resources/gatling.conf (100%) rename {testing-modules => testing-libraries}/gatling/src/test/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/gatling/src/test/resources/recorder.conf (100%) rename {testing-modules => testing-libraries}/gatling/src/test/scala/Engine.scala (97%) rename {testing-modules => testing-libraries}/gatling/src/test/scala/IDEPathHelper.scala (97%) rename {testing-modules => testing-libraries}/gatling/src/test/scala/Recorder.scala (97%) rename {testing-modules => testing-libraries}/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala (100%) rename {testing-modules => testing-libraries}/groovy-spock/.gitignore (100%) rename {testing-modules => testing-libraries}/groovy-spock/README.md (100%) rename {testing-modules => testing-libraries}/groovy-spock/pom.xml (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/main/java/mocks/EventPublisher.java (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/main/java/mocks/Item.java (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/main/java/mocks/ItemProvider.java (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/main/java/mocks/ItemService.java (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/FirstSpecification.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/Notifier.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/PaymentGateway.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/IssueTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/RetryTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/SeeTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy (100%) rename {testing-modules => testing-libraries}/groovy-spock/src/test/resources/SpockConfig.groovy (100%) rename {testing-modules => testing-libraries}/junit-4/README.md (100%) rename {testing-modules => testing-libraries}/junit-4/pom.xml (64%) rename {testing-modules/testing => testing-libraries/junit-4}/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java (100%) rename {testing-modules => testing-libraries}/junit-4/src/main/resources/logback.xml (100%) rename {testing-modules/testing => testing-libraries/junit-4}/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java (100%) rename {testing-modules/testing => testing-libraries/junit-4}/src/test/java/com/baeldung/junitparams/TestDataProvider.java (100%) rename {testing-modules => testing-libraries}/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java (100%) rename {testing-modules => testing-libraries}/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java (100%) rename {testing-modules => testing-libraries}/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java (100%) rename {testing-modules/testing => testing-libraries/junit-4}/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java (100%) rename {testing-modules/testing => testing-libraries/junit-4}/src/test/java/com/baeldung/runfromjava/MyTestSuite.java (100%) rename {testing-modules/testing => testing-libraries/junit-4}/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java (100%) rename {testing-modules/testing => testing-libraries/junit-4}/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java (100%) rename {testing-modules/testing => testing-libraries/junit-4}/src/test/resources/JunitParamsTestParameters.csv (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/README.md (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/pom.xml (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-advanced/src/test/resources/lorem-ipsum.txt (100%) rename {testing-modules => testing-libraries}/junit-5-basics/README.md (100%) rename {testing-modules => testing-libraries}/junit-5-basics/pom.xml (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/resources/jdbc/schema.sql (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/main/resources/jdbc/test-data.sql (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/LiveTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java (100%) rename {testing-modules => testing-libraries}/junit-5-basics/src/test/resources/example_resource.txt (100%) rename {testing-modules => testing-libraries}/junit-5/README.md (100%) rename {testing-modules => testing-libraries}/junit-5/pom.xml (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/NestedUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/StringUtils.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/TestLauncher.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/helpers/Employee.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java (97%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/param/Person.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/param/PersonValidator.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/Person.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/Strings.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/resources/com/baeldung/extensions/application.properties (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties (100%) rename {testing-modules => testing-libraries}/junit-5/src/test/resources/data.csv (100%) rename {testing-modules => testing-libraries}/junit5-migration/README.md (100%) rename {testing-modules => testing-libraries}/junit5-migration/pom.xml (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java (100%) rename {testing-modules => testing-libraries}/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/README.md (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/pom.xml (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties (100%) rename {testing-modules => testing-libraries}/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py (100%) rename {testing-modules => testing-libraries}/mockito-2/.gitignore (100%) rename {testing-modules => testing-libraries}/mockito-2/README.md (100%) rename {testing-modules => testing-libraries}/mockito-2/pom.xml (100%) rename {testing-modules => testing-libraries}/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java (100%) rename {testing-modules => testing-libraries}/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/.gitignore (100%) rename {testing-modules => testing-libraries}/mockito/README.md (100%) rename {testing-modules => testing-libraries}/mockito/pom.xml (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/hamcrest/City.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/hamcrest/Location.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/mockito/service/Callback.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/mockito/service/Data.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/mockito/service/Response.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/java/org/baeldung/mockito/service/Service.java (100%) rename {testing-modules => testing-libraries}/mockito/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java (97%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java (95%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java (96%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/FinalList.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MockFinals.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/MyList.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java (100%) rename {testing-modules => testing-libraries}/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker (100%) rename {testing-modules => testing-libraries}/mockito/src/test/resources/test1.in (100%) rename {testing-modules => testing-libraries}/mocks/README.md (100%) create mode 100644 testing-libraries/mocks/javafaker/pom.xml rename {testing-modules/testing => testing-libraries/mocks/javafaker}/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/README.md (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/pom.xml (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java (100%) create mode 100644 testing-libraries/mocks/jukito/pom.xml rename {testing-modules/testing => testing-libraries/mocks/jukito}/src/main/java/com/baeldung/introductionjukito/Calculator.java (100%) rename {testing-modules/testing => testing-libraries/mocks/jukito}/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java (100%) rename {testing-modules/testing => testing-libraries/mocks/jukito}/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java (100%) rename {testing-modules/testing => testing-libraries/mocks/jukito}/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/README.md (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/pom.xml (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java (95%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java (95%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java (95%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java (95%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java (96%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java (96%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java (97%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java (96%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java (97%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/mocks/pom.xml (100%) rename {testing-modules => testing-libraries}/mockserver/README.md (100%) rename {testing-modules => testing-libraries}/mockserver/pom.xml (100%) rename {testing-modules => testing-libraries}/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java (100%) rename {testing-modules => testing-libraries}/mockserver/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java (100%) rename {testing-modules => testing-libraries}/parallel-tests-junit/README.md (100%) rename {testing-modules => testing-libraries}/parallel-tests-junit/math-test-functions/pom.xml (100%) rename {testing-modules => testing-libraries}/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java (100%) rename {testing-modules => testing-libraries}/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java (100%) rename {testing-modules => testing-libraries}/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java (100%) rename {testing-modules => testing-libraries}/parallel-tests-junit/pom.xml (100%) rename {testing-modules => testing-libraries}/parallel-tests-junit/string-test-functions/pom.xml (100%) rename {testing-modules => testing-libraries}/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java (100%) rename {testing-modules => testing-libraries}/pom.xml (92%) rename {testing-modules => testing-libraries}/rest-assured/.gitignore (100%) rename {testing-modules => testing-libraries}/rest-assured/README.md (100%) rename {testing-modules => testing-libraries}/rest-assured/pom.xml (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/java/com/baeldung/restassured/Application.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/resources/1 (100%) rename {testing-modules => testing-libraries}/rest-assured/src/main/resources/2 (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/Odd.java (94%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/Util.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/resources/employees.xml (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/resources/event_0.json (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/resources/odds.json (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/resources/teachers.xml (100%) rename {testing-modules => testing-libraries}/rest-assured/src/test/resources/test.txt (100%) rename {testing-modules => testing-libraries}/rest-testing/.gitignore (100%) rename {testing-modules => testing-libraries}/rest-testing/README.md (100%) rename {testing-modules => testing-libraries}/rest-testing/pom.xml (100%) rename {testing-modules => testing-libraries}/rest-testing/src/main/resources/cucumber.json (100%) rename {testing-modules => testing-libraries}/rest-testing/src/main/resources/karate/cucumber.feature (100%) rename {testing-modules => testing-libraries}/rest-testing/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/rest-testing/src/main/resources/wiremock_intro.json (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/resources/Feature/cucumber.feature (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/resources/github_user_not_found.story (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/resources/github_user_response_mediatype.story (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/resources/github_user_response_payload.story (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/resources/increase.story (100%) rename {testing-modules => testing-libraries}/rest-testing/src/test/resources/karate/user.feature (100%) rename {testing-modules => testing-libraries}/runjunitfromjava/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java (100%) rename {testing-modules => testing-libraries}/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java (100%) rename {testing-modules => testing-libraries}/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java (100%) rename {testing-modules => testing-libraries}/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/README.md (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/geckodriver.mac (100%) mode change 100755 => 100644 rename {testing-modules => testing-libraries}/selenium-junit-testng/pom.xml (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java (100%) rename {testing-modules => testing-libraries}/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/README.md (100%) rename {testing-modules => testing-libraries}/spring-testing/pom.xml (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/com/baeldung/config/WebConfig.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java (94%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java (96%) rename {testing-modules => testing-libraries}/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java (95%) rename {testing-modules => testing-libraries}/spring-testing/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java (97%) rename {testing-modules => testing-libraries}/spring-testing/src/test/resources/application-test.properties (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/resources/application.properties (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/resources/context-override-application.properties (100%) rename {testing-modules => testing-libraries}/spring-testing/src/test/resources/other-location.properties (100%) rename {testing-modules => testing-libraries}/test-containers/README.md (100%) rename {testing-modules => testing-libraries}/test-containers/pom.xml (100%) rename {testing-modules => testing-libraries}/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java (100%) rename {testing-modules => testing-libraries}/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java (100%) rename {testing-modules => testing-libraries}/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java (100%) rename {testing-modules => testing-libraries}/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java (100%) rename {testing-modules => testing-libraries}/test-containers/src/test/resources/test-compose.yml (100%) rename {testing-modules => testing-libraries}/testng/README.md (100%) rename {testing-modules => testing-libraries}/testng/pom.xml (96%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/GroupIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java (100%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/reports/CustomisedListener.java (96%) rename {testing-modules => testing-libraries}/testng/src/test/java/com/baeldung/reports/CustomisedReports.java (97%) rename {testing-modules => testing-libraries}/testng/src/test/resources/logback.xml (97%) rename {testing-modules => testing-libraries}/testng/src/test/resources/parametrized_testng.xml (97%) rename {testing-modules => testing-libraries}/testng/src/test/resources/reportTemplate.html (100%) rename {testing-modules => testing-libraries}/testng/src/test/resources/test_group.xml (96%) rename {testing-modules => testing-libraries}/testng/src/test/resources/test_setup.xml (96%) rename {testing-modules => testing-libraries}/testng/src/test/resources/test_suite.xml (97%) rename {testing-modules => testing-libraries}/xmlunit-2/README.md (100%) rename {testing-modules => testing-libraries}/xmlunit-2/pom.xml (100%) rename {testing-modules => testing-libraries}/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java (100%) rename {testing-modules/testing => testing-libraries/xmlunit-2}/src/main/resources/logback.xml (100%) rename {testing-modules => testing-libraries}/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java (100%) rename {testing-modules => testing-libraries}/xmlunit-2/src/test/resources/control.xml (100%) rename {testing-modules => testing-libraries}/xmlunit-2/src/test/resources/students.xml (100%) rename {testing-modules => testing-libraries}/xmlunit-2/src/test/resources/students.xsd (100%) rename {testing-modules => testing-libraries}/xmlunit-2/src/test/resources/students_with_error.xml (100%) rename {testing-modules => testing-libraries}/xmlunit-2/src/test/resources/teachers.xml (100%) rename {testing-modules => testing-libraries}/xmlunit-2/src/test/resources/test.xml (100%) delete mode 100644 testing-modules/groovy-spock/report-2019-03-29.json delete mode 100644 testing-modules/testing/README.md delete mode 100644 testing-modules/testing/pom.xml delete mode 100644 testing-modules/xmlunit-2/src/main/resources/logback.xml diff --git a/assertion-libraries/pom.xml b/assertion-libraries/pom.xml new file mode 100644 index 0000000000..274806d336 --- /dev/null +++ b/assertion-libraries/pom.xml @@ -0,0 +1,81 @@ + + 4.0.0 + com.baeldung + assertion-libraries + 0.1-SNAPSHOT + assertion-libraries + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + com.google.truth + truth + ${truth.version} + + + com.google.truth.extensions + truth-java8-extension + ${truth.version} + test + + + org.assertj + assertj-guava + ${assertj-guava.version} + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + org.javalite + javalite-common + ${javalite.version} + + + org.jgotesting + jgotesting + ${jgotesting.version} + test + + + + + + + + org.assertj + assertj-assertions-generator-maven-plugin + ${assertj-generator.version} + + + com.baeldung.testing.assertj.custom.Person + + + + + + + + 0.32 + 3.1.0 + 3.9.0 + 2.1.0 + 1.4.13 + 0.12 + + + + + + + diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Dog.java b/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java similarity index 88% rename from testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Dog.java rename to assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java index 7a1c158500..6c049e1a10 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Dog.java +++ b/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; public class Dog { private String name; diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Member.java b/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java similarity index 88% rename from testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Member.java rename to assertion-libraries/src/main/java/com/baeldung/assertj/Member.java index a0b3d0daac..baf3c2df52 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Member.java +++ b/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; public class Member { private String name; diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Person.java b/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java similarity index 88% rename from testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Person.java rename to assertion-libraries/src/main/java/com/baeldung/assertj/Person.java index 43e9ff8884..09b16b4f5b 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/Person.java +++ b/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; public class Person { private String name; diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java b/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java similarity index 93% rename from testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java rename to assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java index 34afc480e4..5506a56b51 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/assertj/custom/Person.java +++ b/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.custom; +package com.baeldung.assertj.custom; import java.util.ArrayList; import java.util.List; diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java b/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/jspec/Animal.java rename to assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java b/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/jspec/Cage.java rename to assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java b/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/jspec/Cat.java rename to assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java b/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/jspec/Dog.java rename to assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/junit/Calculator.java b/assertion-libraries/src/main/java/com/baeldung/junit/Calculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/junit/Calculator.java rename to assertion-libraries/src/main/java/com/baeldung/junit/Calculator.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/truth/User.java b/assertion-libraries/src/main/java/com/baeldung/truth/User.java similarity index 97% rename from testing-modules/testing/src/main/java/com/baeldung/testing/truth/User.java rename to assertion-libraries/src/main/java/com/baeldung/truth/User.java index fe857dd265..2b5ffde19f 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/truth/User.java +++ b/assertion-libraries/src/main/java/com/baeldung/truth/User.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.truth; +package com.baeldung.truth; import java.util.Arrays; import java.util.List; diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/truth/UserSubject.java b/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java similarity index 97% rename from testing-modules/testing/src/main/java/com/baeldung/testing/truth/UserSubject.java rename to assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java index 2fd84085a0..b478043ad8 100644 --- a/testing-modules/testing/src/main/java/com/baeldung/testing/truth/UserSubject.java +++ b/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.truth; +package com.baeldung.truth; import com.google.common.truth.ComparableSubject; import com.google.common.truth.FailureStrategy; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJConditionUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java similarity index 98% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJConditionUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java index 6fa09d8dfc..ec2d93500f 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJConditionUnitTest.java +++ b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; import static org.assertj.core.api.Assertions.allOf; import static org.assertj.core.api.Assertions.anyOf; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java similarity index 98% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java index 6836bb79c5..73b9b373a1 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJCoreUnitTest.java +++ b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; import org.assertj.core.util.Maps; import org.junit.Ignore; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java similarity index 98% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java index 2056d7e61a..6a552aee78 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJGuavaUnitTest.java +++ b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; import com.google.common.base.Optional; import com.google.common.collect.ArrayListMultimap; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java similarity index 98% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java index 7ec6d0caa7..a2f58d677d 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/AssertJJava8UnitTest.java +++ b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj; +package com.baeldung.assertj; import org.junit.Test; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java similarity index 91% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java index 4c09311bac..98f50568a8 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/AssertJCustomAssertionsUnitTest.java +++ b/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java @@ -1,6 +1,6 @@ -package com.baeldung.testing.assertj.custom; +package com.baeldung.assertj.custom; -import static com.baeldung.testing.assertj.custom.Assertions.assertThat; +import static com.baeldung.assertj.custom.Assertions.assertThat; import static org.junit.Assert.fail; import org.junit.Rule; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java b/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java similarity index 81% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java rename to assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java index fcffb8fc6c..3e1021851e 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/Assertions.java +++ b/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.custom; +package com.baeldung.assertj.custom; public class Assertions { public static PersonAssert assertThat(Person actual) { diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java b/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java similarity index 95% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java rename to assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java index d6cc585e96..5be093644a 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/custom/PersonAssert.java +++ b/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.custom; +package com.baeldung.assertj.custom; import org.assertj.core.api.AbstractAssert; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java7StyleAssertions.java b/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java similarity index 94% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java7StyleAssertions.java rename to assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java index 07a5be1118..ab93f8eac7 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java7StyleAssertions.java +++ b/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.exceptions; +package com.baeldung.assertj.exceptions; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.fail; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java8StyleAssertions.java b/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java similarity index 97% rename from testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java8StyleAssertions.java rename to assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java index 973b921654..4d4e2aedfc 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/assertj/exceptions/Java8StyleAssertions.java +++ b/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.assertj.exceptions; +package com.baeldung.assertj.exceptions; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.assertThat; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/jgotesting/JGoTestingUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/testing/jgotesting/JGoTestingUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/jspec/CageUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/jspec/JSpecUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/AdditionUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/AdditionUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/AssertionsUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/AssertionsUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java b/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/BlockingTestRunner.java rename to assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/CalculatorUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/CalculatorUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/SubstractionUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/SubstractionUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/SuiteUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/SuiteUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junit/TestRunner.java b/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junit/TestRunner.java rename to assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java similarity index 99% rename from testing-modules/testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java rename to assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java index 5be27db9db..b7919a29ca 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/truth/GoogleTruthUnitTest.java +++ b/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.truth; +package com.baeldung.truth; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; @@ -6,7 +6,7 @@ import com.google.common.collect.Range; import com.google.common.collect.Table; import com.google.common.collect.TreeBasedTable; import com.google.common.collect.TreeMultiset; -import static com.baeldung.testing.truth.UserSubject.*; +import static com.baeldung.truth.UserSubject.*; import static com.google.common.truth.Truth.*; import static com.google.common.truth.Truth8.*; import java.math.BigDecimal; diff --git a/pom.xml b/pom.xml index a4f2a13c28..0ac31c03eb 100644 --- a/pom.xml +++ b/pom.xml @@ -780,7 +780,9 @@ structurizr struts-2 - testing-modules + assertion-libraries + testing-libraries + testing-libraries-2 twilio twitter4j @@ -1458,7 +1460,9 @@ structurizr struts-2 - testing-modules + assertion-libraries + testing-libraries + testing-libraries-2 twilio twitter4j diff --git a/testing-libraries-2/README.md b/testing-libraries-2/README.md new file mode 100644 index 0000000000..949ae7f760 --- /dev/null +++ b/testing-libraries-2/README.md @@ -0,0 +1,5 @@ + +## Testing Modules + +This is a aggregator module containing several modules focused on testing libraries 2. + diff --git a/testing-libraries-2/cucumber/pom.xml b/testing-libraries-2/cucumber/pom.xml new file mode 100644 index 0000000000..b12a3297bb --- /dev/null +++ b/testing-libraries-2/cucumber/pom.xml @@ -0,0 +1,41 @@ + + + 4.0.0 + cucumber + cucumber + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../.. + + + + + info.cukes + cucumber-junit + ${cucumber.version} + test + + + info.cukes + cucumber-java + ${cucumber.version} + test + + + info.cukes + cucumber-java8 + ${cucumber.version} + test + + + + + 1.2.5 + + + \ No newline at end of file diff --git a/testing-modules/testing/src/main/java/com/baeldung/cucumber/Calculator.java b/testing-libraries-2/cucumber/src/main/java/com/baeldung/cucumber/Calculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/cucumber/Calculator.java rename to testing-libraries-2/cucumber/src/main/java/com/baeldung/cucumber/Calculator.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java b/testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java similarity index 91% rename from testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java rename to testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java index 20bd62396c..00f666db2d 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorIntegrationTest.java +++ b/testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.calculator; +package com.baeldung.calculator; import cucumber.api.CucumberOptions; import cucumber.api.junit.Cucumber; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java b/testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java similarity index 95% rename from testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java rename to testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java index ef6dff9617..7eda618566 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/calculator/CalculatorRunSteps.java +++ b/testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.calculator; +package com.baeldung.calculator; import com.baeldung.cucumber.Calculator; import cucumber.api.java.Before; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java b/testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java similarity index 86% rename from testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java rename to testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java index 7bf8641ed6..20fd65b02a 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingIntegrationTest.java +++ b/testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.shopping; +package com.baeldung.shopping; import org.junit.runner.RunWith; diff --git a/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java b/testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java similarity index 92% rename from testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java rename to testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java index 2c4bf2eeae..c56ec95883 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/testing/shopping/ShoppingStepsDef.java +++ b/testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.shopping; +package com.baeldung.shopping; import static org.junit.Assert.assertEquals; import cucumber.api.java8.En; diff --git a/testing-modules/testing/src/test/resources/features/calculator-scenario-outline.feature b/testing-libraries-2/cucumber/src/test/resources/features/calculator-scenario-outline.feature similarity index 100% rename from testing-modules/testing/src/test/resources/features/calculator-scenario-outline.feature rename to testing-libraries-2/cucumber/src/test/resources/features/calculator-scenario-outline.feature diff --git a/testing-modules/testing/src/test/resources/features/calculator.feature b/testing-libraries-2/cucumber/src/test/resources/features/calculator.feature similarity index 100% rename from testing-modules/testing/src/test/resources/features/calculator.feature rename to testing-libraries-2/cucumber/src/test/resources/features/calculator.feature diff --git a/testing-modules/testing/src/test/resources/features/shopping.feature b/testing-libraries-2/cucumber/src/test/resources/features/shopping.feature similarity index 100% rename from testing-modules/testing/src/test/resources/features/shopping.feature rename to testing-libraries-2/cucumber/src/test/resources/features/shopping.feature diff --git a/testing-libraries-2/lambdabehave/pom.xml b/testing-libraries-2/lambdabehave/pom.xml new file mode 100644 index 0000000000..61fd20da03 --- /dev/null +++ b/testing-libraries-2/lambdabehave/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + lambdabehave + lambdabehave + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../.. + + + + + com.insightfullogic + lambda-behave + ${lambda-behave.version} + + + + + 0.4 + + + \ No newline at end of file diff --git a/testing-modules/testing/src/main/java/com/baeldung/lambdabehave/Calculator.java b/testing-libraries-2/lambdabehave/src/main/java/com/baeldung/lambdabehave/Calculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/lambdabehave/Calculator.java rename to testing-libraries-2/lambdabehave/src/main/java/com/baeldung/lambdabehave/Calculator.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java b/testing-libraries-2/lambdabehave/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java rename to testing-libraries-2/lambdabehave/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java diff --git a/testing-libraries-2/mutations/pom.xml b/testing-libraries-2/mutations/pom.xml new file mode 100644 index 0000000000..c4ff0660b0 --- /dev/null +++ b/testing-libraries-2/mutations/pom.xml @@ -0,0 +1,16 @@ + + + 4.0.0 + mutations + mutations + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../.. + + + \ No newline at end of file diff --git a/testing-modules/testing/src/main/java/com/baeldung/testing/mutation/Palindrome.java b/testing-libraries-2/mutations/src/main/java/com/baeldung/mutation/Palindrome.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/testing/mutation/Palindrome.java rename to testing-libraries-2/mutations/src/main/java/com/baeldung/mutation/Palindrome.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java b/testing-libraries-2/mutations/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java similarity index 90% rename from testing-modules/testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java rename to testing-libraries-2/mutations/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java index 5321735469..cb4830a6fb 100644 --- a/testing-modules/testing/src/test/java/com/baeldung/mutation/test/PalindromeUnitTest.java +++ b/testing-libraries-2/mutations/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java @@ -1,11 +1,11 @@ -package com.baeldung.mutation.test; +package com.baeldung.mutation; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import org.junit.Test; -import com.baeldung.testing.mutation.Palindrome; +import com.baeldung.mutation.Palindrome; public class PalindromeUnitTest { @Test diff --git a/testing-libraries-2/pom.xml b/testing-libraries-2/pom.xml new file mode 100644 index 0000000000..728a510430 --- /dev/null +++ b/testing-libraries-2/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + testing-libraries-2 + testing-libraries-2 + pom + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + .. + + + + mutations + cucumber + lambdabehave + + + diff --git a/testing-modules/README.md b/testing-libraries/README.md similarity index 100% rename from testing-modules/README.md rename to testing-libraries/README.md diff --git a/testing-modules/easy-random/README.md b/testing-libraries/easy-random/README.md similarity index 100% rename from testing-modules/easy-random/README.md rename to testing-libraries/easy-random/README.md diff --git a/testing-modules/easy-random/pom.xml b/testing-libraries/easy-random/pom.xml similarity index 100% rename from testing-modules/easy-random/pom.xml rename to testing-libraries/easy-random/pom.xml diff --git a/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java b/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java similarity index 100% rename from testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java rename to testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java diff --git a/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java b/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java similarity index 100% rename from testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java rename to testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java diff --git a/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java b/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java similarity index 100% rename from testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java rename to testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java diff --git a/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java b/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java similarity index 100% rename from testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java rename to testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java diff --git a/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java b/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java similarity index 100% rename from testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java rename to testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java diff --git a/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java b/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java similarity index 100% rename from testing-modules/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java rename to testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java diff --git a/testing-modules/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java b/testing-libraries/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java similarity index 100% rename from testing-modules/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java rename to testing-libraries/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java diff --git a/testing-modules/easymock/pom.xml b/testing-libraries/easymock/pom.xml similarity index 100% rename from testing-modules/easymock/pom.xml rename to testing-libraries/easymock/pom.xml diff --git a/testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java b/testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java similarity index 100% rename from testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java rename to testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java diff --git a/testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/Location.java b/testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/Location.java similarity index 100% rename from testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/Location.java rename to testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/Location.java diff --git a/testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java b/testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java similarity index 100% rename from testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java rename to testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java diff --git a/testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java b/testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java similarity index 100% rename from testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java rename to testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java diff --git a/testing-modules/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java b/testing-libraries/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java similarity index 100% rename from testing-modules/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java rename to testing-libraries/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java diff --git a/testing-modules/gatling/README.md b/testing-libraries/gatling/README.md similarity index 100% rename from testing-modules/gatling/README.md rename to testing-libraries/gatling/README.md diff --git a/testing-modules/gatling/pom.xml b/testing-libraries/gatling/pom.xml similarity index 96% rename from testing-modules/gatling/pom.xml rename to testing-libraries/gatling/pom.xml index e708d939e4..37693ebfee 100644 --- a/testing-modules/gatling/pom.xml +++ b/testing-libraries/gatling/pom.xml @@ -1,136 +1,136 @@ - - - 4.0.0 - org.baeldung - gatling - 1.0-SNAPSHOT - gatling - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - ../../ - - - - - - io.gatling - gatling-app - ${gatling.version} - - - io.gatling - gatling-recorder - ${gatling.version} - - - io.gatling.highcharts - gatling-charts-highcharts - ${gatling.version} - - - org.scala-lang - scala-library - ${scala.version} - - - - - - - io.gatling.highcharts - gatling-charts-highcharts - - - io.gatling - gatling-app - - - io.gatling - gatling-recorder - - - org.scala-lang - scala-library - - - - - src/test/scala - - - - net.alchim31.maven - scala-maven-plugin - ${scala-maven-plugin.version} - - - - - - net.alchim31.maven - scala-maven-plugin - - - - testCompile - - - - - -Ydelambdafy:method - -target:jvm-1.8 - -deprecation - -feature - -unchecked - -language:implicitConversions - -language:postfixOps - - - - - - - - - - - simulation - - - - io.gatling - gatling-maven-plugin - ${gatling-maven-plugin.version} - - - test - - execute - - - true - - - - - - - - - - - 1.8 - 1.8 - UTF-8 - 2.12.6 - 2.3.1 - 3.2.2 - 2.2.4 - - - + + + 4.0.0 + org.baeldung + gatling + 1.0-SNAPSHOT + gatling + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + + io.gatling + gatling-app + ${gatling.version} + + + io.gatling + gatling-recorder + ${gatling.version} + + + io.gatling.highcharts + gatling-charts-highcharts + ${gatling.version} + + + org.scala-lang + scala-library + ${scala.version} + + + + + + + io.gatling.highcharts + gatling-charts-highcharts + + + io.gatling + gatling-app + + + io.gatling + gatling-recorder + + + org.scala-lang + scala-library + + + + + src/test/scala + + + + net.alchim31.maven + scala-maven-plugin + ${scala-maven-plugin.version} + + + + + + net.alchim31.maven + scala-maven-plugin + + + + testCompile + + + + + -Ydelambdafy:method + -target:jvm-1.8 + -deprecation + -feature + -unchecked + -language:implicitConversions + -language:postfixOps + + + + + + + + + + + simulation + + + + io.gatling + gatling-maven-plugin + ${gatling-maven-plugin.version} + + + test + + execute + + + true + + + + + + + + + + + 1.8 + 1.8 + UTF-8 + 2.12.6 + 2.3.1 + 3.2.2 + 2.2.4 + + + diff --git a/testing-modules/gatling/src/test/resources/gatling.conf b/testing-libraries/gatling/src/test/resources/gatling.conf similarity index 100% rename from testing-modules/gatling/src/test/resources/gatling.conf rename to testing-libraries/gatling/src/test/resources/gatling.conf diff --git a/testing-modules/gatling/src/test/resources/logback.xml b/testing-libraries/gatling/src/test/resources/logback.xml similarity index 100% rename from testing-modules/gatling/src/test/resources/logback.xml rename to testing-libraries/gatling/src/test/resources/logback.xml diff --git a/testing-modules/gatling/src/test/resources/recorder.conf b/testing-libraries/gatling/src/test/resources/recorder.conf similarity index 100% rename from testing-modules/gatling/src/test/resources/recorder.conf rename to testing-libraries/gatling/src/test/resources/recorder.conf diff --git a/testing-modules/gatling/src/test/scala/Engine.scala b/testing-libraries/gatling/src/test/scala/Engine.scala similarity index 97% rename from testing-modules/gatling/src/test/scala/Engine.scala rename to testing-libraries/gatling/src/test/scala/Engine.scala index 32c85fbe45..c2884fc218 100644 --- a/testing-modules/gatling/src/test/scala/Engine.scala +++ b/testing-libraries/gatling/src/test/scala/Engine.scala @@ -1,13 +1,13 @@ -import io.gatling.app.Gatling -import io.gatling.core.config.GatlingPropertiesBuilder - -object Engine extends App { - - val props = new GatlingPropertiesBuilder - props.dataDirectory(IDEPathHelper.dataDirectory.toString) - props.resultsDirectory(IDEPathHelper.resultsDirectory.toString) - props.bodiesDirectory(IDEPathHelper.bodiesDirectory.toString) - props.binariesDirectory(IDEPathHelper.mavenBinariesDirectory.toString) - - Gatling.fromMap(props.build) -} +import io.gatling.app.Gatling +import io.gatling.core.config.GatlingPropertiesBuilder + +object Engine extends App { + + val props = new GatlingPropertiesBuilder + props.dataDirectory(IDEPathHelper.dataDirectory.toString) + props.resultsDirectory(IDEPathHelper.resultsDirectory.toString) + props.bodiesDirectory(IDEPathHelper.bodiesDirectory.toString) + props.binariesDirectory(IDEPathHelper.mavenBinariesDirectory.toString) + + Gatling.fromMap(props.build) +} diff --git a/testing-modules/gatling/src/test/scala/IDEPathHelper.scala b/testing-libraries/gatling/src/test/scala/IDEPathHelper.scala similarity index 97% rename from testing-modules/gatling/src/test/scala/IDEPathHelper.scala rename to testing-libraries/gatling/src/test/scala/IDEPathHelper.scala index 0abf6a42ef..9fb1d7d5c8 100644 --- a/testing-modules/gatling/src/test/scala/IDEPathHelper.scala +++ b/testing-libraries/gatling/src/test/scala/IDEPathHelper.scala @@ -1,22 +1,22 @@ -import java.nio.file.Path - -import io.gatling.commons.util.PathHelper._ - -object IDEPathHelper { - - val gatlingConfUrl: Path = getClass.getClassLoader.getResource("gatling.conf").toURI - val projectRootDir = gatlingConfUrl.ancestor(3) - - val mavenSourcesDirectory = projectRootDir / "src" / "test" / "scala" - val mavenResourcesDirectory = projectRootDir / "src" / "test" / "resources" - val mavenTargetDirectory = projectRootDir / "target" - val mavenBinariesDirectory = mavenTargetDirectory / "test-classes" - - val dataDirectory = mavenResourcesDirectory / "data" - val bodiesDirectory = mavenResourcesDirectory / "bodies" - - val recorderOutputDirectory = mavenSourcesDirectory - val resultsDirectory = mavenTargetDirectory / "gatling" - - val recorderConfigFile = mavenResourcesDirectory / "recorder.conf" -} +import java.nio.file.Path + +import io.gatling.commons.util.PathHelper._ + +object IDEPathHelper { + + val gatlingConfUrl: Path = getClass.getClassLoader.getResource("gatling.conf").toURI + val projectRootDir = gatlingConfUrl.ancestor(3) + + val mavenSourcesDirectory = projectRootDir / "src" / "test" / "scala" + val mavenResourcesDirectory = projectRootDir / "src" / "test" / "resources" + val mavenTargetDirectory = projectRootDir / "target" + val mavenBinariesDirectory = mavenTargetDirectory / "test-classes" + + val dataDirectory = mavenResourcesDirectory / "data" + val bodiesDirectory = mavenResourcesDirectory / "bodies" + + val recorderOutputDirectory = mavenSourcesDirectory + val resultsDirectory = mavenTargetDirectory / "gatling" + + val recorderConfigFile = mavenResourcesDirectory / "recorder.conf" +} diff --git a/testing-modules/gatling/src/test/scala/Recorder.scala b/testing-libraries/gatling/src/test/scala/Recorder.scala similarity index 97% rename from testing-modules/gatling/src/test/scala/Recorder.scala rename to testing-libraries/gatling/src/test/scala/Recorder.scala index 6ad320618b..9c38e52f12 100644 --- a/testing-modules/gatling/src/test/scala/Recorder.scala +++ b/testing-libraries/gatling/src/test/scala/Recorder.scala @@ -1,12 +1,12 @@ -import io.gatling.recorder.GatlingRecorder -import io.gatling.recorder.config.RecorderPropertiesBuilder - -object Recorder extends App { - - val props = new RecorderPropertiesBuilder - props.simulationOutputFolder(IDEPathHelper.recorderOutputDirectory.toString) - props.simulationPackage("org.baeldung") - props.bodiesFolder(IDEPathHelper.bodiesDirectory.toString) - - GatlingRecorder.fromMap(props.build, Some(IDEPathHelper.recorderConfigFile)) -} +import io.gatling.recorder.GatlingRecorder +import io.gatling.recorder.config.RecorderPropertiesBuilder + +object Recorder extends App { + + val props = new RecorderPropertiesBuilder + props.simulationOutputFolder(IDEPathHelper.recorderOutputDirectory.toString) + props.simulationPackage("org.baeldung") + props.bodiesFolder(IDEPathHelper.bodiesDirectory.toString) + + GatlingRecorder.fromMap(props.build, Some(IDEPathHelper.recorderConfigFile)) +} diff --git a/testing-modules/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala b/testing-libraries/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala similarity index 100% rename from testing-modules/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala rename to testing-libraries/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala diff --git a/testing-modules/groovy-spock/.gitignore b/testing-libraries/groovy-spock/.gitignore similarity index 100% rename from testing-modules/groovy-spock/.gitignore rename to testing-libraries/groovy-spock/.gitignore diff --git a/testing-modules/groovy-spock/README.md b/testing-libraries/groovy-spock/README.md similarity index 100% rename from testing-modules/groovy-spock/README.md rename to testing-libraries/groovy-spock/README.md diff --git a/testing-modules/groovy-spock/pom.xml b/testing-libraries/groovy-spock/pom.xml similarity index 100% rename from testing-modules/groovy-spock/pom.xml rename to testing-libraries/groovy-spock/pom.xml diff --git a/testing-modules/groovy-spock/src/main/java/mocks/EventPublisher.java b/testing-libraries/groovy-spock/src/main/java/mocks/EventPublisher.java similarity index 100% rename from testing-modules/groovy-spock/src/main/java/mocks/EventPublisher.java rename to testing-libraries/groovy-spock/src/main/java/mocks/EventPublisher.java diff --git a/testing-modules/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java b/testing-libraries/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java similarity index 100% rename from testing-modules/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java rename to testing-libraries/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java diff --git a/testing-modules/groovy-spock/src/main/java/mocks/Item.java b/testing-libraries/groovy-spock/src/main/java/mocks/Item.java similarity index 100% rename from testing-modules/groovy-spock/src/main/java/mocks/Item.java rename to testing-libraries/groovy-spock/src/main/java/mocks/Item.java diff --git a/testing-modules/groovy-spock/src/main/java/mocks/ItemProvider.java b/testing-libraries/groovy-spock/src/main/java/mocks/ItemProvider.java similarity index 100% rename from testing-modules/groovy-spock/src/main/java/mocks/ItemProvider.java rename to testing-libraries/groovy-spock/src/main/java/mocks/ItemProvider.java diff --git a/testing-modules/groovy-spock/src/main/java/mocks/ItemService.java b/testing-libraries/groovy-spock/src/main/java/mocks/ItemService.java similarity index 100% rename from testing-modules/groovy-spock/src/main/java/mocks/ItemService.java rename to testing-libraries/groovy-spock/src/main/java/mocks/ItemService.java diff --git a/testing-modules/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java b/testing-libraries/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java similarity index 100% rename from testing-modules/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java rename to testing-libraries/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java diff --git a/testing-modules/groovy-spock/src/test/groovy/FirstSpecification.groovy b/testing-libraries/groovy-spock/src/test/groovy/FirstSpecification.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/FirstSpecification.groovy rename to testing-libraries/groovy-spock/src/test/groovy/FirstSpecification.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/Notifier.groovy b/testing-libraries/groovy-spock/src/test/groovy/Notifier.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/Notifier.groovy rename to testing-libraries/groovy-spock/src/test/groovy/Notifier.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/PaymentGateway.groovy b/testing-libraries/groovy-spock/src/test/groovy/PaymentGateway.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/PaymentGateway.groovy rename to testing-libraries/groovy-spock/src/test/groovy/PaymentGateway.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/IssueTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/IssueTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/IssueTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/IssueTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/RetryTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/RetryTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/RetryTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/RetryTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/SeeTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/SeeTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/SeeTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/SeeTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy diff --git a/testing-modules/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy b/testing-libraries/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy rename to testing-libraries/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy diff --git a/testing-modules/groovy-spock/src/test/resources/SpockConfig.groovy b/testing-libraries/groovy-spock/src/test/resources/SpockConfig.groovy similarity index 100% rename from testing-modules/groovy-spock/src/test/resources/SpockConfig.groovy rename to testing-libraries/groovy-spock/src/test/resources/SpockConfig.groovy diff --git a/testing-modules/junit-4/README.md b/testing-libraries/junit-4/README.md similarity index 100% rename from testing-modules/junit-4/README.md rename to testing-libraries/junit-4/README.md diff --git a/testing-modules/junit-4/pom.xml b/testing-libraries/junit-4/pom.xml similarity index 64% rename from testing-modules/junit-4/pom.xml rename to testing-libraries/junit-4/pom.xml index 272a9380b5..be0f51ea23 100644 --- a/testing-modules/junit-4/pom.xml +++ b/testing-libraries/junit-4/pom.xml @@ -15,4 +15,17 @@ ../../ + + + pl.pragmatists + JUnitParams + ${jUnitParams.version} + test + + + + + 1.1.0 + + diff --git a/testing-modules/testing/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java b/testing-libraries/junit-4/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java rename to testing-libraries/junit-4/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java diff --git a/testing-modules/junit-4/src/main/resources/logback.xml b/testing-libraries/junit-4/src/main/resources/logback.xml similarity index 100% rename from testing-modules/junit-4/src/main/resources/logback.xml rename to testing-libraries/junit-4/src/main/resources/logback.xml diff --git a/testing-modules/testing/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java b/testing-libraries/junit-4/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/junitparams/TestDataProvider.java b/testing-libraries/junit-4/src/test/java/com/baeldung/junitparams/TestDataProvider.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/junitparams/TestDataProvider.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/junitparams/TestDataProvider.java diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java b/testing-libraries/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java similarity index 100% rename from testing-modules/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java b/testing-libraries/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java similarity index 100% rename from testing-modules/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java b/testing-libraries/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java similarity index 100% rename from testing-modules/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java b/testing-libraries/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java similarity index 100% rename from testing-modules/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java b/testing-libraries/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java similarity index 100% rename from testing-modules/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java b/testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/runfromjava/MyTestSuite.java b/testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/MyTestSuite.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/runfromjava/MyTestSuite.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/MyTestSuite.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java b/testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java b/testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java rename to testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java diff --git a/testing-modules/testing/src/test/resources/JunitParamsTestParameters.csv b/testing-libraries/junit-4/src/test/resources/JunitParamsTestParameters.csv similarity index 100% rename from testing-modules/testing/src/test/resources/JunitParamsTestParameters.csv rename to testing-libraries/junit-4/src/test/resources/JunitParamsTestParameters.csv diff --git a/testing-modules/junit-5-advanced/README.md b/testing-libraries/junit-5-advanced/README.md similarity index 100% rename from testing-modules/junit-5-advanced/README.md rename to testing-libraries/junit-5-advanced/README.md diff --git a/testing-modules/junit-5-advanced/pom.xml b/testing-libraries/junit-5-advanced/pom.xml similarity index 100% rename from testing-modules/junit-5-advanced/pom.xml rename to testing-libraries/junit-5-advanced/pom.xml diff --git a/testing-modules/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java b/testing-libraries/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java similarity index 100% rename from testing-modules/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java rename to testing-libraries/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java diff --git a/testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java b/testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java similarity index 100% rename from testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java rename to testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java diff --git a/testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java b/testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java similarity index 100% rename from testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java rename to testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java diff --git a/testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java b/testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java similarity index 100% rename from testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java rename to testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java diff --git a/testing-modules/junit-5-advanced/src/main/resources/logback.xml b/testing-libraries/junit-5-advanced/src/main/resources/logback.xml similarity index 100% rename from testing-modules/junit-5-advanced/src/main/resources/logback.xml rename to testing-libraries/junit-5-advanced/src/main/resources/logback.xml diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java b/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java similarity index 100% rename from testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java rename to testing-libraries/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java b/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java similarity index 100% rename from testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java rename to testing-libraries/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java b/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java similarity index 100% rename from testing-modules/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java rename to testing-libraries/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java b/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java similarity index 100% rename from testing-modules/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java rename to testing-libraries/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java b/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java similarity index 100% rename from testing-modules/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java rename to testing-libraries/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java b/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java similarity index 100% rename from testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java rename to testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java b/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java similarity index 100% rename from testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java rename to testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java b/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java similarity index 100% rename from testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java rename to testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java diff --git a/testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java b/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java similarity index 100% rename from testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java rename to testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java diff --git a/testing-modules/junit-5-advanced/src/test/resources/lorem-ipsum.txt b/testing-libraries/junit-5-advanced/src/test/resources/lorem-ipsum.txt similarity index 100% rename from testing-modules/junit-5-advanced/src/test/resources/lorem-ipsum.txt rename to testing-libraries/junit-5-advanced/src/test/resources/lorem-ipsum.txt diff --git a/testing-modules/junit-5-basics/README.md b/testing-libraries/junit-5-basics/README.md similarity index 100% rename from testing-modules/junit-5-basics/README.md rename to testing-libraries/junit-5-basics/README.md diff --git a/testing-modules/junit-5-basics/pom.xml b/testing-libraries/junit-5-basics/pom.xml similarity index 100% rename from testing-modules/junit-5-basics/pom.xml rename to testing-libraries/junit-5-basics/pom.xml diff --git a/testing-modules/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java b/testing-libraries/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java similarity index 100% rename from testing-modules/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java rename to testing-libraries/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java diff --git a/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java b/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java similarity index 100% rename from testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java rename to testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java diff --git a/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java b/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java similarity index 100% rename from testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java rename to testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java diff --git a/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java b/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java similarity index 100% rename from testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java rename to testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java diff --git a/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java b/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java similarity index 100% rename from testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java rename to testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java diff --git a/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java b/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java similarity index 100% rename from testing-modules/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java rename to testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java diff --git a/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java b/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java similarity index 100% rename from testing-modules/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java rename to testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java diff --git a/testing-modules/junit-5-basics/src/main/resources/jdbc/schema.sql b/testing-libraries/junit-5-basics/src/main/resources/jdbc/schema.sql similarity index 100% rename from testing-modules/junit-5-basics/src/main/resources/jdbc/schema.sql rename to testing-libraries/junit-5-basics/src/main/resources/jdbc/schema.sql diff --git a/testing-modules/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml b/testing-libraries/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml similarity index 100% rename from testing-modules/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml rename to testing-libraries/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml diff --git a/testing-modules/junit-5-basics/src/main/resources/jdbc/test-data.sql b/testing-libraries/junit-5-basics/src/main/resources/jdbc/test-data.sql similarity index 100% rename from testing-modules/junit-5-basics/src/main/resources/jdbc/test-data.sql rename to testing-libraries/junit-5-basics/src/main/resources/jdbc/test-data.sql diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/LiveTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/LiveTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/LiveTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/LiveTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java b/testing-libraries/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java similarity index 100% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java rename to testing-libraries/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java diff --git a/testing-modules/junit-5-basics/src/test/resources/example_resource.txt b/testing-libraries/junit-5-basics/src/test/resources/example_resource.txt similarity index 100% rename from testing-modules/junit-5-basics/src/test/resources/example_resource.txt rename to testing-libraries/junit-5-basics/src/test/resources/example_resource.txt diff --git a/testing-modules/junit-5/README.md b/testing-libraries/junit-5/README.md similarity index 100% rename from testing-modules/junit-5/README.md rename to testing-libraries/junit-5/README.md diff --git a/testing-modules/junit-5/pom.xml b/testing-libraries/junit-5/pom.xml similarity index 100% rename from testing-modules/junit-5/pom.xml rename to testing-libraries/junit-5/pom.xml diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java b/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java b/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java b/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java b/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java b/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java b/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java b/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java b/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java b/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java b/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java b/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java b/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java b/testing-libraries/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java b/testing-libraries/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java rename to testing-libraries/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java diff --git a/testing-modules/junit-5/src/main/resources/logback.xml b/testing-libraries/junit-5/src/main/resources/logback.xml similarity index 100% rename from testing-modules/junit-5/src/main/resources/logback.xml rename to testing-libraries/junit-5/src/main/resources/logback.xml diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java b/testing-libraries/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/NestedUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/NestedUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/NestedUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/NestedUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java b/testing-libraries/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/StringUtils.java b/testing-libraries/junit-5/src/test/java/com/baeldung/StringUtils.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/StringUtils.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/StringUtils.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java b/testing-libraries/junit-5/src/test/java/com/baeldung/TestLauncher.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/TestLauncher.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java b/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java b/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java b/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java b/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java b/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java b/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/helpers/Employee.java b/testing-libraries/junit-5/src/test/java/com/baeldung/helpers/Employee.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/helpers/Employee.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/helpers/Employee.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java b/testing-libraries/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java b/testing-libraries/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java b/testing-libraries/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java similarity index 97% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java index d4195e3b12..e13b4e24be 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java +++ b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java @@ -1,126 +1,126 @@ -package com.baeldung.junit5.mockito; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.mockito.stubbing.Answer; - -import com.baeldung.junit5.mockito.repository.MailClient; -import com.baeldung.junit5.mockito.repository.SettingRepository; -import com.baeldung.junit5.mockito.repository.UserRepository; -import com.baeldung.junit5.mockito.service.DefaultUserService; -import com.baeldung.junit5.mockito.service.Errors; -import com.baeldung.junit5.mockito.service.UserService; - -@ExtendWith(MockitoExtension.class) -@RunWith(JUnitPlatform.class) -public class UserServiceUnitTest { - - UserService userService; - SettingRepository settingRepository; - @Mock UserRepository userRepository; - @Mock MailClient mailClient; - - User user; - - @BeforeEach - void init(@Mock SettingRepository settingRepository) { - userService = new DefaultUserService(userRepository, settingRepository, mailClient); - lenient().when(settingRepository.getUserMinAge()).thenReturn(10); - when(settingRepository.getUserNameMinLength()).thenReturn(4); - lenient().when(userRepository.isUsernameAlreadyExists(any(String.class))).thenReturn(false); - this.settingRepository = settingRepository; - } - - @Test - void givenValidUser_whenSaveUser_thenSucceed(@Mock MailClient mailClient) { - // Given - user = new User("Jerry", 12); - when(userRepository.insert(any(User.class))).then(new Answer() { - int sequence = 1; - - @Override - public User answer(InvocationOnMock invocation) throws Throwable { - User user = (User) invocation.getArgument(0); - user.setId(sequence++); - return user; - } - }); - - userService = new DefaultUserService(userRepository, settingRepository, mailClient); - - // When - User insertedUser = userService.register(user); - - // Then - verify(userRepository).insert(user); - Assertions.assertNotNull(user.getId()); - verify(mailClient).sendUserRegistrationMail(insertedUser); - } - - @Test - void givenShortName_whenSaveUser_thenGiveShortUsernameError() { - // Given - user = new User("tom", 12); - - // When - try { - userService.register(user); - fail("Should give an error"); - } catch(Exception ex) { - assertEquals(ex.getMessage(), Errors.USER_NAME_SHORT); - } - - // Then - verify(userRepository, never()).insert(user); - } - - @Test - void givenSmallAge_whenSaveUser_thenGiveYoungUserError() { - // Given - user = new User("jerry", 3); - - // When - try { - userService.register(user); - fail("Should give an error"); - } catch(Exception ex) { - assertEquals(ex.getMessage(), Errors.USER_AGE_YOUNG); - } - - // Then - verify(userRepository, never()).insert(user); - } - - @Test - void givenUserWithExistingName_whenSaveUser_thenGiveUsernameAlreadyExistsError() { - // Given - user = new User("jerry", 12); - Mockito.reset(userRepository); - when(userRepository.isUsernameAlreadyExists(any(String.class))).thenReturn(true); - - // When - try { - userService.register(user); - fail("Should give an error"); - } catch(Exception ex) { - assertEquals(ex.getMessage(), Errors.USER_NAME_DUPLICATE); - } - - // Then - verify(userRepository, never()).insert(user); - } - -} +package com.baeldung.junit5.mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.platform.runner.JUnitPlatform; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.mockito.stubbing.Answer; + +import com.baeldung.junit5.mockito.repository.MailClient; +import com.baeldung.junit5.mockito.repository.SettingRepository; +import com.baeldung.junit5.mockito.repository.UserRepository; +import com.baeldung.junit5.mockito.service.DefaultUserService; +import com.baeldung.junit5.mockito.service.Errors; +import com.baeldung.junit5.mockito.service.UserService; + +@ExtendWith(MockitoExtension.class) +@RunWith(JUnitPlatform.class) +public class UserServiceUnitTest { + + UserService userService; + SettingRepository settingRepository; + @Mock UserRepository userRepository; + @Mock MailClient mailClient; + + User user; + + @BeforeEach + void init(@Mock SettingRepository settingRepository) { + userService = new DefaultUserService(userRepository, settingRepository, mailClient); + lenient().when(settingRepository.getUserMinAge()).thenReturn(10); + when(settingRepository.getUserNameMinLength()).thenReturn(4); + lenient().when(userRepository.isUsernameAlreadyExists(any(String.class))).thenReturn(false); + this.settingRepository = settingRepository; + } + + @Test + void givenValidUser_whenSaveUser_thenSucceed(@Mock MailClient mailClient) { + // Given + user = new User("Jerry", 12); + when(userRepository.insert(any(User.class))).then(new Answer() { + int sequence = 1; + + @Override + public User answer(InvocationOnMock invocation) throws Throwable { + User user = (User) invocation.getArgument(0); + user.setId(sequence++); + return user; + } + }); + + userService = new DefaultUserService(userRepository, settingRepository, mailClient); + + // When + User insertedUser = userService.register(user); + + // Then + verify(userRepository).insert(user); + Assertions.assertNotNull(user.getId()); + verify(mailClient).sendUserRegistrationMail(insertedUser); + } + + @Test + void givenShortName_whenSaveUser_thenGiveShortUsernameError() { + // Given + user = new User("tom", 12); + + // When + try { + userService.register(user); + fail("Should give an error"); + } catch(Exception ex) { + assertEquals(ex.getMessage(), Errors.USER_NAME_SHORT); + } + + // Then + verify(userRepository, never()).insert(user); + } + + @Test + void givenSmallAge_whenSaveUser_thenGiveYoungUserError() { + // Given + user = new User("jerry", 3); + + // When + try { + userService.register(user); + fail("Should give an error"); + } catch(Exception ex) { + assertEquals(ex.getMessage(), Errors.USER_AGE_YOUNG); + } + + // Then + verify(userRepository, never()).insert(user); + } + + @Test + void givenUserWithExistingName_whenSaveUser_thenGiveUsernameAlreadyExistsError() { + // Given + user = new User("jerry", 12); + Mockito.reset(userRepository); + when(userRepository.isUsernameAlreadyExists(any(String.class))).thenReturn(true); + + // When + try { + userService.register(user); + fail("Should give an error"); + } catch(Exception ex) { + assertEquals(ex.getMessage(), Errors.USER_NAME_DUPLICATE); + } + + // Then + verify(userRepository, never()).insert(user); + } + +} diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java b/testing-libraries/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/param/Person.java b/testing-libraries/junit-5/src/test/java/com/baeldung/param/Person.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/param/Person.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/param/Person.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidator.java b/testing-libraries/junit-5/src/test/java/com/baeldung/param/PersonValidator.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidator.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/param/PersonValidator.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java b/testing-libraries/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Person.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Person.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Strings.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Strings.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java b/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java b/testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java b/testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java rename to testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java diff --git a/testing-modules/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/testing-libraries/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension similarity index 100% rename from testing-modules/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension rename to testing-libraries/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension diff --git a/testing-modules/junit-5/src/test/resources/com/baeldung/extensions/application.properties b/testing-libraries/junit-5/src/test/resources/com/baeldung/extensions/application.properties similarity index 100% rename from testing-modules/junit-5/src/test/resources/com/baeldung/extensions/application.properties rename to testing-libraries/junit-5/src/test/resources/com/baeldung/extensions/application.properties diff --git a/testing-modules/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties b/testing-libraries/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties similarity index 100% rename from testing-modules/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties rename to testing-libraries/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties diff --git a/testing-modules/junit-5/src/test/resources/data.csv b/testing-libraries/junit-5/src/test/resources/data.csv similarity index 100% rename from testing-modules/junit-5/src/test/resources/data.csv rename to testing-libraries/junit-5/src/test/resources/data.csv diff --git a/testing-modules/junit5-migration/README.md b/testing-libraries/junit5-migration/README.md similarity index 100% rename from testing-modules/junit5-migration/README.md rename to testing-libraries/junit5-migration/README.md diff --git a/testing-modules/junit5-migration/pom.xml b/testing-libraries/junit5-migration/pom.xml similarity index 100% rename from testing-modules/junit5-migration/pom.xml rename to testing-libraries/junit5-migration/pom.xml diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java diff --git a/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java b/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java similarity index 100% rename from testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java rename to testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java diff --git a/testing-modules/load-testing-comparison/README.md b/testing-libraries/load-testing-comparison/README.md similarity index 100% rename from testing-modules/load-testing-comparison/README.md rename to testing-libraries/load-testing-comparison/README.md diff --git a/testing-modules/load-testing-comparison/pom.xml b/testing-libraries/load-testing-comparison/pom.xml similarity index 100% rename from testing-modules/load-testing-comparison/pom.xml rename to testing-libraries/load-testing-comparison/pom.xml diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java b/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java similarity index 100% rename from testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java rename to testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java b/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java similarity index 100% rename from testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java rename to testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java b/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java similarity index 100% rename from testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java rename to testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java b/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java similarity index 100% rename from testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java rename to testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java b/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java similarity index 100% rename from testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java rename to testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java b/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java similarity index 100% rename from testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java rename to testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java diff --git a/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java b/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java similarity index 100% rename from testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java rename to testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala b/testing-libraries/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala similarity index 100% rename from testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala rename to testing-libraries/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx b/testing-libraries/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx similarity index 100% rename from testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx rename to testing-libraries/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties b/testing-libraries/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties similarity index 100% rename from testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties rename to testing-libraries/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py b/testing-libraries/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py similarity index 100% rename from testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py rename to testing-libraries/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py diff --git a/testing-modules/mockito-2/.gitignore b/testing-libraries/mockito-2/.gitignore similarity index 100% rename from testing-modules/mockito-2/.gitignore rename to testing-libraries/mockito-2/.gitignore diff --git a/testing-modules/mockito-2/README.md b/testing-libraries/mockito-2/README.md similarity index 100% rename from testing-modules/mockito-2/README.md rename to testing-libraries/mockito-2/README.md diff --git a/testing-modules/mockito-2/pom.xml b/testing-libraries/mockito-2/pom.xml similarity index 100% rename from testing-modules/mockito-2/pom.xml rename to testing-libraries/mockito-2/pom.xml diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java b/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java rename to testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java b/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java rename to testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java b/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java rename to testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java b/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java rename to testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java diff --git a/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java b/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java similarity index 100% rename from testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java rename to testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java diff --git a/testing-modules/mockito-2/src/main/resources/logback.xml b/testing-libraries/mockito-2/src/main/resources/logback.xml similarity index 100% rename from testing-modules/mockito-2/src/main/resources/logback.xml rename to testing-libraries/mockito-2/src/main/resources/logback.xml diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java b/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java rename to testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java b/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java rename to testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java b/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java rename to testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java b/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java rename to testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java b/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java rename to testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java b/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java rename to testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java b/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java rename to testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java b/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java rename to testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java b/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java similarity index 100% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java rename to testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java diff --git a/testing-modules/mockito/.gitignore b/testing-libraries/mockito/.gitignore similarity index 100% rename from testing-modules/mockito/.gitignore rename to testing-libraries/mockito/.gitignore diff --git a/testing-modules/mockito/README.md b/testing-libraries/mockito/README.md similarity index 100% rename from testing-modules/mockito/README.md rename to testing-libraries/mockito/README.md diff --git a/testing-modules/mockito/pom.xml b/testing-libraries/mockito/pom.xml similarity index 100% rename from testing-modules/mockito/pom.xml rename to testing-libraries/mockito/pom.xml diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java b/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/City.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java rename to testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/City.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java b/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/Location.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java rename to testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/Location.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java b/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java rename to testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java b/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java rename to testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java b/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java rename to testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java b/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java rename to testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java b/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Callback.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java rename to testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Callback.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java b/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Data.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java rename to testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Data.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java b/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Response.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java rename to testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Response.java diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java b/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Service.java similarity index 100% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java rename to testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Service.java diff --git a/testing-modules/mockito/src/main/resources/logback.xml b/testing-libraries/mockito/src/main/resources/logback.xml similarity index 100% rename from testing-modules/mockito/src/main/resources/logback.xml rename to testing-libraries/mockito/src/main/resources/logback.xml diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java b/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java rename to testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java b/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java rename to testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java b/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java rename to testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java b/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java rename to testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java b/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java rename to testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java b/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java rename to testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java similarity index 97% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java index e772b5e049..e0ca6f0a35 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java +++ b/testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java @@ -1,104 +1,104 @@ -package org.baeldung.bddmockito; - -import static org.junit.Assert.fail; -import static org.mockito.BDDMockito.*; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.mockito.Mockito; -import org.mockito.invocation.InvocationOnMock; - - -public class BDDMockitoIntegrationTest { - - PhoneBookService phoneBookService; - PhoneBookRepository phoneBookRepository; - - String momContactName = "Mom"; - String momPhoneNumber = "01234"; - String xContactName = "x"; - String tooLongPhoneNumber = "01111111111111"; - - @Before - public void init() { - phoneBookRepository = Mockito.mock(PhoneBookRepository.class); - phoneBookService = new PhoneBookService(phoneBookRepository); - } - - @Test - public void givenValidContactName_whenSearchInPhoneBook_thenRetunPhoneNumber() { - given(phoneBookRepository.contains(momContactName)).willReturn(true); - given(phoneBookRepository.getPhoneNumberByContactName(momContactName)) - .will((InvocationOnMock invocation) -> { - if(invocation.getArgument(0).equals(momContactName)) { - return momPhoneNumber; - } else { - return null; - } - }); - - String phoneNumber = phoneBookService.search(momContactName); - - then(phoneBookRepository).should().contains(momContactName); - then(phoneBookRepository).should().getPhoneNumberByContactName(momContactName); - Assert.assertEquals(phoneNumber, momPhoneNumber); - } - - @Test - public void givenInvalidContactName_whenSearch_thenRetunNull() { - given(phoneBookRepository.contains(xContactName)).willReturn(false); - - String phoneNumber = phoneBookService.search(xContactName); - - then(phoneBookRepository).should().contains(xContactName); - then(phoneBookRepository).should(never()).getPhoneNumberByContactName(xContactName); - Assert.assertEquals(phoneNumber, null); - } - - @Test - public void givenValidContactNameAndPhoneNumber_whenRegister_thenSucceed() { - given(phoneBookRepository.contains(momContactName)).willReturn(false); - - phoneBookService.register(momContactName, momPhoneNumber); - - verify(phoneBookRepository).insert(momContactName, momPhoneNumber); - } - - @Test - public void givenEmptyPhoneNumber_whenRegister_thenFail() { - given(phoneBookRepository.contains(momContactName)).willReturn(false); - - phoneBookService.register(xContactName, ""); - - then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); - } - - @Test - public void givenLongPhoneNumber_whenRegister_thenFail() { - given(phoneBookRepository.contains(xContactName)).willReturn(false); - willThrow(new RuntimeException()) - .given(phoneBookRepository).insert(any(String.class), eq(tooLongPhoneNumber)); - - try { - phoneBookService.register(xContactName, tooLongPhoneNumber); - fail("Should throw exception"); - } catch (RuntimeException ex) { } - - then(phoneBookRepository).should(never()).insert(momContactName, tooLongPhoneNumber); - } - - @Test - public void givenExistentContactName_whenRegister_thenFail() { - given(phoneBookRepository.contains(momContactName)) - .willThrow(new RuntimeException("Name already exist")); - - try { - phoneBookService.register(momContactName, momPhoneNumber); - fail("Should throw exception"); - } catch(Exception ex) { } - - then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); - } - -} +package org.baeldung.bddmockito; + +import static org.junit.Assert.fail; +import static org.mockito.BDDMockito.*; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.mockito.invocation.InvocationOnMock; + + +public class BDDMockitoIntegrationTest { + + PhoneBookService phoneBookService; + PhoneBookRepository phoneBookRepository; + + String momContactName = "Mom"; + String momPhoneNumber = "01234"; + String xContactName = "x"; + String tooLongPhoneNumber = "01111111111111"; + + @Before + public void init() { + phoneBookRepository = Mockito.mock(PhoneBookRepository.class); + phoneBookService = new PhoneBookService(phoneBookRepository); + } + + @Test + public void givenValidContactName_whenSearchInPhoneBook_thenRetunPhoneNumber() { + given(phoneBookRepository.contains(momContactName)).willReturn(true); + given(phoneBookRepository.getPhoneNumberByContactName(momContactName)) + .will((InvocationOnMock invocation) -> { + if(invocation.getArgument(0).equals(momContactName)) { + return momPhoneNumber; + } else { + return null; + } + }); + + String phoneNumber = phoneBookService.search(momContactName); + + then(phoneBookRepository).should().contains(momContactName); + then(phoneBookRepository).should().getPhoneNumberByContactName(momContactName); + Assert.assertEquals(phoneNumber, momPhoneNumber); + } + + @Test + public void givenInvalidContactName_whenSearch_thenRetunNull() { + given(phoneBookRepository.contains(xContactName)).willReturn(false); + + String phoneNumber = phoneBookService.search(xContactName); + + then(phoneBookRepository).should().contains(xContactName); + then(phoneBookRepository).should(never()).getPhoneNumberByContactName(xContactName); + Assert.assertEquals(phoneNumber, null); + } + + @Test + public void givenValidContactNameAndPhoneNumber_whenRegister_thenSucceed() { + given(phoneBookRepository.contains(momContactName)).willReturn(false); + + phoneBookService.register(momContactName, momPhoneNumber); + + verify(phoneBookRepository).insert(momContactName, momPhoneNumber); + } + + @Test + public void givenEmptyPhoneNumber_whenRegister_thenFail() { + given(phoneBookRepository.contains(momContactName)).willReturn(false); + + phoneBookService.register(xContactName, ""); + + then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); + } + + @Test + public void givenLongPhoneNumber_whenRegister_thenFail() { + given(phoneBookRepository.contains(xContactName)).willReturn(false); + willThrow(new RuntimeException()) + .given(phoneBookRepository).insert(any(String.class), eq(tooLongPhoneNumber)); + + try { + phoneBookService.register(xContactName, tooLongPhoneNumber); + fail("Should throw exception"); + } catch (RuntimeException ex) { } + + then(phoneBookRepository).should(never()).insert(momContactName, tooLongPhoneNumber); + } + + @Test + public void givenExistentContactName_whenRegister_thenFail() { + given(phoneBookRepository.contains(momContactName)) + .willThrow(new RuntimeException("Name already exist")); + + try { + phoneBookService.register(momContactName, momPhoneNumber); + fail("Should throw exception"); + } catch(Exception ex) { } + + then(phoneBookRepository).should(never()).insert(momContactName, momPhoneNumber); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java b/testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java similarity index 95% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java rename to testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java index b73a1d835c..94d4a90d4b 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java +++ b/testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java @@ -1,26 +1,26 @@ -package org.baeldung.bddmockito; - -public interface PhoneBookRepository { - - /** - * Insert phone record - * @param name Contact name - * @param phone Phone number - */ - void insert(String name, String phone); - - /** - * Search for contact phone number - * @param name Contact name - * @return phone number - */ - String getPhoneNumberByContactName(String name); - - /** - * Check if the phonebook contains this contact - * @param name Contact name - * @return true if this contact name exists - */ - boolean contains(String name); - -} +package org.baeldung.bddmockito; + +public interface PhoneBookRepository { + + /** + * Insert phone record + * @param name Contact name + * @param phone Phone number + */ + void insert(String name, String phone); + + /** + * Search for contact phone number + * @param name Contact name + * @return phone number + */ + String getPhoneNumberByContactName(String name); + + /** + * Check if the phonebook contains this contact + * @param name Contact name + * @return true if this contact name exists + */ + boolean contains(String name); + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java b/testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java similarity index 96% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java rename to testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java index 645884af02..8fc49b026d 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java +++ b/testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java @@ -1,34 +1,34 @@ -package org.baeldung.bddmockito; - -public class PhoneBookService { - - private PhoneBookRepository phoneBookRepository; - - public PhoneBookService(PhoneBookRepository phoneBookRepository) { - this.phoneBookRepository = phoneBookRepository; - } - - /** - * Register a contact - * @param name Contact name - * @param phone Phone number - */ - public void register(String name, String phone) { - if(!name.isEmpty() && !phone.isEmpty() && !phoneBookRepository.contains(name)) { - phoneBookRepository.insert(name, phone); - } - } - - /** - * Search for a phone number by contact name - * @param name Contact name - * @return Phone number - */ - public String search(String name) { - if(!name.isEmpty() && phoneBookRepository.contains(name)) { - return phoneBookRepository.getPhoneNumberByContactName(name); - } - return null; - } - -} +package org.baeldung.bddmockito; + +public class PhoneBookService { + + private PhoneBookRepository phoneBookRepository; + + public PhoneBookService(PhoneBookRepository phoneBookRepository) { + this.phoneBookRepository = phoneBookRepository; + } + + /** + * Register a contact + * @param name Contact name + * @param phone Phone number + */ + public void register(String name, String phone) { + if(!name.isEmpty() && !phone.isEmpty() && !phoneBookRepository.contains(name)) { + phoneBookRepository.insert(name, phone); + } + } + + /** + * Search for a phone number by contact name + * @param name Contact name + * @return Phone number + */ + public String search(String name) { + if(!name.isEmpty() && phoneBookRepository.contains(name)) { + return phoneBookRepository.getPhoneNumberByContactName(name); + } + return null; + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/FinalList.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/FinalList.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockFinals.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockFinals.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MyList.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/MyList.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java b/testing-libraries/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java similarity index 100% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java rename to testing-libraries/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java diff --git a/testing-modules/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/testing-libraries/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker similarity index 100% rename from testing-modules/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker rename to testing-libraries/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/testing-modules/mockito/src/test/resources/test1.in b/testing-libraries/mockito/src/test/resources/test1.in similarity index 100% rename from testing-modules/mockito/src/test/resources/test1.in rename to testing-libraries/mockito/src/test/resources/test1.in diff --git a/testing-modules/mocks/README.md b/testing-libraries/mocks/README.md similarity index 100% rename from testing-modules/mocks/README.md rename to testing-libraries/mocks/README.md diff --git a/testing-libraries/mocks/javafaker/pom.xml b/testing-libraries/mocks/javafaker/pom.xml new file mode 100644 index 0000000000..8c1f8c080e --- /dev/null +++ b/testing-libraries/mocks/javafaker/pom.xml @@ -0,0 +1,26 @@ + + 4.0.0 + javafaker + javafaker + + + com.baeldung + mocks + 1.0.0-SNAPSHOT + ../ + + + + + com.github.javafaker + javafaker + ${javafaker.version} + + + + + 0.15 + + + diff --git a/testing-modules/testing/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java b/testing-libraries/mocks/javafaker/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java rename to testing-libraries/mocks/javafaker/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java diff --git a/testing-modules/mocks/jmockit/README.md b/testing-libraries/mocks/jmockit/README.md similarity index 100% rename from testing-modules/mocks/jmockit/README.md rename to testing-libraries/mocks/jmockit/README.md diff --git a/testing-modules/mocks/jmockit/pom.xml b/testing-libraries/mocks/jmockit/pom.xml similarity index 100% rename from testing-modules/mocks/jmockit/pom.xml rename to testing-libraries/mocks/jmockit/pom.xml diff --git a/testing-modules/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java b/testing-libraries/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java rename to testing-libraries/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java b/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java rename to testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java b/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java rename to testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java b/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java rename to testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java b/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java rename to testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java b/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java rename to testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java diff --git a/testing-modules/mocks/jmockit/src/main/resources/logback.xml b/testing-libraries/mocks/jmockit/src/main/resources/logback.xml similarity index 100% rename from testing-modules/mocks/jmockit/src/main/resources/logback.xml rename to testing-libraries/mocks/jmockit/src/main/resources/logback.xml diff --git a/testing-modules/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java b/testing-libraries/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java rename to testing-libraries/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java b/testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java rename to testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java b/testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java rename to testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java b/testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java rename to testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java b/testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java rename to testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java diff --git a/testing-libraries/mocks/jukito/pom.xml b/testing-libraries/mocks/jukito/pom.xml new file mode 100644 index 0000000000..752f097482 --- /dev/null +++ b/testing-libraries/mocks/jukito/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + jukito + jukito + + + com.baeldung + mocks + 1.0.0-SNAPSHOT + ../ + + + + + org.jukito + jukito + ${jukito.version} + test + + + + + 1.5 + + + diff --git a/testing-modules/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java b/testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/Calculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/introductionjukito/Calculator.java rename to testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/Calculator.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java b/testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java rename to testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java diff --git a/testing-modules/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java b/testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java similarity index 100% rename from testing-modules/testing/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java rename to testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java diff --git a/testing-modules/testing/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java b/testing-libraries/mocks/jukito/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java similarity index 100% rename from testing-modules/testing/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java rename to testing-libraries/mocks/jukito/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java diff --git a/testing-modules/mocks/mock-comparisons/README.md b/testing-libraries/mocks/mock-comparisons/README.md similarity index 100% rename from testing-modules/mocks/mock-comparisons/README.md rename to testing-libraries/mocks/mock-comparisons/README.md diff --git a/testing-modules/mocks/mock-comparisons/pom.xml b/testing-libraries/mocks/mock-comparisons/pom.xml similarity index 100% rename from testing-modules/mocks/mock-comparisons/pom.xml rename to testing-libraries/mocks/mock-comparisons/pom.xml diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java old mode 100755 new mode 100644 similarity index 95% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java index 9e4a15c27a..c4732e3452 --- a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java +++ b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java @@ -1,36 +1,36 @@ -package com.baeldung.easymock; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import static java.util.stream.Collectors.toList; - -public class ArticleReader { - - private List articles; - private Iterator articleIter; - - public ArticleReader() { - this(new ArrayList<>()); - } - - public ArticleReader(List articles) { - this.articles = articles; - this.articleIter = this.articles.iterator(); - } - - public List ofTopic(String topic) { - return articles - .stream() - .filter(article -> article - .title() - .contains(topic)) - .collect(toList()); - } - - public BaeldungArticle next() { - return this.articleIter.next(); - } - +package com.baeldung.easymock; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +import static java.util.stream.Collectors.toList; + +public class ArticleReader { + + private List articles; + private Iterator articleIter; + + public ArticleReader() { + this(new ArrayList<>()); + } + + public ArticleReader(List articles) { + this.articles = articles; + this.articleIter = this.articles.iterator(); + } + + public List ofTopic(String topic) { + return articles + .stream() + .filter(article -> article + .title() + .contains(topic)) + .collect(toList()); + } + + public BaeldungArticle next() { + return this.articleIter.next(); + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java old mode 100755 new mode 100644 similarity index 95% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java index f386c980f4..9f332a9bac --- a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java +++ b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java @@ -1,25 +1,25 @@ -package com.baeldung.easymock; - -public class BaeldungArticle { - - public static BaeldungArticle simpleArticle(String title, String content) { - return new BaeldungArticle(title, content); - } - - private String title; - private String content; - - private BaeldungArticle(String title, String content) { - this.title = title; - this.content = content; - } - - public String title() { - return this.title; - } - - public String content() { - return this.content; - } - +package com.baeldung.easymock; + +public class BaeldungArticle { + + public static BaeldungArticle simpleArticle(String title, String content) { + return new BaeldungArticle(title, content); + } + + private String title; + private String content; + + private BaeldungArticle(String title, String content) { + this.title = title; + this.content = content; + } + + public String title() { + return this.title; + } + + public String content() { + return this.content; + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java old mode 100755 new mode 100644 similarity index 95% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java index 319dfc5d77..fc37b9f94a --- a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java +++ b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java @@ -1,40 +1,40 @@ -package com.baeldung.easymock; - -import java.util.List; - -public class BaeldungReader { - - private ArticleReader articleReader; - private IArticleWriter articleWriter; - - public BaeldungReader() { - } - - ; - - public BaeldungReader(ArticleReader articleReader) { - this.articleReader = articleReader; - } - - public BaeldungReader(IArticleWriter writer) { - this.articleWriter = writer; - } - - public BaeldungReader(ArticleReader articleReader, IArticleWriter writer) { - this.articleReader = articleReader; - this.articleWriter = writer; - } - - public BaeldungArticle readNext() { - return articleReader.next(); - } - - public List readTopic(String topic) { - return articleReader.ofTopic(topic); - } - - public String write(String title, String content) { - return articleWriter.write(title, content); - } - +package com.baeldung.easymock; + +import java.util.List; + +public class BaeldungReader { + + private ArticleReader articleReader; + private IArticleWriter articleWriter; + + public BaeldungReader() { + } + + ; + + public BaeldungReader(ArticleReader articleReader) { + this.articleReader = articleReader; + } + + public BaeldungReader(IArticleWriter writer) { + this.articleWriter = writer; + } + + public BaeldungReader(ArticleReader articleReader, IArticleWriter writer) { + this.articleReader = articleReader; + this.articleWriter = writer; + } + + public BaeldungArticle readNext() { + return articleReader.next(); + } + + public List readTopic(String topic) { + return articleReader.ofTopic(topic); + } + + public String write(String title, String content) { + return articleWriter.write(title, content); + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java old mode 100755 new mode 100644 similarity index 95% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java index 4c8b190464..26970d5eb5 --- a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java +++ b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java @@ -1,7 +1,7 @@ -package com.baeldung.easymock; - -public interface IArticleWriter { - - String write(String title, String content); - +package com.baeldung.easymock; + +public interface IArticleWriter { + + String write(String title, String content); + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java b/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java b/testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java b/testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java b/testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java b/testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java rename to testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml b/testing-libraries/mocks/mock-comparisons/src/main/resources/logback.xml similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml rename to testing-libraries/mocks/mock-comparisons/src/main/resources/logback.xml diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java rename to testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java old mode 100755 new mode 100644 similarity index 96% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java rename to testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java index afacd8d8ad..56a58dd6e8 --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java +++ b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java @@ -1,57 +1,57 @@ -package com.baeldung.easymock; - -import org.easymock.EasyMockRunner; -import org.easymock.Mock; -import org.easymock.TestSubject; -import org.junit.*; -import org.junit.runner.RunWith; - -import java.util.NoSuchElementException; - -import static org.easymock.EasyMock.*; - -@RunWith(EasyMockRunner.class) -public class BaeldungReaderAnnotatedUnitTest { - - @Mock ArticleReader mockArticleReader; - - @Mock IArticleWriter mockArticleWriter; - - @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); - - @Test - public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { - expect(mockArticleReader.next()).andReturn(null); - replay(mockArticleReader); - baeldungReader.readNext(); - verify(mockArticleReader); - } - - @Mock BaeldungReader mockBaeldungReader; - - @Test - public void givenBaeldungReader_whenWrite_thenWriterCalled() { - expect(mockArticleWriter.write("title", "content")).andReturn(null); - replay(mockArticleWriter); - baeldungReader.write("title", "content"); - verify(mockArticleWriter); - } - - @Test - public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { - expect(mockArticleReader.next()) - .andReturn(null) - .times(2) - .andThrow(new NoSuchElementException()); - replay(mockArticleReader); - try { - for (int i = 0; i < 3; i++) { - baeldungReader.readNext(); - } - } catch (Exception ignored) { - } - verify(mockArticleReader); - } - -} - +package com.baeldung.easymock; + +import org.easymock.EasyMockRunner; +import org.easymock.Mock; +import org.easymock.TestSubject; +import org.junit.*; +import org.junit.runner.RunWith; + +import java.util.NoSuchElementException; + +import static org.easymock.EasyMock.*; + +@RunWith(EasyMockRunner.class) +public class BaeldungReaderAnnotatedUnitTest { + + @Mock ArticleReader mockArticleReader; + + @Mock IArticleWriter mockArticleWriter; + + @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); + + @Test + public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { + expect(mockArticleReader.next()).andReturn(null); + replay(mockArticleReader); + baeldungReader.readNext(); + verify(mockArticleReader); + } + + @Mock BaeldungReader mockBaeldungReader; + + @Test + public void givenBaeldungReader_whenWrite_thenWriterCalled() { + expect(mockArticleWriter.write("title", "content")).andReturn(null); + replay(mockArticleWriter); + baeldungReader.write("title", "content"); + verify(mockArticleWriter); + } + + @Test + public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { + expect(mockArticleReader.next()) + .andReturn(null) + .times(2) + .andThrow(new NoSuchElementException()); + replay(mockArticleReader); + try { + for (int i = 0; i < 3; i++) { + baeldungReader.readNext(); + } + } catch (Exception ignored) { + } + verify(mockArticleReader); + } + +} + diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java old mode 100755 new mode 100644 similarity index 96% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java rename to testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java index 086ed88888..5b4219d263 --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java +++ b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java @@ -1,57 +1,57 @@ -package com.baeldung.easymock; - -import org.easymock.EasyMockRule; -import org.easymock.Mock; -import org.easymock.TestSubject; -import org.junit.*; - -import java.util.NoSuchElementException; - -import static org.easymock.EasyMock.*; - -public class BaeldungReaderAnnotatedWithRuleUnitTest { - - @Rule public EasyMockRule mockRule = new EasyMockRule(this); - - @Mock ArticleReader mockArticleReader; - - @Mock IArticleWriter mockArticleWriter; - - @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); - - @Test - public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { - expect(mockArticleReader.next()).andReturn(null); - replay(mockArticleReader); - baeldungReader.readNext(); - verify(mockArticleReader); - } - - @Mock BaeldungReader mockBaeldungReader; - - @Test - public void givenBaeldungReader_whenWrite_thenWriterCalled() { - expect(mockArticleWriter.write("title", "content")).andReturn(null); - replay(mockArticleWriter); - baeldungReader.write("title", "content"); - verify(mockArticleWriter); - } - - @Test - public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { - expect(mockArticleReader.next()) - .andReturn(null) - .times(2) - .andThrow(new NoSuchElementException()); - replay(mockArticleReader); - try { - for (int i = 0; i < 3; i++) { - baeldungReader.readNext(); - } - } catch (Exception ignored) { - } - verify(mockArticleReader); - } - -} - +package com.baeldung.easymock; + +import org.easymock.EasyMockRule; +import org.easymock.Mock; +import org.easymock.TestSubject; +import org.junit.*; + +import java.util.NoSuchElementException; + +import static org.easymock.EasyMock.*; + +public class BaeldungReaderAnnotatedWithRuleUnitTest { + + @Rule public EasyMockRule mockRule = new EasyMockRule(this); + + @Mock ArticleReader mockArticleReader; + + @Mock IArticleWriter mockArticleWriter; + + @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); + + @Test + public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { + expect(mockArticleReader.next()).andReturn(null); + replay(mockArticleReader); + baeldungReader.readNext(); + verify(mockArticleReader); + } + + @Mock BaeldungReader mockBaeldungReader; + + @Test + public void givenBaeldungReader_whenWrite_thenWriterCalled() { + expect(mockArticleWriter.write("title", "content")).andReturn(null); + replay(mockArticleWriter); + baeldungReader.write("title", "content"); + verify(mockArticleWriter); + } + + @Test + public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { + expect(mockArticleReader.next()) + .andReturn(null) + .times(2) + .andThrow(new NoSuchElementException()); + replay(mockArticleReader); + try { + for (int i = 0; i < 3; i++) { + baeldungReader.readNext(); + } + } catch (Exception ignored) { + } + verify(mockArticleReader); + } + +} + diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java old mode 100755 new mode 100644 similarity index 97% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java rename to testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java index 89d3a2baee..6d8b553df7 --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java +++ b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java @@ -1,27 +1,27 @@ -package com.baeldung.easymock; - -import org.easymock.*; -import org.junit.*; - -import static org.easymock.EasyMock.*; - -public class BaeldungReaderMockDelegationUnitTest { - - EasyMockSupport easyMockSupport = new EasyMockSupport(); - - @Test - public void givenBaeldungReader_whenReadAndWriteSequencially_thenWorks() { - ArticleReader mockArticleReader = easyMockSupport.createMock(ArticleReader.class); - IArticleWriter mockArticleWriter = easyMockSupport.createMock(IArticleWriter.class); - BaeldungReader baeldungReader = new BaeldungReader(mockArticleReader, mockArticleWriter); - - expect(mockArticleReader.next()).andReturn(null); - expect(mockArticleWriter.write("title", "content")).andReturn(""); - easyMockSupport.replayAll(); - - baeldungReader.readNext(); - baeldungReader.write("title", "content"); - easyMockSupport.verifyAll(); - } - +package com.baeldung.easymock; + +import org.easymock.*; +import org.junit.*; + +import static org.easymock.EasyMock.*; + +public class BaeldungReaderMockDelegationUnitTest { + + EasyMockSupport easyMockSupport = new EasyMockSupport(); + + @Test + public void givenBaeldungReader_whenReadAndWriteSequencially_thenWorks() { + ArticleReader mockArticleReader = easyMockSupport.createMock(ArticleReader.class); + IArticleWriter mockArticleWriter = easyMockSupport.createMock(IArticleWriter.class); + BaeldungReader baeldungReader = new BaeldungReader(mockArticleReader, mockArticleWriter); + + expect(mockArticleReader.next()).andReturn(null); + expect(mockArticleWriter.write("title", "content")).andReturn(""); + easyMockSupport.replayAll(); + + baeldungReader.readNext(); + baeldungReader.write("title", "content"); + easyMockSupport.verifyAll(); + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java old mode 100755 new mode 100644 similarity index 96% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java rename to testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java index cd0c906949..8b5c4d9d41 --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java +++ b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java @@ -1,42 +1,42 @@ -package com.baeldung.easymock; - -import org.easymock.*; -import org.junit.*; -import org.junit.runner.RunWith; - -import java.util.NoSuchElementException; - -import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertEquals; - -@RunWith(EasyMockRunner.class) -public class BaeldungReaderMockSupportUnitTest extends EasyMockSupport { - - @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); - @Mock ArticleReader mockArticleReader; - @Mock IArticleWriter mockArticleWriter; - - @Test - public void givenBaeldungReader_whenReadAndWriteSequencially_thenWorks() { - expect(mockArticleReader.next()) - .andReturn(null) - .times(2) - .andThrow(new NoSuchElementException()); - expect(mockArticleWriter.write("title", "content")).andReturn("BAEL-201801"); - replayAll(); - - Exception expectedException = null; - try { - for (int i = 0; i < 3; i++) { - baeldungReader.readNext(); - } - } catch (Exception exception) { - expectedException = exception; - } - String articleId = baeldungReader.write("title", "content"); - verifyAll(); - assertEquals(NoSuchElementException.class, expectedException.getClass()); - assertEquals("BAEL-201801", articleId); - } - +package com.baeldung.easymock; + +import org.easymock.*; +import org.junit.*; +import org.junit.runner.RunWith; + +import java.util.NoSuchElementException; + +import static org.easymock.EasyMock.*; +import static org.junit.Assert.assertEquals; + +@RunWith(EasyMockRunner.class) +public class BaeldungReaderMockSupportUnitTest extends EasyMockSupport { + + @TestSubject BaeldungReader baeldungReader = new BaeldungReader(); + @Mock ArticleReader mockArticleReader; + @Mock IArticleWriter mockArticleWriter; + + @Test + public void givenBaeldungReader_whenReadAndWriteSequencially_thenWorks() { + expect(mockArticleReader.next()) + .andReturn(null) + .times(2) + .andThrow(new NoSuchElementException()); + expect(mockArticleWriter.write("title", "content")).andReturn("BAEL-201801"); + replayAll(); + + Exception expectedException = null; + try { + for (int i = 0; i < 3; i++) { + baeldungReader.readNext(); + } + } catch (Exception exception) { + expectedException = exception; + } + String articleId = baeldungReader.write("title", "content"); + verifyAll(); + assertEquals(NoSuchElementException.class, expectedException.getClass()); + assertEquals("BAEL-201801", articleId); + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java old mode 100755 new mode 100644 similarity index 97% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java rename to testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java index 31f6af116c..12fce4b07a --- a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java +++ b/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java @@ -1,105 +1,105 @@ -package com.baeldung.easymock; - -import org.junit.*; - -import java.util.NoSuchElementException; - -import static org.easymock.EasyMock.*; -import static org.junit.Assert.assertEquals; - -public class BaeldungReaderUnitTest { - - private BaeldungReader baeldungReader; - - private ArticleReader mockArticleReader; - - private IArticleWriter mockArticleWriter; - - @Test - public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { - mockArticleReader = mock(ArticleReader.class); - baeldungReader = new BaeldungReader(mockArticleReader); - - expect(mockArticleReader.next()).andReturn(null); - replay(mockArticleReader); - - BaeldungArticle article = baeldungReader.readNext(); - verify(mockArticleReader); - assertEquals(null, article); - } - - @Test - public void givenBaeldungReader_whenReadNextAndSkimTopics_thenAllAllowed() { - mockArticleReader = strictMock(ArticleReader.class); - baeldungReader = new BaeldungReader(mockArticleReader); - - expect(mockArticleReader.next()).andReturn(null); - expect(mockArticleReader.ofTopic("easymock")).andReturn(null); - replay(mockArticleReader); - - baeldungReader.readNext(); - baeldungReader.readTopic("easymock"); - verify(mockArticleReader); - } - - @Test - public void givenBaeldungReader_whenReadNextAndOthers_thenAllowed() { - mockArticleReader = niceMock(ArticleReader.class); - baeldungReader = new BaeldungReader(mockArticleReader); - - expect(mockArticleReader.next()).andReturn(null); - replay(mockArticleReader); - - baeldungReader.readNext(); - baeldungReader.readTopic("easymock"); - verify(mockArticleReader); - } - - @Test - public void givenBaeldungReader_whenWriteMaliciousContent_thenArgumentIllegal() { - mockArticleWriter = mock(IArticleWriter.class); - baeldungReader = new BaeldungReader(mockArticleWriter); - expect(mockArticleWriter.write("easymock", "")).andThrow(new IllegalArgumentException()); - replay(mockArticleWriter); - - Exception expectedException = null; - try { - baeldungReader.write("easymock", ""); - } catch (Exception exception) { - expectedException = exception; - } - - verify(mockArticleWriter); - assertEquals(IllegalArgumentException.class, expectedException.getClass()); - } - - @Test - public void givenBaeldungReader_whenWrite_thenWriterCalled() { - mockArticleWriter = mock(IArticleWriter.class); - baeldungReader = new BaeldungReader(mockArticleWriter); - expect(mockArticleWriter.write("title", "content")).andReturn(null); - replay(mockArticleWriter); - String articleId = baeldungReader.write("title", "content"); - verify(mockArticleWriter); - assertEquals(null, articleId); - } - - @Test - public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { - ArticleReader mockArticleReader = mock(ArticleReader.class); - baeldungReader = new BaeldungReader(mockArticleReader); - expect(mockArticleReader.next()) - .andReturn(null) - .times(2) - .andThrow(new NoSuchElementException()); - replay(mockArticleReader); - try { - for (int i = 0; i < 3; i++) { - baeldungReader.readNext(); - } - } catch (Exception ignored) { - } - verify(mockArticleReader); - } - +package com.baeldung.easymock; + +import org.junit.*; + +import java.util.NoSuchElementException; + +import static org.easymock.EasyMock.*; +import static org.junit.Assert.assertEquals; + +public class BaeldungReaderUnitTest { + + private BaeldungReader baeldungReader; + + private ArticleReader mockArticleReader; + + private IArticleWriter mockArticleWriter; + + @Test + public void givenBaeldungReader_whenReadNext_thenNextArticleRead() { + mockArticleReader = mock(ArticleReader.class); + baeldungReader = new BaeldungReader(mockArticleReader); + + expect(mockArticleReader.next()).andReturn(null); + replay(mockArticleReader); + + BaeldungArticle article = baeldungReader.readNext(); + verify(mockArticleReader); + assertEquals(null, article); + } + + @Test + public void givenBaeldungReader_whenReadNextAndSkimTopics_thenAllAllowed() { + mockArticleReader = strictMock(ArticleReader.class); + baeldungReader = new BaeldungReader(mockArticleReader); + + expect(mockArticleReader.next()).andReturn(null); + expect(mockArticleReader.ofTopic("easymock")).andReturn(null); + replay(mockArticleReader); + + baeldungReader.readNext(); + baeldungReader.readTopic("easymock"); + verify(mockArticleReader); + } + + @Test + public void givenBaeldungReader_whenReadNextAndOthers_thenAllowed() { + mockArticleReader = niceMock(ArticleReader.class); + baeldungReader = new BaeldungReader(mockArticleReader); + + expect(mockArticleReader.next()).andReturn(null); + replay(mockArticleReader); + + baeldungReader.readNext(); + baeldungReader.readTopic("easymock"); + verify(mockArticleReader); + } + + @Test + public void givenBaeldungReader_whenWriteMaliciousContent_thenArgumentIllegal() { + mockArticleWriter = mock(IArticleWriter.class); + baeldungReader = new BaeldungReader(mockArticleWriter); + expect(mockArticleWriter.write("easymock", "")).andThrow(new IllegalArgumentException()); + replay(mockArticleWriter); + + Exception expectedException = null; + try { + baeldungReader.write("easymock", ""); + } catch (Exception exception) { + expectedException = exception; + } + + verify(mockArticleWriter); + assertEquals(IllegalArgumentException.class, expectedException.getClass()); + } + + @Test + public void givenBaeldungReader_whenWrite_thenWriterCalled() { + mockArticleWriter = mock(IArticleWriter.class); + baeldungReader = new BaeldungReader(mockArticleWriter); + expect(mockArticleWriter.write("title", "content")).andReturn(null); + replay(mockArticleWriter); + String articleId = baeldungReader.write("title", "content"); + verify(mockArticleWriter); + assertEquals(null, articleId); + } + + @Test + public void givenArticlesInReader_whenReadTillEnd_thenThrowException() { + ArticleReader mockArticleReader = mock(ArticleReader.class); + baeldungReader = new BaeldungReader(mockArticleReader); + expect(mockArticleReader.next()) + .andReturn(null) + .times(2) + .andThrow(new NoSuchElementException()); + replay(mockArticleReader); + try { + for (int i = 0; i < 3; i++) { + baeldungReader.readNext(); + } + } catch (Exception ignored) { + } + verify(mockArticleReader); + } + } \ No newline at end of file diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java b/testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java rename to testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java b/testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java rename to testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java b/testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java rename to testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java diff --git a/testing-modules/mocks/pom.xml b/testing-libraries/mocks/pom.xml similarity index 100% rename from testing-modules/mocks/pom.xml rename to testing-libraries/mocks/pom.xml diff --git a/testing-modules/mockserver/README.md b/testing-libraries/mockserver/README.md similarity index 100% rename from testing-modules/mockserver/README.md rename to testing-libraries/mockserver/README.md diff --git a/testing-modules/mockserver/pom.xml b/testing-libraries/mockserver/pom.xml similarity index 100% rename from testing-modules/mockserver/pom.xml rename to testing-libraries/mockserver/pom.xml diff --git a/testing-modules/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java b/testing-libraries/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java similarity index 100% rename from testing-modules/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java rename to testing-libraries/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java diff --git a/testing-modules/mockserver/src/main/resources/logback.xml b/testing-libraries/mockserver/src/main/resources/logback.xml similarity index 100% rename from testing-modules/mockserver/src/main/resources/logback.xml rename to testing-libraries/mockserver/src/main/resources/logback.xml diff --git a/testing-modules/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java b/testing-libraries/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java similarity index 100% rename from testing-modules/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java rename to testing-libraries/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java diff --git a/testing-modules/parallel-tests-junit/README.md b/testing-libraries/parallel-tests-junit/README.md similarity index 100% rename from testing-modules/parallel-tests-junit/README.md rename to testing-libraries/parallel-tests-junit/README.md diff --git a/testing-modules/parallel-tests-junit/math-test-functions/pom.xml b/testing-libraries/parallel-tests-junit/math-test-functions/pom.xml similarity index 100% rename from testing-modules/parallel-tests-junit/math-test-functions/pom.xml rename to testing-libraries/parallel-tests-junit/math-test-functions/pom.xml diff --git a/testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java b/testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java similarity index 100% rename from testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java rename to testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java diff --git a/testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java b/testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java similarity index 100% rename from testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java rename to testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java diff --git a/testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java b/testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java similarity index 100% rename from testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java rename to testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java diff --git a/testing-modules/parallel-tests-junit/pom.xml b/testing-libraries/parallel-tests-junit/pom.xml similarity index 100% rename from testing-modules/parallel-tests-junit/pom.xml rename to testing-libraries/parallel-tests-junit/pom.xml diff --git a/testing-modules/parallel-tests-junit/string-test-functions/pom.xml b/testing-libraries/parallel-tests-junit/string-test-functions/pom.xml similarity index 100% rename from testing-modules/parallel-tests-junit/string-test-functions/pom.xml rename to testing-libraries/parallel-tests-junit/string-test-functions/pom.xml diff --git a/testing-modules/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java b/testing-libraries/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java similarity index 100% rename from testing-modules/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java rename to testing-libraries/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java diff --git a/testing-modules/pom.xml b/testing-libraries/pom.xml similarity index 92% rename from testing-modules/pom.xml rename to testing-libraries/pom.xml index e15fdb4a37..5102e09349 100644 --- a/testing-modules/pom.xml +++ b/testing-libraries/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - testing-modules - testing-modules + testing-libraries + testing-libraries pom @@ -31,7 +31,6 @@ selenium-junit-testng spring-testing test-containers - testing testng junit-5-basics easymock diff --git a/testing-modules/rest-assured/.gitignore b/testing-libraries/rest-assured/.gitignore similarity index 100% rename from testing-modules/rest-assured/.gitignore rename to testing-libraries/rest-assured/.gitignore diff --git a/testing-modules/rest-assured/README.md b/testing-libraries/rest-assured/README.md similarity index 100% rename from testing-modules/rest-assured/README.md rename to testing-libraries/rest-assured/README.md diff --git a/testing-modules/rest-assured/pom.xml b/testing-libraries/rest-assured/pom.xml similarity index 100% rename from testing-modules/rest-assured/pom.xml rename to testing-libraries/rest-assured/pom.xml diff --git a/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/Application.java b/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/Application.java similarity index 100% rename from testing-modules/rest-assured/src/main/java/com/baeldung/restassured/Application.java rename to testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/Application.java diff --git a/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java b/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java similarity index 100% rename from testing-modules/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java rename to testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java diff --git a/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java b/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java similarity index 100% rename from testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java rename to testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java diff --git a/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java b/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java similarity index 100% rename from testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java rename to testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java diff --git a/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java b/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java similarity index 100% rename from testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java rename to testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java diff --git a/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java b/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java similarity index 100% rename from testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java rename to testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java diff --git a/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java b/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java similarity index 100% rename from testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java rename to testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java diff --git a/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java b/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java similarity index 100% rename from testing-modules/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java rename to testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java diff --git a/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java b/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java similarity index 100% rename from testing-modules/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java rename to testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java diff --git a/testing-modules/rest-assured/src/main/resources/1 b/testing-libraries/rest-assured/src/main/resources/1 similarity index 100% rename from testing-modules/rest-assured/src/main/resources/1 rename to testing-libraries/rest-assured/src/main/resources/1 diff --git a/testing-modules/rest-assured/src/main/resources/2 b/testing-libraries/rest-assured/src/main/resources/2 similarity index 100% rename from testing-modules/rest-assured/src/main/resources/2 rename to testing-libraries/rest-assured/src/main/resources/2 diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Odd.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/Odd.java similarity index 94% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Odd.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/Odd.java index f60f1764c6..c3f82f0836 100644 --- a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Odd.java +++ b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/Odd.java @@ -1,49 +1,49 @@ -package com.baeldung.restassured; - -public class Odd { - - float price; - int status; - float ck; - String name; - - Odd(float price, int status, float ck, String name) { - this.price = price; - this.status = status; - this.ck = ck; - this.name = name; - } - - public float getPrice() { - return price; - } - - public void setPrice(float price) { - this.price = price; - } - - public int getStatus() { - return status; - } - - public void setStatus(int status) { - this.status = status; - } - - public float getCk() { - return ck; - } - - public void setCk(float ck) { - this.ck = ck; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - -} +package com.baeldung.restassured; + +public class Odd { + + float price; + int status; + float ck; + String name; + + Odd(float price, int status, float ck, String name) { + this.price = price; + this.status = status; + this.ck = ck; + this.name = name; + } + + public float getPrice() { + return price; + } + + public void setPrice(float price) { + this.price = price; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public float getCk() { + return ck; + } + + public void setCk(float ck) { + this.ck = ck; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/Util.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/Util.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java diff --git a/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java b/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java similarity index 100% rename from testing-modules/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java rename to testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java diff --git a/testing-modules/rest-assured/src/test/resources/employees.xml b/testing-libraries/rest-assured/src/test/resources/employees.xml similarity index 100% rename from testing-modules/rest-assured/src/test/resources/employees.xml rename to testing-libraries/rest-assured/src/test/resources/employees.xml diff --git a/testing-modules/rest-assured/src/test/resources/event_0.json b/testing-libraries/rest-assured/src/test/resources/event_0.json similarity index 100% rename from testing-modules/rest-assured/src/test/resources/event_0.json rename to testing-libraries/rest-assured/src/test/resources/event_0.json diff --git a/testing-modules/rest-assured/src/test/resources/logback.xml b/testing-libraries/rest-assured/src/test/resources/logback.xml similarity index 100% rename from testing-modules/rest-assured/src/test/resources/logback.xml rename to testing-libraries/rest-assured/src/test/resources/logback.xml diff --git a/testing-modules/rest-assured/src/test/resources/odds.json b/testing-libraries/rest-assured/src/test/resources/odds.json similarity index 100% rename from testing-modules/rest-assured/src/test/resources/odds.json rename to testing-libraries/rest-assured/src/test/resources/odds.json diff --git a/testing-modules/rest-assured/src/test/resources/teachers.xml b/testing-libraries/rest-assured/src/test/resources/teachers.xml similarity index 100% rename from testing-modules/rest-assured/src/test/resources/teachers.xml rename to testing-libraries/rest-assured/src/test/resources/teachers.xml diff --git a/testing-modules/rest-assured/src/test/resources/test.txt b/testing-libraries/rest-assured/src/test/resources/test.txt similarity index 100% rename from testing-modules/rest-assured/src/test/resources/test.txt rename to testing-libraries/rest-assured/src/test/resources/test.txt diff --git a/testing-modules/rest-testing/.gitignore b/testing-libraries/rest-testing/.gitignore similarity index 100% rename from testing-modules/rest-testing/.gitignore rename to testing-libraries/rest-testing/.gitignore diff --git a/testing-modules/rest-testing/README.md b/testing-libraries/rest-testing/README.md similarity index 100% rename from testing-modules/rest-testing/README.md rename to testing-libraries/rest-testing/README.md diff --git a/testing-modules/rest-testing/pom.xml b/testing-libraries/rest-testing/pom.xml similarity index 100% rename from testing-modules/rest-testing/pom.xml rename to testing-libraries/rest-testing/pom.xml diff --git a/testing-modules/rest-testing/src/main/resources/cucumber.json b/testing-libraries/rest-testing/src/main/resources/cucumber.json similarity index 100% rename from testing-modules/rest-testing/src/main/resources/cucumber.json rename to testing-libraries/rest-testing/src/main/resources/cucumber.json diff --git a/testing-modules/rest-testing/src/main/resources/karate/cucumber.feature b/testing-libraries/rest-testing/src/main/resources/karate/cucumber.feature similarity index 100% rename from testing-modules/rest-testing/src/main/resources/karate/cucumber.feature rename to testing-libraries/rest-testing/src/main/resources/karate/cucumber.feature diff --git a/testing-modules/rest-testing/src/main/resources/logback.xml b/testing-libraries/rest-testing/src/main/resources/logback.xml similarity index 100% rename from testing-modules/rest-testing/src/main/resources/logback.xml rename to testing-libraries/rest-testing/src/main/resources/logback.xml diff --git a/testing-modules/rest-testing/src/main/resources/wiremock_intro.json b/testing-libraries/rest-testing/src/main/resources/wiremock_intro.json similarity index 100% rename from testing-modules/rest-testing/src/main/resources/wiremock_intro.json rename to testing-libraries/rest-testing/src/main/resources/wiremock_intro.json diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java diff --git a/testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java b/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java rename to testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java diff --git a/testing-modules/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java b/testing-libraries/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java rename to testing-libraries/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java diff --git a/testing-modules/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java b/testing-libraries/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java similarity index 100% rename from testing-modules/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java rename to testing-libraries/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java diff --git a/testing-modules/rest-testing/src/test/resources/Feature/cucumber.feature b/testing-libraries/rest-testing/src/test/resources/Feature/cucumber.feature similarity index 100% rename from testing-modules/rest-testing/src/test/resources/Feature/cucumber.feature rename to testing-libraries/rest-testing/src/test/resources/Feature/cucumber.feature diff --git a/testing-modules/rest-testing/src/test/resources/github_user_not_found.story b/testing-libraries/rest-testing/src/test/resources/github_user_not_found.story similarity index 100% rename from testing-modules/rest-testing/src/test/resources/github_user_not_found.story rename to testing-libraries/rest-testing/src/test/resources/github_user_not_found.story diff --git a/testing-modules/rest-testing/src/test/resources/github_user_response_mediatype.story b/testing-libraries/rest-testing/src/test/resources/github_user_response_mediatype.story similarity index 100% rename from testing-modules/rest-testing/src/test/resources/github_user_response_mediatype.story rename to testing-libraries/rest-testing/src/test/resources/github_user_response_mediatype.story diff --git a/testing-modules/rest-testing/src/test/resources/github_user_response_payload.story b/testing-libraries/rest-testing/src/test/resources/github_user_response_payload.story similarity index 100% rename from testing-modules/rest-testing/src/test/resources/github_user_response_payload.story rename to testing-libraries/rest-testing/src/test/resources/github_user_response_payload.story diff --git a/testing-modules/rest-testing/src/test/resources/increase.story b/testing-libraries/rest-testing/src/test/resources/increase.story similarity index 100% rename from testing-modules/rest-testing/src/test/resources/increase.story rename to testing-libraries/rest-testing/src/test/resources/increase.story diff --git a/testing-modules/rest-testing/src/test/resources/karate/user.feature b/testing-libraries/rest-testing/src/test/resources/karate/user.feature similarity index 100% rename from testing-modules/rest-testing/src/test/resources/karate/user.feature rename to testing-libraries/rest-testing/src/test/resources/karate/user.feature diff --git a/testing-modules/runjunitfromjava/src/main/resources/logback.xml b/testing-libraries/runjunitfromjava/src/main/resources/logback.xml similarity index 100% rename from testing-modules/runjunitfromjava/src/main/resources/logback.xml rename to testing-libraries/runjunitfromjava/src/main/resources/logback.xml diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java b/testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java similarity index 100% rename from testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java rename to testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java b/testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java similarity index 100% rename from testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java rename to testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java b/testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java similarity index 100% rename from testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java rename to testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java b/testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java similarity index 100% rename from testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java rename to testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java diff --git a/testing-modules/selenium-junit-testng/README.md b/testing-libraries/selenium-junit-testng/README.md similarity index 100% rename from testing-modules/selenium-junit-testng/README.md rename to testing-libraries/selenium-junit-testng/README.md diff --git a/testing-modules/selenium-junit-testng/geckodriver.mac b/testing-libraries/selenium-junit-testng/geckodriver.mac old mode 100755 new mode 100644 similarity index 100% rename from testing-modules/selenium-junit-testng/geckodriver.mac rename to testing-libraries/selenium-junit-testng/geckodriver.mac diff --git a/testing-modules/selenium-junit-testng/pom.xml b/testing-libraries/selenium-junit-testng/pom.xml similarity index 100% rename from testing-modules/selenium-junit-testng/pom.xml rename to testing-libraries/selenium-junit-testng/pom.xml diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java b/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java similarity index 100% rename from testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java rename to testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java b/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java similarity index 100% rename from testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java rename to testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java b/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java similarity index 100% rename from testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java rename to testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java b/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java similarity index 100% rename from testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java rename to testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java b/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java similarity index 100% rename from testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java rename to testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java diff --git a/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java b/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java similarity index 100% rename from testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java rename to testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java diff --git a/testing-modules/selenium-junit-testng/src/main/resources/logback.xml b/testing-libraries/selenium-junit-testng/src/main/resources/logback.xml similarity index 100% rename from testing-modules/selenium-junit-testng/src/main/resources/logback.xml rename to testing-libraries/selenium-junit-testng/src/main/resources/logback.xml diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java b/testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java similarity index 100% rename from testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java rename to testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java b/testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java similarity index 100% rename from testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java rename to testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java diff --git a/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java b/testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java similarity index 100% rename from testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java rename to testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java diff --git a/testing-modules/spring-testing/README.md b/testing-libraries/spring-testing/README.md similarity index 100% rename from testing-modules/spring-testing/README.md rename to testing-libraries/spring-testing/README.md diff --git a/testing-modules/spring-testing/pom.xml b/testing-libraries/spring-testing/pom.xml similarity index 100% rename from testing-modules/spring-testing/pom.xml rename to testing-libraries/spring-testing/pom.xml diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java b/testing-libraries/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java similarity index 100% rename from testing-modules/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java rename to testing-libraries/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/config/WebConfig.java b/testing-libraries/spring-testing/src/main/java/com/baeldung/config/WebConfig.java similarity index 100% rename from testing-modules/spring-testing/src/main/java/com/baeldung/config/WebConfig.java rename to testing-libraries/spring-testing/src/main/java/com/baeldung/config/WebConfig.java diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java b/testing-libraries/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java similarity index 100% rename from testing-modules/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java rename to testing-libraries/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java b/testing-libraries/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java similarity index 100% rename from testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java rename to testing-libraries/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java b/testing-libraries/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java similarity index 100% rename from testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java rename to testing-libraries/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java b/testing-libraries/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java similarity index 100% rename from testing-modules/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java rename to testing-libraries/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java b/testing-libraries/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java similarity index 100% rename from testing-modules/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java rename to testing-libraries/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java b/testing-libraries/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java similarity index 100% rename from testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java rename to testing-libraries/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java b/testing-libraries/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java similarity index 100% rename from testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java rename to testing-libraries/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java b/testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java similarity index 94% rename from testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java rename to testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java index 0677b05d66..8d4eeb57c4 100644 --- a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java +++ b/testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java @@ -1,23 +1,23 @@ -package org.baeldung.reflectiontestutils.repository; - -public class Employee { - private Integer id; - private String name; - - public Integer getId() { - return id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - private String employeeToString() { - return "id: " + getId() + "; name: " + getName(); - } - -} +package org.baeldung.reflectiontestutils.repository; + +public class Employee { + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + private String employeeToString() { + return "id: " + getId() + "; name: " + getName(); + } + +} diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java b/testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java similarity index 96% rename from testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java rename to testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java index 699ec3236c..d28745e2ab 100644 --- a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java +++ b/testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java @@ -1,14 +1,14 @@ -package org.baeldung.reflectiontestutils.repository; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class EmployeeService { - @Autowired - private HRService hrService; - - public String findEmployeeStatus(Integer employeeId) { - return "Employee " + employeeId + " status: " + hrService.getEmployeeStatus(employeeId); - } -} +package org.baeldung.reflectiontestutils.repository; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class EmployeeService { + @Autowired + private HRService hrService; + + public String findEmployeeStatus(Integer employeeId) { + return "Employee " + employeeId + " status: " + hrService.getEmployeeStatus(employeeId); + } +} diff --git a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java b/testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java similarity index 95% rename from testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java rename to testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java index e693aca764..13a5973ee8 100644 --- a/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java +++ b/testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java @@ -1,11 +1,11 @@ -package org.baeldung.reflectiontestutils.repository; - -import org.springframework.stereotype.Component; - -@Component -public class HRService { - - public String getEmployeeStatus(Integer employeeId) { - return "Inactive"; - } -} +package org.baeldung.reflectiontestutils.repository; + +import org.springframework.stereotype.Component; + +@Component +public class HRService { + + public String getEmployeeStatus(Integer employeeId) { + return "Inactive"; + } +} diff --git a/testing-modules/spring-testing/src/main/resources/logback.xml b/testing-libraries/spring-testing/src/main/resources/logback.xml similarity index 100% rename from testing-modules/spring-testing/src/main/resources/logback.xml rename to testing-libraries/spring-testing/src/main/resources/logback.xml diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java b/testing-libraries/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java rename to testing-libraries/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java diff --git a/testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java b/testing-libraries/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java similarity index 100% rename from testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java rename to testing-libraries/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java diff --git a/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java b/testing-libraries/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java similarity index 97% rename from testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java rename to testing-libraries/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java index 64c7ca19ef..36e5428b58 100644 --- a/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java +++ b/testing-libraries/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java @@ -1,46 +1,46 @@ -package org.baeldung.reflectiontestutils; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.mock; - -import org.baeldung.reflectiontestutils.repository.Employee; -import org.baeldung.reflectiontestutils.repository.EmployeeService; -import org.baeldung.reflectiontestutils.repository.HRService; -import org.junit.Test; -import org.springframework.test.util.ReflectionTestUtils; - -import static org.mockito.Mockito.when; - -public class ReflectionTestUtilsUnitTest { - - @Test - public void whenNonPublicField_thenReflectionTestUtilsSetField() { - Employee employee = new Employee(); - ReflectionTestUtils.setField(employee, "id", 1); - assertTrue(employee.getId().equals(1)); - - } - - @Test - public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod() { - Employee employee = new Employee(); - ReflectionTestUtils.setField(employee, "id", 1); - employee.setName("Smith, John"); - assertTrue(ReflectionTestUtils.invokeMethod(employee, "employeeToString").equals("id: 1; name: Smith, John")); - } - - @Test - public void whenInjectingMockOfDependency_thenReflectionTestUtilsSetField() { - Employee employee = new Employee(); - ReflectionTestUtils.setField(employee, "id", 1); - employee.setName("Smith, John"); - - HRService hrService = mock(HRService.class); - when(hrService.getEmployeeStatus(employee.getId())).thenReturn("Active"); - EmployeeService employeeService = new EmployeeService(); - - // Inject mock into the private field - ReflectionTestUtils.setField(employeeService, "hrService", hrService); - assertEquals("Employee " + employee.getId() + " status: Active", employeeService.findEmployeeStatus(employee.getId())); - } -} +package org.baeldung.reflectiontestutils; + +import static org.junit.Assert.*; +import static org.mockito.Mockito.mock; + +import org.baeldung.reflectiontestutils.repository.Employee; +import org.baeldung.reflectiontestutils.repository.EmployeeService; +import org.baeldung.reflectiontestutils.repository.HRService; +import org.junit.Test; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.mockito.Mockito.when; + +public class ReflectionTestUtilsUnitTest { + + @Test + public void whenNonPublicField_thenReflectionTestUtilsSetField() { + Employee employee = new Employee(); + ReflectionTestUtils.setField(employee, "id", 1); + assertTrue(employee.getId().equals(1)); + + } + + @Test + public void whenNonPublicMethod_thenReflectionTestUtilsInvokeMethod() { + Employee employee = new Employee(); + ReflectionTestUtils.setField(employee, "id", 1); + employee.setName("Smith, John"); + assertTrue(ReflectionTestUtils.invokeMethod(employee, "employeeToString").equals("id: 1; name: Smith, John")); + } + + @Test + public void whenInjectingMockOfDependency_thenReflectionTestUtilsSetField() { + Employee employee = new Employee(); + ReflectionTestUtils.setField(employee, "id", 1); + employee.setName("Smith, John"); + + HRService hrService = mock(HRService.class); + when(hrService.getEmployeeStatus(employee.getId())).thenReturn("Active"); + EmployeeService employeeService = new EmployeeService(); + + // Inject mock into the private field + ReflectionTestUtils.setField(employeeService, "hrService", hrService); + assertEquals("Employee " + employee.getId() + " status: Active", employeeService.findEmployeeStatus(employee.getId())); + } +} diff --git a/testing-modules/spring-testing/src/test/resources/application-test.properties b/testing-libraries/spring-testing/src/test/resources/application-test.properties similarity index 100% rename from testing-modules/spring-testing/src/test/resources/application-test.properties rename to testing-libraries/spring-testing/src/test/resources/application-test.properties diff --git a/testing-modules/spring-testing/src/test/resources/application.properties b/testing-libraries/spring-testing/src/test/resources/application.properties similarity index 100% rename from testing-modules/spring-testing/src/test/resources/application.properties rename to testing-libraries/spring-testing/src/test/resources/application.properties diff --git a/testing-modules/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties b/testing-libraries/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties similarity index 100% rename from testing-modules/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties rename to testing-libraries/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties diff --git a/testing-modules/spring-testing/src/test/resources/context-override-application.properties b/testing-libraries/spring-testing/src/test/resources/context-override-application.properties similarity index 100% rename from testing-modules/spring-testing/src/test/resources/context-override-application.properties rename to testing-libraries/spring-testing/src/test/resources/context-override-application.properties diff --git a/testing-modules/spring-testing/src/test/resources/other-location.properties b/testing-libraries/spring-testing/src/test/resources/other-location.properties similarity index 100% rename from testing-modules/spring-testing/src/test/resources/other-location.properties rename to testing-libraries/spring-testing/src/test/resources/other-location.properties diff --git a/testing-modules/test-containers/README.md b/testing-libraries/test-containers/README.md similarity index 100% rename from testing-modules/test-containers/README.md rename to testing-libraries/test-containers/README.md diff --git a/testing-modules/test-containers/pom.xml b/testing-libraries/test-containers/pom.xml similarity index 100% rename from testing-modules/test-containers/pom.xml rename to testing-libraries/test-containers/pom.xml diff --git a/testing-modules/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java b/testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java similarity index 100% rename from testing-modules/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java rename to testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java diff --git a/testing-modules/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java b/testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java similarity index 100% rename from testing-modules/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java rename to testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java diff --git a/testing-modules/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java b/testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java similarity index 100% rename from testing-modules/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java rename to testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java diff --git a/testing-modules/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java b/testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java similarity index 100% rename from testing-modules/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java rename to testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java diff --git a/testing-modules/test-containers/src/test/resources/test-compose.yml b/testing-libraries/test-containers/src/test/resources/test-compose.yml similarity index 100% rename from testing-modules/test-containers/src/test/resources/test-compose.yml rename to testing-libraries/test-containers/src/test/resources/test-compose.yml diff --git a/testing-modules/testng/README.md b/testing-libraries/testng/README.md similarity index 100% rename from testing-modules/testng/README.md rename to testing-libraries/testng/README.md diff --git a/testing-modules/testng/pom.xml b/testing-libraries/testng/pom.xml similarity index 96% rename from testing-modules/testng/pom.xml rename to testing-libraries/testng/pom.xml index 8389604717..5d0c9f126b 100644 --- a/testing-modules/testng/pom.xml +++ b/testing-libraries/testng/pom.xml @@ -1,48 +1,48 @@ - - - 4.0.0 - testng - 0.1.0-SNAPSHOT - testng - jar - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - ../../ - - - - - - org.testng - testng - ${testng.version} - test - - - - - testng - - - src/main/resources - true - - - - - src/main/resources - true - - - - - - - 6.10 - - + + + 4.0.0 + testng + 0.1.0-SNAPSHOT + testng + jar + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + + org.testng + testng + ${testng.version} + test + + + + + testng + + + src/main/resources + true + + + + + src/main/resources + true + + + + + + + 6.10 + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java b/testing-libraries/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/GroupIntegrationTest.java b/testing-libraries/testng/src/test/java/com/baeldung/GroupIntegrationTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/GroupIntegrationTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/GroupIntegrationTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java b/testing-libraries/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java b/testing-libraries/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java b/testing-libraries/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java b/testing-libraries/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java b/testing-libraries/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java b/testing-libraries/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java b/testing-libraries/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java b/testing-libraries/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java similarity index 100% rename from testing-modules/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java rename to testing-libraries/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java diff --git a/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java b/testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedListener.java similarity index 96% rename from testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java rename to testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedListener.java index 1a0ff190e3..669d6a1a4c 100644 --- a/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java +++ b/testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedListener.java @@ -1,67 +1,67 @@ -package com.baeldung.reports; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.ITestContext; -import org.testng.ITestListener; -import org.testng.ITestResult; - -public class CustomisedListener implements ITestListener { - private static final Logger LOGGER = LoggerFactory.getLogger("CUSTOM_LOGS"); - - @Override - public void onFinish(ITestContext context) { - LOGGER.info("PASSED TEST CASES"); - context.getPassedTests() - .getAllResults() - .forEach(result -> { - LOGGER.info(result.getName()); - }); - LOGGER.info("FAILED TEST CASES"); - context.getFailedTests() - .getAllResults() - .forEach(result -> { - LOGGER.info(result.getName()); - }); - LOGGER.info("Test completed on: " + context.getEndDate() - .toString()); - } - - @Override - public void onStart(ITestContext arg0) { - LOGGER.info("Started testing on: " + arg0.getStartDate() - .toString()); - } - - @Override - public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) { - // TODO Auto-generated method stub - - } - - @Override - public void onTestFailure(ITestResult arg0) { - LOGGER.info("Failed : " + arg0.getName()); - - } - - @Override - public void onTestSkipped(ITestResult arg0) { - LOGGER.info("Skipped Test: " + arg0.getName()); - - } - - @Override - public void onTestStart(ITestResult arg0) { - LOGGER.info("Testing: " + arg0.getName()); - - } - - @Override - public void onTestSuccess(ITestResult arg0) { - long timeTaken = ((arg0.getEndMillis() - arg0.getStartMillis())); - LOGGER.info("Tested: " + arg0.getName() + " Time taken:" + timeTaken + " ms"); - - } - -} +package com.baeldung.reports; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.ITestContext; +import org.testng.ITestListener; +import org.testng.ITestResult; + +public class CustomisedListener implements ITestListener { + private static final Logger LOGGER = LoggerFactory.getLogger("CUSTOM_LOGS"); + + @Override + public void onFinish(ITestContext context) { + LOGGER.info("PASSED TEST CASES"); + context.getPassedTests() + .getAllResults() + .forEach(result -> { + LOGGER.info(result.getName()); + }); + LOGGER.info("FAILED TEST CASES"); + context.getFailedTests() + .getAllResults() + .forEach(result -> { + LOGGER.info(result.getName()); + }); + LOGGER.info("Test completed on: " + context.getEndDate() + .toString()); + } + + @Override + public void onStart(ITestContext arg0) { + LOGGER.info("Started testing on: " + arg0.getStartDate() + .toString()); + } + + @Override + public void onTestFailedButWithinSuccessPercentage(ITestResult arg0) { + // TODO Auto-generated method stub + + } + + @Override + public void onTestFailure(ITestResult arg0) { + LOGGER.info("Failed : " + arg0.getName()); + + } + + @Override + public void onTestSkipped(ITestResult arg0) { + LOGGER.info("Skipped Test: " + arg0.getName()); + + } + + @Override + public void onTestStart(ITestResult arg0) { + LOGGER.info("Testing: " + arg0.getName()); + + } + + @Override + public void onTestSuccess(ITestResult arg0) { + long timeTaken = ((arg0.getEndMillis() - arg0.getStartMillis())); + LOGGER.info("Tested: " + arg0.getName() + " Time taken:" + timeTaken + " ms"); + + } + +} diff --git a/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java b/testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedReports.java similarity index 97% rename from testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java rename to testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedReports.java index 2c57993e0b..6d53043918 100644 --- a/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java +++ b/testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedReports.java @@ -1,111 +1,111 @@ -package com.baeldung.reports; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.testng.*; -import org.testng.xml.XmlSuite; - -import java.io.*; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.function.Function; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import static java.util.stream.Collectors.toList; - -public class CustomisedReports implements IReporter { - private static final Logger LOGGER = LoggerFactory.getLogger(CustomisedReports.class); - - private static final String ROW_TEMPLATE = "%s%s%s%s%s"; - - public void generateReport(List xmlSuites, List suites, String outputDirectory) { - String reportTemplate = initReportTemplate(); - - final String body = suites - .stream() - .flatMap(suiteToResults()) - .collect(Collectors.joining()); - - saveReportTemplate(outputDirectory, reportTemplate.replaceFirst("", String.format("%s", body))); - } - - private Function> suiteToResults() { - return suite -> suite.getResults().entrySet() - .stream() - .flatMap(resultsToRows(suite)); - } - - private Function, Stream> resultsToRows(ISuite suite) { - return e -> { - ITestContext testContext = e.getValue().getTestContext(); - - Set failedTests = testContext - .getFailedTests() - .getAllResults(); - Set passedTests = testContext - .getPassedTests() - .getAllResults(); - Set skippedTests = testContext - .getSkippedTests() - .getAllResults(); - - String suiteName = suite.getName(); - - return Stream - .of(failedTests, passedTests, skippedTests) - .flatMap(results -> generateReportRows(e.getKey(), suiteName, results).stream()); - }; - } - - private List generateReportRows(String testName, String suiteName, Set allTestResults) { - return allTestResults.stream() - .map(testResultToResultRow(testName, suiteName)) - .collect(toList()); - } - - private Function testResultToResultRow(String testName, String suiteName) { - return testResult -> { - switch (testResult.getStatus()) { - case ITestResult.FAILURE: - return String.format(ROW_TEMPLATE, "danger", suiteName, testName, testResult.getName(), "FAILED", "NA"); - - case ITestResult.SUCCESS: - return String.format(ROW_TEMPLATE, "success", suiteName, testName, testResult.getName(), "PASSED", String.valueOf(testResult.getEndMillis() - testResult.getStartMillis())); - - case ITestResult.SKIP: - return String.format(ROW_TEMPLATE, "warning", suiteName, testName, testResult.getName(), "SKIPPED", "NA"); - - default: - return ""; - } - }; - } - - private String initReportTemplate() { - String template = null; - byte[] reportTemplate; - try { - reportTemplate = Files.readAllBytes(Paths.get("src/test/resources/reportTemplate.html")); - template = new String(reportTemplate, "UTF-8"); - } catch (IOException e) { - LOGGER.error("Problem initializing template", e); - } - return template; - } - - private void saveReportTemplate(String outputDirectory, String reportTemplate) { - new File(outputDirectory).mkdirs(); - try { - PrintWriter reportWriter = new PrintWriter(new BufferedWriter(new FileWriter(new File(outputDirectory, "my-report.html")))); - reportWriter.println(reportTemplate); - reportWriter.flush(); - reportWriter.close(); - } catch (IOException e) { - LOGGER.error("Problem saving template", e); - } - } -} +package com.baeldung.reports; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.testng.*; +import org.testng.xml.XmlSuite; + +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import static java.util.stream.Collectors.toList; + +public class CustomisedReports implements IReporter { + private static final Logger LOGGER = LoggerFactory.getLogger(CustomisedReports.class); + + private static final String ROW_TEMPLATE = "%s%s%s%s%s"; + + public void generateReport(List xmlSuites, List suites, String outputDirectory) { + String reportTemplate = initReportTemplate(); + + final String body = suites + .stream() + .flatMap(suiteToResults()) + .collect(Collectors.joining()); + + saveReportTemplate(outputDirectory, reportTemplate.replaceFirst("", String.format("%s", body))); + } + + private Function> suiteToResults() { + return suite -> suite.getResults().entrySet() + .stream() + .flatMap(resultsToRows(suite)); + } + + private Function, Stream> resultsToRows(ISuite suite) { + return e -> { + ITestContext testContext = e.getValue().getTestContext(); + + Set failedTests = testContext + .getFailedTests() + .getAllResults(); + Set passedTests = testContext + .getPassedTests() + .getAllResults(); + Set skippedTests = testContext + .getSkippedTests() + .getAllResults(); + + String suiteName = suite.getName(); + + return Stream + .of(failedTests, passedTests, skippedTests) + .flatMap(results -> generateReportRows(e.getKey(), suiteName, results).stream()); + }; + } + + private List generateReportRows(String testName, String suiteName, Set allTestResults) { + return allTestResults.stream() + .map(testResultToResultRow(testName, suiteName)) + .collect(toList()); + } + + private Function testResultToResultRow(String testName, String suiteName) { + return testResult -> { + switch (testResult.getStatus()) { + case ITestResult.FAILURE: + return String.format(ROW_TEMPLATE, "danger", suiteName, testName, testResult.getName(), "FAILED", "NA"); + + case ITestResult.SUCCESS: + return String.format(ROW_TEMPLATE, "success", suiteName, testName, testResult.getName(), "PASSED", String.valueOf(testResult.getEndMillis() - testResult.getStartMillis())); + + case ITestResult.SKIP: + return String.format(ROW_TEMPLATE, "warning", suiteName, testName, testResult.getName(), "SKIPPED", "NA"); + + default: + return ""; + } + }; + } + + private String initReportTemplate() { + String template = null; + byte[] reportTemplate; + try { + reportTemplate = Files.readAllBytes(Paths.get("src/test/resources/reportTemplate.html")); + template = new String(reportTemplate, "UTF-8"); + } catch (IOException e) { + LOGGER.error("Problem initializing template", e); + } + return template; + } + + private void saveReportTemplate(String outputDirectory, String reportTemplate) { + new File(outputDirectory).mkdirs(); + try { + PrintWriter reportWriter = new PrintWriter(new BufferedWriter(new FileWriter(new File(outputDirectory, "my-report.html")))); + reportWriter.println(reportTemplate); + reportWriter.flush(); + reportWriter.close(); + } catch (IOException e) { + LOGGER.error("Problem saving template", e); + } + } +} diff --git a/testing-modules/testng/src/test/resources/logback.xml b/testing-libraries/testng/src/test/resources/logback.xml similarity index 97% rename from testing-modules/testng/src/test/resources/logback.xml rename to testing-libraries/testng/src/test/resources/logback.xml index 035520aa15..ec0dc2469a 100644 --- a/testing-modules/testng/src/test/resources/logback.xml +++ b/testing-libraries/testng/src/test/resources/logback.xml @@ -1,19 +1,19 @@ - - - - - web - %date [%thread] %-5level %logger{36} - %message%n - - - - - - - - - - - - - + + + + + web - %date [%thread] %-5level %logger{36} - %message%n + + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/resources/parametrized_testng.xml b/testing-libraries/testng/src/test/resources/parametrized_testng.xml similarity index 97% rename from testing-modules/testng/src/test/resources/parametrized_testng.xml rename to testing-libraries/testng/src/test/resources/parametrized_testng.xml index d3a9a6dc51..1a9266dd59 100644 --- a/testing-modules/testng/src/test/resources/parametrized_testng.xml +++ b/testing-libraries/testng/src/test/resources/parametrized_testng.xml @@ -1,13 +1,13 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/resources/reportTemplate.html b/testing-libraries/testng/src/test/resources/reportTemplate.html similarity index 100% rename from testing-modules/testng/src/test/resources/reportTemplate.html rename to testing-libraries/testng/src/test/resources/reportTemplate.html diff --git a/testing-modules/testng/src/test/resources/test_group.xml b/testing-libraries/testng/src/test/resources/test_group.xml similarity index 96% rename from testing-modules/testng/src/test/resources/test_group.xml rename to testing-libraries/testng/src/test/resources/test_group.xml index 3f51c039d6..34a825855c 100644 --- a/testing-modules/testng/src/test/resources/test_group.xml +++ b/testing-libraries/testng/src/test/resources/test_group.xml @@ -1,13 +1,13 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/resources/test_setup.xml b/testing-libraries/testng/src/test/resources/test_setup.xml similarity index 96% rename from testing-modules/testng/src/test/resources/test_setup.xml rename to testing-libraries/testng/src/test/resources/test_setup.xml index dea9d9bf5a..8e91349b0a 100644 --- a/testing-modules/testng/src/test/resources/test_setup.xml +++ b/testing-libraries/testng/src/test/resources/test_setup.xml @@ -1,17 +1,17 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/testng/src/test/resources/test_suite.xml b/testing-libraries/testng/src/test/resources/test_suite.xml similarity index 97% rename from testing-modules/testng/src/test/resources/test_suite.xml rename to testing-libraries/testng/src/test/resources/test_suite.xml index 7a01f1af08..8b66799c4e 100644 --- a/testing-modules/testng/src/test/resources/test_suite.xml +++ b/testing-libraries/testng/src/test/resources/test_suite.xml @@ -1,13 +1,13 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/xmlunit-2/README.md b/testing-libraries/xmlunit-2/README.md similarity index 100% rename from testing-modules/xmlunit-2/README.md rename to testing-libraries/xmlunit-2/README.md diff --git a/testing-modules/xmlunit-2/pom.xml b/testing-libraries/xmlunit-2/pom.xml similarity index 100% rename from testing-modules/xmlunit-2/pom.xml rename to testing-libraries/xmlunit-2/pom.xml diff --git a/testing-modules/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java b/testing-libraries/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java similarity index 100% rename from testing-modules/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java rename to testing-libraries/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java diff --git a/testing-modules/testing/src/main/resources/logback.xml b/testing-libraries/xmlunit-2/src/main/resources/logback.xml similarity index 100% rename from testing-modules/testing/src/main/resources/logback.xml rename to testing-libraries/xmlunit-2/src/main/resources/logback.xml diff --git a/testing-modules/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java b/testing-libraries/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java similarity index 100% rename from testing-modules/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java rename to testing-libraries/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java diff --git a/testing-modules/xmlunit-2/src/test/resources/control.xml b/testing-libraries/xmlunit-2/src/test/resources/control.xml similarity index 100% rename from testing-modules/xmlunit-2/src/test/resources/control.xml rename to testing-libraries/xmlunit-2/src/test/resources/control.xml diff --git a/testing-modules/xmlunit-2/src/test/resources/students.xml b/testing-libraries/xmlunit-2/src/test/resources/students.xml similarity index 100% rename from testing-modules/xmlunit-2/src/test/resources/students.xml rename to testing-libraries/xmlunit-2/src/test/resources/students.xml diff --git a/testing-modules/xmlunit-2/src/test/resources/students.xsd b/testing-libraries/xmlunit-2/src/test/resources/students.xsd similarity index 100% rename from testing-modules/xmlunit-2/src/test/resources/students.xsd rename to testing-libraries/xmlunit-2/src/test/resources/students.xsd diff --git a/testing-modules/xmlunit-2/src/test/resources/students_with_error.xml b/testing-libraries/xmlunit-2/src/test/resources/students_with_error.xml similarity index 100% rename from testing-modules/xmlunit-2/src/test/resources/students_with_error.xml rename to testing-libraries/xmlunit-2/src/test/resources/students_with_error.xml diff --git a/testing-modules/xmlunit-2/src/test/resources/teachers.xml b/testing-libraries/xmlunit-2/src/test/resources/teachers.xml similarity index 100% rename from testing-modules/xmlunit-2/src/test/resources/teachers.xml rename to testing-libraries/xmlunit-2/src/test/resources/teachers.xml diff --git a/testing-modules/xmlunit-2/src/test/resources/test.xml b/testing-libraries/xmlunit-2/src/test/resources/test.xml similarity index 100% rename from testing-modules/xmlunit-2/src/test/resources/test.xml rename to testing-libraries/xmlunit-2/src/test/resources/test.xml diff --git a/testing-modules/groovy-spock/report-2019-03-29.json b/testing-modules/groovy-spock/report-2019-03-29.json deleted file mode 100644 index 85f0b261fb..0000000000 --- a/testing-modules/groovy-spock/report-2019-03-29.json +++ /dev/null @@ -1,402 +0,0 @@ -loadLogFile([{ - "package": "mocks", - "name": "ExampleSpockTest", - "start": 1553898111660, - "features": [ - { - "name": "should calculate character occurrences in given string", - "start": 1553898111662, - "end": 1553898111699, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898111709, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "mocks", - "name": "ItemServiceTest", - "start": 1553898111714, - "features": [ - { - "name": "should spy on EventPublisher method call", - "start": 1553898111714, - "output": [ - "I've published: item-id\n" - ], - "end": 1553898112250, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should return items", - "start": 1553898112250, - "end": 1553898112260, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should publish events about new non-empty saved offers", - "start": 1553898112260, - "end": 1553898112267, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should return different items for different ids lists", - "start": 1553898112267, - "end": 1553898112280, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should throw ExternalItemProviderException when ItemProvider fails", - "start": 1553898112281, - "end": 1553898112294, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should return different items on subsequent call", - "start": 1553898112294, - "narrative": "When method is called for the first time\nThen empty list is returned\nWhen method is called for the second time\nThen item with id=1 is returned\nWhen method is called for the thirdtime\nThen item with id=2 is returned", - "end": 1553898112298, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "should return items sorted by name", - "start": 1553898112299, - "end": 1553898112307, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112310, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "FirstSpecification", - "name": "FirstSpecification", - "start": 1553898112314, - "features": [ - { - "name": "Should verify notify was called", - "start": 1553898112314, - "end": 1553898112324, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "Should return true value for mock", - "start": 1553898112325, - "end": 1553898112344, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "Should return default value for mock", - "start": 1553898112344, - "end": 1553898112347, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "numbers to the power of two", - "start": 1553898112347, - "end": 1553898112358, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "Should get an index out of bounds when removing a non-existent item", - "start": 1553898112358, - "end": 1553898112364, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "Should be able to remove from list", - "start": 1553898112364, - "end": 1553898112366, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "two plus two should equal four", - "start": 1553898112366, - "end": 1553898112368, - "result": "passed", - "attachments": [ - - ] - }, - { - "name": "one plus one should equal two", - "start": 1553898112368, - "end": 1553898112391, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112394, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "IgnoreTest", - "start": 1553898112395, - "end": 1553898112395, - "result": "skipped" -}]) - -loadLogFile([{ - "package": "extensions", - "name": "RetryTest", - "start": 1553898112403, - "end": 1553898112405, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "This title is easy to read for humans", - "start": 1553898112407, - "end": 1553898112408, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "SeeTest", - "start": 1553898112409, - "end": 1553898112411, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "StepwiseTest", - "start": 1553898112422, - "end": 1553898112423, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "NarrativeDescriptionTest", - "start": 1553898112427, - "narrative": "as a user\n i want to save favourite items \n and then get the list of them", - "end": 1553898112433, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "SubjectTest", - "start": 1553898112434, - "end": 1553898112436, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "IgnoreRestTest", - "start": 1553898112437, - "end": 1553898112437, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "StackTraceTest", - "start": 1553898112438, - "features": [ - { - "name": "stacktrace", - "start": 1553898112438, - "exceptions": [ - "java.lang.RuntimeException: blabla\n\tat extensions.StackTraceTest.stacktrace(StackTraceTest.groovy:10)\n" - ], - "end": 1553898112455, - "result": "failed", - "attachments": [ - - ] - } - ], - "end": 1553898112470, - "result": "failed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "IgnoreIfTest", - "start": 1553898112471, - "end": 1553898112472, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "RequiresTest", - "start": 1553898112473, - "features": [ - { - "name": "I will run only on Windows", - "start": 1553898112474, - "end": 1553898112474, - "result": "skipped" - } - ], - "end": 1553898112476, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "IssueTest", - "start": 1553898112477, - "features": [ - { - "name": "I'm using Spock configuration file", - "start": 1553898112477, - "tags": [ - { - "name": "Bug LO-1000", - "key": "issue", - "value": "LO-1000", - "url": "http:\/\/jira.org\/issues\/LO-1000" - } - ], - "end": 1553898112489, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112490, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "TimeoutTest", - "start": 1553898112491, - "features": [ - { - "name": "I will fail after 200 millis", - "start": 1553898112491, - "end": 1553898112514, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112517, - "result": "passed", - "attachments": [ - - ] -}]) - -loadLogFile([{ - "package": "extensions", - "name": "RestoreSystemPropertiesTest", - "start": 1553898112518, - "features": [ - { - "name": "all environment variables will be saved before execution and restored after tests", - "start": 1553898112518, - "end": 1553898112532, - "result": "passed", - "attachments": [ - - ] - } - ], - "end": 1553898112539, - "result": "passed", - "attachments": [ - - ] -}]) - diff --git a/testing-modules/testing/README.md b/testing-modules/testing/README.md deleted file mode 100644 index 135ef1054a..0000000000 --- a/testing-modules/testing/README.md +++ /dev/null @@ -1,24 +0,0 @@ -========= - -## Mutation Testing - -### Relevant Articles: -- [Mutation Testing with PITest](http://www.baeldung.com/java-mutation-testing-with-pitest) -- [Intro to JaCoCo](http://www.baeldung.com/jacoco) -- [AssertJ’s Java 8 Features](http://www.baeldung.com/assertJ-java-8-features) -- [AssertJ for Guava](http://www.baeldung.com/assertJ-for-guava) -- [Introduction to AssertJ](http://www.baeldung.com/introduction-to-assertj) -- [Cucumber and Scenario Outline](http://www.baeldung.com/cucumber-scenario-outline) -- [Testing with Google Truth](http://www.baeldung.com/google-truth) -- [Testing with JGoTesting](http://www.baeldung.com/jgotesting) -- [Introduction to JUnitParams](http://www.baeldung.com/junit-params) -- [Cucumber Java 8 Support](http://www.baeldung.com/cucumber-java-8-support) -- [Introduction to Lambda Behave](http://www.baeldung.com/lambda-behave) -- [Introduction to Jukito](http://www.baeldung.com/jukito) -- [Custom JUnit 4 Test Runners](http://www.baeldung.com/junit-4-custom-runners) -- [Guide to JSpec](http://www.baeldung.com/jspec) -- [Custom Assertions with AssertJ](http://www.baeldung.com/assertj-custom-assertion) -- [Using Conditions with AssertJ Assertions](http://www.baeldung.com/assertj-conditions) -- [A Guide to JavaFaker](https://www.baeldung.com/java-faker) -- [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) -- [AssertJ Exception Assertions](http://www.baeldung.com/assertj-exception-assertion) diff --git a/testing-modules/testing/pom.xml b/testing-modules/testing/pom.xml deleted file mode 100644 index ccfa1070d1..0000000000 --- a/testing-modules/testing/pom.xml +++ /dev/null @@ -1,183 +0,0 @@ - - 4.0.0 - com.baeldung - testing - 0.1-SNAPSHOT - testing - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - - - - - com.insightfullogic - lambda-behave - ${lambda-behave.version} - - - org.assertj - assertj-guava - ${assertj-guava.version} - - - org.assertj - assertj-core - ${assertj-core.version} - test - - - info.cukes - cucumber-junit - ${cucumber.version} - test - - - info.cukes - cucumber-java - ${cucumber.version} - test - - - info.cukes - cucumber-java8 - ${cucumber.version} - test - - - org.pitest - pitest-parent - ${pitest.version} - pom - - - com.google.truth - truth - ${truth.version} - - - com.google.truth.extensions - truth-java8-extension - ${truth.version} - test - - - pl.pragmatists - JUnitParams - ${jUnitParams.version} - test - - - org.jgotesting - jgotesting - ${jgotesting.version} - test - - - org.jukito - jukito - ${jukito.version} - test - - - org.javalite - javalite-common - ${javalite.version} - - - com.github.javafaker - javafaker - ${javafaker.version} - - - - - - - org.pitest - pitest-maven - ${pitest.version} - - - com.baeldung.testing.mutation.* - - - com.baeldung.mutation.test.* - - - - - org.jacoco - jacoco-maven-plugin - ${jacoco.version} - - - - prepare-agent - - - - report - prepare-package - - report - - - - jacoco-check - - check - - - - - PACKAGE - - - LINE - COVEREDRATIO - 0 - - - - - - - - - - org.assertj - assertj-assertions-generator-maven-plugin - ${assertj-generator.version} - - - com.baeldung.testing.assertj.custom.Person - - - - - - - - 1.2.5 - 1.1.10 - 0.7.7.201606060606 - 21.0 - 3.1.0 - 3.9.0 - 2.1.0 - 0.32 - 1.1.0 - 0.12 - 1.4.13 - 0.4 - 3.0.0 - 1.5 - 0.15 - - - diff --git a/testing-modules/xmlunit-2/src/main/resources/logback.xml b/testing-modules/xmlunit-2/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/testing-modules/xmlunit-2/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file From 58bb3a5119566566a45ede242356441e52e3b568 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 31 Aug 2019 17:30:52 +0530 Subject: [PATCH 072/396] BAEL-17355 Fix the integrations tests in spring-boot-properties (#7686) --- .../configurationproperties/DemoApplication.java | 13 ------------- 1 file changed, 13 deletions(-) delete mode 100644 spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java diff --git a/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java b/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java deleted file mode 100644 index 011acaba36..0000000000 --- a/spring-boot-properties/src/main/java/com/baeldung/configurationproperties/DemoApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.configurationproperties; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.context.properties.EnableConfigurationProperties; - -@SpringBootApplication -@EnableConfigurationProperties(ConfigProperties.class) -public class DemoApplication { - public static void main(String[] args) { - SpringApplication.run(DemoApplication.class, args); - } -} \ No newline at end of file From 9fd2fb32cacd1562a2931f4e47bc94ca846222a6 Mon Sep 17 00:00:00 2001 From: Denis Date: Sat, 31 Aug 2019 15:39:30 +0200 Subject: [PATCH 073/396] extract spring-scheduling module --- spring-all/README.md | 3 -- spring-scheduling/README.md | 5 +++ spring-scheduling/pom.xml | 36 +++++++++++++++++++ .../scheduling/ScheduledFixedRateExample.java | 0 .../SpringSchedulingFixedRateConfig.java | 0 .../org/baeldung/async/AsyncComponent.java | 0 .../async/CustomAsyncExceptionHandler.java | 0 .../async/config/SpringAsyncConfig.java | 0 .../ScheduledAnnotationExample.java | 0 .../scheduling/SchedulingWithXmlConfig.java | 0 .../scheduling/SpringSchedulingConfig.java | 0 .../org/baeldung/springretry/AppConfig.java | 0 .../springretry/DefaultListenerSupport.java | 0 .../org/baeldung/springretry/MyService.java | 0 .../baeldung/springretry/MyServiceImpl.java | 0 .../ThreadPoolTaskSchedulerConfig.java | 0 .../ThreadPoolTaskSchedulerExamples.java | 0 .../src/main/resources/retryadvice.xml | 2 +- .../src/main/resources/springAsync-config.xml | 0 .../main/resources/springScheduled-config.xml | 0 .../main/resources/springScheduled.properties | 0 ...eduledFixedRateExampleIntegrationTest.java | 0 ...AsyncAnnotationExampleIntegrationTest.java | 0 .../async/AsyncWithXMLIntegrationTest.java | 0 ...duledAnnotationExampleIntegrationTest.java | 0 ...chedulingWithXmlConfigIntegrationTest.java | 0 .../SpringRetryIntegrationTest.java | 0 ...hreadPoolTaskSchedulerIntegrationTest.java | 0 28 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 spring-scheduling/README.md create mode 100644 spring-scheduling/pom.xml rename {spring-all => spring-scheduling}/src/main/java/com/baeldung/scheduling/ScheduledFixedRateExample.java (100%) rename {spring-all => spring-scheduling}/src/main/java/com/baeldung/scheduling/SpringSchedulingFixedRateConfig.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/async/AsyncComponent.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/async/CustomAsyncExceptionHandler.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/async/config/SpringAsyncConfig.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/scheduling/ScheduledAnnotationExample.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/scheduling/SchedulingWithXmlConfig.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/scheduling/SpringSchedulingConfig.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/springretry/AppConfig.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/springretry/MyService.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/springretry/MyServiceImpl.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java (100%) rename {spring-all => spring-scheduling}/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java (100%) rename {spring-all => spring-scheduling}/src/main/resources/retryadvice.xml (97%) rename {spring-all => spring-scheduling}/src/main/resources/springAsync-config.xml (100%) rename {spring-all => spring-scheduling}/src/main/resources/springScheduled-config.xml (100%) rename {spring-all => spring-scheduling}/src/main/resources/springScheduled.properties (100%) rename {spring-all => spring-scheduling}/src/test/java/com/baeldung/scheduling/ScheduledFixedRateExampleIntegrationTest.java (100%) rename {spring-all => spring-scheduling}/src/test/java/org/baeldung/async/AsyncAnnotationExampleIntegrationTest.java (100%) rename {spring-all => spring-scheduling}/src/test/java/org/baeldung/async/AsyncWithXMLIntegrationTest.java (100%) rename {spring-all => spring-scheduling}/src/test/java/org/baeldung/scheduling/ScheduledAnnotationExampleIntegrationTest.java (100%) rename {spring-all => spring-scheduling}/src/test/java/org/baeldung/scheduling/SchedulingWithXmlConfigIntegrationTest.java (100%) rename {spring-all => spring-scheduling}/src/test/java/org/baeldung/springretry/SpringRetryIntegrationTest.java (100%) rename {spring-all => spring-scheduling}/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerIntegrationTest.java (100%) diff --git a/spring-all/README.md b/spring-all/README.md index c5825b47fb..3db7599914 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -18,14 +18,11 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Quick Guide to Spring Controllers](http://www.baeldung.com/spring-controllers) - [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) - [Introduction To Ehcache](http://www.baeldung.com/ehcache) -- [A Guide to the Spring Task Scheduler](http://www.baeldung.com/spring-task-scheduler) -- [Guide to Spring Retry](http://www.baeldung.com/spring-retry) - [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) - [A CLI with Spring Shell](http://www.baeldung.com/spring-shell-cli) - [JasperReports with Spring](http://www.baeldung.com/spring-jasper) - [Model, ModelMap, and ModelView in Spring MVC](http://www.baeldung.com/spring-mvc-model-model-map-model-view) - [A Guide To Caching in Spring](http://www.baeldung.com/spring-cache-tutorial) -- [How To Do @Async in Spring](http://www.baeldung.com/spring-async) - [@Order in Spring](http://www.baeldung.com/spring-order) - [Spring Web Contexts](http://www.baeldung.com/spring-web-contexts) - [Spring Cache – Creating a Custom KeyGenerator](http://www.baeldung.com/spring-cache-custom-keygenerator) diff --git a/spring-scheduling/README.md b/spring-scheduling/README.md new file mode 100644 index 0000000000..72d5a7dc83 --- /dev/null +++ b/spring-scheduling/README.md @@ -0,0 +1,5 @@ +### Relevant articles: +- [A Guide to the Spring Task Scheduler](http://www.baeldung.com/spring-task-scheduler) +- [Guide to Spring Retry](http://www.baeldung.com/spring-retry) +- [How To Do @Async in Spring](http://www.baeldung.com/spring-async) + diff --git a/spring-scheduling/pom.xml b/spring-scheduling/pom.xml new file mode 100644 index 0000000000..1b48b55bd7 --- /dev/null +++ b/spring-scheduling/pom.xml @@ -0,0 +1,36 @@ + + 4.0.0 + spring-scheduling + 0.1-SNAPSHOT + spring-scheduling + war + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework + spring-context + + + org.springframework.retry + spring-retry + + + org.springframework + spring-aspects + + + org.springframework + spring-test + test + + + + \ No newline at end of file diff --git a/spring-all/src/main/java/com/baeldung/scheduling/ScheduledFixedRateExample.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/ScheduledFixedRateExample.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/scheduling/ScheduledFixedRateExample.java rename to spring-scheduling/src/main/java/com/baeldung/scheduling/ScheduledFixedRateExample.java diff --git a/spring-all/src/main/java/com/baeldung/scheduling/SpringSchedulingFixedRateConfig.java b/spring-scheduling/src/main/java/com/baeldung/scheduling/SpringSchedulingFixedRateConfig.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/scheduling/SpringSchedulingFixedRateConfig.java rename to spring-scheduling/src/main/java/com/baeldung/scheduling/SpringSchedulingFixedRateConfig.java diff --git a/spring-all/src/main/java/org/baeldung/async/AsyncComponent.java b/spring-scheduling/src/main/java/org/baeldung/async/AsyncComponent.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/async/AsyncComponent.java rename to spring-scheduling/src/main/java/org/baeldung/async/AsyncComponent.java diff --git a/spring-all/src/main/java/org/baeldung/async/CustomAsyncExceptionHandler.java b/spring-scheduling/src/main/java/org/baeldung/async/CustomAsyncExceptionHandler.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/async/CustomAsyncExceptionHandler.java rename to spring-scheduling/src/main/java/org/baeldung/async/CustomAsyncExceptionHandler.java diff --git a/spring-all/src/main/java/org/baeldung/async/config/SpringAsyncConfig.java b/spring-scheduling/src/main/java/org/baeldung/async/config/SpringAsyncConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/async/config/SpringAsyncConfig.java rename to spring-scheduling/src/main/java/org/baeldung/async/config/SpringAsyncConfig.java diff --git a/spring-all/src/main/java/org/baeldung/scheduling/ScheduledAnnotationExample.java b/spring-scheduling/src/main/java/org/baeldung/scheduling/ScheduledAnnotationExample.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scheduling/ScheduledAnnotationExample.java rename to spring-scheduling/src/main/java/org/baeldung/scheduling/ScheduledAnnotationExample.java diff --git a/spring-all/src/main/java/org/baeldung/scheduling/SchedulingWithXmlConfig.java b/spring-scheduling/src/main/java/org/baeldung/scheduling/SchedulingWithXmlConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scheduling/SchedulingWithXmlConfig.java rename to spring-scheduling/src/main/java/org/baeldung/scheduling/SchedulingWithXmlConfig.java diff --git a/spring-all/src/main/java/org/baeldung/scheduling/SpringSchedulingConfig.java b/spring-scheduling/src/main/java/org/baeldung/scheduling/SpringSchedulingConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scheduling/SpringSchedulingConfig.java rename to spring-scheduling/src/main/java/org/baeldung/scheduling/SpringSchedulingConfig.java diff --git a/spring-all/src/main/java/org/baeldung/springretry/AppConfig.java b/spring-scheduling/src/main/java/org/baeldung/springretry/AppConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springretry/AppConfig.java rename to spring-scheduling/src/main/java/org/baeldung/springretry/AppConfig.java diff --git a/spring-all/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java b/spring-scheduling/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java rename to spring-scheduling/src/main/java/org/baeldung/springretry/DefaultListenerSupport.java diff --git a/spring-all/src/main/java/org/baeldung/springretry/MyService.java b/spring-scheduling/src/main/java/org/baeldung/springretry/MyService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springretry/MyService.java rename to spring-scheduling/src/main/java/org/baeldung/springretry/MyService.java diff --git a/spring-all/src/main/java/org/baeldung/springretry/MyServiceImpl.java b/spring-scheduling/src/main/java/org/baeldung/springretry/MyServiceImpl.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springretry/MyServiceImpl.java rename to spring-scheduling/src/main/java/org/baeldung/springretry/MyServiceImpl.java diff --git a/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java b/spring-scheduling/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java rename to spring-scheduling/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerConfig.java diff --git a/spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java b/spring-scheduling/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java rename to spring-scheduling/src/main/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerExamples.java diff --git a/spring-all/src/main/resources/retryadvice.xml b/spring-scheduling/src/main/resources/retryadvice.xml similarity index 97% rename from spring-all/src/main/resources/retryadvice.xml rename to spring-scheduling/src/main/resources/retryadvice.xml index 8de7801a58..79a9fc8660 100644 --- a/spring-all/src/main/resources/retryadvice.xml +++ b/spring-scheduling/src/main/resources/retryadvice.xml @@ -7,7 +7,7 @@ http://www.springframework.org/schema/beans/spring-beans.xsd"> + expression="execution(* org.baeldung.springretry..*MyService.defaultXmlRetryService(..))" /> diff --git a/spring-all/src/main/resources/springAsync-config.xml b/spring-scheduling/src/main/resources/springAsync-config.xml similarity index 100% rename from spring-all/src/main/resources/springAsync-config.xml rename to spring-scheduling/src/main/resources/springAsync-config.xml diff --git a/spring-all/src/main/resources/springScheduled-config.xml b/spring-scheduling/src/main/resources/springScheduled-config.xml similarity index 100% rename from spring-all/src/main/resources/springScheduled-config.xml rename to spring-scheduling/src/main/resources/springScheduled-config.xml diff --git a/spring-all/src/main/resources/springScheduled.properties b/spring-scheduling/src/main/resources/springScheduled.properties similarity index 100% rename from spring-all/src/main/resources/springScheduled.properties rename to spring-scheduling/src/main/resources/springScheduled.properties diff --git a/spring-all/src/test/java/com/baeldung/scheduling/ScheduledFixedRateExampleIntegrationTest.java b/spring-scheduling/src/test/java/com/baeldung/scheduling/ScheduledFixedRateExampleIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/com/baeldung/scheduling/ScheduledFixedRateExampleIntegrationTest.java rename to spring-scheduling/src/test/java/com/baeldung/scheduling/ScheduledFixedRateExampleIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/async/AsyncAnnotationExampleIntegrationTest.java b/spring-scheduling/src/test/java/org/baeldung/async/AsyncAnnotationExampleIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/async/AsyncAnnotationExampleIntegrationTest.java rename to spring-scheduling/src/test/java/org/baeldung/async/AsyncAnnotationExampleIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/async/AsyncWithXMLIntegrationTest.java b/spring-scheduling/src/test/java/org/baeldung/async/AsyncWithXMLIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/async/AsyncWithXMLIntegrationTest.java rename to spring-scheduling/src/test/java/org/baeldung/async/AsyncWithXMLIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/scheduling/ScheduledAnnotationExampleIntegrationTest.java b/spring-scheduling/src/test/java/org/baeldung/scheduling/ScheduledAnnotationExampleIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/scheduling/ScheduledAnnotationExampleIntegrationTest.java rename to spring-scheduling/src/test/java/org/baeldung/scheduling/ScheduledAnnotationExampleIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/scheduling/SchedulingWithXmlConfigIntegrationTest.java b/spring-scheduling/src/test/java/org/baeldung/scheduling/SchedulingWithXmlConfigIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/scheduling/SchedulingWithXmlConfigIntegrationTest.java rename to spring-scheduling/src/test/java/org/baeldung/scheduling/SchedulingWithXmlConfigIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/springretry/SpringRetryIntegrationTest.java b/spring-scheduling/src/test/java/org/baeldung/springretry/SpringRetryIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/springretry/SpringRetryIntegrationTest.java rename to spring-scheduling/src/test/java/org/baeldung/springretry/SpringRetryIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerIntegrationTest.java b/spring-scheduling/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerIntegrationTest.java rename to spring-scheduling/src/test/java/org/baeldung/taskscheduler/ThreadPoolTaskSchedulerIntegrationTest.java From e848a0ffcfb907d6db86e14d43bee8cd6032225f Mon Sep 17 00:00:00 2001 From: Denis Date: Sat, 31 Aug 2019 15:51:56 +0200 Subject: [PATCH 074/396] extract spring-caching module --- spring-all/README.md | 3 - spring-all/pom.xml | 5 - .../main/java/org/baeldung/model/User.java | 2 +- .../baeldung/repository/UserRepository.java | 2 +- .../UserRepositoryIntegrationTest.java | 2 +- spring-caching/README.md | 4 + spring-caching/pom.xml | 43 ++++ .../config/ApplicationCacheConfig.java | 0 .../caching/config/CachingConfig.java | 0 .../caching/config/CustomKeyGenerator.java | 0 .../controllers/CachingController.java | 36 ++-- .../eviction/service/CachingService.java | 106 +++++----- .../caching/example/AbstractService.java | 0 .../baeldung/caching/example/BookService.java | 2 +- .../baeldung/caching/example/Customer.java | 0 .../caching/example/CustomerDataService.java | 0 .../example/CustomerServiceWithParent.java | 0 .../org/baeldung/caching}/model/Book.java | 2 +- .../ehcache/calculator/SquaredCalculator.java | 0 .../baeldung/ehcache/config/CacheHelper.java | 0 .../src/main/resources/config.xml | 0 .../CacheEvictAnnotationIntegrationTest.java | 158 +++++++------- .../CacheManagerEvictIntegrationTest.java | 192 +++++++++--------- .../test/SpringCachingIntegrationTest.java | 0 .../ehcache/SquareCalculatorUnitTest.java | 80 ++++---- 25 files changed, 338 insertions(+), 299 deletions(-) create mode 100644 spring-caching/README.md create mode 100644 spring-caching/pom.xml rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/config/ApplicationCacheConfig.java (100%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/config/CachingConfig.java (100%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/config/CustomKeyGenerator.java (100%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/eviction/controllers/CachingController.java (96%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/eviction/service/CachingService.java (96%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/example/AbstractService.java (100%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/example/BookService.java (93%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/example/Customer.java (100%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/example/CustomerDataService.java (100%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/caching/example/CustomerServiceWithParent.java (100%) rename {spring-all/src/main/java/org/baeldung => spring-caching/src/main/java/org/baeldung/caching}/model/Book.java (94%) rename {spring-all => spring-caching}/src/main/java/org/baeldung/ehcache/calculator/SquaredCalculator.java (100%) mode change 100755 => 100644 rename {spring-all => spring-caching}/src/main/java/org/baeldung/ehcache/config/CacheHelper.java (100%) mode change 100755 => 100644 rename {spring-all => spring-caching}/src/main/resources/config.xml (100%) rename {spring-all => spring-caching}/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java (96%) rename {spring-all => spring-caching}/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java (97%) rename {spring-all => spring-caching}/src/test/java/org/baeldung/caching/test/SpringCachingIntegrationTest.java (100%) rename {spring-all => spring-caching}/src/test/java/org/baeldung/ehcache/SquareCalculatorUnitTest.java (97%) diff --git a/spring-all/README.md b/spring-all/README.md index 3db7599914..95b87cfee1 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -17,15 +17,12 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Running Setup Data on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring) - [Quick Guide to Spring Controllers](http://www.baeldung.com/spring-controllers) - [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) -- [Introduction To Ehcache](http://www.baeldung.com/ehcache) - [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) - [A CLI with Spring Shell](http://www.baeldung.com/spring-shell-cli) - [JasperReports with Spring](http://www.baeldung.com/spring-jasper) - [Model, ModelMap, and ModelView in Spring MVC](http://www.baeldung.com/spring-mvc-model-model-map-model-view) -- [A Guide To Caching in Spring](http://www.baeldung.com/spring-cache-tutorial) - [@Order in Spring](http://www.baeldung.com/spring-order) - [Spring Web Contexts](http://www.baeldung.com/spring-web-contexts) -- [Spring Cache – Creating a Custom KeyGenerator](http://www.baeldung.com/spring-cache-custom-keygenerator) - [Spring @Primary Annotation](http://www.baeldung.com/spring-primary) - [Spring Events](https://www.baeldung.com/spring-events) - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) diff --git a/spring-all/pom.xml b/spring-all/pom.xml index 8c88efb970..1b733555da 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -147,10 +147,6 @@ ${easymock.version} test
- - org.ehcache - ehcache - org.apache.logging.log4j log4j-api @@ -243,7 +239,6 @@ 25.1-jre - 3.5.2 3.6 3.6.1 6.6.0 diff --git a/spring-boot/src/main/java/org/baeldung/model/User.java b/spring-boot/src/main/java/org/baeldung/model/User.java index eb886338a0..049b118b12 100644 --- a/spring-boot/src/main/java/org/baeldung/model/User.java +++ b/spring-boot/src/main/java/org/baeldung/model/User.java @@ -1,4 +1,4 @@ -package org.baeldung.model; +package org.baeldung.caching.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java b/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java index 7335af2616..0113c4c5d4 100644 --- a/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java +++ b/spring-boot/src/main/java/org/baeldung/repository/UserRepository.java @@ -1,6 +1,6 @@ package org.baeldung.repository; -import org.baeldung.model.User; +import org.baeldung.caching.model.User; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; diff --git a/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java index 04bb1170f8..54ce3b4bf3 100644 --- a/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/repository/UserRepositoryIntegrationTest.java @@ -1,7 +1,7 @@ package org.baeldung.repository; import org.baeldung.boot.config.H2JpaConfig; -import org.baeldung.model.User; +import org.baeldung.caching.model.User; import org.junit.After; import org.junit.Test; import org.junit.runner.RunWith; diff --git a/spring-caching/README.md b/spring-caching/README.md new file mode 100644 index 0000000000..14dfe94041 --- /dev/null +++ b/spring-caching/README.md @@ -0,0 +1,4 @@ +### Relevant articles: +- [Introduction To Ehcache](http://www.baeldung.com/ehcache) +- [A Guide To Caching in Spring](http://www.baeldung.com/spring-cache-tutorial) +- [Spring Cache – Creating a Custom KeyGenerator](http://www.baeldung.com/spring-cache-custom-keygenerator) diff --git a/spring-caching/pom.xml b/spring-caching/pom.xml new file mode 100644 index 0000000000..3329cd5f77 --- /dev/null +++ b/spring-caching/pom.xml @@ -0,0 +1,43 @@ + + 4.0.0 + spring-caching + 0.1-SNAPSHOT + spring-caching + war + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework + spring-context + + + org.springframework + spring-web + + + org.springframework + spring-webmvc + + + org.ehcache + ehcache + + + org.springframework + spring-test + test + + + + + 3.5.2 + + \ No newline at end of file diff --git a/spring-all/src/main/java/org/baeldung/caching/config/ApplicationCacheConfig.java b/spring-caching/src/main/java/org/baeldung/caching/config/ApplicationCacheConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/caching/config/ApplicationCacheConfig.java rename to spring-caching/src/main/java/org/baeldung/caching/config/ApplicationCacheConfig.java diff --git a/spring-all/src/main/java/org/baeldung/caching/config/CachingConfig.java b/spring-caching/src/main/java/org/baeldung/caching/config/CachingConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/caching/config/CachingConfig.java rename to spring-caching/src/main/java/org/baeldung/caching/config/CachingConfig.java diff --git a/spring-all/src/main/java/org/baeldung/caching/config/CustomKeyGenerator.java b/spring-caching/src/main/java/org/baeldung/caching/config/CustomKeyGenerator.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/caching/config/CustomKeyGenerator.java rename to spring-caching/src/main/java/org/baeldung/caching/config/CustomKeyGenerator.java diff --git a/spring-all/src/main/java/org/baeldung/caching/eviction/controllers/CachingController.java b/spring-caching/src/main/java/org/baeldung/caching/eviction/controllers/CachingController.java similarity index 96% rename from spring-all/src/main/java/org/baeldung/caching/eviction/controllers/CachingController.java rename to spring-caching/src/main/java/org/baeldung/caching/eviction/controllers/CachingController.java index 675cb7a516..aaaf8a5918 100644 --- a/spring-all/src/main/java/org/baeldung/caching/eviction/controllers/CachingController.java +++ b/spring-caching/src/main/java/org/baeldung/caching/eviction/controllers/CachingController.java @@ -1,18 +1,18 @@ -package org.baeldung.caching.eviction.controllers; - -import org.baeldung.caching.eviction.service.CachingService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class CachingController { - - @Autowired - CachingService cachingService; - - @GetMapping("clearAllCaches") - public void clearAllCaches() { - cachingService.evictAllCaches(); - } -} +package org.baeldung.caching.eviction.controllers; + +import org.baeldung.caching.eviction.service.CachingService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class CachingController { + + @Autowired + CachingService cachingService; + + @GetMapping("clearAllCaches") + public void clearAllCaches() { + cachingService.evictAllCaches(); + } +} diff --git a/spring-all/src/main/java/org/baeldung/caching/eviction/service/CachingService.java b/spring-caching/src/main/java/org/baeldung/caching/eviction/service/CachingService.java similarity index 96% rename from spring-all/src/main/java/org/baeldung/caching/eviction/service/CachingService.java rename to spring-caching/src/main/java/org/baeldung/caching/eviction/service/CachingService.java index 7e37215954..a0dd30c329 100644 --- a/spring-all/src/main/java/org/baeldung/caching/eviction/service/CachingService.java +++ b/spring-caching/src/main/java/org/baeldung/caching/eviction/service/CachingService.java @@ -1,53 +1,53 @@ -package org.baeldung.caching.eviction.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.CacheEvict; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -@Component -public class CachingService { - - @Autowired - CacheManager cacheManager; - - public void putToCache(String cacheName, String key, String value) { - cacheManager.getCache(cacheName).put(key, value); - } - - public String getFromCache(String cacheName, String key) { - String value = null; - if (cacheManager.getCache(cacheName).get(key) != null) { - value = cacheManager.getCache(cacheName).get(key).get().toString(); - } - return value; - } - - @CacheEvict(value = "first", key = "#cacheKey") - public void evictSingleCacheValue(String cacheKey) { - } - - @CacheEvict(value = "first", allEntries = true) - public void evictAllCacheValues() { - } - - public void evictSingleCacheValue(String cacheName, String cacheKey) { - cacheManager.getCache(cacheName).evict(cacheKey); - } - - public void evictAllCacheValues(String cacheName) { - cacheManager.getCache(cacheName).clear(); - } - - public void evictAllCaches() { - cacheManager.getCacheNames() - .parallelStream() - .forEach(cacheName -> cacheManager.getCache(cacheName).clear()); - } - - @Scheduled(fixedRate = 6000) - public void evictAllcachesAtIntervals() { - evictAllCaches(); - } -} +package org.baeldung.caching.eviction.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +public class CachingService { + + @Autowired + CacheManager cacheManager; + + public void putToCache(String cacheName, String key, String value) { + cacheManager.getCache(cacheName).put(key, value); + } + + public String getFromCache(String cacheName, String key) { + String value = null; + if (cacheManager.getCache(cacheName).get(key) != null) { + value = cacheManager.getCache(cacheName).get(key).get().toString(); + } + return value; + } + + @CacheEvict(value = "first", key = "#cacheKey") + public void evictSingleCacheValue(String cacheKey) { + } + + @CacheEvict(value = "first", allEntries = true) + public void evictAllCacheValues() { + } + + public void evictSingleCacheValue(String cacheName, String cacheKey) { + cacheManager.getCache(cacheName).evict(cacheKey); + } + + public void evictAllCacheValues(String cacheName) { + cacheManager.getCache(cacheName).clear(); + } + + public void evictAllCaches() { + cacheManager.getCacheNames() + .parallelStream() + .forEach(cacheName -> cacheManager.getCache(cacheName).clear()); + } + + @Scheduled(fixedRate = 6000) + public void evictAllcachesAtIntervals() { + evictAllCaches(); + } +} diff --git a/spring-all/src/main/java/org/baeldung/caching/example/AbstractService.java b/spring-caching/src/main/java/org/baeldung/caching/example/AbstractService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/caching/example/AbstractService.java rename to spring-caching/src/main/java/org/baeldung/caching/example/AbstractService.java diff --git a/spring-all/src/main/java/org/baeldung/caching/example/BookService.java b/spring-caching/src/main/java/org/baeldung/caching/example/BookService.java similarity index 93% rename from spring-all/src/main/java/org/baeldung/caching/example/BookService.java rename to spring-caching/src/main/java/org/baeldung/caching/example/BookService.java index 26118d61de..9f3aaf89cf 100644 --- a/spring-all/src/main/java/org/baeldung/caching/example/BookService.java +++ b/spring-caching/src/main/java/org/baeldung/caching/example/BookService.java @@ -1,6 +1,6 @@ package org.baeldung.caching.example; -import org.baeldung.model.Book; +import org.baeldung.caching.model.Book; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Component; diff --git a/spring-all/src/main/java/org/baeldung/caching/example/Customer.java b/spring-caching/src/main/java/org/baeldung/caching/example/Customer.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/caching/example/Customer.java rename to spring-caching/src/main/java/org/baeldung/caching/example/Customer.java diff --git a/spring-all/src/main/java/org/baeldung/caching/example/CustomerDataService.java b/spring-caching/src/main/java/org/baeldung/caching/example/CustomerDataService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/caching/example/CustomerDataService.java rename to spring-caching/src/main/java/org/baeldung/caching/example/CustomerDataService.java diff --git a/spring-all/src/main/java/org/baeldung/caching/example/CustomerServiceWithParent.java b/spring-caching/src/main/java/org/baeldung/caching/example/CustomerServiceWithParent.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/caching/example/CustomerServiceWithParent.java rename to spring-caching/src/main/java/org/baeldung/caching/example/CustomerServiceWithParent.java diff --git a/spring-all/src/main/java/org/baeldung/model/Book.java b/spring-caching/src/main/java/org/baeldung/caching/model/Book.java similarity index 94% rename from spring-all/src/main/java/org/baeldung/model/Book.java rename to spring-caching/src/main/java/org/baeldung/caching/model/Book.java index 9305ce9653..c110c79db0 100644 --- a/spring-all/src/main/java/org/baeldung/model/Book.java +++ b/spring-caching/src/main/java/org/baeldung/caching/model/Book.java @@ -1,4 +1,4 @@ -package org.baeldung.model; +package org.baeldung.caching.model; public class Book { diff --git a/spring-all/src/main/java/org/baeldung/ehcache/calculator/SquaredCalculator.java b/spring-caching/src/main/java/org/baeldung/ehcache/calculator/SquaredCalculator.java old mode 100755 new mode 100644 similarity index 100% rename from spring-all/src/main/java/org/baeldung/ehcache/calculator/SquaredCalculator.java rename to spring-caching/src/main/java/org/baeldung/ehcache/calculator/SquaredCalculator.java diff --git a/spring-all/src/main/java/org/baeldung/ehcache/config/CacheHelper.java b/spring-caching/src/main/java/org/baeldung/ehcache/config/CacheHelper.java old mode 100755 new mode 100644 similarity index 100% rename from spring-all/src/main/java/org/baeldung/ehcache/config/CacheHelper.java rename to spring-caching/src/main/java/org/baeldung/ehcache/config/CacheHelper.java diff --git a/spring-all/src/main/resources/config.xml b/spring-caching/src/main/resources/config.xml similarity index 100% rename from spring-all/src/main/resources/config.xml rename to spring-caching/src/main/resources/config.xml diff --git a/spring-all/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java b/spring-caching/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java similarity index 96% rename from spring-all/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java rename to spring-caching/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java index f24cdef917..e00305d4a2 100644 --- a/spring-all/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java +++ b/spring-caching/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java @@ -1,79 +1,79 @@ -package org.baeldung.caching.test; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.junit.Assert.assertThat; - -import java.util.ArrayList; -import java.util.List; - -import org.baeldung.caching.eviction.service.CachingService; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.Cache; -import org.springframework.cache.CacheManager; -import org.springframework.cache.annotation.EnableCaching; -import org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean; -import org.springframework.cache.support.SimpleCacheManager; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration -public class CacheEvictAnnotationIntegrationTest { - - @Configuration - @EnableCaching - static class ContextConfiguration { - - @Bean - public CachingService cachingService() { - return new CachingService(); - } - - @Bean - public CacheManager cacheManager(){ - SimpleCacheManager cacheManager = new SimpleCacheManager(); - List caches = new ArrayList<>(); - caches.add(cacheBean().getObject()); - cacheManager.setCaches(caches ); - return cacheManager; - } - - @Bean - public ConcurrentMapCacheFactoryBean cacheBean(){ - ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); - cacheFactoryBean.setName("first"); - return cacheFactoryBean; - } - } - - @Autowired - CachingService cachingService; - - @Before - public void before() { - cachingService.putToCache("first", "key1", "Baeldung"); - cachingService.putToCache("first", "key2", "Article"); - } - - @Test - public void givenFirstCache_whenSingleCacheValueEvictRequested_thenEmptyCacheValue() { - cachingService.evictSingleCacheValue("key1"); - String key1 = cachingService.getFromCache("first", "key1"); - assertThat(key1, is(nullValue())); - } - - @Test - public void givenFirstCache_whenAllCacheValueEvictRequested_thenEmptyCache() { - cachingService.evictAllCacheValues(); - String key1 = cachingService.getFromCache("first", "key1"); - String key2 = cachingService.getFromCache("first", "key2"); - assertThat(key1, is(nullValue())); - assertThat(key2, is(nullValue())); - } -} +package org.baeldung.caching.test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertThat; + +import java.util.ArrayList; +import java.util.List; + +import org.baeldung.caching.eviction.service.CachingService; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean; +import org.springframework.cache.support.SimpleCacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class CacheEvictAnnotationIntegrationTest { + + @Configuration + @EnableCaching + static class ContextConfiguration { + + @Bean + public CachingService cachingService() { + return new CachingService(); + } + + @Bean + public CacheManager cacheManager(){ + SimpleCacheManager cacheManager = new SimpleCacheManager(); + List caches = new ArrayList<>(); + caches.add(cacheBean().getObject()); + cacheManager.setCaches(caches ); + return cacheManager; + } + + @Bean + public ConcurrentMapCacheFactoryBean cacheBean(){ + ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); + cacheFactoryBean.setName("first"); + return cacheFactoryBean; + } + } + + @Autowired + CachingService cachingService; + + @Before + public void before() { + cachingService.putToCache("first", "key1", "Baeldung"); + cachingService.putToCache("first", "key2", "Article"); + } + + @Test + public void givenFirstCache_whenSingleCacheValueEvictRequested_thenEmptyCacheValue() { + cachingService.evictSingleCacheValue("key1"); + String key1 = cachingService.getFromCache("first", "key1"); + assertThat(key1, is(nullValue())); + } + + @Test + public void givenFirstCache_whenAllCacheValueEvictRequested_thenEmptyCache() { + cachingService.evictAllCacheValues(); + String key1 = cachingService.getFromCache("first", "key1"); + String key2 = cachingService.getFromCache("first", "key2"); + assertThat(key1, is(nullValue())); + assertThat(key2, is(nullValue())); + } +} diff --git a/spring-all/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java b/spring-caching/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java similarity index 97% rename from spring-all/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java rename to spring-caching/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java index 9c6aaea892..4b12ed60b6 100644 --- a/spring-all/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java +++ b/spring-caching/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java @@ -1,96 +1,96 @@ -package org.baeldung.caching.test; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.CoreMatchers.nullValue; -import static org.junit.Assert.assertThat; - -import java.util.ArrayList; -import java.util.List; - -import org.baeldung.caching.eviction.service.CachingService; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cache.Cache; -import org.springframework.cache.CacheManager; -import org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean; -import org.springframework.cache.support.SimpleCacheManager; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration -public class CacheManagerEvictIntegrationTest { - - @Configuration - static class ContextConfiguration { - - @Bean - public CachingService cachingService() { - return new CachingService(); - } - - @Bean - public CacheManager cacheManager(){ - SimpleCacheManager cacheManager = new SimpleCacheManager(); - List caches = new ArrayList<>(); - caches.add(cacheBeanFirst().getObject()); - caches.add(cacheBeanSecond().getObject()); - cacheManager.setCaches(caches ); - return cacheManager; - } - - @Bean - public ConcurrentMapCacheFactoryBean cacheBeanFirst(){ - ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); - cacheFactoryBean.setName("first"); - return cacheFactoryBean; - } - - @Bean - public ConcurrentMapCacheFactoryBean cacheBeanSecond(){ - ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); - cacheFactoryBean.setName("second"); - return cacheFactoryBean; - } - } - - @Autowired - CachingService cachingService; - - @Before - public void before() { - cachingService.putToCache("first", "key1", "Baeldung"); - cachingService.putToCache("first", "key2", "Article"); - cachingService.putToCache("second", "key", "Article"); - } - - @Test - public void givenFirstCache_whenSingleCacheValueEvictRequested_thenEmptyCacheValue() { - cachingService.evictSingleCacheValue("first", "key1"); - String key1 = cachingService.getFromCache("first", "key1"); - assertThat(key1, is(nullValue())); - } - - @Test - public void givenFirstCache_whenAllCacheValueEvictRequested_thenEmptyCache() { - cachingService.evictAllCacheValues("first"); - String key1 = cachingService.getFromCache("first", "key1"); - String key2 = cachingService.getFromCache("first", "key2"); - assertThat(key1, is(nullValue())); - assertThat(key2, is(nullValue())); - } - - @Test - public void givenAllCaches_whenAllCacheEvictRequested_thenEmptyAllCaches() { - cachingService.evictAllCaches(); - String key1 = cachingService.getFromCache("first", "key1"); - assertThat(key1, is(nullValue())); - - String key = cachingService.getFromCache("second", "key"); - assertThat(key, is(nullValue())); - } -} +package org.baeldung.caching.test; + +import static org.hamcrest.CoreMatchers.is; +import static org.hamcrest.CoreMatchers.nullValue; +import static org.junit.Assert.assertThat; + +import java.util.ArrayList; +import java.util.List; + +import org.baeldung.caching.eviction.service.CachingService; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.Cache; +import org.springframework.cache.CacheManager; +import org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean; +import org.springframework.cache.support.SimpleCacheManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration +public class CacheManagerEvictIntegrationTest { + + @Configuration + static class ContextConfiguration { + + @Bean + public CachingService cachingService() { + return new CachingService(); + } + + @Bean + public CacheManager cacheManager(){ + SimpleCacheManager cacheManager = new SimpleCacheManager(); + List caches = new ArrayList<>(); + caches.add(cacheBeanFirst().getObject()); + caches.add(cacheBeanSecond().getObject()); + cacheManager.setCaches(caches ); + return cacheManager; + } + + @Bean + public ConcurrentMapCacheFactoryBean cacheBeanFirst(){ + ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); + cacheFactoryBean.setName("first"); + return cacheFactoryBean; + } + + @Bean + public ConcurrentMapCacheFactoryBean cacheBeanSecond(){ + ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); + cacheFactoryBean.setName("second"); + return cacheFactoryBean; + } + } + + @Autowired + CachingService cachingService; + + @Before + public void before() { + cachingService.putToCache("first", "key1", "Baeldung"); + cachingService.putToCache("first", "key2", "Article"); + cachingService.putToCache("second", "key", "Article"); + } + + @Test + public void givenFirstCache_whenSingleCacheValueEvictRequested_thenEmptyCacheValue() { + cachingService.evictSingleCacheValue("first", "key1"); + String key1 = cachingService.getFromCache("first", "key1"); + assertThat(key1, is(nullValue())); + } + + @Test + public void givenFirstCache_whenAllCacheValueEvictRequested_thenEmptyCache() { + cachingService.evictAllCacheValues("first"); + String key1 = cachingService.getFromCache("first", "key1"); + String key2 = cachingService.getFromCache("first", "key2"); + assertThat(key1, is(nullValue())); + assertThat(key2, is(nullValue())); + } + + @Test + public void givenAllCaches_whenAllCacheEvictRequested_thenEmptyAllCaches() { + cachingService.evictAllCaches(); + String key1 = cachingService.getFromCache("first", "key1"); + assertThat(key1, is(nullValue())); + + String key = cachingService.getFromCache("second", "key"); + assertThat(key, is(nullValue())); + } +} diff --git a/spring-all/src/test/java/org/baeldung/caching/test/SpringCachingIntegrationTest.java b/spring-caching/src/test/java/org/baeldung/caching/test/SpringCachingIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/caching/test/SpringCachingIntegrationTest.java rename to spring-caching/src/test/java/org/baeldung/caching/test/SpringCachingIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/ehcache/SquareCalculatorUnitTest.java b/spring-caching/src/test/java/org/baeldung/ehcache/SquareCalculatorUnitTest.java similarity index 97% rename from spring-all/src/test/java/org/baeldung/ehcache/SquareCalculatorUnitTest.java rename to spring-caching/src/test/java/org/baeldung/ehcache/SquareCalculatorUnitTest.java index 96265c11f5..0e6ac6fd8e 100644 --- a/spring-all/src/test/java/org/baeldung/ehcache/SquareCalculatorUnitTest.java +++ b/spring-caching/src/test/java/org/baeldung/ehcache/SquareCalculatorUnitTest.java @@ -1,40 +1,40 @@ -package org.baeldung.ehcache; - -import org.baeldung.ehcache.calculator.SquaredCalculator; -import org.baeldung.ehcache.config.CacheHelper; -import org.junit.Before; -import org.junit.Test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class SquareCalculatorUnitTest { - private SquaredCalculator squaredCalculator = new SquaredCalculator(); - private CacheHelper cacheHelper = new CacheHelper(); - - @Before - public void setup() { - squaredCalculator.setCache(cacheHelper); - } - - @Test - public void whenCalculatingSquareValueOnce_thenCacheDontHaveValues() { - for (int i = 10; i < 15; i++) { - assertFalse(cacheHelper.getSquareNumberCache().containsKey(i)); - System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); - } - } - - @Test - public void whenCalculatingSquareValueAgain_thenCacheHasAllValues() { - for (int i = 10; i < 15; i++) { - assertFalse(cacheHelper.getSquareNumberCache().containsKey(i)); - System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); - } - - for (int i = 10; i < 15; i++) { - assertTrue(cacheHelper.getSquareNumberCache().containsKey(i)); - System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); - } - } -} +package org.baeldung.ehcache; + +import org.baeldung.ehcache.calculator.SquaredCalculator; +import org.baeldung.ehcache.config.CacheHelper; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class SquareCalculatorUnitTest { + private SquaredCalculator squaredCalculator = new SquaredCalculator(); + private CacheHelper cacheHelper = new CacheHelper(); + + @Before + public void setup() { + squaredCalculator.setCache(cacheHelper); + } + + @Test + public void whenCalculatingSquareValueOnce_thenCacheDontHaveValues() { + for (int i = 10; i < 15; i++) { + assertFalse(cacheHelper.getSquareNumberCache().containsKey(i)); + System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); + } + } + + @Test + public void whenCalculatingSquareValueAgain_thenCacheHasAllValues() { + for (int i = 10; i < 15; i++) { + assertFalse(cacheHelper.getSquareNumberCache().containsKey(i)); + System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); + } + + for (int i = 10; i < 15; i++) { + assertTrue(cacheHelper.getSquareNumberCache().containsKey(i)); + System.out.println("Square value of " + i + " is: " + squaredCalculator.getSquareValueOfNumber(i) + "\n"); + } + } +} From a3d7b77c13b170acb53915a53f023778083c35a3 Mon Sep 17 00:00:00 2001 From: Devender Kumar <47500074+kumar-devender@users.noreply.github.com> Date: Sat, 31 Aug 2019 18:08:07 +0200 Subject: [PATCH 075/396] Fix type in method name (#7687) * Added cascading type mudule * fix compile error * updated dependency version in pom * Added BigDecimal validation classes * Updated test cases * Remove syso from test cases * Updated test cases * Added validation group code * Added validation group code * Added validation group code * fix method name --- .../validationgroup/RegistrationForm.java | 20 +++++++++---------- .../RegistrationFormUnitTest.java | 6 +++--- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java index 57c06648a7..154d9821b6 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java @@ -4,24 +4,24 @@ import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; public class RegistrationForm { - @NotBlank(groups=BasicInfo.class) + @NotBlank(groups = BasicInfo.class) private String firstName; - @NotBlank(groups=BasicInfo.class) + @NotBlank(groups = BasicInfo.class) private String lastName; - @Email(groups=BasicInfo.class) + @Email(groups = BasicInfo.class) private String email; - @NotBlank(groups=BasicInfo.class) + @NotBlank(groups = BasicInfo.class) private String phone; - - @NotBlank(groups=AdvanceInfo.class) + + @NotBlank(groups = AdvanceInfo.class) private String street; - @NotBlank(groups=AdvanceInfo.class) + @NotBlank(groups = AdvanceInfo.class) private String houseNumber; - @NotBlank(groups=AdvanceInfo.class) + @NotBlank(groups = AdvanceInfo.class) private String zipCode; - @NotBlank(groups=AdvanceInfo.class) + @NotBlank(groups = AdvanceInfo.class) private String city; - @NotBlank(groups=AdvanceInfo.class) + @NotBlank(groups = AdvanceInfo.class) private String contry; public String getStreet() { diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java index 91792a0c7e..f8944524f3 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java @@ -61,10 +61,10 @@ public class RegistrationFormUnitTest { private RegistrationForm buildRegistrationFormWithAdvanceInfo() { RegistrationForm form = new RegistrationForm(); - return popultaeAdvanceInfo(form); + return populateAdvanceInfo(form); } - private RegistrationForm popultaeAdvanceInfo(RegistrationForm form) { + private RegistrationForm populateAdvanceInfo(RegistrationForm form) { form.setCity("Berlin"); form.setContry("DE"); form.setStreet("alexa str."); @@ -75,6 +75,6 @@ public class RegistrationFormUnitTest { private RegistrationForm buildRegistrationFormWithBasicAndAdvanceInfo() { RegistrationForm form = buildRegistrationFormWithBasicInfo(); - return popultaeAdvanceInfo(form); + return populateAdvanceInfo(form); } } From f7957e2fa8d22ee15772465fe1aa5ec527b7938d Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 31 Aug 2019 22:49:12 +0530 Subject: [PATCH 076/396] [BAEL-16767] - Fix the integrations tests in spring-boot-ops --- spring-boot-ops/pom.xml | 11 ++++++-- .../baeldung/properties/ConfProperties.java | 6 ++--- .../main/resources/external/conf.properties | 6 ++--- .../RestartApplicationIntegrationTest.java | 25 +++++++++++-------- 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/spring-boot-ops/pom.xml b/spring-boot-ops/pom.xml index f36434b682..f578a24163 100644 --- a/spring-boot-ops/pom.xml +++ b/spring-boot-ops/pom.xml @@ -85,11 +85,17 @@ ${jquery.version} - + org.springframework.cloud spring-cloud-context ${springcloud.version} + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + @@ -190,7 +196,8 @@ 2.2 18.0 3.1.7 - 2.0.2.RELEASE + 2.0.2.RELEASE + 4.5.8 diff --git a/spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java b/spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java index 0b6041bb06..c6413324f3 100644 --- a/spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java +++ b/spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java @@ -6,13 +6,13 @@ import org.springframework.stereotype.Component; @Component public class ConfProperties { - @Value("${url}") + @Value("${db.url}") private String url; - @Value("${username}") + @Value("${db.username}") private String username; - @Value("${password}") + @Value("${db.password}") private String password; public String getUrl() { diff --git a/spring-boot-ops/src/main/resources/external/conf.properties b/spring-boot-ops/src/main/resources/external/conf.properties index cfcd23dc76..944b31cc5c 100644 --- a/spring-boot-ops/src/main/resources/external/conf.properties +++ b/spring-boot-ops/src/main/resources/external/conf.properties @@ -1,4 +1,4 @@ -url=jdbc:postgresql://localhost:5432/ -username=admin -password=root +db.url=jdbc:postgresql://localhost:5432/ +db.username=admin +db.password=root spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java index 14e80c3ac7..48c876de87 100644 --- a/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java +++ b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java @@ -2,25 +2,24 @@ package com.baeldung.restart; import static org.junit.Assert.assertEquals; -import org.junit.After; -import org.junit.Before; +import java.io.IOException; +import java.net.ServerSocket; + import org.junit.Test; import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; -import java.time.Duration; - public class RestartApplicationIntegrationTest { private TestRestTemplate restTemplate = new TestRestTemplate(); @Test public void givenBootApp_whenRestart_thenOk() throws Exception { - Application.main(new String[0]); + Integer port = findRandomOpenPortOnAllLocalInterfaces(); + Application.main(new String[] { String.format("--server.port=%d", port) }); - ResponseEntity response = restTemplate.exchange("http://localhost:8080/restart", + ResponseEntity response = restTemplate.exchange(String.format("http://localhost:%d/restart", port), HttpMethod.POST, null, Object.class); assertEquals(200, response.getStatusCode().value()); @@ -28,12 +27,18 @@ public class RestartApplicationIntegrationTest { @Test public void givenBootApp_whenRestartUsingActuator_thenOk() throws Exception { - Application.main(new String[] { "--server.port=8090" }); + Integer port = findRandomOpenPortOnAllLocalInterfaces(); + Application.main(new String[] { String.format("--server.port=%d", port) }); - ResponseEntity response = restTemplate.exchange("http://localhost:8090/restartApp", + ResponseEntity response = restTemplate.exchange(String.format("http://localhost:%d/restartApp", port), HttpMethod.POST, null, Object.class); assertEquals(200, response.getStatusCode().value()); } - + + private Integer findRandomOpenPortOnAllLocalInterfaces() throws IOException { + try (ServerSocket socket = new ServerSocket(0);) { + return socket.getLocalPort(); + } + } } \ No newline at end of file From 92e1ffd7b83c23d98614093ffdc5f5f113e32f24 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 31 Aug 2019 23:53:31 +0530 Subject: [PATCH 077/396] [BAEL-16635][BAEL-16636] Split or move core-java-modules/core-java-collections-list and core-java-modules/core-java-collections-list-2 --- .../core-java-collections-list-2/README.md | 6 +- .../core-java-collections-list-2/pom.xml | 30 -------- .../core-java-collections-list-3/README.md | 11 +++ .../core-java-collections-list-3/pom.xml | 76 +++++++++++++++++++ .../VerifyAllEqualListElements.java | 0 .../collection/filtering/Employee.java | 0 .../baeldung/java/list/CopyListService.java | 0 .../java/com/baeldung/java/list/Flower.java | 0 .../list/primitive/PrimitiveCollections.java | 0 .../primitive/PrimitivesListPerformance.java | 0 .../src/main/resources/logback.xml | 13 ++++ .../VerifyAllEqualListElementsUnitTest.java | 0 .../baeldung/collection/CollectionsEmpty.java | 0 .../CollectionFilteringUnitTest.java | 0 .../java/list/CopyListServiceUnitTest.java | 0 .../core-java-collections-list/README.md | 2 - pom.xml | 2 + 17 files changed, 103 insertions(+), 37 deletions(-) create mode 100644 core-java-modules/core-java-collections-list-3/README.md create mode 100644 core-java-modules/core-java-collections-list-3/pom.xml rename core-java-modules/{core-java-collections-list-2 => core-java-collections-list-3}/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java (100%) rename core-java-modules/{core-java-collections-list-2 => core-java-collections-list-3}/src/main/java/com/baeldung/collection/filtering/Employee.java (100%) rename core-java-modules/{core-java-collections-list => core-java-collections-list-3}/src/main/java/com/baeldung/java/list/CopyListService.java (100%) rename core-java-modules/{core-java-collections-list => core-java-collections-list-3}/src/main/java/com/baeldung/java/list/Flower.java (100%) rename core-java-modules/{core-java-collections-list-2 => core-java-collections-list-3}/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java (100%) rename core-java-modules/{core-java-collections-list-2 => core-java-collections-list-3}/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java (100%) create mode 100644 core-java-modules/core-java-collections-list-3/src/main/resources/logback.xml rename core-java-modules/{core-java-collections-list-2 => core-java-collections-list-3}/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java (100%) rename core-java-modules/{core-java-collections-list => core-java-collections-list-3}/src/test/java/com/baeldung/collection/CollectionsEmpty.java (100%) rename core-java-modules/{core-java-collections-list-2 => core-java-collections-list-3}/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java (100%) rename core-java-modules/{core-java-collections-list => core-java-collections-list-3}/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java (100%) diff --git a/core-java-modules/core-java-collections-list-2/README.md b/core-java-modules/core-java-collections-list-2/README.md index be10a0210c..6192442edd 100644 --- a/core-java-modules/core-java-collections-list-2/README.md +++ b/core-java-modules/core-java-collections-list-2/README.md @@ -10,8 +10,4 @@ - [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) - [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list) - [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) -- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection) -- [Determine If All Elements Are the Same in a Java List](https://www.baeldung.com/java-list-all-equal) -- [List of Primitive Integer Values in Java](https://www.baeldung.com/java-list-primitive-int) -- [Performance Comparison of Primitive Lists in Java](https://www.baeldung.com/java-list-primitive-performance) -- [Filtering a Java Collection by a List](https://www.baeldung.com/java-filter-collection-by-list) \ No newline at end of file +- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection) \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-2/pom.xml b/core-java-modules/core-java-collections-list-2/pom.xml index d200a3c90c..727de0818a 100644 --- a/core-java-modules/core-java-collections-list-2/pom.xml +++ b/core-java-modules/core-java-collections-list-2/pom.xml @@ -36,41 +36,11 @@ ${lombok.version} provided - - - net.sf.trove4j - trove4j - ${trove4j.version} - - - it.unimi.dsi - fastutil - ${fastutil.version} - - - colt - colt - ${colt.version} - - - - org.openjdk.jmh - jmh-core - ${jmh-core.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh-core.version} - 4.1 3.8.1 3.11.1 - 3.0.2 - 8.1.0 - 1.2.0 diff --git a/core-java-modules/core-java-collections-list-3/README.md b/core-java-modules/core-java-collections-list-3/README.md new file mode 100644 index 0000000000..267996044c --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/README.md @@ -0,0 +1,11 @@ +========= + +## Core Java Collections List Cookbooks and Examples + +### Relevant Articles: +- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list) +- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another) +- [Determine If All Elements Are the Same in a Java List](https://www.baeldung.com/java-list-all-equal) +- [List of Primitive Integer Values in Java](https://www.baeldung.com/java-list-primitive-int) +- [Performance Comparison of Primitive Lists in Java](https://www.baeldung.com/java-list-primitive-performance) +- [Filtering a Java Collection by a List](https://www.baeldung.com/java-filter-collection-by-list) diff --git a/core-java-modules/core-java-collections-list-3/pom.xml b/core-java-modules/core-java-collections-list-3/pom.xml new file mode 100644 index 0000000000..064b65d19e --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/pom.xml @@ -0,0 +1,76 @@ + + 4.0.0 + core-java-collections-list-3 + 0.1.0-SNAPSHOT + core-java-collections-list-3 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + net.sf.trove4j + trove4j + ${trove4j.version} + + + it.unimi.dsi + fastutil + ${fastutil.version} + + + colt + colt + ${colt.version} + + + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-core.version} + + + + + 4.1 + 3.8.1 + 3.11.1 + 3.0.2 + 8.1.0 + 1.2.0 + + diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java similarity index 100% rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/allequalelements/VerifyAllEqualListElements.java diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/collection/filtering/Employee.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/collection/filtering/Employee.java similarity index 100% rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/collection/filtering/Employee.java rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/collection/filtering/Employee.java diff --git a/core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/CopyListService.java similarity index 100% rename from core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/CopyListService.java diff --git a/core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/Flower.java similarity index 100% rename from core-java-modules/core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/java/list/Flower.java diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java similarity index 100% rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitiveCollections.java diff --git a/core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java b/core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java similarity index 100% rename from core-java-modules/core-java-collections-list-2/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java rename to core-java-modules/core-java-collections-list-3/src/main/java/com/baeldung/list/primitive/PrimitivesListPerformance.java diff --git a/core-java-modules/core-java-collections-list-3/src/main/resources/logback.xml b/core-java-modules/core-java-collections-list-3/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-collections-list-3/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java similarity index 100% rename from core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/allequalelements/VerifyAllEqualListElementsUnitTest.java diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/CollectionsEmpty.java similarity index 100% rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/CollectionsEmpty.java diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java similarity index 100% rename from core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/collection/filtering/CollectionFilteringUnitTest.java diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java b/core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java similarity index 100% rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java rename to core-java-modules/core-java-collections-list-3/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java diff --git a/core-java-modules/core-java-collections-list/README.md b/core-java-modules/core-java-collections-list/README.md index 4bc1c5fb57..e83fcce5ff 100644 --- a/core-java-modules/core-java-collections-list/README.md +++ b/core-java-modules/core-java-collections-list/README.md @@ -10,7 +10,5 @@ - [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards) - [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list) - [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java) -- [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another) - [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) -- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list) - [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list) \ No newline at end of file diff --git a/pom.xml b/pom.xml index 005d6b6e2c..6107cb612a 100644 --- a/pom.xml +++ b/pom.xml @@ -395,6 +395,7 @@ core-java-modules/core-java-collections core-java-modules/core-java-collections-list core-java-modules/core-java-collections-list-2 + core-java-modules/core-java-collections-list-3 core-java-modules/core-java-collections-array-list core-java-modules/core-java-collections-set core-java-modules/core-java-concurrency-basic @@ -1117,6 +1118,7 @@ core-java-modules/core-java-collections core-java-modules/core-java-collections-list core-java-modules/core-java-collections-list-2 + core-java-modules/core-java-collections-list-3 core-java-modules/core-java-collections-array-list core-java-modules/core-java-collections-set core-java-modules/core-java-concurrency-basic From ac96aca6f8bda01184b5e9ce4344926c0c55c844 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 1 Sep 2019 00:58:28 +0530 Subject: [PATCH 078/396] =?UTF-8?q?BAEL-17342=20Slice=209=20|=20The=20top?= =?UTF-8?q?=20100=20articles=20should=20have=20their=20own=20packa?= =?UTF-8?q?=E2=80=A6=20(#7671)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BAEL-17342 Slice 9 | The top 100 articles should have their own package in the module * BAEL-17342 Slice 9 | The top 100 articles should have their own package in the module -Updated for junit-assert-exception --- .../baeldung/string/{ => newline}/AddingNewLineToString.java | 2 +- .../SpringResourceIntegrationTest.java | 2 +- .../ExceptionAssertionUnitTest.java | 2 +- .../migration/junit4/ExceptionAssertionUnitTest.java | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename java-strings/src/main/java/com/baeldung/string/{ => newline}/AddingNewLineToString.java (98%) rename spring-core/src/test/java/com/baeldung/{resource => classpathfileaccess}/SpringResourceIntegrationTest.java (99%) rename testing-modules/junit-5-basics/src/test/java/com/baeldung/{exception => assertexception}/ExceptionAssertionUnitTest.java (93%) rename testing-modules/junit-5-basics/src/test/java/com/baeldung/{ => assertexception}/migration/junit4/ExceptionAssertionUnitTest.java (91%) diff --git a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java b/java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java similarity index 98% rename from java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java rename to java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java index b522f7337b..48b71eed12 100644 --- a/java-strings/src/main/java/com/baeldung/string/AddingNewLineToString.java +++ b/java-strings/src/main/java/com/baeldung/string/newline/AddingNewLineToString.java @@ -1,4 +1,4 @@ -package com.baeldung.string; +package com.baeldung.string.newline; public class AddingNewLineToString { diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/classpathfileaccess/SpringResourceIntegrationTest.java similarity index 99% rename from spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java rename to spring-core/src/test/java/com/baeldung/classpathfileaccess/SpringResourceIntegrationTest.java index c7a2984045..b57a64a8c6 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/classpathfileaccess/SpringResourceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.resource; +package com.baeldung.classpathfileaccess; import static org.junit.Assert.assertEquals; diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java similarity index 93% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java index 002aae34a8..1b1c70d824 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/ExceptionAssertionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.exception; +package com.baeldung.assertexception; import static org.junit.jupiter.api.Assertions.assertThrows; diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/migration/junit4/ExceptionAssertionUnitTest.java similarity index 91% rename from testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/migration/junit4/ExceptionAssertionUnitTest.java index afe4af8c4a..62736b0800 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/assertexception/migration/junit4/ExceptionAssertionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.migration.junit4; +package com.baeldung.assertexception.migration.junit4; import org.junit.Rule; import org.junit.Test; From f5dcc8e57be6e135057151ef8db5b10fcbb9fe9c Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 1 Sep 2019 00:59:13 +0530 Subject: [PATCH 079/396] BAEL-17345 Slice 10 | The top 100 articles should have their own package in the module (#7675) --- .../baeldung/{ => javaxval/beanvalidation}/User.java | 2 +- .../beanvalidation}/ValidationIntegrationTest.java | 10 ++++------ .../{spring => security/config}/SecSecurityConfig.java | 2 +- .../java/com/baeldung/security/FormLoginUnitTest.java | 2 +- 4 files changed, 7 insertions(+), 9 deletions(-) rename javaxval/src/main/java/org/baeldung/{ => javaxval/beanvalidation}/User.java (97%) rename javaxval/src/test/java/org/baeldung/{ => javaxval/beanvalidation}/ValidationIntegrationTest.java (97%) rename spring-security-mvc-login/src/main/java/com/baeldung/{spring => security/config}/SecSecurityConfig.java (98%) diff --git a/javaxval/src/main/java/org/baeldung/User.java b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java similarity index 97% rename from javaxval/src/main/java/org/baeldung/User.java rename to javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java index e2f2732399..cf80266c9d 100644 --- a/javaxval/src/main/java/org/baeldung/User.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java @@ -1,4 +1,4 @@ -package org.baeldung; +package org.baeldung.javaxval.beanvalidation; import java.time.LocalDate; import java.util.List; diff --git a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java similarity index 97% rename from javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java rename to javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java index 78745a1af2..6639d60ac6 100644 --- a/javaxval/src/test/java/org/baeldung/ValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java @@ -1,20 +1,18 @@ -package org.baeldung; +package org.baeldung.javaxval.beanvalidation; + +import static org.junit.Assert.assertEquals; import java.time.LocalDate; import java.util.Collections; -import java.util.Iterator; import java.util.Set; -import java.util.Optional; - import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; -import static org.junit.Assert.*; -import org.junit.Test; import org.junit.Before; +import org.junit.Test; public class ValidationIntegrationTest { diff --git a/spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/spring-security-mvc-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java similarity index 98% rename from spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java rename to spring-security-mvc-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java index 08a83f8633..15fa06aa3e 100644 --- a/spring-security-mvc-login/src/main/java/com/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-mvc-login/src/main/java/com/baeldung/security/config/SecSecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring; +package com.baeldung.security.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java b/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java index b7d959bf36..01cb8e7b67 100644 --- a/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java +++ b/spring-security-mvc-login/src/test/java/com/baeldung/security/FormLoginUnitTest.java @@ -12,7 +12,7 @@ import org.springframework.test.web.servlet.MvcResult; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; -import com.baeldung.spring.SecSecurityConfig; +import com.baeldung.security.config.SecSecurityConfig; import javax.servlet.Filter; From 51bd347f6a1a0a627417645e8710c0370094534f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 1 Sep 2019 01:00:33 +0530 Subject: [PATCH 080/396] BAEL-16980 Slice 7 | The top 100 articles should have their own package in the module (#7663) --- .../executorservice}/Java8ExecutorServiceIntegrationTest.java | 2 +- .../DateToLocalDateConverter.java | 2 +- .../DateToLocalDateTimeConverter.java | 2 +- .../LocalDateTimeToDateConverter.java | 2 +- .../LocalDateToDateConverter.java | 2 +- .../DateToLocalDateConverterUnitTest.java | 4 ++-- .../DateToLocalDateTimeConverterUnitTest.java | 4 ++-- .../LocalDateTimeToDateConverterUnitTest.java | 4 +++- .../LocalDateToDateConverterUnitTest.java | 4 +++- .../mockito/src/test/java/org/baeldung/mockito/FinalList.java | 2 ++ .../src/test/java/org/baeldung/mockito/MockFinals.java | 2 ++ .../mockito/MockitoConfigExamplesIntegrationTest.java | 2 ++ .../java/org/baeldung/mockito/MockitoMockIntegrationTest.java | 3 +++ .../mockito/MockitoVerifyExamplesIntegrationTest.java | 2 ++ .../mockito/{ => voidmethods}/MockitoVoidMethodsUnitTest.java | 2 +- .../java/org/baeldung/mockito/{ => voidmethods}/MyList.java | 4 ++-- 16 files changed, 29 insertions(+), 14 deletions(-) rename core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/{java8 => concurrent/executorservice}/Java8ExecutorServiceIntegrationTest.java (99%) rename java-dates/src/main/java/com/baeldung/{java9/datetime => datetolocaldate}/DateToLocalDateConverter.java (96%) rename java-dates/src/main/java/com/baeldung/{java9/datetime => datetolocaldate}/DateToLocalDateTimeConverter.java (96%) rename java-dates/src/main/java/com/baeldung/{java9/datetime => datetolocaldate}/LocalDateTimeToDateConverter.java (94%) rename java-dates/src/main/java/com/baeldung/{java9/datetime => datetolocaldate}/LocalDateToDateConverter.java (94%) rename java-dates/src/test/java/com/baeldung/{java9/datetime => datetolocaldate}/DateToLocalDateConverterUnitTest.java (96%) rename java-dates/src/test/java/com/baeldung/{java9/datetime => datetolocaldate}/DateToLocalDateTimeConverterUnitTest.java (97%) rename java-dates/src/test/java/com/baeldung/{java9/datetime => datetolocaldate}/LocalDateTimeToDateConverterUnitTest.java (94%) rename java-dates/src/test/java/com/baeldung/{java9/datetime => datetolocaldate}/LocalDateToDateConverterUnitTest.java (93%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{ => voidmethods}/MockitoVoidMethodsUnitTest.java (98%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{ => voidmethods}/MyList.java (78%) diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java similarity index 99% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java index a1f5b6f1e2..998152c452 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/Java8ExecutorServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.concurrent.executorservice; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java similarity index 96% rename from java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java rename to java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java index c794c57e87..80bccb399a 100644 --- a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateConverter.java +++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import java.time.Instant; import java.time.LocalDate; diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java similarity index 96% rename from java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java rename to java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java index 17ca5b1122..1d1e3b7d92 100644 --- a/java-dates/src/main/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverter.java +++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import java.time.Instant; import java.time.LocalDateTime; diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java similarity index 94% rename from java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java rename to java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java index f219dcf038..9a6bb248fa 100644 --- a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverter.java +++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import java.time.LocalDateTime; import java.time.ZoneId; diff --git a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java similarity index 94% rename from java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java rename to java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java index f9893da5d0..f679ffb77a 100644 --- a/java-dates/src/main/java/com/baeldung/java9/datetime/LocalDateToDateConverter.java +++ b/java-dates/src/main/java/com/baeldung/datetolocaldate/LocalDateToDateConverter.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import java.time.LocalDate; import java.time.ZoneId; diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java similarity index 96% rename from java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java rename to java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java index f7f07500f1..b5a54e28eb 100644 --- a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateConverterUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateConverterUnitTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import static org.junit.Assert.assertEquals; @@ -12,7 +12,7 @@ import java.util.Date; import org.junit.Test; -import com.baeldung.java9.datetime.DateToLocalDateConverter; +import com.baeldung.datetolocaldate.DateToLocalDateConverter; /** * JUnits for {@link DateToLocalDateConverter} class. diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java similarity index 97% rename from java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java rename to java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java index 9ad29ea673..e6098cec1c 100644 --- a/java-dates/src/test/java/com/baeldung/java9/datetime/DateToLocalDateTimeConverterUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/DateToLocalDateTimeConverterUnitTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import static org.junit.Assert.assertEquals; @@ -12,7 +12,7 @@ import java.util.Date; import org.junit.Test; -import com.baeldung.java9.datetime.DateToLocalDateTimeConverter; +import com.baeldung.datetolocaldate.DateToLocalDateTimeConverter; /** * JUnits for {@link DateToLocalDateTimeConverter} class. diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java similarity index 94% rename from java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java rename to java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java index e5a541c546..c8e596c220 100644 --- a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateTimeToDateConverterUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateTimeToDateConverterUnitTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import static org.junit.Assert.assertEquals; @@ -11,6 +11,8 @@ import java.util.Date; import org.junit.Test; +import com.baeldung.datetolocaldate.LocalDateTimeToDateConverter; + /** * * JUnits for {@link LocalDateTimeToDateConverter} class. diff --git a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java similarity index 93% rename from java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java rename to java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java index 4e4dd20f2f..4ff3682158 100644 --- a/java-dates/src/test/java/com/baeldung/java9/datetime/LocalDateToDateConverterUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/datetolocaldate/LocalDateToDateConverterUnitTest.java @@ -1,7 +1,7 @@ /** * */ -package com.baeldung.java9.datetime; +package com.baeldung.datetolocaldate; import static org.junit.Assert.assertEquals; @@ -11,6 +11,8 @@ import java.util.Date; import org.junit.Test; +import com.baeldung.datetolocaldate.LocalDateToDateConverter; + /** * * JUnits for {@link LocalDateToDateConverter} class. diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java index c41021f7b6..e01f189f0b 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java @@ -1,5 +1,7 @@ package org.baeldung.mockito; +import org.baeldung.mockito.voidmethods.MyList; + public final class FinalList extends MyList { @Override diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java index 5f064e1355..caa456c891 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java @@ -6,6 +6,8 @@ import static org.junit.Assert.assertNotEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import org.baeldung.mockito.voidmethods.MyList; + public class MockFinals { @Test diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java index 5da86dfb9a..096bbe1ed7 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java @@ -11,6 +11,8 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; +import org.baeldung.mockito.voidmethods.MyList; + public class MockitoConfigExamplesIntegrationTest { // tests diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java index 6ec3b34db5..de26642ede 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java @@ -1,6 +1,9 @@ package org.baeldung.mockito; import static org.mockito.Mockito.*; + +import org.baeldung.mockito.voidmethods.MyList; + import static org.junit.Assert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.containsString; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java index 418e9693b8..9c71b1fc4f 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java @@ -1,6 +1,8 @@ package org.baeldung.mockito; import com.google.common.collect.Lists; + +import org.baeldung.mockito.voidmethods.MyList; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InOrder; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java index b020338fd9..0393490f9a 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package org.baeldung.mockito.voidmethods; import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MyList.java similarity index 78% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MyList.java index 4fcddb3164..f28c9b732f 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MyList.java @@ -1,8 +1,8 @@ -package org.baeldung.mockito; +package org.baeldung.mockito.voidmethods; import java.util.AbstractList; -class MyList extends AbstractList { +public class MyList extends AbstractList { @Override public String get(final int index) { From 9c90f9b9618df34f59c53a5096268b8d3f0c099d Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 31 Aug 2019 17:32:49 -0500 Subject: [PATCH 081/396] BAEL-2989 add link in README file (#7693) * BAEL-2246: add link back to article * BAEL-2174: rename core-java-net module to core-java-networking * BAEL-2174: add link back to article * BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 add links back to articles * BAEL-2367: add link back to article * BAEL-2335: add link back to article * BAEL-2413: add link back to article * Update README.MD * BAEL-2577: add link back to article * BAEL-2490: add link back to article * BAEL-2471: add link back to article * BAEL-2583: add link back to article * BAEL-2738: add link back to article * BAEL-2711: Add spring-boot-angular module to root pom * BAEL-2544 BAEL-2711 BAEL-2575 BAEL-2657 Add links back to articles * BAEL-2736: Add link back to article * BAEL-2789: Add link back to article * BAEL-2489: add link back to article * BAEL-2840: add link back to article * BAEL-2655: add link back to article * BAEL-2884: add link back to article * BAEL-2985: Fix Spring Boot Apps in spring-data-rest module * BAEL-2898 BAEL-3057 BAEL-3020 add links back to articles * BAEL-3126 BAEL-2463 README * BAEL-2989: add README --- bazel/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 bazel/README.md diff --git a/bazel/README.md b/bazel/README.md new file mode 100644 index 0000000000..d1f8f1af5b --- /dev/null +++ b/bazel/README.md @@ -0,0 +1,3 @@ +## Relevant Articles: + +- [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool) From 69bdf2b5fcfa1423585354c1be2486d86f2747b5 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:46:43 +0300 Subject: [PATCH 082/396] BAEL-3190 - Working with web services in Groovy --- core-groovy-2/pom.xml | 5 + .../webservice/WebserviceUnitTest.groovy | 148 ++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index ba3fd0802b..85f6106e95 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -48,6 +48,11 @@ ${spock-core.version} test + + com.github.groovy-wslite + groovy-wslite + 1.1.3 + diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy new file mode 100644 index 0000000000..edf2dca33f --- /dev/null +++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy @@ -0,0 +1,148 @@ +package com.baeldung.webservice + +import groovy.json.JsonSlurper +import wslite.rest.ContentType +import wslite.rest.RESTClient +import wslite.rest.RESTClientException +import wslite.soap.SOAPClient +import wslite.soap.SOAPMessageBuilder + +class WebserviceUnitTest extends GroovyTestCase { + + JsonSlurper jsonSlurper = new JsonSlurper() + + static RESTClient client = new RESTClient("https://postman-echo.com") + + static { + client.defaultAcceptHeader = ContentType.JSON + client.httpClient.sslTrustAllCerts = true + } + + void testHttpGetRequest() { + def postmanGet = new URL('https://postman-echo.com/get') + def getConnection = postmanGet.openConnection() + getConnection.requestMethod = 'GET' + assert getConnection.responseCode == 200 + if (getConnection.responseCode == 200) { + assert jsonSlurper.parseText(getConnection.content.text)?.headers?.host == "postman-echo.com" + } + } + + void testHttpPostRequest() { + def postmanPost = new URL('https://postman-echo.com/post') + def query = "q=This is post request form parameter." + def postConnection = postmanPost.openConnection() + postConnection.requestMethod = 'POST' + assert postConnection.responseCode == 200 + } + + void testHttpPostRequestWithParams() { + def postmanPost = new URL('https://postman-echo.com/post') + def form = "param1=This is request parameter." + def postConnection = postmanPost.openConnection() + postConnection.requestMethod = 'POST' + postConnection.doOutput = true + def text + postConnection.with { + outputStream.withWriter { outputStreamWriter -> + outputStreamWriter << form + } + text = content.text + } + assert postConnection.responseCode == 200 + assert jsonSlurper.parseText(text)?.json.param1 == "This is request parameter." + } + + void testRssFeed() { + def rssFeed = new XmlParser().parse("https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en") + def stories = [] + (0..4).each { + def item = rssFeed.channel.item.get(it) + stories << item.title.text() + } + assert stories.size() == 5 + } + + void testAtomFeed() { + def atomFeed = new XmlParser().parse("https://news.google.com/atom?hl=en-US&gl=US&ceid=US:en") + def stories = [] + (0..4).each { + def entry = atomFeed.entry.get(it) + stories << entry.title.text() + } + assert stories.size() == 5 + } + + void testSoapClient() { + def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso" + def soapClient = new SOAPClient(url) + def message = new SOAPMessageBuilder().build({ + body { + NumberToWords(xmlns: "http://www.dataaccess.com/webservicesserver/") { + ubiNum(1234) + } + } + }) + def response = soapClient.send(message.toString()); + def words = response.NumberToWordsResponse + assert words == "one thousand two hundred and thirty four " + } + + void testRestClientGet() { + def path = "/get" + def response + try { + response = client.get(path: path) + assert response.statusCode == 200 + assert response.json?.headers?.host == "postman-echo.com" + } catch (RESTClientException e) { + assert e?.response?.statusCode != 200 + } + } + + void testRestClientPost() { + def path = "/post" + def params = ["foo":1,"bar":2] + def response + try { + response = client.post(path: path) { + type ContentType.JSON + json params + } + assert response.json?.data == params + } catch (RESTClientException e) { + e.printStackTrace() + assert e?.response?.statusCode != 200 + } + } + + void testBasicAuthentication() { + def path = "/basic-auth" + def response + try { + response = client.get(path: path, headers: ["Authorization": "Basic cG9zdG1hbjpwYXNzd29yZA=="]) + assert response.statusCode == 200 + assert response.json?.authenticated == true + } catch (RESTClientException e) { + assert e?.response?.statusCode != 200 + } + } + + void testOAuth() { + RESTClient oAuthClient = new RESTClient("https://postman-echo.com") + oAuthClient.defaultAcceptHeader = ContentType.JSON + oAuthClient.httpClient.sslTrustAllCerts = true + + def path = "/oauth1" + def params = [oauth_consumer_key: "RKCGzna7bv9YD57c", oauth_signature_method: "HMAC-SHA1", oauth_timestamp:1567089944, oauth_nonce: "URT7v4", oauth_version: 1.0, oauth_signature: 'RGgR/ktDmclkM0ISWaFzebtlO0A='] + def response + try { + response = oAuthClient.get(path: path, query: params) + assert response.statusCode == 200 + assert response.statusMessage == "OK" + assert response.json.status == "pass" + } catch (RESTClientException e) { + assert e?.response?.statusCode != 200 + } + } +} \ No newline at end of file From f29bb940134706877f4df7e5dc5d404188468383 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:48:07 +0300 Subject: [PATCH 083/396] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 357 +++++++++++++++++++++--------------------- 1 file changed, 179 insertions(+), 178 deletions(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 85f6106e95..6f2f9bd533 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -1,189 +1,190 @@ - - 4.0.0 - core-groovy-2 - 1.0-SNAPSHOT - core-groovy-2 - jar + + 4.0.0 + core-groovy-2 + 1.0-SNAPSHOT + core-groovy-2 + jar - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - org.codehaus.groovy - groovy-all - ${groovy.version} - pom - - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - - - org.hsqldb - hsqldb - ${hsqldb.version} - test - - - org.spockframework - spock-core - ${spock-core.version} - test - - - com.github.groovy-wslite - groovy-wslite - 1.1.3 + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} - + + ch.qos.logback + logback-classic + ${logback.version} + + + org.codehaus.groovy + groovy-all + ${groovy.version} + pom + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + org.hsqldb + hsqldb + ${hsqldb.version} + test + + + org.spockframework + spock-core + ${spock-core.version} + test + + + com.github.groovy-wslite + groovy-wslite + 1.1.3 + + - - src/main/groovy - src/main/java - - - org.codehaus.groovy - groovy-eclipse-compiler - 3.3.0-01 - true - - - maven-compiler-plugin - 3.8.0 - - groovy-eclipse-compiler - ${java.version} - ${java.version} - - - - org.codehaus.groovy - groovy-eclipse-compiler - 3.3.0-01 - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.version}-01 - - - - - maven-failsafe-plugin - ${maven-failsafe-plugin.version} - - - org.junit.platform - junit-platform-surefire-provider - ${junit.platform.version} - - - - - junit5 - - integration-test - verify - - - - **/*Test5.java - - - - - - - maven-surefire-plugin - 2.20.1 - - false - - **/*Test.java - **/*Spec.java - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - - jar-with-dependencies - - - - - com.baeldung.MyJointCompilationApp - - + + src/main/groovy + src/main/java + + + org.codehaus.groovy + groovy-eclipse-compiler + 3.3.0-01 + true + + + maven-compiler-plugin + 3.8.0 + + groovy-eclipse-compiler + ${java.version} + ${java.version} + + + + org.codehaus.groovy + groovy-eclipse-compiler + 3.3.0-01 + + + org.codehaus.groovy + groovy-eclipse-batch + ${groovy.version}-01 + + + + + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + + + + + junit5 + + integration-test + verify + + + + **/*Test5.java + + + + + + + maven-surefire-plugin + 2.20.1 + + false + + **/*Test.java + **/*Spec.java + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + + jar-with-dependencies + + + + + com.baeldung.MyJointCompilationApp + + - - - - make-assembly - - package - - single - - - - - - + + + + make-assembly + + package + + single + + + + + + - - - central - http://jcenter.bintray.com - - + + + central + http://jcenter.bintray.com + + - - - bintray - Groovy Bintray - https://dl.bintray.com/groovy/maven - - - never - - - false - - - + + + bintray + Groovy Bintray + https://dl.bintray.com/groovy/maven + + + never + + + false + + + - - 1.0.0 - 2.4.0 - 1.1-groovy-2.4 - 3.8.1 - 1.2.3 - 2.5.7 - UTF-8 - + + 1.0.0 + 2.4.0 + 1.1-groovy-2.4 + 3.8.1 + 1.2.3 + 2.5.7 + UTF-8 + From 78e2331c4fc6be1a1e577b8cda7543eb4aba0dc5 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:51:19 +0300 Subject: [PATCH 084/396] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 351 +++++++++++++++++++++--------------------- 1 file changed, 175 insertions(+), 176 deletions(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 6f2f9bd533..2ffef7ae94 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -1,190 +1,189 @@ - - 4.0.0 - core-groovy-2 - 1.0-SNAPSHOT - core-groovy-2 - jar + + 4.0.0 + core-groovy-2 + 1.0-SNAPSHOT + core-groovy-2 + jar - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - org.codehaus.groovy - groovy-all - ${groovy.version} - pom - - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - - - org.hsqldb - hsqldb - ${hsqldb.version} - test - - - org.spockframework - spock-core - ${spock-core.version} - test - - + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + ch.qos.logback + logback-classic + ${logback.version} + + + org.codehaus.groovy + groovy-all + ${groovy.version} + pom + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + org.hsqldb + hsqldb + ${hsqldb.version} + test + + + org.spockframework + spock-core + ${spock-core.version} + test + + com.github.groovy-wslite groovy-wslite 1.1.3 - + - - src/main/groovy - src/main/java - - - org.codehaus.groovy - groovy-eclipse-compiler - 3.3.0-01 - true - - - maven-compiler-plugin - 3.8.0 - - groovy-eclipse-compiler - ${java.version} - ${java.version} - - - - org.codehaus.groovy - groovy-eclipse-compiler - 3.3.0-01 - - - org.codehaus.groovy - groovy-eclipse-batch - ${groovy.version}-01 - - - - - maven-failsafe-plugin - ${maven-failsafe-plugin.version} - - - org.junit.platform - junit-platform-surefire-provider - ${junit.platform.version} - - - - - junit5 - - integration-test - verify - - - - **/*Test5.java - - - - - - - maven-surefire-plugin - 2.20.1 - - false - - **/*Test.java - **/*Spec.java - - - - - - org.apache.maven.plugins - maven-assembly-plugin - 3.1.0 - - - - jar-with-dependencies - - - - - com.baeldung.MyJointCompilationApp - - + + src/main/groovy + src/main/java + + + org.codehaus.groovy + groovy-eclipse-compiler + 3.3.0-01 + true + + + maven-compiler-plugin + 3.8.0 + + groovy-eclipse-compiler + ${java.version} + ${java.version} + + + + org.codehaus.groovy + groovy-eclipse-compiler + 3.3.0-01 + + + org.codehaus.groovy + groovy-eclipse-batch + ${groovy.version}-01 + + + + + maven-failsafe-plugin + ${maven-failsafe-plugin.version} + + + org.junit.platform + junit-platform-surefire-provider + ${junit.platform.version} + + + + + junit5 + + integration-test + verify + + + + **/*Test5.java + + + + + + + maven-surefire-plugin + 2.20.1 + + false + + **/*Test.java + **/*Spec.java + + + + + + org.apache.maven.plugins + maven-assembly-plugin + 3.1.0 + + + + jar-with-dependencies + + + + + com.baeldung.MyJointCompilationApp + + - - - - make-assembly - - package - - single - - - - - - + + + + make-assembly + + package + + single + + + + + + - - - central - http://jcenter.bintray.com - - + + + central + http://jcenter.bintray.com + + - - - bintray - Groovy Bintray - https://dl.bintray.com/groovy/maven - - - never - - - false - - - + + + bintray + Groovy Bintray + https://dl.bintray.com/groovy/maven + + + never + + + false + + + - - 1.0.0 - 2.4.0 - 1.1-groovy-2.4 - 3.8.1 - 1.2.3 - 2.5.7 - UTF-8 - + + 1.0.0 + 2.4.0 + 1.1-groovy-2.4 + 3.8.1 + 1.2.3 + 2.5.7 + UTF-8 + From e5ff15e4aa07667df47af930f6c30973e9c18ee3 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:56:26 +0300 Subject: [PATCH 085/396] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 2ffef7ae94..1f5baaf904 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -51,7 +51,7 @@ com.github.groovy-wslite groovy-wslite - 1.1.3 + ${groovy-wslite.version} @@ -180,6 +180,7 @@ 1.0.0 2.4.0 1.1-groovy-2.4 + 1.1.3 3.8.1 1.2.3 2.5.7 From a92e0ec2bc48618066281fe383cf12b74fcea5bc Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 15:57:37 +0300 Subject: [PATCH 086/396] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 1f5baaf904..40e38bef16 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -49,10 +49,10 @@ test - com.github.groovy-wslite - groovy-wslite - ${groovy-wslite.version} - + com.github.groovy-wslite + groovy-wslite + ${groovy-wslite.version} + @@ -180,7 +180,7 @@ 1.0.0 2.4.0 1.1-groovy-2.4 - 1.1.3 + 1.1.3 3.8.1 1.2.3 2.5.7 From 4e926d3f06074404838dec33e197bd9906df71ef Mon Sep 17 00:00:00 2001 From: Shubhra Srivastava Date: Sun, 1 Sep 2019 21:18:20 +0530 Subject: [PATCH 087/396] BAEL-3207 Convert Char Array to String (#7692) * BAEL-320 Convert Char Array to String * BAEL-3207 re-formatting --- .../CharArrayToStringConversionUnitTest.java | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java diff --git a/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java new file mode 100644 index 0000000000..11002ece0f --- /dev/null +++ b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java @@ -0,0 +1,73 @@ +package com.baeldung.string.charArrayToString; + +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import com.google.common.base.Joiner; +import org.junit.Test; + +import java.util.Arrays; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +public class CharArrayToStringConversionUnitTest { + + @Test + public void whenStringConstructor_thenOK() { + final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + String string = new String(charArray); + + assertThat(string, is("baeldung")); + } + + @Test + public void whenStringCopyValueOf_thenOK() { + final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + String string = String.copyValueOf(charArray); + + assertThat(string, is("baeldung")); + } + + @Test + public void whenStringValueOf_thenOK() { + final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + String string = String.valueOf(charArray); + + assertThat(string, is("baeldung")); + } + + @Test + public void whenStringBuilder_thenOK() { + final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + StringBuilder sb = new StringBuilder(); + for (char value : charArray) { + sb.append(value); + } + + assertThat(sb.toString(), is("baeldung")); + } + + @Test + public void whenStreamCollectors_thenOK() { + final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + Stream charStream = Arrays.stream(charArray); + String string = charStream.map(String::valueOf).collect(Collectors.joining()); + + assertThat(string, is("baeldung")); + } + + @Test + public void whenGoogleCommonBaseJoiners_thenOK() { + final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + + String string = Joiner.on("").join(charArray); + + assertThat(string, is("baeldung")); + } + +} From d93e68d4df3ec75dc23fb1648cd8fdf5c9409cef Mon Sep 17 00:00:00 2001 From: "anilkivilcim.eray" Date: Sun, 1 Sep 2019 20:46:52 +0300 Subject: [PATCH 088/396] BAEL-3097 new example added --- ...TO.java => UserBodyImperialValuesDTO.java} | 5 +- .../{UrlObject.java => UserBodyValues.java} | 5 +- ...emover.java => PoundToKilogramMapper.java} | 2 +- .../java/com/baeldung/mapper/UrlMapper.java | 39 --------------- .../baeldung/mapper/UserBodyValuesMapper.java | 28 +++++++++++ .../baeldung/mapper/UrlMapperUnitTest.java | 30 ------------ .../mapper/UserBodyValuesMapperUnitTest.java | 47 +++++++++++++++++++ 7 files changed, 82 insertions(+), 74 deletions(-) rename mapstruct/src/main/java/com/baeldung/dto/{UrlDTO.java => UserBodyImperialValuesDTO.java} (50%) rename mapstruct/src/main/java/com/baeldung/entity/{UrlObject.java => UserBodyValues.java} (50%) rename mapstruct/src/main/java/com/baeldung/mapper/{ProtocolRemover.java => PoundToKilogramMapper.java} (87%) delete mode 100644 mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java create mode 100644 mapstruct/src/main/java/com/baeldung/mapper/UserBodyValuesMapper.java delete mode 100644 mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/UserBodyValuesMapperUnitTest.java diff --git a/mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java b/mapstruct/src/main/java/com/baeldung/dto/UserBodyImperialValuesDTO.java similarity index 50% rename from mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java rename to mapstruct/src/main/java/com/baeldung/dto/UserBodyImperialValuesDTO.java index e0d7fd58e9..9817b76bc8 100644 --- a/mapstruct/src/main/java/com/baeldung/dto/UrlDTO.java +++ b/mapstruct/src/main/java/com/baeldung/dto/UserBodyImperialValuesDTO.java @@ -5,6 +5,7 @@ import lombok.Setter; @Getter @Setter -public class UrlDTO { - private String address; +public class UserBodyImperialValuesDTO { + private int inch; + private int pound; } \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/entity/UrlObject.java b/mapstruct/src/main/java/com/baeldung/entity/UserBodyValues.java similarity index 50% rename from mapstruct/src/main/java/com/baeldung/entity/UrlObject.java rename to mapstruct/src/main/java/com/baeldung/entity/UserBodyValues.java index 9d1f4668c2..b23463cb93 100644 --- a/mapstruct/src/main/java/com/baeldung/entity/UrlObject.java +++ b/mapstruct/src/main/java/com/baeldung/entity/UserBodyValues.java @@ -5,6 +5,7 @@ import lombok.Setter; @Getter @Setter -public class UrlObject { - private String address; +public class UserBodyValues { + private double kilogram; + private double centimeter; } \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/mapper/ProtocolRemover.java b/mapstruct/src/main/java/com/baeldung/mapper/PoundToKilogramMapper.java similarity index 87% rename from mapstruct/src/main/java/com/baeldung/mapper/ProtocolRemover.java rename to mapstruct/src/main/java/com/baeldung/mapper/PoundToKilogramMapper.java index 4c22ffd9ee..e75022a5e8 100644 --- a/mapstruct/src/main/java/com/baeldung/mapper/ProtocolRemover.java +++ b/mapstruct/src/main/java/com/baeldung/mapper/PoundToKilogramMapper.java @@ -10,4 +10,4 @@ import java.lang.annotation.Target; @Qualifier @Target(ElementType.METHOD) @Retention(RetentionPolicy.CLASS) -public @interface ProtocolRemover {} +public @interface PoundToKilogramMapper {} diff --git a/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java deleted file mode 100644 index 22083fabb2..0000000000 --- a/mapstruct/src/main/java/com/baeldung/mapper/UrlMapper.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.baeldung.mapper; - -import com.baeldung.dto.UrlDTO; -import com.baeldung.entity.UrlObject; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; - -@Mapper -public interface UrlMapper { - - UrlMapper INSTANCE = Mappers.getMapper(UrlMapper.class); - - - @Mapping(source = "address", target = "address", qualifiedByName = "protocolRemover") - public UrlObject urlObjectNamedMapper(UrlDTO urlDTO); - - @Mapping(source = "address", target = "address", qualifiedBy = ProtocolRemover.class) - public UrlObject urlObjectAnnotatedMapper(UrlDTO urlDTO); - - @Named("protocolRemover") - public static String protocolRemoverWithCustomMethod(String address) throws URISyntaxException { - URI uri = new URI(address); - - return uri.getHost() + uri.getPath(); - } - - @ProtocolRemover - public static String protocolRemoverMethod(String address) throws URISyntaxException { - URI uri = new URI(address); - - return uri.getHost() + uri.getPath(); - } -} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/mapper/UserBodyValuesMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/UserBodyValuesMapper.java new file mode 100644 index 0000000000..4c992f91e1 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/mapper/UserBodyValuesMapper.java @@ -0,0 +1,28 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.UserBodyImperialValuesDTO; +import com.baeldung.entity.UserBodyValues; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface UserBodyValuesMapper { + + UserBodyValuesMapper INSTANCE = Mappers.getMapper(UserBodyValuesMapper.class); + + @Mapping(source = "pound", target = "kilogram", qualifiedBy = PoundToKilogramMapper.class) + @Mapping(source = "inch", target = "centimeter", qualifiedByName = "inchToCentimeter") + public UserBodyValues userBodyValuesMapper(UserBodyImperialValuesDTO dto); + + @Named("inchToCentimeter") + public static double inchToCentimeter(int inch) { + return inch * 2.54; + } + + @PoundToKilogramMapper + public static double poundToKilogram(int pound) { + return pound * 0.4535; + } +} \ No newline at end of file diff --git a/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java deleted file mode 100644 index 567d0aefbc..0000000000 --- a/mapstruct/src/test/java/com/baeldung/mapper/UrlMapperUnitTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.mapper; - -import com.baeldung.dto.UrlDTO; -import com.baeldung.entity.UrlObject; -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class UrlMapperUnitTest { - - @Test - public void givenDomain_whenCallNamedMapper_thenReturnDomainWithoutProtocol() { - UrlDTO dto = new UrlDTO(); - dto.setAddress("http://www.baeldung.com/mapstruct"); - - UrlObject urlObject = UrlMapper.INSTANCE.urlObjectNamedMapper(dto); - - assertEquals(urlObject.getAddress(), "www.baeldung.com/mapstruct"); - } - - @Test - public void givenAddress_whenCallAnnotatedMapper_thenReturnDomainWithoutProtocol() { - UrlDTO dto = new UrlDTO(); - dto.setAddress("http://www.baeldung.com/customMappers"); - - UrlObject urlObject = UrlMapper.INSTANCE.urlObjectAnnotatedMapper(dto); - - assertEquals(urlObject.getAddress(), "www.baeldung.com/customMappers"); - } -} \ No newline at end of file diff --git a/mapstruct/src/test/java/com/baeldung/mapper/UserBodyValuesMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/UserBodyValuesMapperUnitTest.java new file mode 100644 index 0000000000..a875d6faf7 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/UserBodyValuesMapperUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.mapper; + +import com.baeldung.dto.UserBodyImperialValuesDTO; +import com.baeldung.entity.UserBodyValues; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + + +public class UserBodyValuesMapperUnitTest { + + @Test + public void givenUserBodyImperialValuesDTOToUserBodyValuesObject_whenMaps_thenCorrect() { + UserBodyImperialValuesDTO dto = new UserBodyImperialValuesDTO(); + dto.setInch(10); + dto.setPound(100); + + UserBodyValues obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper(dto); + + assertNotNull(obj); + assertEquals(25.4, obj.getCentimeter(), 0); + assertEquals(45.35, obj.getKilogram(), 0); + } + + @Test + public void givenUserBodyImperialValuesDTOWithInchToUserBodyValuesObject_whenMaps_thenCorrect() { + UserBodyImperialValuesDTO dto = new UserBodyImperialValuesDTO(); + dto.setInch(10); + + UserBodyValues obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper(dto); + + assertNotNull(obj); + assertEquals(25.4, obj.getCentimeter(), 0); + } + + @Test + public void givenUserBodyImperialValuesDTOWithPoundToUserBodyValuesObject_whenMaps_thenCorrect() { + UserBodyImperialValuesDTO dto = new UserBodyImperialValuesDTO(); + dto.setPound(100); + + UserBodyValues obj = UserBodyValuesMapper.INSTANCE.userBodyValuesMapper(dto); + + assertNotNull(obj); + assertEquals(45.35, obj.getKilogram(), 0); + } +} \ No newline at end of file From f78edd35697b82691b71a20cf012c3d554a71fd5 Mon Sep 17 00:00:00 2001 From: Lukasz Rys <> Date: Sun, 1 Sep 2019 20:15:29 +0200 Subject: [PATCH 089/396] [ BAEL-1869 ]: Couchbase spring reactive article --- spring-5-data-reactive/README.md | 1 + spring-5-data-reactive/pom.xml | 15 ++++ .../ReactiveCouchbaseApplication.java | 12 +++ .../configuration/CouchbaseProperties.java | 43 ++++++++++ .../N1QLReactiveCouchbaseConfiguration.java | 15 ++++ .../ReactiveCouchbaseConfiguration.java | 47 +++++++++++ .../ViewReactiveCouchbaseConfiguration.java | 13 +++ .../com/baeldung/couchbase/domain/Person.java | 43 ++++++++++ .../repository/n1ql/N1QLPersonRepository.java | 16 ++++ .../n1ql/N1QLSortingPersonRepository.java | 13 +++ .../repository/view/ViewPersonRepository.java | 20 +++++ .../CouchbaseMockConfiguration.java | 54 +++++++++++++ .../n1ql/N1QLPersonRepositoryLiveTest.java | 55 +++++++++++++ .../N1QLSortingPersonRepositoryLiveTest.java | 60 ++++++++++++++ .../ViewPersonRepositoryIntegrationTest.java | 79 +++++++++++++++++++ 15 files changed, 486 insertions(+) create mode 100644 spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java create mode 100644 spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java create mode 100644 spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java create mode 100644 spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java create mode 100644 spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java create mode 100644 spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/Person.java create mode 100644 spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java create mode 100644 spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java create mode 100644 spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java create mode 100644 spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java create mode 100644 spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java create mode 100644 spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java create mode 100644 spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java diff --git a/spring-5-data-reactive/README.md b/spring-5-data-reactive/README.md index 4c2347dc77..4e342532b2 100644 --- a/spring-5-data-reactive/README.md +++ b/spring-5-data-reactive/README.md @@ -8,3 +8,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring Data Reactive Repositories with MongoDB](http://www.baeldung.com/spring-data-mongodb-reactive) - [Spring Data MongoDB Tailable Cursors](https://www.baeldung.com/spring-data-mongodb-tailable-cursors) - [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc) +- [Embedded Redis Server with Spring Boot Test]() diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml index 5372803842..296da87529 100644 --- a/spring-5-data-reactive/pom.xml +++ b/spring-5-data-reactive/pom.xml @@ -14,6 +14,14 @@ + + io.projectreactor + reactor-core + + + org.springframework.boot + spring-boot-starter-data-couchbase-reactive + org.springframework.boot spring-boot-starter-data-mongodb-reactive @@ -105,6 +113,12 @@ httpclient ${httpclient.version} + + com.couchbase.mock + CouchbaseMock + ${couchbaseMock.version} + test + @@ -224,6 +238,7 @@ 0.8.0.M8 4.5.2 1.4.199 + 1.5.23 diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java new file mode 100644 index 0000000000..917bcfdaa8 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.couchbase; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ReactiveCouchbaseApplication { + + public static void main(String[] args) { + SpringApplication.run(ReactiveCouchbaseApplication.class, args); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java new file mode 100644 index 0000000000..85c6997c6a --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java @@ -0,0 +1,43 @@ +package com.baeldung.couchbase.configuration; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import java.util.Collections; +import java.util.List; + +@Configuration +public class CouchbaseProperties { + + private final List bootstrapHosts; + private final String bucketName; + private final String bucketPassword; + private final int port; + + public CouchbaseProperties( + @Value("${spring.couchbase.bootstrap-hosts}") final List bootstrapHosts, + @Value("${spring.couchbase.bucket.name}") final String bucketName, + @Value("${spring.couchbase.bucket.password}") final String bucketPassword, + @Value("${spring.couchbase.port}") final int port) { + this.bootstrapHosts = Collections.unmodifiableList(bootstrapHosts); + this.bucketName = bucketName; + this.bucketPassword = bucketPassword; + this.port = port; + } + + public List getBootstrapHosts() { + return bootstrapHosts; + } + + public String getBucketName() { + return bucketName; + } + + public String getBucketPassword() { + return bucketPassword; + } + + public int getPort() { + return port; + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java new file mode 100644 index 0000000000..059bd36cae --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/N1QLReactiveCouchbaseConfiguration.java @@ -0,0 +1,15 @@ +package com.baeldung.couchbase.configuration; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.data.couchbase.repository.config.EnableReactiveCouchbaseRepositories; + +@Configuration +@EnableReactiveCouchbaseRepositories("com.baeldung.couchbase.domain.repository.n1ql") +@Primary +public class N1QLReactiveCouchbaseConfiguration extends ReactiveCouchbaseConfiguration { + + public N1QLReactiveCouchbaseConfiguration(CouchbaseProperties couchbaseProperties) { + super(couchbaseProperties); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java new file mode 100644 index 0000000000..80c040df9f --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java @@ -0,0 +1,47 @@ +package com.baeldung.couchbase.configuration; + +import com.couchbase.client.java.env.CouchbaseEnvironment; +import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; +import org.springframework.context.annotation.Bean; +import org.springframework.data.couchbase.config.AbstractReactiveCouchbaseConfiguration; +import org.springframework.data.couchbase.config.BeanNames; +import org.springframework.data.couchbase.repository.support.IndexManager; + +import java.util.List; + +public abstract class ReactiveCouchbaseConfiguration extends AbstractReactiveCouchbaseConfiguration { + + private CouchbaseProperties couchbaseProperties; + + public ReactiveCouchbaseConfiguration(final CouchbaseProperties couchbaseProperties) { + this.couchbaseProperties = couchbaseProperties; + } + + @Bean(name = BeanNames.COUCHBASE_INDEX_MANAGER) + public IndexManager indexManager() { + return new IndexManager(true, true, false); + } + + @Override + protected List getBootstrapHosts() { + return couchbaseProperties.getBootstrapHosts(); + } + + @Override + protected String getBucketName() { + return couchbaseProperties.getBucketName(); + } + + @Override + protected String getBucketPassword() { + return couchbaseProperties.getBucketPassword(); + } + + @Override + public CouchbaseEnvironment couchbaseEnvironment() { + return DefaultCouchbaseEnvironment + .builder() + .bootstrapHttpDirectPort(couchbaseProperties.getPort()) + .build(); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java new file mode 100644 index 0000000000..9b4d9b0319 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ViewReactiveCouchbaseConfiguration.java @@ -0,0 +1,13 @@ +package com.baeldung.couchbase.configuration; + +import org.springframework.context.annotation.Configuration; +import org.springframework.data.couchbase.repository.config.EnableReactiveCouchbaseRepositories; + +@Configuration +@EnableReactiveCouchbaseRepositories("com.baeldung.couchbase.domain.repository.view") +public class ViewReactiveCouchbaseConfiguration extends ReactiveCouchbaseConfiguration { + + public ViewReactiveCouchbaseConfiguration(CouchbaseProperties couchbaseProperties) { + super(couchbaseProperties); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/Person.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/Person.java new file mode 100644 index 0000000000..285de34df8 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/Person.java @@ -0,0 +1,43 @@ +package com.baeldung.couchbase.domain; + +import org.springframework.data.annotation.Id; +import org.springframework.data.couchbase.core.mapping.Document; + +import java.util.Objects; +import java.util.UUID; + +@Document +public class Person { + + @Id private UUID id; + private String firstName; + + public Person(final UUID id, final String firstName) { + this.id = id; + this.firstName = firstName; + } + + private Person() { + } + + public UUID getId() { + return id; + } + + public String getFirstName() { + return firstName; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Person person = (Person) o; + return Objects.equals(id, person.id) && Objects.equals(firstName, person.firstName); + } + + @Override + public int hashCode() { + return Objects.hash(id, firstName); + } +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java new file mode 100644 index 0000000000..6f73a77ceb --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepository.java @@ -0,0 +1,16 @@ +package com.baeldung.couchbase.domain.repository.n1ql; + +import com.baeldung.couchbase.domain.Person; +import org.springframework.data.couchbase.core.query.N1qlPrimaryIndexed; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; + +import java.util.UUID; + +@Repository +@N1qlPrimaryIndexed +public interface N1QLPersonRepository extends ReactiveCrudRepository { + + Flux findAllByFirstName(final String firstName); +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java new file mode 100644 index 0000000000..57dd149425 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepository.java @@ -0,0 +1,13 @@ +package com.baeldung.couchbase.domain.repository.n1ql; + +import com.baeldung.couchbase.domain.Person; +import org.springframework.data.couchbase.core.query.N1qlPrimaryIndexed; +import org.springframework.data.repository.reactive.ReactiveSortingRepository; +import org.springframework.stereotype.Repository; + +import java.util.UUID; + +@Repository +@N1qlPrimaryIndexed +public interface N1QLSortingPersonRepository extends ReactiveSortingRepository { +} diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java new file mode 100644 index 0000000000..28a7ec1b78 --- /dev/null +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java @@ -0,0 +1,20 @@ +package com.baeldung.couchbase.domain.repository.view; + +import com.baeldung.couchbase.domain.Person; +import org.springframework.data.couchbase.core.query.View; +import org.springframework.data.couchbase.core.query.ViewIndexed; +import org.springframework.data.repository.reactive.ReactiveCrudRepository; +import org.springframework.stereotype.Repository; +import reactor.core.publisher.Flux; + +import java.util.UUID; + +@Repository +@ViewIndexed(designDoc = ViewPersonRepository.DESIGN_DOCUMENT) +public interface ViewPersonRepository extends ReactiveCrudRepository { + + String DESIGN_DOCUMENT = "persons"; + + @View(designDocument = ViewPersonRepository.DESIGN_DOCUMENT) + Flux findByFirstName(String firstName); +} diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java new file mode 100644 index 0000000000..9d4108eccd --- /dev/null +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java @@ -0,0 +1,54 @@ +package com.baeldung.couchbase.domain.repository; + +import com.baeldung.couchbase.configuration.CouchbaseProperties; +import com.couchbase.mock.Bucket; +import com.couchbase.mock.BucketConfiguration; +import com.couchbase.mock.CouchbaseMock; +import org.springframework.boot.test.context.TestConfiguration; + +import javax.annotation.PostConstruct; +import javax.annotation.PreDestroy; +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.List; + +@TestConfiguration +public class CouchbaseMockConfiguration { + + private CouchbaseMock couchbaseMock; + + public CouchbaseMockConfiguration(final CouchbaseProperties couchbaseProperties) { + final BucketConfiguration bucketConfiguration = new BucketConfiguration(); + bucketConfiguration.numNodes = 1; + bucketConfiguration.numReplicas = 1; + bucketConfiguration.numVBuckets = 1024; + bucketConfiguration.name = couchbaseProperties.getBucketName(); + bucketConfiguration.type = Bucket.BucketType.COUCHBASE; + bucketConfiguration.password = couchbaseProperties.getBucketPassword(); + + try { + couchbaseMock = new CouchbaseMock(couchbaseProperties.getPort(), List.of(bucketConfiguration)); + } catch (final IOException ex) { + throw new UncheckedIOException(ex); + } + } + + @PostConstruct + public void postConstruct() { + try { + couchbaseMock.start(); + } catch (final IOException ex) { + throw new UncheckedIOException(ex); + } + try { + couchbaseMock.waitForStartup(); + } catch (final InterruptedException ex) { + throw new RuntimeException(ex); + } + } + + @PreDestroy + public void preDestroy() { + couchbaseMock.stop(); + } +} diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java new file mode 100644 index 0000000000..0c1b6bde6c --- /dev/null +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java @@ -0,0 +1,55 @@ +package com.baeldung.couchbase.domain.repository.n1ql; + +import com.baeldung.couchbase.domain.Person; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +import java.util.UUID; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class N1QLPersonRepositoryLiveTest { + + @Autowired private N1QLPersonRepository personRepository; + + @Test + public void shouldFindAll_byLastName() { + //Given + final String firstName = "John"; + final Person matchingPerson = new Person(UUID.randomUUID(), firstName); + final Person nonMatchingPerson = new Person(UUID.randomUUID(), "NotJohn"); + wrap(() -> { + personRepository + .save(matchingPerson) + .subscribe(); + personRepository + .save(nonMatchingPerson) + .subscribe(); + //When + final Flux allByFirstName = personRepository.findAllByFirstName(firstName); + //Then + StepVerifier + .create(allByFirstName) + .expectNext(matchingPerson) + .verifyComplete(); + + }, matchingPerson, nonMatchingPerson); + } + + private void wrap(final Runnable runnable, final Person... people) { + try { + runnable.run(); + } finally { + for (final Person person : people) { + personRepository + .delete(person) + .subscribe(); + } + } + } +} \ No newline at end of file diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java new file mode 100644 index 0000000000..4ba2206e0a --- /dev/null +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java @@ -0,0 +1,60 @@ +package com.baeldung.couchbase.domain.repository.n1ql; + +import com.baeldung.couchbase.domain.Person; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Sort; +import org.springframework.test.context.junit4.SpringRunner; +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +import java.util.UUID; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class N1QLSortingPersonRepositoryLiveTest { + + @Autowired private N1QLSortingPersonRepository personRepository; + + @Test + public void shouldFindAll_sortedByFirstName() { + //Given + final Person firstPerson = new Person(UUID.randomUUID(), "John"); + final Person secondPerson = new Person(UUID.randomUUID(), "Mikki"); + wrap(() -> { + personRepository + .save(firstPerson) + .subscribe(); + personRepository + .save(secondPerson) + .subscribe(); + //When + final Flux allByFirstName = personRepository.findAll(Sort.by(Sort.Direction.DESC, "firstName")); + //Then + StepVerifier + .create(allByFirstName) + .expectNextMatches(person -> person + .getFirstName() + .equals(secondPerson.getFirstName())) + .expectNextMatches(person -> person + .getFirstName() + .equals(firstPerson.getFirstName())) + .verifyComplete(); + }, firstPerson, secondPerson); + } + + //workaround for deleteAll() + private void wrap(final Runnable runnable, final Person... people) { + try { + runnable.run(); + } finally { + for (final Person person : people) { + personRepository + .delete(person) + .subscribe(); + } + } + } +} \ No newline at end of file diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java new file mode 100644 index 0000000000..712e7b0d37 --- /dev/null +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java @@ -0,0 +1,79 @@ +package com.baeldung.couchbase.domain.repository.view; + +import com.baeldung.couchbase.configuration.CouchbaseProperties; +import com.baeldung.couchbase.configuration.ViewReactiveCouchbaseConfiguration; +import com.baeldung.couchbase.domain.Person; +import com.baeldung.couchbase.domain.repository.CouchbaseMockConfiguration; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.util.UUID; + +@RunWith(SpringRunner.class) +@SpringBootTest(properties = { "spring.couchbase.port=10010" }, classes = { ViewReactiveCouchbaseConfiguration.class, CouchbaseProperties.class, CouchbaseMockConfiguration.class }) +public class ViewPersonRepositoryIntegrationTest { + + @Autowired private ViewPersonRepository personRepository; + + @Test + public void shouldSavePerson_findById_thenDeleteIt() { + //Given + final UUID id = UUID.randomUUID(); + final Person person = new Person(id, "John"); + wrap(() -> { + personRepository + .save(person) + .subscribe(); + //When + final Mono byId = personRepository.findById(id); + //Then + StepVerifier + .create(byId) + .expectNextMatches(result -> result + .getId() + .equals(id)) + .expectComplete() + .verify(); + }, person); + } + + @Test + public void shouldFindAll_thenDeleteIt() { + //Given + final Person person = new Person(UUID.randomUUID(), "John"); + final Person secondPerson = new Person(UUID.randomUUID(), "Mikki"); + wrap(() -> { + personRepository + .save(person) + .subscribe(); + personRepository + .save(secondPerson) + .subscribe(); + //When + final Flux all = personRepository.findAll(); + //Then + StepVerifier + .create(all) + .expectNextCount(2) + .verifyComplete(); + }, person, secondPerson); + } + + private void wrap(final Runnable runnable, final Person... people) { + try { + runnable.run(); + } finally { + for (final Person person : people) { + personRepository + .delete(person) + .subscribe(); + } + } + } +} \ No newline at end of file From db772047f44e6707a206b7e927b94f8996836b19 Mon Sep 17 00:00:00 2001 From: David Calap Date: Sun, 1 Sep 2019 20:30:58 +0200 Subject: [PATCH 090/396] BAEL-3142 Removing an element from an ArrayList --- .../baeldung/java/list/RemoveFromList.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java new file mode 100644 index 0000000000..9e116c54de --- /dev/null +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java @@ -0,0 +1,40 @@ +package com.baeldung.java.list; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +public class RemoveFromList { + + public static void main(String[] args) { + List sports = new ArrayList<>(); + sports.add("Football"); + sports.add("Basketball"); + sports.add("Baseball"); + sports.add("Boxing"); + sports.add("Cycling"); + + System.out.println("List before removing: " + sports); + + // Remove with index + sports.remove(1); + + // Remove with an element + sports.remove("Baseball"); + + // Iterator remove method + Iterator iterator = sports.iterator(); + while(iterator.hasNext()){ + if(iterator.next().equals("Boxing")){ + iterator.remove(); + } + } + + // ArrayList removeIf method (Java 8) + for(int i = 0; i < sports.size(); i++){ + sports.removeIf(p -> p.equals("Cycling")); + } + + System.out.println("List after removing: " + sports); + } +} From 5a3143b0e43f461f0f79e4dafccde9bd47c421ca Mon Sep 17 00:00:00 2001 From: Lukasz Rys <> Date: Sun, 1 Sep 2019 21:46:14 +0200 Subject: [PATCH 091/396] BAEL-1869: Fix List.of --- .../configuration/ReactiveCouchbaseConfiguration.java | 5 ----- .../domain/repository/CouchbaseMockConfiguration.java | 4 ++-- 2 files changed, 2 insertions(+), 7 deletions(-) diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java index 80c040df9f..3bd66a895a 100644 --- a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java @@ -17,11 +17,6 @@ public abstract class ReactiveCouchbaseConfiguration extends AbstractReactiveCou this.couchbaseProperties = couchbaseProperties; } - @Bean(name = BeanNames.COUCHBASE_INDEX_MANAGER) - public IndexManager indexManager() { - return new IndexManager(true, true, false); - } - @Override protected List getBootstrapHosts() { return couchbaseProperties.getBootstrapHosts(); diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java index 9d4108eccd..2a09fce4b0 100644 --- a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/CouchbaseMockConfiguration.java @@ -10,7 +10,7 @@ import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import java.io.IOException; import java.io.UncheckedIOException; -import java.util.List; +import java.util.Collections; @TestConfiguration public class CouchbaseMockConfiguration { @@ -27,7 +27,7 @@ public class CouchbaseMockConfiguration { bucketConfiguration.password = couchbaseProperties.getBucketPassword(); try { - couchbaseMock = new CouchbaseMock(couchbaseProperties.getPort(), List.of(bucketConfiguration)); + couchbaseMock = new CouchbaseMock(couchbaseProperties.getPort(), Collections.singletonList(bucketConfiguration)); } catch (final IOException ex) { throw new UncheckedIOException(ex); } From d3df5e0d9758abb8b157d3c7f677d1516cf04d25 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 1 Sep 2019 23:08:53 +0300 Subject: [PATCH 092/396] BAEL-3190 - Working with web services in Groovy - pom.xml code indentation --- core-groovy-2/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-groovy-2/pom.xml b/core-groovy-2/pom.xml index 40e38bef16..91e31d4cba 100644 --- a/core-groovy-2/pom.xml +++ b/core-groovy-2/pom.xml @@ -49,9 +49,9 @@ test - com.github.groovy-wslite - groovy-wslite - ${groovy-wslite.version} + com.github.groovy-wslite + groovy-wslite + ${groovy-wslite.version} From 0f0908bc18eb30136ccc5c6c0e1ca2d32b6e49c8 Mon Sep 17 00:00:00 2001 From: David Calap Date: Mon, 2 Sep 2019 10:25:22 +0200 Subject: [PATCH 093/396] Identation fixed applying https://github.com/eugenp/tutorials/blob/master/eclipse/formatter.xml --- .../baeldung/java/list/RemoveFromList.java | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java index 9e116c54de..7c23d1c978 100644 --- a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java @@ -6,35 +6,36 @@ import java.util.List; public class RemoveFromList { - public static void main(String[] args) { - List sports = new ArrayList<>(); - sports.add("Football"); - sports.add("Basketball"); - sports.add("Baseball"); - sports.add("Boxing"); - sports.add("Cycling"); + public static void main(String[] args) { + List sports = new ArrayList<>(); + sports.add("Football"); + sports.add("Basketball"); + sports.add("Baseball"); + sports.add("Boxing"); + sports.add("Cycling"); - System.out.println("List before removing: " + sports); + System.out.println("List before removing: " + sports); - // Remove with index - sports.remove(1); + // Remove with index + sports.remove(1); - // Remove with an element - sports.remove("Baseball"); + // Remove with an element + sports.remove("Baseball"); - // Iterator remove method - Iterator iterator = sports.iterator(); - while(iterator.hasNext()){ - if(iterator.next().equals("Boxing")){ - iterator.remove(); - } + // Iterator remove method + Iterator iterator = sports.iterator(); + while (iterator.hasNext()) { + if (iterator.next().equals("Boxing")) { + iterator.remove(); + } + } + + // ArrayList removeIf method (Java 8) + for (int i = 0; i < sports.size(); i++) { + sports.removeIf(p -> p.equals("Cycling")); + } + + System.out.println("List after removing: " + sports); } - // ArrayList removeIf method (Java 8) - for(int i = 0; i < sports.size(); i++){ - sports.removeIf(p -> p.equals("Cycling")); - } - - System.out.println("List after removing: " + sports); - } } From 784fb624c1ae903a053a19a58755cf5401f4a683 Mon Sep 17 00:00:00 2001 From: David Calap Date: Mon, 2 Sep 2019 14:02:25 +0200 Subject: [PATCH 094/396] break added to avoid unnecessary loop iterations. Get rid of for since a loop is not needed for removeIf method --- .../src/main/java/com/baeldung/java/list/RemoveFromList.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java index 7c23d1c978..df9b3d987d 100644 --- a/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java +++ b/core-java-modules/core-java-collections-array-list/src/main/java/com/baeldung/java/list/RemoveFromList.java @@ -27,13 +27,12 @@ public class RemoveFromList { while (iterator.hasNext()) { if (iterator.next().equals("Boxing")) { iterator.remove(); + break; } } // ArrayList removeIf method (Java 8) - for (int i = 0; i < sports.size(); i++) { - sports.removeIf(p -> p.equals("Cycling")); - } + sports.removeIf(p -> p.equals("Cycling")); System.out.println("List after removing: " + sports); } From 149bfc44beb232e4b0485671ea2dc95aaaf44bad Mon Sep 17 00:00:00 2001 From: NickTononi <48349671+NickTononi@users.noreply.github.com> Date: Mon, 2 Sep 2019 16:06:44 +0200 Subject: [PATCH 095/396] [BAEL-3149] Java 'private' access modifier (#7669) --- .../com/baeldung/core/modifiers/Employee.java | 19 ++++++++++++++----- .../baeldung/core/modifiers/ExampleClass.java | 4 ++-- 2 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java index e43b6634ed..6ec68d6ebb 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java @@ -3,12 +3,12 @@ package com.baeldung.core.modifiers; public class Employee { private String privateId; - public String name; + private String name; private boolean manager; public Employee(String id, String name) { - changeId(id); - this.name = name; + setPrivateId(id); + setName(name); } private Employee(String id, String name, boolean managerAttribute) { @@ -17,7 +17,7 @@ public class Employee { this.privateId = id + "_ID-MANAGER"; } - public void changeId(String customId) { + public void setPrivateId(String customId) { if (customId.endsWith("_ID")) { this.privateId = customId; } else { @@ -25,7 +25,7 @@ public class Employee { } } - public String getId() { + public String getPrivateId() { return privateId; } @@ -43,6 +43,15 @@ public class Employee { this.manager = manager; } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + public static Employee buildManager(String id, String name) { return new Employee(id, name, true); } diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java index db58b4f00b..41f0b7a690 100644 --- a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java @@ -4,7 +4,7 @@ public class ExampleClass { public static void main(String[] args) { Employee employee = new Employee("Bob","ABC123"); - employee.changeId("BCD234"); - System.out.println(employee.getId()); + employee.setPrivateId("BCD234"); + System.out.println(employee.getPrivateId()); } } From b0c1efdb7cb0a089e996d660d2d490d8a6a1219f Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Tue, 3 Sep 2019 01:58:58 +0530 Subject: [PATCH 096/396] [BAEL-14836] - Moved code for in-memory database article (#7705) --- .../spring-boot-persistence/README.MD | 1 + .../spring-boot-persistence/pom.xml | 16 ++++++++++++++++ .../com/baeldung/boot/config/H2JpaConfig.java | 3 +++ .../main/resources/persistence-derby.properties | 8 ++++++++ .../main/resources/persistence-hsqldb.properties | 8 ++++++++ .../main/resources/persistence-sqlite.properties | 7 +++++++ spring-data-rest/README.md | 1 - 7 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties create mode 100644 persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties create mode 100644 persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties diff --git a/persistence-modules/spring-boot-persistence/README.MD b/persistence-modules/spring-boot-persistence/README.MD index 709f505ea9..96eb326cbe 100644 --- a/persistence-modules/spring-boot-persistence/README.MD +++ b/persistence-modules/spring-boot-persistence/README.MD @@ -9,3 +9,4 @@ - [Configuring a DataSource Programmatically in Spring Boot](https://www.baeldung.com/spring-boot-configure-data-source-programmatic) - [Resolving “Failed to Configure a DataSource” Error](https://www.baeldung.com/spring-boot-failed-to-configure-data-source) - [Spring Boot with Hibernate](https://www.baeldung.com/spring-boot-hibernate) +- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases) \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index e283759c75..c7cda07a1a 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -59,6 +59,20 @@ validation-api ${validation-api.version} + + org.xerial + sqlite-jdbc + + + org.apache.derby + derby + ${derby.version} + + + org.hsqldb + hsqldb + ${hsqldb.version} + @@ -83,6 +97,8 @@ 9.0.10 2.23.0 2.0.1.Final + 10.13.1.1 + 2.3.4 diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java index c5c77be56f..6325d2cd2e 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/config/H2JpaConfig.java @@ -20,6 +20,9 @@ import java.util.Properties; @Configuration @EnableJpaRepositories(basePackages = { "com.baeldung.boot.repository", "com.baeldung.repository" }) @PropertySource("classpath:persistence-generic-entity.properties") +//@PropertySource("classpath:persistence-derby.properties") +//@PropertySource("classpath:persistence-hsqldb.properties") +//@PropertySource("classpath:persistence-sqlite.properties") @EnableTransactionManagement @Profile("default") //only required to allow H2JpaConfig and H2TestProfileJPAConfig to coexist in same project //this demo project is showcasing several ways to achieve the same end, and class-level diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties new file mode 100644 index 0000000000..5b5ff05236 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-derby.properties @@ -0,0 +1,8 @@ +jdbc.driverClassName=org.apache.derby.jdbc.EmbeddedDriver +jdbc.url=jdbc:derby:memory:myD;create=true +jdbc.user=sa +jdbc.pass= + +hibernate.dialect=org.hibernate.dialect.DerbyDialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties new file mode 100644 index 0000000000..d045a8b7e5 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-hsqldb.properties @@ -0,0 +1,8 @@ +jdbc.driverClassName=org.hsqldb.jdbc.JDBCDriver +jdbc.url=jdbc:hsqldb:mem:myDb +jdbc.user=sa +jdbc.pass= + +hibernate.dialect=org.hibernate.dialect.HSQLDialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties new file mode 100644 index 0000000000..ee16081603 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/resources/persistence-sqlite.properties @@ -0,0 +1,7 @@ +jdbc.driverClassName=org.sqlite.JDBC +jdbc.url=jdbc:sqlite:memory:myDb?cache=shared +jdbc.user=sa +jdbc.pass=sa +hibernate.dialect=com.baeldung.dialect.SQLiteDialect +hibernate.hbm2ddl.auto=create-drop +hibernate.show_sql=true diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md index abbacb69cc..4b89a24bbc 100644 --- a/spring-data-rest/README.md +++ b/spring-data-rest/README.md @@ -17,7 +17,6 @@ To view the running application, visit [http://localhost:8080](http://localhost: - [Guide to Spring Data REST Validators](http://www.baeldung.com/spring-data-rest-validators) - [Working with Relationships in Spring Data REST](http://www.baeldung.com/spring-data-rest-relationships) - [AngularJS CRUD Application with Spring Data REST](http://www.baeldung.com/angularjs-crud-with-spring-data-rest) -- [List of In-Memory Databases](http://www.baeldung.com/java-in-memory-databases) - [Projections and Excerpts in Spring Data REST](http://www.baeldung.com/spring-data-rest-projections-excerpts) - [Spring Data REST Events with @RepositoryEventHandler](http://www.baeldung.com/spring-data-rest-events) - [Customizing HTTP Endpoints in Spring Data REST](https://www.baeldung.com/spring-data-rest-customize-http-endpoints) From c6b3e0316cf36ec9439d915a926b0f8b9dff84fc Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Tue, 3 Sep 2019 04:35:09 +0530 Subject: [PATCH 097/396] BAEL-3215: A Guide to the Java FileReader Class (#7677) --- core-java-modules/core-java-io-2/.gitignore | 3 + core-java-modules/core-java-io-2/pom.xml | 279 ++++++++++++++++++ .../filereader/FileReaderExample.java | 57 ++++ .../filereader/FileReaderExampleUnitTest.java | 62 ++++ .../src/test/resources/HelloWorld.txt | 1 + 5 files changed, 402 insertions(+) create mode 100644 core-java-modules/core-java-io-2/.gitignore create mode 100644 core-java-modules/core-java-io-2/pom.xml create mode 100644 core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java create mode 100644 core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java create mode 100644 core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt diff --git a/core-java-modules/core-java-io-2/.gitignore b/core-java-modules/core-java-io-2/.gitignore new file mode 100644 index 0000000000..de044ef20f --- /dev/null +++ b/core-java-modules/core-java-io-2/.gitignore @@ -0,0 +1,3 @@ +# Intellij +.idea/ +*.iml diff --git a/core-java-modules/core-java-io-2/pom.xml b/core-java-modules/core-java-io-2/pom.xml new file mode 100644 index 0000000000..64d9434beb --- /dev/null +++ b/core-java-modules/core-java-io-2/pom.xml @@ -0,0 +1,279 @@ + + 4.0.0 + core-java-io-2 + 0.1.0-SNAPSHOT + core-java-io-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + org.decimal4j + decimal4j + ${decimal4j.version} + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + org.unix4j + unix4j-command + ${unix4j.version} + + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.javamoney + moneta + ${moneta.version} + + + org.owasp.esapi + esapi + ${esapi.version} + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator-annprocess.version} + + + org.hsqldb + hsqldb + ${hsqldb.version} + runtime + + + + org.asynchttpclient + async-http-client + ${async-http-client.version} + + + com.opencsv + opencsv + ${opencsv.version} + test + + + + org.apache.tika + tika-core + ${tika.version} + + + net.sf.jmimemagic + jmimemagic + ${jmime-magic.version} + + + + + core-java-io-2 + + + src/main/resources + true + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + + integration + + + + org.codehaus.mojo + exec-maven-plugin + + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + + + + + + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 4.1 + 4.01 + 0.4 + 1.8.7 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 + 4.1 + + 3.6.1 + 1.7.0 + + + 3.0.0-M1 + 2.4.0 + 2.1.0.1 + 1.19 + 2.4.5 + + 1.18 + 0.1.5 + + + \ No newline at end of file diff --git a/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java new file mode 100644 index 0000000000..34a8f61615 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filereader/FileReaderExample.java @@ -0,0 +1,57 @@ +package com.baeldung.filereader; + +import java.io.*; + +public class FileReaderExample { + + public static String readAllCharactersOneByOne(Reader reader) throws IOException { + StringBuilder content = new StringBuilder(); + int nextChar; + while ((nextChar = reader.read()) != -1) { + content.append((char) nextChar); + } + return String.valueOf(content); + } + + public static String readMultipleCharacters(Reader reader, int length) throws IOException { + char[] buffer = new char[length]; + int charactersRead = reader.read(buffer, 0, length); + + + if (charactersRead != -1) { + return new String(buffer, 0, charactersRead); + } else { + return ""; + } + } + + public static String readFile(String path) { + FileReader fileReader = null; + try { + fileReader = new FileReader(path); + return readAllCharactersOneByOne(fileReader); + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (fileReader != null) { + try { + fileReader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + public static String readFileUsingTryWithResources(String path) { + try (FileReader fileReader = new FileReader(path)) { + return readAllCharactersOneByOne(fileReader); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + +} \ No newline at end of file diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java new file mode 100644 index 0000000000..968c041115 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java @@ -0,0 +1,62 @@ +package com.baeldung.filereader; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +public class FileReaderExampleUnitTest { + + + private static final String FILE_PATH = "src/test/resources/HelloWorld.txt"; + + + @Test + public void givenFileReader_whenReadAllCharacters_thenReturnsContent() throws IOException { + String expectedText = "Hello, World!"; + File file = new File(FILE_PATH); + FileReader fileReader = null; + try { + fileReader = new FileReader(file); + String content = FileReaderExample.readAllCharactersOneByOne(fileReader); + Assert.assertEquals(expectedText, content); + } finally { + if (fileReader != null) { + fileReader.close(); + } + } + } + + @Test + public void givenFileReader_whenReadMultipleCharacters_thenReturnsContent() throws IOException { + String expectedText = "Hello"; + File file = new File(FILE_PATH); + FileReader fileReader = null; + try { + fileReader = new FileReader(file); + String content = FileReaderExample.readMultipleCharacters(fileReader, 5); + Assert.assertEquals(expectedText, content); + } finally { + if (fileReader != null) { + fileReader.close(); + } + } + } + + @Test + public void whenReadFile_thenReturnsContent() { + String expectedText = "Hello, World!"; + String content = FileReaderExample.readFile(FILE_PATH); + Assert.assertEquals(expectedText, content); + } + + @Test + public void whenReadFileUsingTryWithResources_thenReturnsContent() { + String expectedText = "Hello, World!"; + String content = FileReaderExample.readFileUsingTryWithResources(FILE_PATH); + Assert.assertEquals(expectedText, content); + } + +} diff --git a/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt b/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt new file mode 100644 index 0000000000..b45ef6fec8 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/resources/HelloWorld.txt @@ -0,0 +1 @@ +Hello, World! \ No newline at end of file From fd2757a412080149dc4b6ef591932c4221d17220 Mon Sep 17 00:00:00 2001 From: Alex Tighe Date: Mon, 2 Sep 2019 20:49:40 -0400 Subject: [PATCH 098/396] Moving resources example from core-java-io2 to core-java-io. Removing core-java-io2 --- core-java-modules/core-java-io/pom.xml | 17 +++ .../baeldung/resource/MyResourceLoader.java | 0 core-java-modules/core-java-io2/.gitignore | 5 - core-java-modules/core-java-io2/pom.xml | 139 ------------------ .../src/main/resources/input.txt | 3 - .../src/test/resources/.gitignore | 13 -- 6 files changed, 17 insertions(+), 160 deletions(-) rename core-java-modules/{core-java-io2 => core-java-io}/src/main/java/com/baeldung/resource/MyResourceLoader.java (100%) delete mode 100644 core-java-modules/core-java-io2/.gitignore delete mode 100644 core-java-modules/core-java-io2/pom.xml delete mode 100644 core-java-modules/core-java-io2/src/main/resources/input.txt delete mode 100644 core-java-modules/core-java-io2/src/test/resources/.gitignore diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml index 1a133d2cbe..84bf3baeed 100644 --- a/core-java-modules/core-java-io/pom.xml +++ b/core-java-modules/core-java-io/pom.xml @@ -207,6 +207,21 @@ ${maven.compiler.target} + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + com.baeldung.resource.MyResourceLoader + + + + @@ -274,6 +289,8 @@ 1.18 0.1.5 + 3.1.0 + \ No newline at end of file diff --git a/core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java similarity index 100% rename from core-java-modules/core-java-io2/src/main/java/com/baeldung/resource/MyResourceLoader.java rename to core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java diff --git a/core-java-modules/core-java-io2/.gitignore b/core-java-modules/core-java-io2/.gitignore deleted file mode 100644 index c61d35324d..0000000000 --- a/core-java-modules/core-java-io2/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -0.* - -# Files generated by integration tests -# *.txt -/temp \ No newline at end of file diff --git a/core-java-modules/core-java-io2/pom.xml b/core-java-modules/core-java-io2/pom.xml deleted file mode 100644 index 922403edab..0000000000 --- a/core-java-modules/core-java-io2/pom.xml +++ /dev/null @@ -1,139 +0,0 @@ - - 4.0.0 - core-java-io2 - 0.1.0-SNAPSHOT - core-java-io2 - jar - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - - - - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - - commons-io - commons-io - 2.6 - - - - org.projectlombok - lombok - ${lombok.version} - provided - - - - log4j - log4j - ${log4j.version} - - - - org.slf4j - log4j-over-slf4j - ${org.slf4j.version} - - - - - - core-java-io2 - - - src/main/resources - true - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - java - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - -Xmx300m - -XX:+UseParallelGC - -classpath - - com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed - - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - true - com.baeldung.resource.MyResourceLoader - - - - - - - - - - integration - - - - org.codehaus.mojo - exec-maven-plugin - - - - run-benchmarks - - none - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - - - - - - - - 4.1 - - - 3.1.0 - - - - \ No newline at end of file diff --git a/core-java-modules/core-java-io2/src/main/resources/input.txt b/core-java-modules/core-java-io2/src/main/resources/input.txt deleted file mode 100644 index 8670fb3460..0000000000 --- a/core-java-modules/core-java-io2/src/main/resources/input.txt +++ /dev/null @@ -1,3 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit. -In lacus enim, scelerisque id sapien ut, semper euismod quam. -Nunc ullamcorper semper blandit. \ No newline at end of file diff --git a/core-java-modules/core-java-io2/src/test/resources/.gitignore b/core-java-modules/core-java-io2/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/core-java-modules/core-java-io2/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file From 5b2dec57486fc754e3ed5c02b4d80ddd0660eba6 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Tue, 3 Sep 2019 13:12:17 +0300 Subject: [PATCH 099/396] BAEL-3190 - Working with web services in Groovy - basic authorization --- .../groovy/com/baeldung/webservice/WebserviceUnitTest.groovy | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy index edf2dca33f..0d4b5cd7ee 100644 --- a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy +++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy @@ -6,6 +6,7 @@ import wslite.rest.RESTClient import wslite.rest.RESTClientException import wslite.soap.SOAPClient import wslite.soap.SOAPMessageBuilder +import wslite.http.auth.HTTPBasicAuthorization class WebserviceUnitTest extends GroovyTestCase { @@ -120,10 +121,12 @@ class WebserviceUnitTest extends GroovyTestCase { def path = "/basic-auth" def response try { - response = client.get(path: path, headers: ["Authorization": "Basic cG9zdG1hbjpwYXNzd29yZA=="]) + client.authorization = new HTTPBasicAuthorization("postman", "password") + response = client.get(path: path) assert response.statusCode == 200 assert response.json?.authenticated == true } catch (RESTClientException e) { + e.printStackTrace() assert e?.response?.statusCode != 200 } } From 68413d30dc706e4eb9918cd9c6c6c312d91d1eb9 Mon Sep 17 00:00:00 2001 From: Kert Pjatkin Date: Thu, 29 Aug 2019 12:53:03 +0300 Subject: [PATCH 100/396] =?UTF-8?q?[BAEL-2851]=20Debugging=20the=20Spring?= =?UTF-8?q?=20MVC=20404=20=E2=80=9CNo=20mapping=20found=20for=20HTTP=20req?= =?UTF-8?q?uest=20with=20URI...=E2=80=9D=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spring/controller/GreetingController.java | 16 ++++++++++++++++ .../src/main/webapp/WEB-INF/view/greeting.jsp | 9 +++++++++ 2 files changed, 25 insertions(+) create mode 100644 spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GreetingController.java create mode 100644 spring-mvc-xml/src/main/webapp/WEB-INF/view/greeting.jsp diff --git a/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GreetingController.java b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GreetingController.java new file mode 100644 index 0000000000..dfa50fcb26 --- /dev/null +++ b/spring-mvc-xml/src/main/java/com/baeldung/spring/controller/GreetingController.java @@ -0,0 +1,16 @@ +package com.baeldung.spring.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Controller +public class GreetingController { + + @RequestMapping(value = "/greeting", method = RequestMethod.GET) + public String get(ModelMap model) { + model.addAttribute("message", "Hello, World!"); + return "greeting"; + } +} \ No newline at end of file diff --git a/spring-mvc-xml/src/main/webapp/WEB-INF/view/greeting.jsp b/spring-mvc-xml/src/main/webapp/WEB-INF/view/greeting.jsp new file mode 100644 index 0000000000..ac17c75ab7 --- /dev/null +++ b/spring-mvc-xml/src/main/webapp/WEB-INF/view/greeting.jsp @@ -0,0 +1,9 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + Greeting + + +

${message}

+ + \ No newline at end of file From 1889628daa76b4f8b846a2596bab47229a101f51 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Tue, 3 Sep 2019 16:27:36 +0200 Subject: [PATCH 101/396] BAEL-2966 --- .../interpolation/NotNullRequest.java | 17 ++++++++++ .../interpolation/RestController.java | 15 +++++++++ .../interpolation/ValidationExamples.java | 31 +++++++++++++++++++ 3 files changed, 63 insertions(+) create mode 100644 spring-core-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java create mode 100644 spring-core-2/src/main/java/com/baeldung/interpolation/RestController.java create mode 100644 spring-core-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java diff --git a/spring-core-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java b/spring-core-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java new file mode 100644 index 0000000000..9a2b00be8f --- /dev/null +++ b/spring-core-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java @@ -0,0 +1,17 @@ +package com.baeldung.interpolation; + +import javax.validation.constraints.NotNull; + +public class NotNullRequest { + + @NotNull(message = "stringValue has to be present") + private String stringValue; + + public String getStringValue() { + return stringValue; + } + + public void setStringValue(String stringValue) { + this.stringValue = stringValue; + } +} diff --git a/spring-core-2/src/main/java/com/baeldung/interpolation/RestController.java b/spring-core-2/src/main/java/com/baeldung/interpolation/RestController.java new file mode 100644 index 0000000000..87b16320fe --- /dev/null +++ b/spring-core-2/src/main/java/com/baeldung/interpolation/RestController.java @@ -0,0 +1,15 @@ +package com.baeldung.interpolation; + +import javax.validation.Valid; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class RestController { + + @PostMapping("/test-not-null") + public void testNotNull(@Valid @RequestBody NotNullRequest request) { + + } +} diff --git a/spring-core-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java b/spring-core-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java new file mode 100644 index 0000000000..d353e4f7f2 --- /dev/null +++ b/spring-core-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java @@ -0,0 +1,31 @@ +package com.baeldung.interpolation; + +import java.util.Formatter; +import javax.validation.constraints.Size; +import javax.validation.constraints.Min; +import javax.validation.constraints.DecimalMin; + +public class ValidationExamples { + + private static final Formatter formatter = new Formatter(); + + @Size( + min = 5, + max = 14, + message = "The author email '${validatedValue}' must be between {min} and {max} characters long" + ) + private String authorEmail; + + @Min( + value = 1, + message = "There must be at least {value} test{value > 1 ? 's' : ''} int the test case" + ) + private int testCount; + + @DecimalMin( + value = "50", + message = "The code coverage ${formatter.format('%1$.2f', validatedValue)} must be higher than {value}%" + ) + private double codeCoverage; + +} From 40ec4b95982661c03d93a9dec24c14e5cc46c61d Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Tue, 3 Sep 2019 16:32:13 +0200 Subject: [PATCH 102/396] add validation to pom --- spring-core-2/pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index d68beda64a..6c2635c88b 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -41,6 +41,11 @@ ${junit-jupiter.version} test + + javax.validation + validation-api + ${validation-api.version} + @@ -55,6 +60,7 @@ 2.22.1 + 2.0.1.Final - \ No newline at end of file + From 017992bf74006e111b0a4152035a5ed2f586f9be Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Tue, 3 Sep 2019 16:39:23 +0200 Subject: [PATCH 103/396] move to new module --- spring-core-2/pom.xml | 6 ------ .../java/com/baeldung/interpolation/NotNullRequest.java | 0 .../java/com/baeldung/interpolation/RestController.java | 0 .../java/com/baeldung/interpolation/ValidationExamples.java | 0 4 files changed, 6 deletions(-) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/com/baeldung/interpolation/NotNullRequest.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/com/baeldung/interpolation/RestController.java (100%) rename {spring-core-2 => spring-mvc-simple-2}/src/main/java/com/baeldung/interpolation/ValidationExamples.java (100%) diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index 6c2635c88b..e24839b737 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -41,11 +41,6 @@ ${junit-jupiter.version} test - - javax.validation - validation-api - ${validation-api.version} - @@ -60,7 +55,6 @@ 2.22.1 - 2.0.1.Final diff --git a/spring-core-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java rename to spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/NotNullRequest.java diff --git a/spring-core-2/src/main/java/com/baeldung/interpolation/RestController.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/RestController.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/interpolation/RestController.java rename to spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/RestController.java diff --git a/spring-core-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java rename to spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java From 6627bcdc841e7bec124a281770a9070e39b225e9 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Tue, 3 Sep 2019 16:41:50 +0200 Subject: [PATCH 104/396] rename file --- .../{RestController.java => ValidationController.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/{RestController.java => ValidationController.java} (91%) diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/RestController.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationController.java similarity index 91% rename from spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/RestController.java rename to spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationController.java index 87b16320fe..3fed170fdf 100644 --- a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/RestController.java +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationController.java @@ -6,7 +6,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController -public class RestController { +public class ValidationController { @PostMapping("/test-not-null") public void testNotNull(@Valid @RequestBody NotNullRequest request) { From 06cbdfce02f67223f9aaa67389d4cd90dd85bd3f Mon Sep 17 00:00:00 2001 From: fanatixan Date: Tue, 3 Sep 2019 18:26:21 +0200 Subject: [PATCH 105/396] bael-3208 command line arguments examples (#7704) * bael-3208 command line arguments examples * moved command line argument examples from core-java-lang to core-java-lang-2 --- core-java-modules/core-java-lang-2/.gitignore | 25 ++++++++++++++ core-java-modules/core-java-lang-2/README.md | 5 +++ core-java-modules/core-java-lang-2/pom.xml | 33 +++++++++++++++++++ .../commandlinearguments/CliExample.java | 12 +++++++ .../CliExampleWithVarargs.java | 12 +++++++ pom.xml | 2 ++ 6 files changed, 89 insertions(+) create mode 100644 core-java-modules/core-java-lang-2/.gitignore create mode 100644 core-java-modules/core-java-lang-2/README.md create mode 100644 core-java-modules/core-java-lang-2/pom.xml create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java create mode 100644 core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java diff --git a/core-java-modules/core-java-lang-2/.gitignore b/core-java-modules/core-java-lang-2/.gitignore new file mode 100644 index 0000000000..374c8bf907 --- /dev/null +++ b/core-java-modules/core-java-lang-2/.gitignore @@ -0,0 +1,25 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md new file mode 100644 index 0000000000..88a48661a0 --- /dev/null +++ b/core-java-modules/core-java-lang-2/README.md @@ -0,0 +1,5 @@ +========= + +## Core Java Lang Cookbooks and Examples + +### Relevant Articles: diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml new file mode 100644 index 0000000000..4b02e06be4 --- /dev/null +++ b/core-java-modules/core-java-lang-2/pom.xml @@ -0,0 +1,33 @@ + + 4.0.0 + com.baeldung + core-java-lang-2 + 0.1.0-SNAPSHOT + core-java-lang-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + + core-java-lang-2 + + + src/main/resources + true + + + + + + + + diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java new file mode 100644 index 0000000000..d6a7dec8aa --- /dev/null +++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExample.java @@ -0,0 +1,12 @@ +package com.baeldung.commandlinearguments; + +public class CliExample { + + public static void main(String[] args) { + System.out.println("Argument count: " + args.length); + for (int i = 0; i < args.length; i++) { + System.out.println("Argument " + i + ": " + args[i]); + } + } + +} diff --git a/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java new file mode 100644 index 0000000000..899e03416e --- /dev/null +++ b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/commandlinearguments/CliExampleWithVarargs.java @@ -0,0 +1,12 @@ +package com.baeldung.commandlinearguments; + +public class CliExampleWithVarargs { + + public static void main(String... args) { + System.out.println("Argument count: " + args.length); + for (int i = 0; i < args.length; i++) { + System.out.println("Argument " + i + ": " + args[i]); + } + } + +} diff --git a/pom.xml b/pom.xml index 005d6b6e2c..21d87d9852 100644 --- a/pom.xml +++ b/pom.xml @@ -404,6 +404,7 @@ core-java-modules/core-java-security core-java-modules/core-java-lang-syntax core-java-modules/core-java-lang + core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop core-java-modules/core-java-lang-oop-2 core-java-modules @@ -1126,6 +1127,7 @@ core-java-modules/core-java-security core-java-modules/core-java-lang-syntax core-java-modules/core-java-lang + core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop core-java-modules/core-java-lang-oop-2 core-java-modules From d68530b53950f5825b60ebc1822adbd4875ec4dc Mon Sep 17 00:00:00 2001 From: Maciej Andrearczyk Date: Tue, 27 Aug 2019 22:21:37 +0200 Subject: [PATCH 106/396] BAEL-3192 | A guide to System.gc() --- .../baeldung/systemgc/DemoApplication.java | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java diff --git a/core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java new file mode 100644 index 0000000000..8bca55c5f0 --- /dev/null +++ b/core-java-modules/core-java-jvm/src/main/java/com/baeldung/systemgc/DemoApplication.java @@ -0,0 +1,33 @@ +package com.baeldung.systemgc; + +import java.util.HashMap; +import java.util.Map; +import java.util.Scanner; + +import static java.util.UUID.randomUUID; + +public class DemoApplication { + + private static final Map cache = new HashMap(); + + public static void main(String[] args) { + Scanner scanner = new Scanner(System.in); + + while (scanner.hasNext()) { + final String next = scanner.next(); + if ("fill".equals(next)) { + for (int i = 0; i < 1000000; i++) { + cache.put(randomUUID().toString(), randomUUID().toString()); + } + } else if ("invalidate".equals(next)) { + cache.clear(); + } else if ("gc".equals(next)) { + System.gc(); + } else if ("exit".equals(next)) { + System.exit(0); + } else { + System.out.println("unknown"); + } + } + } +} \ No newline at end of file From 2da48b91e74bd8df48cb3a86467aa32addb0340e Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Tue, 3 Sep 2019 19:47:15 +0100 Subject: [PATCH 107/396] moved files to core-java-modules/core-java-reflection --- core-java-modules/core-java-8/README.md | 1 - core-java-modules/core-java-8/pom.xml | 11 --------- core-java-modules/core-java-lang/README.md | 5 +--- .../core-java-reflection/README.MD | 5 ++++ .../core-java-reflection/pom.xml | 23 +++++++++++++++++++ .../DynamicInvocationHandler.java | 0 .../TimingDynamicInvocationHandler.java | 0 .../java/com/baeldung/reflect/Person.java | 0 .../reflection}/java/reflection/Animal.java | 0 .../reflection}/java/reflection/Bird.java | 0 .../java/reflection/DynamicGreeter.java | 0 .../reflection}/java/reflection/Eating.java | 0 .../reflection}/java/reflection/Goat.java | 0 .../reflection}/java/reflection/Greeter.java | 0 .../java/reflection/GreetingAnnotation.java | 0 .../java/reflection/Greetings.java | 0 .../java/reflection/Locomotion.java | 0 .../java/reflection/Operations.java | 0 .../reflection}/java/reflection/Person.java | 0 .../DynamicProxyIntegrationTest.java | 0 .../reflect/MethodParamNameUnitTest.java | 0 .../java/reflection/OperationsUnitTest.java | 0 .../java/reflection/ReflectionUnitTest.java | 0 23 files changed, 29 insertions(+), 16 deletions(-) rename core-java-modules/{core-java-lang => core-java-reflection}/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java (100%) rename core-java-modules/{core-java-lang => core-java-reflection}/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java (100%) rename core-java-modules/{core-java-8 => core-java-reflection}/src/main/java/com/baeldung/reflect/Person.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/Animal.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/Bird.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/DynamicGreeter.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/Eating.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/Goat.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/Greeter.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/GreetingAnnotation.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/Greetings.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/Locomotion.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/Operations.java (100%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-reflection/src/main/java/com/baeldung/reflection}/java/reflection/Person.java (100%) rename core-java-modules/{core-java-lang => core-java-reflection}/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java (100%) rename core-java-modules/{core-java-8 => core-java-reflection}/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java (100%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-reflection/src/test/java/com/baeldung/reflection}/java/reflection/OperationsUnitTest.java (100%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-reflection/src/test/java/com/baeldung/reflection}/java/reflection/ReflectionUnitTest.java (100%) diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md index 6e79eddd16..aee7121fb3 100644 --- a/core-java-modules/core-java-8/README.md +++ b/core-java-modules/core-java-8/README.md @@ -20,7 +20,6 @@ - [Finding Min/Max in an Array with Java](http://www.baeldung.com/java-array-min-max) - [Internationalization and Localization in Java 8](http://www.baeldung.com/java-8-localization) - [Java Optional – orElse() vs orElseGet()](http://www.baeldung.com/java-optional-or-else-vs-or-else-get) -- [Method Parameter Reflection in Java](http://www.baeldung.com/java-parameter-reflection) - [Java 8 Unsigned Arithmetic Support](http://www.baeldung.com/java-unsigned-arithmetic) - [Generalized Target-Type Inference in Java](http://www.baeldung.com/java-generalized-target-type-inference) - [Overriding System Time for Testing in Java](http://www.baeldung.com/java-override-system-time) diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml index 28182e515b..6e547b7fad 100644 --- a/core-java-modules/core-java-8/pom.xml +++ b/core-java-modules/core-java-8/pom.xml @@ -134,16 +134,6 @@
- - org.apache.maven.plugins - maven-compiler-plugin - ${maven-compiler-plugin.version} - - 1.8 - 1.8 - -parameters - - org.springframework.boot spring-boot-maven-plugin @@ -192,7 +182,6 @@ 1.19 2.0.4.RELEASE - 3.8.0 2.22.1 diff --git a/core-java-modules/core-java-lang/README.md b/core-java-modules/core-java-lang/README.md index 74936eac21..f3b6d3d8e5 100644 --- a/core-java-modules/core-java-lang/README.md +++ b/core-java-modules/core-java-lang/README.md @@ -3,13 +3,10 @@ ## Core Java Lang Cookbooks and Examples ### Relevant Articles: -- [Guide to Java Reflection](http://www.baeldung.com/java-reflection) + - [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) - [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions) -- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection) - [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration) -- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params) -- [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies) - [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization) - [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator) - [Comparator and Comparable in Java](http://www.baeldung.com/java-comparator-comparable) diff --git a/core-java-modules/core-java-reflection/README.MD b/core-java-modules/core-java-reflection/README.MD index c8766d6858..e46a97cd3d 100644 --- a/core-java-modules/core-java-reflection/README.MD +++ b/core-java-modules/core-java-reflection/README.MD @@ -1,3 +1,8 @@ ## Relevant Articles - [Void Type in Java](https://www.baeldung.com/java-void-type) +- [Method Parameter Reflection in Java](http://www.baeldung.com/java-parameter-reflection) +- [Guide to Java Reflection](http://www.baeldung.com/java-reflection) +- [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection) +- [Changing Annotation Parameters At Runtime](http://www.baeldung.com/java-reflection-change-annotation-params) +- [Dynamic Proxies in Java](http://www.baeldung.com/java-dynamic-proxies) diff --git a/core-java-modules/core-java-reflection/pom.xml b/core-java-modules/core-java-reflection/pom.xml index e6c7f81d6c..b3c3390df8 100644 --- a/core-java-modules/core-java-reflection/pom.xml +++ b/core-java-modules/core-java-reflection/pom.xml @@ -23,7 +23,30 @@ + + core-java-reflection + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + 1.8 + 1.8 + -parameters + + + + + + 3.8.0 3.10.0 \ No newline at end of file diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/DynamicInvocationHandler.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/dynamicproxy/TimingDynamicInvocationHandler.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reflect/Person.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflect/Person.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reflect/Person.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflect/Person.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Animal.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Animal.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Animal.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Bird.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Bird.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Bird.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/DynamicGreeter.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/DynamicGreeter.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/DynamicGreeter.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Eating.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Eating.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Eating.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Goat.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Goat.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Goat.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greeter.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greeter.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greeter.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/GreetingAnnotation.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/GreetingAnnotation.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/GreetingAnnotation.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greetings.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Greetings.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Greetings.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Locomotion.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Locomotion.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Locomotion.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Operations.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Operations.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Operations.java diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Person.java similarity index 100% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/java/reflection/Person.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/java/reflection/Person.java diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java similarity index 100% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/dynamicproxy/DynamicProxyIntegrationTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflect/MethodParamNameUnitTest.java diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/OperationsUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/OperationsUnitTest.java rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/OperationsUnitTest.java diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/ReflectionUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/java/reflection/ReflectionUnitTest.java rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/java/reflection/ReflectionUnitTest.java From b04e2c32b23a378ef145893ebf99ba20306492e2 Mon Sep 17 00:00:00 2001 From: Lukasz Rys <> Date: Tue, 3 Sep 2019 20:50:27 +0200 Subject: [PATCH 108/396] [ BAEL-1869 ]: Delete the article from README.MD. Reformat. --- spring-5-data-reactive/README.md | 1 - .../couchbase/configuration/CouchbaseProperties.java | 5 +---- .../configuration/ReactiveCouchbaseConfiguration.java | 3 --- 3 files changed, 1 insertion(+), 8 deletions(-) diff --git a/spring-5-data-reactive/README.md b/spring-5-data-reactive/README.md index 4e342532b2..4c2347dc77 100644 --- a/spring-5-data-reactive/README.md +++ b/spring-5-data-reactive/README.md @@ -8,4 +8,3 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring Data Reactive Repositories with MongoDB](http://www.baeldung.com/spring-data-mongodb-reactive) - [Spring Data MongoDB Tailable Cursors](https://www.baeldung.com/spring-data-mongodb-tailable-cursors) - [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc) -- [Embedded Redis Server with Spring Boot Test]() diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java index 85c6997c6a..480c96e986 100644 --- a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java @@ -14,10 +14,7 @@ public class CouchbaseProperties { private final String bucketPassword; private final int port; - public CouchbaseProperties( - @Value("${spring.couchbase.bootstrap-hosts}") final List bootstrapHosts, - @Value("${spring.couchbase.bucket.name}") final String bucketName, - @Value("${spring.couchbase.bucket.password}") final String bucketPassword, + public CouchbaseProperties(@Value("${spring.couchbase.bootstrap-hosts}") final List bootstrapHosts, @Value("${spring.couchbase.bucket.name}") final String bucketName, @Value("${spring.couchbase.bucket.password}") final String bucketPassword, @Value("${spring.couchbase.port}") final int port) { this.bootstrapHosts = Collections.unmodifiableList(bootstrapHosts); this.bucketName = bucketName; diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java index 3bd66a895a..2f3b5486d8 100644 --- a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java @@ -2,10 +2,7 @@ package com.baeldung.couchbase.configuration; import com.couchbase.client.java.env.CouchbaseEnvironment; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; -import org.springframework.context.annotation.Bean; import org.springframework.data.couchbase.config.AbstractReactiveCouchbaseConfiguration; -import org.springframework.data.couchbase.config.BeanNames; -import org.springframework.data.couchbase.repository.support.IndexManager; import java.util.List; From 4a536e394a331a6652203d048186fd45798a588c Mon Sep 17 00:00:00 2001 From: Alex Tighe Date: Tue, 3 Sep 2019 18:24:12 -0400 Subject: [PATCH 109/396] Removing stray core-java-io2 in tutorials pom file. --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index af5cf4ff03..3fd1bcf5fb 100644 --- a/pom.xml +++ b/pom.xml @@ -396,7 +396,6 @@ core-java-modules/core-java-concurrency-basic core-java-modules/core-java-concurrency-collections core-java-modules/core-java-io - core-java-modules/core-java-io2 core-java-modules/core-java-nio core-java-modules/core-java-security core-java-modules/core-java-lang-syntax From 747212790941df5ad7c385812779214ea84d13b9 Mon Sep 17 00:00:00 2001 From: hugogiordano <36562956+hugogiordano@users.noreply.github.com> Date: Wed, 4 Sep 2019 14:37:40 +1000 Subject: [PATCH 110/396] BAEL-3188 How to compress requests using the Spring RestTemplate. (#7688) * BAEL-3188 How to compress requests using the Spring RestTemplate. * BAEL-3188 How to compress requests using the Spring RestTemplate. Updated README. * BAEL-3188 How to compress requests using the Spring RestTemplate. * BAEL-3188 How to compress requests using the Spring RestTemplate. * BAEL-3188 How to compress requests using the Spring RestTemplate. Updated parent pom to add new module. --- pom.xml | 3 + spring-rest-compress/README.md | 5 ++ spring-rest-compress/pom.xml | 66 +++++++++++++++++++ ...mpressingClientHttpRequestInterceptor.java | 38 +++++++++++ .../spring/rest/compress/GzipUtils.java | 56 ++++++++++++++++ .../compress/JettyWebServerConfiguration.java | 38 +++++++++++ .../spring/rest/compress/Message.java | 29 ++++++++ .../rest/compress/MessageController.java | 38 +++++++++++ .../compress/RestTemplateConfiguration.java | 21 ++++++ .../SpringCompressRequestApplication.java | 15 +++++ .../rest/compress/GzipUtilsUnitTest.java | 19 ++++++ .../compress/MessageControllerUnitTest.java | 56 ++++++++++++++++ 12 files changed, 384 insertions(+) create mode 100644 spring-rest-compress/README.md create mode 100644 spring-rest-compress/pom.xml create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java create mode 100644 spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java create mode 100644 spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java create mode 100644 spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java diff --git a/pom.xml b/pom.xml index 21d87d9852..005a24effa 100644 --- a/pom.xml +++ b/pom.xml @@ -741,6 +741,7 @@ spring-remoting spring-rest spring-rest-angular + spring-rest-compress spring-rest-full spring-rest-hal-browser spring-rest-query-language @@ -928,6 +929,7 @@ spring-remoting/remoting-rmi/remoting-rmi-server spring-rest spring-rest-angular + spring-rest-compress spring-rest-full spring-rest-simple spring-resttemplate @@ -1433,6 +1435,7 @@ spring-remoting spring-rest spring-rest-angular + spring-rest-compress spring-rest-full spring-rest-hal-browser spring-rest-query-language diff --git a/spring-rest-compress/README.md b/spring-rest-compress/README.md new file mode 100644 index 0000000000..238c28e4b5 --- /dev/null +++ b/spring-rest-compress/README.md @@ -0,0 +1,5 @@ +========================================================================= +## How to compress requests using the Spring RestTemplate Example Project + +### Relevant Articles: +- [How to compress requests using the Spring RestTemplate]() diff --git a/spring-rest-compress/pom.xml b/spring-rest-compress/pom.xml new file mode 100644 index 0000000000..d5afc5708d --- /dev/null +++ b/spring-rest-compress/pom.xml @@ -0,0 +1,66 @@ + + + 4.0.0 + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + com.baeldung + spring-rest-compress + 0.0.1-SNAPSHOT + spring-rest-compress + + + 1.8 + 2.6 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-jetty + + + + org.apache.httpcomponents + httpclient + + + + commons-io + commons-io + ${commons-io.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java new file mode 100644 index 0000000000..7d5326246d --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/CompressingClientHttpRequestInterceptor.java @@ -0,0 +1,38 @@ +package org.baeldung.spring.rest.compress; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; + +public class CompressingClientHttpRequestInterceptor implements ClientHttpRequestInterceptor { + + private static final Logger LOG = LoggerFactory.getLogger(CompressingClientHttpRequestInterceptor.class); + + private static final String GZIP_ENCODING = "gzip"; + + /** + * Compress a request body using Gzip and add Http headers. + * + * @param req + * @param body + * @param exec + * @return + * @throws IOException + */ + @Override + public ClientHttpResponse intercept(HttpRequest req, byte[] body, ClientHttpRequestExecution exec) + throws IOException { + LOG.info("Compressing request..."); + HttpHeaders httpHeaders = req.getHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_ENCODING, GZIP_ENCODING); + httpHeaders.add(HttpHeaders.ACCEPT_ENCODING, GZIP_ENCODING); + return exec.execute(req, GzipUtils.compress(body)); + } + +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java new file mode 100644 index 0000000000..f3cb8bd631 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java @@ -0,0 +1,56 @@ +package org.baeldung.spring.rest.compress; + +import org.apache.commons.codec.Charsets; +import org.apache.commons.io.IOUtils; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.zip.GZIPInputStream; +import java.util.zip.GZIPOutputStream; + +public class GzipUtils { + + /** + * Gzip a string. + * + * @param text + * @return + * @throws Exception + */ + public static byte[] compress(String text) throws Exception { + return GzipUtils.compress(text.getBytes(Charsets.UTF_8)); + } + + /** + * Gzip a byte array. + * + * @param body + * @return + * @throws IOException + */ + public static byte[] compress(byte[] body) throws IOException { + ByteArrayOutputStream output = new ByteArrayOutputStream(); + try { + try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(output)) { + gzipOutputStream.write(body); + } + } finally { + output.close(); + } + return output.toByteArray(); + } + + /** + * Decompress a Gzipped byte array to a String. + * + * @param body + * @return + * @throws IOException + */ + public static String decompress(byte[] body) throws IOException { + try (GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(body))) { + return IOUtils.toString(gzipInputStream, Charsets.UTF_8); + } + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java new file mode 100644 index 0000000000..784814b04d --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/JettyWebServerConfiguration.java @@ -0,0 +1,38 @@ +package org.baeldung.spring.rest.compress; + +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.server.handler.gzip.GzipHandler; +import org.springframework.boot.web.embedded.jetty.JettyServletWebServerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Configure Jetty web server so it handles compressed requests. + */ +@Configuration +public class JettyWebServerConfiguration { + + private static final int MIN_BYTES = 1; + + /** + * Customise the Jetty web server to automatically decompress requests. + */ + @Bean + public JettyServletWebServerFactory jettyServletWebServerFactory() { + + JettyServletWebServerFactory factory = new JettyServletWebServerFactory(); + factory.addServerCustomizers(server -> { + + GzipHandler gzipHandler = new GzipHandler(); + // Enable request decompression + gzipHandler.setInflateBufferSize(MIN_BYTES); + gzipHandler.setHandler(server.getHandler()); + + HandlerCollection handlerCollection = new HandlerCollection(gzipHandler); + server.setHandler(handlerCollection); + }); + + return factory; + } + +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java new file mode 100644 index 0000000000..d3450b227c --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/Message.java @@ -0,0 +1,29 @@ +package org.baeldung.spring.rest.compress; + +public class Message { + + private String text; + + public Message() { + } + + public Message(String text) { + this.text = text; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder("Message {"); + sb.append("text='").append(text).append('\''); + sb.append('}'); + return sb.toString(); + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java new file mode 100644 index 0000000000..657c3cfec8 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/MessageController.java @@ -0,0 +1,38 @@ +package org.baeldung.spring.rest.compress; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +public class MessageController { + + protected static final String PROCESSED = "Processed "; + + protected static final String REQUEST_MAPPING = "process"; + + private static final Logger LOG = LoggerFactory.getLogger(MessageController.class); + + /** + * A simple endpoint that responds with "Processed " + supplied Message content. + * + * @param headers + * @param message + * @return + */ + @PostMapping(value = REQUEST_MAPPING) + public ResponseEntity processMessage(@RequestHeader Map headers, + @RequestBody Message message) { + + // Print headers + headers.forEach((k, v) -> LOG.info(k + "=" + v)); + + return ResponseEntity.ok(PROCESSED + message.getText()); + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java new file mode 100644 index 0000000000..e1d0f985d9 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/RestTemplateConfiguration.java @@ -0,0 +1,21 @@ +package org.baeldung.spring.rest.compress; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Configuration +public class RestTemplateConfiguration { + + /** + * A RestTemplate that compresses requests. + * + * @return RestTemplate + */ + @Bean + public RestTemplate getRestTemplate() { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.getInterceptors().add(new CompressingClientHttpRequestInterceptor()); + return restTemplate; + } +} diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java new file mode 100644 index 0000000000..3082e3c277 --- /dev/null +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/SpringCompressRequestApplication.java @@ -0,0 +1,15 @@ +package org.baeldung.spring.rest.compress; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@EnableAutoConfiguration +public class SpringCompressRequestApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringCompressRequestApplication.class, args); + } + +} diff --git a/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java new file mode 100644 index 0000000000..d238c9ec7c --- /dev/null +++ b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/GzipUtilsUnitTest.java @@ -0,0 +1,19 @@ +package org.baeldung.spring.rest.compress; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class GzipUtilsUnitTest { + + @Test + public void givenCompressedText_whenDecompressed_thenSuccessful() throws Exception { + final String expectedText = "Hello Baeldung!"; + byte[] compressedText = GzipUtils.compress(expectedText); + String decompressedText = GzipUtils.decompress(compressedText); + assertNotNull(compressedText); + assertEquals(expectedText, decompressedText); + } + +} \ No newline at end of file diff --git a/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java new file mode 100644 index 0000000000..9658204917 --- /dev/null +++ b/spring-rest-compress/src/test/java/org/baeldung/spring/rest/compress/MessageControllerUnitTest.java @@ -0,0 +1,56 @@ +package org.baeldung.spring.rest.compress; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.web.client.RestTemplate; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +@RunWith(SpringRunner.class) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class MessageControllerUnitTest { + + private static final Logger LOG = LoggerFactory.getLogger(MessageControllerUnitTest.class); + + @Autowired + private RestTemplate restTemplate; + + @LocalServerPort + private int randomServerPort; + + /** + * As a further test you can intercept the request body, using a tool like + * Wireshark, to see the request body is actually gzipped. + * + * @throws Exception + */ + @Test + public void givenRestTemplate_whenPostCompressedRequest_thenRespondsSuccessfully() throws Exception { + + final String text = "Hello Baeldung!"; + Message message = new Message(text); + + HttpEntity request = new HttpEntity<>(message); + String uri = String.format("http://localhost:%s/%s", randomServerPort, MessageController.REQUEST_MAPPING); + + ResponseEntity responseEntity = restTemplate.postForEntity(uri, request, String.class); + + String response = responseEntity.getBody(); + LOG.info("Got response [{}]", response); + + assertEquals(HttpStatus.OK, responseEntity.getStatusCode()); + assertNotNull(response); + assertEquals(MessageController.PROCESSED + text, response); + } + +} From c4a1b44b395efd0fd7590fda7c5552d8215deff7 Mon Sep 17 00:00:00 2001 From: Shubhra Srivastava Date: Wed, 4 Sep 2019 10:11:21 +0530 Subject: [PATCH 111/396] Bael 3207 convert char array to string (#7720) * BAEL-320 Convert Char Array to String * BAEL-3207 re-formatting * BAEL-3207 some changes --- .../CharArrayToStringConversionUnitTest.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java index 11002ece0f..1030185c3e 100644 --- a/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java +++ b/java-strings-3/src/test/java/com/baeldung/string/charArrayToString/CharArrayToStringConversionUnitTest.java @@ -41,11 +41,11 @@ public class CharArrayToStringConversionUnitTest { @Test public void whenStringBuilder_thenOK() { - final char[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; + final char[][] arrayOfCharArray = { { 'b', 'a' }, { 'e', 'l', 'd', 'u' }, { 'n', 'g' } }; StringBuilder sb = new StringBuilder(); - for (char value : charArray) { - sb.append(value); + for (char[] subArray : arrayOfCharArray) { + sb.append(subArray); } assertThat(sb.toString(), is("baeldung")); @@ -65,9 +65,8 @@ public class CharArrayToStringConversionUnitTest { public void whenGoogleCommonBaseJoiners_thenOK() { final Character[] charArray = { 'b', 'a', 'e', 'l', 'd', 'u', 'n', 'g' }; - String string = Joiner.on("").join(charArray); + String string = Joiner.on("|").join(charArray); - assertThat(string, is("baeldung")); + assertThat(string, is("b|a|e|l|d|u|n|g")); } - } From 73743acb30fbf4c80dc0b768149660fbc3618dd0 Mon Sep 17 00:00:00 2001 From: Denis Date: Wed, 4 Sep 2019 21:30:42 +0800 Subject: [PATCH 112/396] BAEL-1529 Intro to the Java SecurityManager (#7697) --- .../core-java-security-manager/pom.xml | 34 ++++++++++++++++++ .../security/manager/CustomPermission.java | 13 +++++++ .../baeldung/security/manager/Service.java | 18 ++++++++++ .../manager/SecurityManagerUnitTest.java | 35 +++++++++++++++++++ core-java-modules/pom.xml | 1 + 5 files changed, 101 insertions(+) create mode 100644 core-java-modules/core-java-security-manager/pom.xml create mode 100644 core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java create mode 100644 core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java create mode 100644 core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java diff --git a/core-java-modules/core-java-security-manager/pom.xml b/core-java-modules/core-java-security-manager/pom.xml new file mode 100644 index 0000000000..51d5e7d78f --- /dev/null +++ b/core-java-modules/core-java-security-manager/pom.xml @@ -0,0 +1,34 @@ + + 4.0.0 + core-java-security-manager + 0.1.0-SNAPSHOT + jar + core-java-security-manager + + + com.baeldung.core-java-modules + core-java-modules + 1.0.0-SNAPSHOT + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + + + UTF-8 + 1.8 + 1.8 + + diff --git a/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java new file mode 100644 index 0000000000..5f9c43336f --- /dev/null +++ b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/CustomPermission.java @@ -0,0 +1,13 @@ +package com.baeldung.security.manager; + +import java.security.BasicPermission; + +public class CustomPermission extends BasicPermission { + public CustomPermission(String name) { + super(name); + } + + public CustomPermission(String name, String actions) { + super(name, actions); + } +} diff --git a/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java new file mode 100644 index 0000000000..1b9f14e3b8 --- /dev/null +++ b/core-java-modules/core-java-security-manager/src/main/java/com/baeldung/security/manager/Service.java @@ -0,0 +1,18 @@ +package com.baeldung.security.manager; + +public class Service { + + public static final String OPERATION = "my-operation"; + + public void operation() { + SecurityManager securityManager = System.getSecurityManager(); + if (securityManager != null) { + securityManager.checkPermission(new CustomPermission(OPERATION)); + } + System.out.println("Operation is executed"); + } + + public static void main(String[] args) { + new Service().operation(); + } +} diff --git a/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java b/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java new file mode 100644 index 0000000000..a845f233b5 --- /dev/null +++ b/core-java-modules/core-java-security-manager/src/test/java/com/baeldung/security/manager/SecurityManagerUnitTest.java @@ -0,0 +1,35 @@ +package com.baeldung.security.manager; + +import org.junit.Test; + +import java.net.URL; +import java.security.AccessControlException; +import java.util.concurrent.Callable; + +public class SecurityManagerUnitTest { + + @Test(expected = AccessControlException.class) + public void whenSecurityManagerIsActive_thenNetworkIsNotAccessibleByDefault() throws Exception { + doTest(() -> { + new URL("http://www.google.com").openConnection().connect(); + return null; + }); + } + + @Test(expected = AccessControlException.class) + public void whenUnauthorizedClassTriesToAccessProtectedOperation_thenAnExceptionIsThrown() throws Exception { + doTest(() -> { + new Service().operation(); + return null; + }); + } + + private void doTest(Callable action) throws Exception { + System.setSecurityManager(new SecurityManager()); + try { + action.call(); + } finally { + System.setSecurityManager(null); + } + } +} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index ecf1f4147e..082ffbef53 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -19,6 +19,7 @@ core-java-optional core-java-lang-operators core-java-networking-2 + core-java-security-manager From 8c11eeb20e1370295041d039941e1504d9162b0f Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Wed, 4 Sep 2019 19:07:13 +0530 Subject: [PATCH 113/396] Java blockchain (#7694) * Adding source code for the article tracked under BAEL-3232. * Incorporated the review comments on the article. --- .../src/main/java/com/baeldung/blockchain/Block.java | 5 ++--- .../java/com/baeldung/blockchain/BlockchainUnitTest.java | 7 ++++--- pom.xml | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java index 264e3c4b69..6b4e971cd7 100644 --- a/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java +++ b/java-blockchain/src/main/java/com/baeldung/blockchain/Block.java @@ -3,7 +3,6 @@ package com.baeldung.blockchain; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import java.util.Date; import java.util.logging.Level; import java.util.logging.Logger; @@ -17,10 +16,10 @@ public class Block { private long timeStamp; private int nonce; - public Block(String data, String previousHash) { + public Block(String data, String previousHash, long timeStamp) { this.data = data; this.previousHash = previousHash; - this.timeStamp = new Date().getTime(); + this.timeStamp = timeStamp; this.hash = calculateBlockHash(); } diff --git a/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java index acbf651e78..883e55c351 100644 --- a/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java +++ b/java-blockchain/src/test/java/com/baeldung/blockchain/BlockchainUnitTest.java @@ -3,6 +3,7 @@ package com.baeldung.blockchain; import static org.junit.jupiter.api.Assertions.assertTrue; import java.util.ArrayList; +import java.util.Date; import java.util.List; import org.junit.AfterClass; @@ -17,10 +18,10 @@ public class BlockchainUnitTest { @BeforeClass public static void setUp() { - Block genesisBlock = new Block("The is the Genesis Block.", "0"); + Block genesisBlock = new Block("The is the Genesis Block.", "0", new Date().getTime()); genesisBlock.mineBlock(prefix); blockchain.add(genesisBlock); - Block firstBlock = new Block("The is the First Block.", genesisBlock.getHash()); + Block firstBlock = new Block("The is the First Block.", genesisBlock.getHash(), new Date().getTime()); firstBlock.mineBlock(prefix); blockchain.add(firstBlock); } @@ -28,7 +29,7 @@ public class BlockchainUnitTest { @Test public void givenBlockchain_whenNewBlockAdded_thenSuccess() { Block newBlock = new Block("The is a New Block.", blockchain.get(blockchain.size() - 1) - .getHash()); + .getHash(), new Date().getTime()); newBlock.mineBlock(prefix); assertTrue(newBlock.getHash() .substring(0, prefix) diff --git a/pom.xml b/pom.xml index 005a24effa..81338b9f81 100644 --- a/pom.xml +++ b/pom.xml @@ -579,7 +579,7 @@ spring-boot-nashorn java-blockchain - + From ce9ea390bac0f90eaa9501ec6a3a64ecf06a7592 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Wed, 4 Sep 2019 18:03:26 +0100 Subject: [PATCH 114/396] renamed back to testing-modules, pulled together testing-modules-2 modules into single module --- pom.xml | 8 ++--- testing-libraries-2/lambdabehave/pom.xml | 28 ------------------ testing-libraries-2/mutations/pom.xml | 16 ---------- testing-libraries-2/pom.xml | 22 -------------- .../README.md | 0 .../cucumber => testing-modules-2}/pom.xml | 17 +++++++---- .../com/baeldung/cucumber/Calculator.java | 0 .../com/baeldung/lambdabehave/Calculator.java | 0 .../com/baeldung/mutation/Palindrome.java | 0 .../calculator/CalculatorIntegrationTest.java | 0 .../calculator/CalculatorRunSteps.java | 0 .../lambdabehave/CalculatorUnitTest.java | 0 .../baeldung/mutation/PalindromeUnitTest.java | 0 .../shopping/ShoppingIntegrationTest.java | 0 .../baeldung/shopping/ShoppingStepsDef.java | 0 .../calculator-scenario-outline.feature | 0 .../resources/features/calculator.feature | 0 .../test/resources/features/shopping.feature | 0 .../README.md | 0 .../easy-random/README.md | 0 .../easy-random/pom.xml | 0 .../easy/random/model/Department.java | 0 .../baeldung/easy/random/model/Employee.java | 0 .../org/baeldung/easy/random/model/Grade.java | 0 .../baeldung/easy/random/model/Person.java | 0 .../easy/random/model/YearQuarter.java | 0 .../randomizer/YearQuarterRandomizer.java | 0 .../easy/random/EasyRandomUnitTest.java | 0 .../easymock/pom.xml | 0 .../testing/easymock/ForecastProcessor.java | 0 .../baeldung/testing/easymock/Location.java | 0 .../easymock/ServiceUnavailableException.java | 0 .../testing/easymock/WeatherService.java | 0 .../easymock/ForecastProcessorUnitTest.java | 0 .../gatling/README.md | 0 .../gatling/pom.xml | 0 .../gatling/src/test/resources/gatling.conf | 0 .../gatling/src/test/resources/logback.xml | 0 .../gatling/src/test/resources/recorder.conf | 0 .../gatling/src/test/scala/Engine.scala | 0 .../src/test/scala/IDEPathHelper.scala | 0 .../gatling/src/test/scala/Recorder.scala | 0 .../org/baeldung/RecordedSimulation.scala | 0 .../groovy-spock/.gitignore | 0 .../groovy-spock/README.md | 0 .../groovy-spock/pom.xml | 0 .../src/main/java/mocks/EventPublisher.java | 0 .../mocks/ExternalItemProviderException.java | 0 .../src/main/java/mocks/Item.java | 0 .../src/main/java/mocks/ItemProvider.java | 0 .../src/main/java/mocks/ItemService.java | 0 .../java/mocks/LoggingEventPublisher.java | 0 .../src/test/groovy/FirstSpecification.groovy | 0 .../src/test/groovy/Notifier.groovy | 0 .../src/test/groovy/PaymentGateway.groovy | 0 .../groovy/extensions/CustomTitleTest.groovy | 0 .../groovy/extensions/IgnoreIfTest.groovy | 0 .../groovy/extensions/IgnoreRestTest.groovy | 0 .../test/groovy/extensions/IgnoreTest.groovy | 0 .../test/groovy/extensions/IssueTest.groovy | 0 .../extensions/PendingFeatureTest.groovy | 0 .../groovy/extensions/RequiresTest.groovy | 0 .../RestoreSystemPropertiesTest.groovy | 0 .../test/groovy/extensions/RetryTest.groovy | 0 .../src/test/groovy/extensions/SeeTest.groovy | 0 .../groovy/extensions/StackTraceTest.groovy | 0 .../groovy/extensions/StepwiseTest.groovy | 0 .../test/groovy/extensions/SubjectTest.groovy | 0 .../test/groovy/extensions/TimeoutTest.groovy | 0 .../groovy/mocks/ItemServiceUnitTest.groovy | 0 .../src/test/resources/SpockConfig.groovy | 0 .../junit-4/README.md | 0 .../junit-4/pom.xml | 0 .../junitparams/SafeAdditionUtil.java | 0 .../junit-4/src/main/resources/logback.xml | 0 .../junitparams/SafeAdditionUtilUnitTest.java | 0 .../junitparams/TestDataProvider.java | 0 .../com/baeldung/rules/MessageLogger.java | 0 .../com/baeldung/rules/RuleChainUnitTest.java | 0 .../com/baeldung/rules/RulesUnitTest.java | 0 .../baeldung/rules/TestMethodNameLogger.java | 0 .../baeldung/rules/VerifierRuleUnitTest.java | 0 .../baeldung/runfromjava/FirstUnitTest.java | 0 .../com/baeldung/runfromjava/MyTestSuite.java | 0 .../runfromjava/RunJUnit4TestsFromJava.java | 0 .../baeldung/runfromjava/SecondUnitTest.java | 0 .../resources/JunitParamsTestParameters.csv | 0 .../junit-5-advanced/README.md | 0 .../junit-5-advanced/pom.xml | 0 .../failure_vs_error/SimpleCalculator.java | 0 .../baeldung/junit5/testinstance/Tweet.java | 0 .../junit5/testinstance/TweetException.java | 0 .../junit5/testinstance/TweetSerializer.java | 0 .../src/main/resources/logback.xml | 0 .../DisplayNameGeneratorUnitTest.java | 0 .../ReplaceUnderscoresGeneratorUnitTest.java | 0 .../TestResultLoggerExtension.java | 0 .../testwatcher/TestWatcherAPIUnitTest.java | 0 .../SimpleCalculatorUnitTest.java | 0 .../junit5/testinstance/AdditionUnitTest.java | 0 .../junit5/testinstance/OrderUnitTest.java | 0 .../TweetSerializerJUnit4UnitTest.java | 0 .../testinstance/TweetSerializerUnitTest.java | 0 .../src/test/resources/lorem-ipsum.txt | 0 .../junit-5-basics/README.md | 0 .../junit-5-basics/pom.xml | 0 .../failure_vs_error/SimpleCalculator.java | 0 .../baeldung/junit/tags/example/Employee.java | 0 .../junit/tags/example/EmployeeDAO.java | 0 .../junit/tags/example/EmployeeRowMapper.java | 0 .../junit/tags/example/SpringJdbcConfig.java | 0 .../java/com/baeldung/junit5/Greetings.java | 0 .../com/baeldung/junit5/bean/NumbersBean.java | 0 .../src/main/resources/jdbc/schema.sql | 0 .../main/resources/jdbc/springJdbc-config.xml | 0 .../src/main/resources/jdbc/test-data.sql | 0 .../java/com/baeldung/ExceptionUnitTest.java | 0 .../test/java/com/baeldung/FirstUnitTest.java | 0 .../java/com/baeldung/GreetingsUnitTest.java | 0 .../baeldung/JUnit5NewFeaturesUnitTest.java | 0 .../src/test/java/com/baeldung/LiveTest.java | 0 .../EmployeeDAOCategoryIntegrationTest.java | 0 .../categories/EmployeeDAOUnitTestSuite.java | 0 .../baeldung/categories/IntegrationTest.java | 0 .../com/baeldung/categories/UnitTest.java | 0 .../example/EmployeeDAOIntegrationTest.java | 0 .../baeldung/example/EmployeeUnitTest.java | 0 .../exception/ExceptionAssertionUnitTest.java | 0 .../SharedTemporaryDirectoryUnitTest.java | 0 .../tempdir/TemporaryDirectoryUnitTest.java | 0 .../SimpleCalculatorUnitTest.java | 0 .../junit5/bean/test/NumbersBeanUnitTest.java | 0 .../spring/GreetingsSpringUnitTest.java | 0 .../spring/SpringTestConfiguration.java | 0 .../junit4/AnnotationTestExampleUnitTest.java | 0 .../junit4/AssertionsExampleUnitTest.java | 0 .../BeforeAndAfterAnnotationsUnitTest.java | 0 ...ClassAndAfterClassAnnotationsUnitTest.java | 0 .../junit4/ExceptionAssertionUnitTest.java | 0 .../migration/junit4/RuleExampleUnitTest.java | 0 .../junit4/categories/Annotations.java | 0 .../junit4/categories/JUnit4UnitTest.java | 0 .../junit4/rules/TraceUnitTestRule.java | 0 .../junit5/AnnotationTestExampleUnitTest.java | 0 .../junit5/AssertionsExampleUnitTest.java | 0 .../migration/junit5/AssumptionUnitTest.java | 0 ...foreAllAndAfterAllAnnotationsUnitTest.java | 0 ...reEachAndAfterEachAnnotationsUnitTest.java | 0 .../migration/junit5/RuleExampleUnitTest.java | 0 .../junit5/extensions/TraceUnitExtension.java | 0 .../ReadResourceDirectoryUnitTest.java | 0 .../java/com/baeldung/suites/AllUnitTest.java | 0 .../tags/EmployeeDAOIntegrationTest.java | 0 .../baeldung/tags/EmployeeDAOTestSuite.java | 0 .../src/test/resources/example_resource.txt | 0 .../junit-5/README.md | 0 .../junit-5/pom.xml | 0 .../abstractmethod/AbstractMethodCalling.java | 0 .../indepedentmethod/AbstractIndependent.java | 0 .../indepedentmethod/ConcreteImpl.java | 0 .../AbstractInstanceFields.java | 0 .../privatemethod/AbstractPrivateMethods.java | 0 .../com/baeldung/junit5/mockito/User.java | 0 .../junit5/mockito/repository/MailClient.java | 0 .../mockito/repository/SettingRepository.java | 0 .../mockito/repository/UserRepository.java | 0 .../mockito/service/DefaultUserService.java | 0 .../junit5/mockito/service/Errors.java | 0 .../junit5/mockito/service/UserService.java | 0 .../baeldung/junit5vstestng/Calculator.java | 0 .../junit5vstestng/DivideByZeroException.java | 0 .../junit-5/src/main/resources/logback.xml | 0 .../java/com/baeldung/AssertionUnitTest.java | 0 .../com/baeldung/DynamicTestsExample.java | 0 .../java/com/baeldung/EmployeesUnitTest.java | 0 .../baeldung/MultipleExtensionsUnitTest.java | 0 .../java/com/baeldung/NestedUnitTest.java | 0 .../ProgrammaticEmployeesUnitTest.java | 0 .../baeldung/RegisterExtensionUnitTest.java | 0 .../com/baeldung/RepeatedTestExample.java | 0 .../test/java/com/baeldung/StringUtils.java | 0 .../java/com/baeldung/TaggedUnitTest.java | 0 .../test/java/com/baeldung/TestLauncher.java | 0 .../AbstractMethodCallingUnitTest.java | 0 .../AbstractIndependentUnitTest.java | 0 .../AbstractInstanceFieldsUnitTest.java | 0 .../AbstractPrivateMethodsUnitTest.java | 0 .../ConditionalAnnotationsUnitTest.java | 0 .../EmployeeDaoParameterResolver.java | 0 .../EmployeeDatabaseSetupExtension.java | 0 .../extensions/EnvironmentExtension.java | 0 .../IgnoreFileNotFoundExceptionExtension.java | 0 .../baeldung/extensions/LoggingExtension.java | 0 .../RegisterExtensionSampleExtension.java | 0 .../java/com/baeldung/helpers/Employee.java | 0 .../com/baeldung/helpers/EmployeeDao.java | 0 .../com/baeldung/helpers/EmployeeJdbcDao.java | 0 .../baeldung/helpers/JdbcConnectionUtil.java | 0 .../junit4vstestng/SortedUnitTest.java | 0 .../SummationServiceIntegrationTest.java | 0 .../junit5/mockito/UserServiceUnitTest.java | 0 .../order/AlphanumericOrderUnitTest.java | 0 .../baeldung/junit5/order/CustomOrder.java | 0 .../junit5/order/CustomOrderUnitTest.java | 0 .../junit5/order/OrderAnnotationUnitTest.java | 0 .../junit5vstestng/CalculatorUnitTest.java | 0 .../junit5vstestng/Class1UnitTest.java | 0 .../junit5vstestng/Class2UnitTest.java | 0 .../junit5vstestng/CustomNameUnitTest.java | 0 .../junit5vstestng/ParameterizedUnitTest.java | 0 .../junit5vstestng/PizzaDeliveryStrategy.java | 0 .../SelectClassesSuiteUnitTest.java | 0 .../SelectPackagesSuiteUnitTest.java | 0 .../SummationServiceUnitTest.java | 0 .../DefaultOrderOfExecutionUnitTest.java | 0 .../JVMOrderOfExecutionUnitTest.java | 0 ...NameAscendingOrderOfExecutionUnitTest.java | 0 .../param/InvalidPersonParameterResolver.java | 0 .../test/java/com/baeldung/param/Person.java | 0 .../com/baeldung/param/PersonValidator.java | 0 .../param/PersonValidatorUnitTest.java | 0 .../param/ValidPersonParameterResolver.java | 0 .../BlankStringsArgumentsProvider.java | 0 .../baeldung/parameterized/EnumsUnitTest.java | 0 .../parameterized/LocalDateUnitTest.java | 0 .../com/baeldung/parameterized/Numbers.java | 0 .../parameterized/NumbersUnitTest.java | 0 .../com/baeldung/parameterized/Person.java | 0 .../parameterized/PersonAggregator.java | 0 .../parameterized/PersonUnitTest.java | 0 .../parameterized/SlashyDateConverter.java | 0 .../baeldung/parameterized/StringParams.java | 0 .../com/baeldung/parameterized/Strings.java | 0 .../parameterized/StringsUnitTest.java | 0 .../VariableArgumentsProvider.java | 0 .../parameterized/VariableSource.java | 0 .../baeldung/runfromjava/FirstUnitTest.java | 0 .../runfromjava/RunJUnit5TestsFromJava.java | 0 .../baeldung/runfromjava/SecondUnitTest.java | 0 .../org.junit.jupiter.api.extension.Extension | 0 .../extensions/application.properties | 0 .../com/baeldung/helpers/jdbc.properties | 0 .../junit-5/src/test/resources/data.csv | 0 .../junit5-migration/README.md | 0 .../junit5-migration/pom.xml | 0 .../junit4/AnnotationTestExampleUnitTest.java | 0 .../baeldung/junit4/AssertionUnitTest.java | 0 .../com/baeldung/junit4/AssumeUnitTest.java | 0 .../junit4/ExceptionAssertionUnitTest.java | 0 .../baeldung/junit4/RuleExampleUnitTest.java | 0 .../junit4/TestAnnotationsUnitTest.java | 0 .../baeldung/junit4/TraceUnitTestRule.java | 0 .../junit4/categories/Annotations.java | 0 .../junit4/categories/JUnit4UnitTest.java | 0 .../junit5/AnnotationTestExampleUnitTest.java | 0 .../baeldung/junit5/AssertionUnitTest.java | 0 .../baeldung/junit5/AssumptionUnitTest.java | 0 .../junit5/ConditionalExecutionUnitTest.java | 0 .../com/baeldung/junit5/NestedUnitTest.java | 0 .../baeldung/junit5/RuleExampleUnitTest.java | 0 .../junit5/RuleMigrationSupportUnitTest.java | 0 .../junit5/TestAnnotationsUnitTest.java | 0 .../baeldung/junit5/TraceUnitExtension.java | 0 .../load-testing-comparison/README.md | 0 .../load-testing-comparison/pom.xml | 0 .../com/baeldung/loadtesting/Application.java | 0 .../loadtesting/RewardsController.java | 0 .../loadtesting/TransactionController.java | 0 .../model/CustomerRewardsAccount.java | 0 .../loadtesting/model/Transaction.java | 0 .../repository/CustomerRewardsRepository.java | 0 .../repository/TransactionRepository.java | 0 .../scripts/Gatling/GatlingScenario.scala | 0 .../resources/scripts/JMeter/Test Plan.jmx | 0 .../scripts/The Grinder/grinder.properties | 0 .../resources/scripts/The Grinder/grinder.py | 0 .../mockito-2/.gitignore | 0 .../mockito-2/README.md | 0 .../mockito-2/pom.xml | 0 .../baeldung/mockito/java8/JobPosition.java | 0 .../baeldung/mockito/java8/JobService.java | 0 .../com/baeldung/mockito/java8/Person.java | 0 .../mockito/java8/UnemploymentService.java | 0 .../java8/UnemploymentServiceImpl.java | 0 .../mockito-2/src/main/resources/logback.xml | 0 .../ArgumentMatcherWithLambdaUnitTest.java | 0 .../ArgumentMatcherWithoutLambdaUnitTest.java | 0 .../java8/CustomAnswerWithLambdaUnitTest.java | 0 .../CustomAnswerWithoutLambdaUnitTest.java | 0 .../mockito/java8/JobServiceUnitTest.java | 0 .../java8/LazyVerificationUnitTest.java | 0 .../UnemploymentServiceImplUnitTest.java | 0 .../misusing/ExpectedTestFailureRule.java | 0 .../MockitoUnecessaryStubUnitTest.java | 0 .../mockito/.gitignore | 0 .../mockito/README.md | 0 .../mockito/pom.xml | 0 .../main/java/org/baeldung/hamcrest/City.java | 0 .../java/org/baeldung/hamcrest/Location.java | 0 .../custommatchers/IsDivisibleBy.java | 0 .../hamcrest/custommatchers/IsOnlyDigits.java | 0 .../hamcrest/custommatchers/IsUppercase.java | 0 .../mockito/service/ActionHandler.java | 0 .../baeldung/mockito/service/Callback.java | 0 .../org/baeldung/mockito/service/Data.java | 0 .../baeldung/mockito/service/Response.java | 0 .../org/baeldung/mockito/service/Service.java | 0 .../mockito/src/main/resources/logback.xml | 0 .../CollaboratorForPartialMocking.java | 0 .../CollaboratorWithFinalMethods.java | 0 .../CollaboratorWithStaticMethods.java | 0 .../introduction/LuckyNumberGenerator.java | 0 .../LuckyNumberGeneratorIntegrationTest.java | 0 .../PowerMockitoIntegrationTest.java | 0 .../bddmockito/BDDMockitoIntegrationTest.java | 0 .../bddmockito/PhoneBookRepository.java | 0 .../baeldung/bddmockito/PhoneBookService.java | 0 .../hamcrest/HamcrestBeansUnitTest.java | 0 .../HamcrestCoreMatchersUnitTest.java | 0 .../hamcrest/HamcrestCustomUnitTest.java | 0 .../hamcrest/HamcrestFileUnitTest.java | 0 .../hamcrest/HamcrestNumberUnitTest.java | 0 .../hamcrest/HamcrestObjectUnitTest.java | 0 .../hamcrest/HamcrestTextUnitTest.java | 0 .../java/org/baeldung/mockito/FinalList.java | 0 .../java/org/baeldung/mockito/MockFinals.java | 0 .../MockitoAnnotationIntegrationTest.java | 0 .../MockitoConfigExamplesIntegrationTest.java | 0 .../MockitoExceptionIntegrationTest.java | 0 .../mockito/MockitoInjectIntoSpyUnitTest.java | 0 .../mockito/MockitoMockIntegrationTest.java | 0 .../mockito/MockitoSpyIntegrationTest.java | 0 .../MockitoVerifyExamplesIntegrationTest.java | 0 .../mockito/MockitoVoidMethodsUnitTest.java | 0 .../org/baeldung/mockito/MyDictionary.java | 0 .../java/org/baeldung/mockito/MyList.java | 0 .../misusing/MockitoMisusingUnitTest.java | 0 .../service/ActionHandlerUnitTest.java | 0 .../org.mockito.plugins.MockMaker | 0 .../mockito/src/test/resources/test1.in | 0 .../mocks/README.md | 0 .../mocks/javafaker/pom.xml | 0 .../baeldung/javafaker/JavaFakerUnitTest.java | 0 .../mocks/jmockit/README.md | 0 .../mocks/jmockit/pom.xml | 0 .../baeldung/mocks/jmockit/AppManager.java | 0 .../mocks/jmockit/AdvancedCollaborator.java | 0 .../baeldung/mocks/jmockit/Collaborator.java | 0 .../jmockit/ExpectationsCollaborator.java | 0 .../org/baeldung/mocks/jmockit/Model.java | 0 .../org/baeldung/mocks/jmockit/Performer.java | 0 .../jmockit/src/main/resources/logback.xml | 0 .../mocks/jmockit/AppManagerUnitTest.java | 0 .../AdvancedCollaboratorIntegrationTest.java | 0 .../jmockit/ExpectationsIntegrationTest.java | 0 .../jmockit/PerformerIntegrationTest.java | 0 .../mocks/jmockit/ReusingIntegrationTest.java | 0 .../mocks/jukito/pom.xml | 0 .../introductionjukito/Calculator.java | 0 .../ScientificCalculator.java | 0 .../introductionjukito/SimpleCalculator.java | 0 .../CalculatorUnitTest.java | 0 .../mocks/mock-comparisons/README.md | 0 .../mocks/mock-comparisons/pom.xml | 0 .../com/baeldung/easymock/ArticleReader.java | 0 .../baeldung/easymock/BaeldungArticle.java | 0 .../com/baeldung/easymock/BaeldungReader.java | 0 .../com/baeldung/easymock/IArticleWriter.java | 0 .../com/baeldung/easymock/IUserService.java | 0 .../main/java/com/baeldung/easymock/User.java | 0 .../mocks/testCase/LoginController.java | 0 .../org/baeldung/mocks/testCase/LoginDao.java | 0 .../baeldung/mocks/testCase/LoginService.java | 0 .../org/baeldung/mocks/testCase/UserForm.java | 0 .../src/main/resources/logback.xml | 0 .../easymock/ArgumentMatchersUnitTest.java | 0 .../BaeldungReaderAnnotatedUnitTest.java | 0 ...eldungReaderAnnotatedWithRuleUnitTest.java | 0 .../BaeldungReaderMockDelegationUnitTest.java | 0 .../BaeldungReaderMockSupportUnitTest.java | 0 .../easymock/BaeldungReaderUnitTest.java | 0 .../LoginControllerIntegrationTest.java | 0 .../LoginControllerIntegrationTest.java | 0 .../LoginControllerIntegrationTest.java | 0 .../mocks/pom.xml | 0 .../mockserver/README.md | 0 .../mockserver/pom.xml | 0 .../server/ExpectationCallbackHandler.java | 0 .../mockserver/src/main/resources/logback.xml | 0 .../mock/server/MockServerLiveTest.java | 0 .../parallel-tests-junit/README.md | 0 .../math-test-functions/pom.xml | 0 .../baeldung/ArithmeticFunctionUnitTest.java | 0 .../baeldung/ComparisonFunctionUnitTest.java | 0 .../java/com/baeldung/FunctionTestSuite.java | 0 .../parallel-tests-junit/pom.xml | 0 .../string-test-functions/pom.xml | 0 .../com/baeldung/StringFunctionUnitTest.java | 0 .../pom.xml | 0 .../rest-assured/.gitignore | 0 .../rest-assured/README.md | 0 .../rest-assured/pom.xml | 0 .../com/baeldung/restassured/Application.java | 0 .../restassured/controller/AppController.java | 0 .../baeldung/restassured/learner/Course.java | 0 .../restassured/learner/CourseController.java | 0 .../CourseControllerExceptionHandler.java | 0 .../learner/CourseNotFoundException.java | 0 .../restassured/learner/CourseService.java | 0 .../com/baeldung/restassured/model/Movie.java | 0 .../restassured/service/AppService.java | 0 .../rest-assured/src/main/resources/1 | 0 .../rest-assured/src/main/resources/2 | 0 .../java/com/baeldung/restassured/Odd.java | 0 .../RestAssured2IntegrationTest.java | 0 .../RestAssuredAdvancedLiveTest.java | 0 .../RestAssuredIntegrationTest.java | 0 .../RestAssuredXML2IntegrationTest.java | 0 .../RestAssuredXMLIntegrationTest.java | 0 .../java/com/baeldung/restassured/Util.java | 0 .../BasicAuthenticationLiveTest.java | 0 .../BasicPreemtiveAuthenticationLiveTest.java | 0 .../DigestAuthenticationLiveTest.java | 0 .../FormAuthenticationLiveTest.java | 0 .../FormAutoconfAuthenticationLiveTest.java | 0 .../OAuth2AuthenticationLiveTest.java | 0 .../OAuthAuthenticationLiveTest.java | 0 .../AppControllerIntegrationTest.java | 0 .../CourseControllerIntegrationTest.java | 0 .../learner/CourseControllerUnitTest.java | 0 .../src/test/resources/employees.xml | 0 .../src/test/resources/event_0.json | 0 .../src/test/resources/logback.xml | 0 .../rest-assured/src/test/resources/odds.json | 0 .../src/test/resources/teachers.xml | 0 .../rest-assured/src/test/resources/test.txt | 0 .../rest-testing/.gitignore | 0 .../rest-testing/README.md | 0 .../rest-testing/pom.xml | 0 .../src/main/resources/cucumber.json | 0 .../main/resources/karate/cucumber.feature | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/wiremock_intro.json | 0 .../cucumber/CucumberIntegrationTest.java | 0 .../rest/cucumber/StepDefinition.java | 0 .../baeldung/rest/jbehave/AbstractStory.java | 0 .../rest/jbehave/GithubUserNotFoundSteps.java | 0 .../GithubUserNotFoundStoryLiveTest.java | 0 .../GithubUserResponseMediaTypeSteps.java | 0 ...hubUserResponseMediaTypeStoryLiveTest.java | 0 .../GithubUserResponsePayloadSteps.java | 0 ...ithubUserResponsePayloadStoryLiveTest.java | 0 .../baeldung/rest/jbehave/IncreaseSteps.java | 0 .../rest/jbehave/IncreaseStoryLiveTest.java | 0 .../rest/karate/KarateIntegrationTest.java | 0 .../JUnitManagedIntegrationTest.java | 0 .../ProgrammaticallyManagedLiveTest.java | 0 ...ireMockScenarioExampleIntegrationTest.java | 0 .../java/org/baeldung/rest/GitHubUser.java | 0 .../java/org/baeldung/rest/RetrieveUtil.java | 0 .../test/resources/Feature/cucumber.feature | 0 .../resources/github_user_not_found.story | 0 .../github_user_response_mediatype.story | 0 .../github_user_response_payload.story | 0 .../src/test/resources/increase.story | 0 .../src/test/resources/karate/user.feature | 0 .../src/main/resources/logback.xml | 0 .../junit4/runfromjava/FirstUnitTest.java | 0 .../junit4/runfromjava/SecondUnitTest.java | 0 .../junit5/runfromjava/FirstUnitTest.java | 0 .../junit5/runfromjava/SecondUnitTest.java | 0 .../selenium-junit-testng/README.md | 0 .../selenium-junit-testng/geckodriver.mac | Bin .../selenium-junit-testng/pom.xml | 0 .../baeldung/selenium/SeleniumExample.java | 0 .../selenium/config/SeleniumConfig.java | 0 .../selenium/models/BaeldungAbout.java | 0 .../selenium/pages/BaeldungAboutPage.java | 0 .../selenium/pages/BaeldungHomePage.java | 0 .../selenium/pages/StartHerePage.java | 0 .../src/main/resources/logback.xml | 0 .../junit/SeleniumPageObjectLiveTest.java | 0 .../junit/SeleniumWithJUnitLiveTest.java | 0 .../testng/SeleniumWithTestNGLiveTest.java | 0 .../spring-testing/README.md | 0 .../spring-testing/pom.xml | 0 .../com/baeldung/config/ScheduledConfig.java | 0 .../java/com/baeldung/config/WebConfig.java | 0 .../parameterized/EmployeeRoleController.java | 0 .../overrideproperties/Application.java | 0 .../resolver/PropertySourceResolver.java | 0 .../java/com/baeldung/scheduled/Counter.java | 0 .../ClassUsingProperty.java | 0 .../org/baeldung/mockito/repository/User.java | 0 .../mockito/repository/UserRepository.java | 0 .../repository/Employee.java | 0 .../repository/EmployeeService.java | 0 .../repository/HRService.java | 0 .../src/main/resources/logback.xml | 0 .../RoleControllerIntegrationTest.java | 0 ...ParameterizedClassRuleIntegrationTest.java | 0 ...ontrollerParameterizedIntegrationTest.java | 0 ...PropertySourceResolverIntegrationTest.java | 0 ...PropertySourceResolverIntegrationTest.java | 0 .../PropertyOverrideContextInitializer.java | 0 ...PropertySourceResolverIntegrationTest.java | 0 ...PropertySourceResolverIntegrationTest.java | 0 .../ScheduledAwaitilityIntegrationTest.java | 0 .../scheduled/ScheduledIntegrationTest.java | 0 ...aultTestPropertySourceIntegrationTest.java | 0 ...tionTestPropertySourceIntegrationTest.java | 0 ...tiesTestPropertySourceIntegrationTest.java | 0 .../mockito/MockAnnotationUnitTest.java | 0 .../MockBeanAnnotationIntegrationTest.java | 0 .../ReflectionTestUtilsUnitTest.java | 0 .../resources/application-test.properties | 0 .../src/test/resources/application.properties | 0 ...stPropertySourceIntegrationTest.properties | 0 .../context-override-application.properties | 0 .../test/resources/other-location.properties | 0 .../test-containers/README.md | 0 .../test-containers/pom.xml | 0 .../DockerComposeContainerLiveTest.java | 0 .../GenericContainerLiveTest.java | 0 .../PostgreSqlContainerLiveTest.java | 0 .../WebDriverContainerLiveTest.java | 0 .../src/test/resources/test-compose.yml | 0 .../testng/README.md | 0 .../testng/pom.xml | 0 .../DependentLongRunningUnitTest.java | 0 .../com/baeldung/GroupIntegrationTest.java | 0 .../MultiThreadedIntegrationTest.java | 0 .../ParametrizedLongRunningUnitTest.java | 0 .../baeldung/PriorityLongRunningUnitTest.java | 0 .../RegistrationLongRunningUnitTest.java | 0 .../baeldung/SignInLongRunningUnitTest.java | 0 .../baeldung/SimpleLongRunningUnitTest.java | 0 .../SummationServiceIntegrationTest.java | 0 .../com/baeldung/TimeOutIntegrationTest.java | 0 .../baeldung/reports/CustomisedListener.java | 0 .../baeldung/reports/CustomisedReports.java | 0 .../testng/src/test/resources/logback.xml | 0 .../test/resources/parametrized_testng.xml | 0 .../src/test/resources/reportTemplate.html | 0 .../testng/src/test/resources/test_group.xml | 0 .../testng/src/test/resources/test_setup.xml | 0 .../testng/src/test/resources/test_suite.xml | 0 .../xmlunit-2/README.md | 0 .../xmlunit-2/pom.xml | 0 .../IgnoreAttributeDifferenceEvaluator.java | 0 .../xmlunit-2/src/main/resources/logback.xml | 0 .../com/baeldung/xmlunit/XMLUnitTest.java | 0 .../xmlunit-2/src/test/resources/control.xml | 0 .../xmlunit-2/src/test/resources/students.xml | 0 .../xmlunit-2/src/test/resources/students.xsd | 0 .../test/resources/students_with_error.xml | 0 .../xmlunit-2/src/test/resources/teachers.xml | 0 .../xmlunit-2/src/test/resources/test.xml | 0 558 files changed, 16 insertions(+), 75 deletions(-) delete mode 100644 testing-libraries-2/lambdabehave/pom.xml delete mode 100644 testing-libraries-2/mutations/pom.xml delete mode 100644 testing-libraries-2/pom.xml rename {testing-libraries-2 => testing-modules-2}/README.md (100%) rename {testing-libraries-2/cucumber => testing-modules-2}/pom.xml (69%) rename {testing-libraries-2/cucumber => testing-modules-2}/src/main/java/com/baeldung/cucumber/Calculator.java (100%) rename {testing-libraries-2/lambdabehave => testing-modules-2}/src/main/java/com/baeldung/lambdabehave/Calculator.java (100%) rename {testing-libraries-2/mutations => testing-modules-2}/src/main/java/com/baeldung/mutation/Palindrome.java (100%) rename {testing-libraries-2/cucumber => testing-modules-2}/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java (100%) rename {testing-libraries-2/cucumber => testing-modules-2}/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java (100%) rename {testing-libraries-2/lambdabehave => testing-modules-2}/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java (100%) rename {testing-libraries-2/mutations => testing-modules-2}/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java (100%) rename {testing-libraries-2/cucumber => testing-modules-2}/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java (100%) rename {testing-libraries-2/cucumber => testing-modules-2}/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java (100%) rename {testing-libraries-2/cucumber => testing-modules-2}/src/test/resources/features/calculator-scenario-outline.feature (100%) rename {testing-libraries-2/cucumber => testing-modules-2}/src/test/resources/features/calculator.feature (100%) rename {testing-libraries-2/cucumber => testing-modules-2}/src/test/resources/features/shopping.feature (100%) rename {testing-libraries => testing-modules}/README.md (100%) rename {testing-libraries => testing-modules}/easy-random/README.md (100%) rename {testing-libraries => testing-modules}/easy-random/pom.xml (100%) rename {testing-libraries => testing-modules}/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java (100%) rename {testing-libraries => testing-modules}/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java (100%) rename {testing-libraries => testing-modules}/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java (100%) rename {testing-libraries => testing-modules}/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java (100%) rename {testing-libraries => testing-modules}/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java (100%) rename {testing-libraries => testing-modules}/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java (100%) rename {testing-libraries => testing-modules}/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java (100%) rename {testing-libraries => testing-modules}/easymock/pom.xml (100%) rename {testing-libraries => testing-modules}/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java (100%) rename {testing-libraries => testing-modules}/easymock/src/main/java/com/baeldung/testing/easymock/Location.java (100%) rename {testing-libraries => testing-modules}/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java (100%) rename {testing-libraries => testing-modules}/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java (100%) rename {testing-libraries => testing-modules}/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java (100%) rename {testing-libraries => testing-modules}/gatling/README.md (100%) rename {testing-libraries => testing-modules}/gatling/pom.xml (100%) rename {testing-libraries => testing-modules}/gatling/src/test/resources/gatling.conf (100%) rename {testing-libraries => testing-modules}/gatling/src/test/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/gatling/src/test/resources/recorder.conf (100%) rename {testing-libraries => testing-modules}/gatling/src/test/scala/Engine.scala (100%) rename {testing-libraries => testing-modules}/gatling/src/test/scala/IDEPathHelper.scala (100%) rename {testing-libraries => testing-modules}/gatling/src/test/scala/Recorder.scala (100%) rename {testing-libraries => testing-modules}/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala (100%) rename {testing-libraries => testing-modules}/groovy-spock/.gitignore (100%) rename {testing-libraries => testing-modules}/groovy-spock/README.md (100%) rename {testing-libraries => testing-modules}/groovy-spock/pom.xml (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/main/java/mocks/EventPublisher.java (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/main/java/mocks/Item.java (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/main/java/mocks/ItemProvider.java (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/main/java/mocks/ItemService.java (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/FirstSpecification.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/Notifier.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/PaymentGateway.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/IssueTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/RetryTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/SeeTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy (100%) rename {testing-libraries => testing-modules}/groovy-spock/src/test/resources/SpockConfig.groovy (100%) rename {testing-libraries => testing-modules}/junit-4/README.md (100%) rename {testing-libraries => testing-modules}/junit-4/pom.xml (100%) rename {testing-libraries => testing-modules}/junit-4/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/junitparams/TestDataProvider.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/runfromjava/MyTestSuite.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-4/src/test/resources/JunitParamsTestParameters.csv (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/README.md (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/pom.xml (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-advanced/src/test/resources/lorem-ipsum.txt (100%) rename {testing-libraries => testing-modules}/junit-5-basics/README.md (100%) rename {testing-libraries => testing-modules}/junit-5-basics/pom.xml (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/resources/jdbc/schema.sql (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/main/resources/jdbc/test-data.sql (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/LiveTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java (100%) rename {testing-libraries => testing-modules}/junit-5-basics/src/test/resources/example_resource.txt (100%) rename {testing-libraries => testing-modules}/junit-5/README.md (100%) rename {testing-libraries => testing-modules}/junit-5/pom.xml (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/NestedUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/StringUtils.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/TestLauncher.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/helpers/Employee.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/param/Person.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/param/PersonValidator.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/Person.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/Strings.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/resources/com/baeldung/extensions/application.properties (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties (100%) rename {testing-libraries => testing-modules}/junit-5/src/test/resources/data.csv (100%) rename {testing-libraries => testing-modules}/junit5-migration/README.md (100%) rename {testing-libraries => testing-modules}/junit5-migration/pom.xml (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java (100%) rename {testing-libraries => testing-modules}/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/README.md (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/pom.xml (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties (100%) rename {testing-libraries => testing-modules}/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py (100%) rename {testing-libraries => testing-modules}/mockito-2/.gitignore (100%) rename {testing-libraries => testing-modules}/mockito-2/README.md (100%) rename {testing-libraries => testing-modules}/mockito-2/pom.xml (100%) rename {testing-libraries => testing-modules}/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java (100%) rename {testing-libraries => testing-modules}/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/.gitignore (100%) rename {testing-libraries => testing-modules}/mockito/README.md (100%) rename {testing-libraries => testing-modules}/mockito/pom.xml (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/hamcrest/City.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/hamcrest/Location.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/mockito/service/Callback.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/mockito/service/Data.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/mockito/service/Response.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/java/org/baeldung/mockito/service/Service.java (100%) rename {testing-libraries => testing-modules}/mockito/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/FinalList.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MockFinals.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/MyList.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java (100%) rename {testing-libraries => testing-modules}/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker (100%) rename {testing-libraries => testing-modules}/mockito/src/test/resources/test1.in (100%) rename {testing-libraries => testing-modules}/mocks/README.md (100%) rename {testing-libraries => testing-modules}/mocks/javafaker/pom.xml (100%) rename {testing-libraries => testing-modules}/mocks/javafaker/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/README.md (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/pom.xml (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mocks/jukito/pom.xml (100%) rename {testing-libraries => testing-modules}/mocks/jukito/src/main/java/com/baeldung/introductionjukito/Calculator.java (100%) rename {testing-libraries => testing-modules}/mocks/jukito/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java (100%) rename {testing-libraries => testing-modules}/mocks/jukito/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java (100%) rename {testing-libraries => testing-modules}/mocks/jukito/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/README.md (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/pom.xml (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/mocks/pom.xml (100%) rename {testing-libraries => testing-modules}/mockserver/README.md (100%) rename {testing-libraries => testing-modules}/mockserver/pom.xml (100%) rename {testing-libraries => testing-modules}/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java (100%) rename {testing-libraries => testing-modules}/mockserver/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java (100%) rename {testing-libraries => testing-modules}/parallel-tests-junit/README.md (100%) rename {testing-libraries => testing-modules}/parallel-tests-junit/math-test-functions/pom.xml (100%) rename {testing-libraries => testing-modules}/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java (100%) rename {testing-libraries => testing-modules}/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java (100%) rename {testing-libraries => testing-modules}/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java (100%) rename {testing-libraries => testing-modules}/parallel-tests-junit/pom.xml (100%) rename {testing-libraries => testing-modules}/parallel-tests-junit/string-test-functions/pom.xml (100%) rename {testing-libraries => testing-modules}/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java (100%) rename {testing-libraries => testing-modules}/pom.xml (100%) rename {testing-libraries => testing-modules}/rest-assured/.gitignore (100%) rename {testing-libraries => testing-modules}/rest-assured/README.md (100%) rename {testing-libraries => testing-modules}/rest-assured/pom.xml (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/java/com/baeldung/restassured/Application.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/resources/1 (100%) rename {testing-libraries => testing-modules}/rest-assured/src/main/resources/2 (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/Odd.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/Util.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/resources/employees.xml (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/resources/event_0.json (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/resources/odds.json (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/resources/teachers.xml (100%) rename {testing-libraries => testing-modules}/rest-assured/src/test/resources/test.txt (100%) rename {testing-libraries => testing-modules}/rest-testing/.gitignore (100%) rename {testing-libraries => testing-modules}/rest-testing/README.md (100%) rename {testing-libraries => testing-modules}/rest-testing/pom.xml (100%) rename {testing-libraries => testing-modules}/rest-testing/src/main/resources/cucumber.json (100%) rename {testing-libraries => testing-modules}/rest-testing/src/main/resources/karate/cucumber.feature (100%) rename {testing-libraries => testing-modules}/rest-testing/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/rest-testing/src/main/resources/wiremock_intro.json (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/resources/Feature/cucumber.feature (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/resources/github_user_not_found.story (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/resources/github_user_response_mediatype.story (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/resources/github_user_response_payload.story (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/resources/increase.story (100%) rename {testing-libraries => testing-modules}/rest-testing/src/test/resources/karate/user.feature (100%) rename {testing-libraries => testing-modules}/runjunitfromjava/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java (100%) rename {testing-libraries => testing-modules}/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java (100%) rename {testing-libraries => testing-modules}/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java (100%) rename {testing-libraries => testing-modules}/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/README.md (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/geckodriver.mac (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/pom.xml (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java (100%) rename {testing-libraries => testing-modules}/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/README.md (100%) rename {testing-libraries => testing-modules}/spring-testing/pom.xml (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/com/baeldung/config/WebConfig.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/resources/application-test.properties (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/resources/application.properties (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/resources/context-override-application.properties (100%) rename {testing-libraries => testing-modules}/spring-testing/src/test/resources/other-location.properties (100%) rename {testing-libraries => testing-modules}/test-containers/README.md (100%) rename {testing-libraries => testing-modules}/test-containers/pom.xml (100%) rename {testing-libraries => testing-modules}/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java (100%) rename {testing-libraries => testing-modules}/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java (100%) rename {testing-libraries => testing-modules}/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java (100%) rename {testing-libraries => testing-modules}/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java (100%) rename {testing-libraries => testing-modules}/test-containers/src/test/resources/test-compose.yml (100%) rename {testing-libraries => testing-modules}/testng/README.md (100%) rename {testing-libraries => testing-modules}/testng/pom.xml (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/GroupIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/reports/CustomisedListener.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/java/com/baeldung/reports/CustomisedReports.java (100%) rename {testing-libraries => testing-modules}/testng/src/test/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/testng/src/test/resources/parametrized_testng.xml (100%) rename {testing-libraries => testing-modules}/testng/src/test/resources/reportTemplate.html (100%) rename {testing-libraries => testing-modules}/testng/src/test/resources/test_group.xml (100%) rename {testing-libraries => testing-modules}/testng/src/test/resources/test_setup.xml (100%) rename {testing-libraries => testing-modules}/testng/src/test/resources/test_suite.xml (100%) rename {testing-libraries => testing-modules}/xmlunit-2/README.md (100%) rename {testing-libraries => testing-modules}/xmlunit-2/pom.xml (100%) rename {testing-libraries => testing-modules}/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java (100%) rename {testing-libraries => testing-modules}/xmlunit-2/src/main/resources/logback.xml (100%) rename {testing-libraries => testing-modules}/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java (100%) rename {testing-libraries => testing-modules}/xmlunit-2/src/test/resources/control.xml (100%) rename {testing-libraries => testing-modules}/xmlunit-2/src/test/resources/students.xml (100%) rename {testing-libraries => testing-modules}/xmlunit-2/src/test/resources/students.xsd (100%) rename {testing-libraries => testing-modules}/xmlunit-2/src/test/resources/students_with_error.xml (100%) rename {testing-libraries => testing-modules}/xmlunit-2/src/test/resources/teachers.xml (100%) rename {testing-libraries => testing-modules}/xmlunit-2/src/test/resources/test.xml (100%) diff --git a/pom.xml b/pom.xml index 0ac31c03eb..ac88ce4cdd 100644 --- a/pom.xml +++ b/pom.xml @@ -781,8 +781,8 @@ struts-2 assertion-libraries - testing-libraries - testing-libraries-2 + testing-modules + testing-modules-2 twilio twitter4j @@ -1461,8 +1461,8 @@ struts-2 assertion-libraries - testing-libraries - testing-libraries-2 + testing-modules + testing-modules-2 twilio twitter4j diff --git a/testing-libraries-2/lambdabehave/pom.xml b/testing-libraries-2/lambdabehave/pom.xml deleted file mode 100644 index 61fd20da03..0000000000 --- a/testing-libraries-2/lambdabehave/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - 4.0.0 - lambdabehave - lambdabehave - pom - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - ../.. - - - - - com.insightfullogic - lambda-behave - ${lambda-behave.version} - - - - - 0.4 - - - \ No newline at end of file diff --git a/testing-libraries-2/mutations/pom.xml b/testing-libraries-2/mutations/pom.xml deleted file mode 100644 index c4ff0660b0..0000000000 --- a/testing-libraries-2/mutations/pom.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - 4.0.0 - mutations - mutations - pom - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - ../.. - - - \ No newline at end of file diff --git a/testing-libraries-2/pom.xml b/testing-libraries-2/pom.xml deleted file mode 100644 index 728a510430..0000000000 --- a/testing-libraries-2/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - 4.0.0 - testing-libraries-2 - testing-libraries-2 - pom - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - .. - - - - mutations - cucumber - lambdabehave - - - diff --git a/testing-libraries-2/README.md b/testing-modules-2/README.md similarity index 100% rename from testing-libraries-2/README.md rename to testing-modules-2/README.md diff --git a/testing-libraries-2/cucumber/pom.xml b/testing-modules-2/pom.xml similarity index 69% rename from testing-libraries-2/cucumber/pom.xml rename to testing-modules-2/pom.xml index b12a3297bb..c919dbe90a 100644 --- a/testing-libraries-2/cucumber/pom.xml +++ b/testing-modules-2/pom.xml @@ -1,19 +1,24 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - cucumber - cucumber + testing-modules-2 + testing-modules-2 pom com.baeldung parent-modules 1.0.0-SNAPSHOT - ../.. + .. + + com.insightfullogic + lambda-behave + ${lambda-behave.version} + info.cukes cucumber-junit @@ -35,7 +40,9 @@ + 0.4 1.2.5 - \ No newline at end of file + + diff --git a/testing-libraries-2/cucumber/src/main/java/com/baeldung/cucumber/Calculator.java b/testing-modules-2/src/main/java/com/baeldung/cucumber/Calculator.java similarity index 100% rename from testing-libraries-2/cucumber/src/main/java/com/baeldung/cucumber/Calculator.java rename to testing-modules-2/src/main/java/com/baeldung/cucumber/Calculator.java diff --git a/testing-libraries-2/lambdabehave/src/main/java/com/baeldung/lambdabehave/Calculator.java b/testing-modules-2/src/main/java/com/baeldung/lambdabehave/Calculator.java similarity index 100% rename from testing-libraries-2/lambdabehave/src/main/java/com/baeldung/lambdabehave/Calculator.java rename to testing-modules-2/src/main/java/com/baeldung/lambdabehave/Calculator.java diff --git a/testing-libraries-2/mutations/src/main/java/com/baeldung/mutation/Palindrome.java b/testing-modules-2/src/main/java/com/baeldung/mutation/Palindrome.java similarity index 100% rename from testing-libraries-2/mutations/src/main/java/com/baeldung/mutation/Palindrome.java rename to testing-modules-2/src/main/java/com/baeldung/mutation/Palindrome.java diff --git a/testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java b/testing-modules-2/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java similarity index 100% rename from testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java rename to testing-modules-2/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java diff --git a/testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java b/testing-modules-2/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java similarity index 100% rename from testing-libraries-2/cucumber/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java rename to testing-modules-2/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java diff --git a/testing-libraries-2/lambdabehave/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java b/testing-modules-2/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java similarity index 100% rename from testing-libraries-2/lambdabehave/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java rename to testing-modules-2/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java diff --git a/testing-libraries-2/mutations/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java b/testing-modules-2/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java similarity index 100% rename from testing-libraries-2/mutations/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java rename to testing-modules-2/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java diff --git a/testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java b/testing-modules-2/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java similarity index 100% rename from testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java rename to testing-modules-2/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java diff --git a/testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java b/testing-modules-2/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java similarity index 100% rename from testing-libraries-2/cucumber/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java rename to testing-modules-2/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java diff --git a/testing-libraries-2/cucumber/src/test/resources/features/calculator-scenario-outline.feature b/testing-modules-2/src/test/resources/features/calculator-scenario-outline.feature similarity index 100% rename from testing-libraries-2/cucumber/src/test/resources/features/calculator-scenario-outline.feature rename to testing-modules-2/src/test/resources/features/calculator-scenario-outline.feature diff --git a/testing-libraries-2/cucumber/src/test/resources/features/calculator.feature b/testing-modules-2/src/test/resources/features/calculator.feature similarity index 100% rename from testing-libraries-2/cucumber/src/test/resources/features/calculator.feature rename to testing-modules-2/src/test/resources/features/calculator.feature diff --git a/testing-libraries-2/cucumber/src/test/resources/features/shopping.feature b/testing-modules-2/src/test/resources/features/shopping.feature similarity index 100% rename from testing-libraries-2/cucumber/src/test/resources/features/shopping.feature rename to testing-modules-2/src/test/resources/features/shopping.feature diff --git a/testing-libraries/README.md b/testing-modules/README.md similarity index 100% rename from testing-libraries/README.md rename to testing-modules/README.md diff --git a/testing-libraries/easy-random/README.md b/testing-modules/easy-random/README.md similarity index 100% rename from testing-libraries/easy-random/README.md rename to testing-modules/easy-random/README.md diff --git a/testing-libraries/easy-random/pom.xml b/testing-modules/easy-random/pom.xml similarity index 100% rename from testing-libraries/easy-random/pom.xml rename to testing-modules/easy-random/pom.xml diff --git a/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java b/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java similarity index 100% rename from testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java rename to testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Department.java diff --git a/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java b/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java similarity index 100% rename from testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java rename to testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Employee.java diff --git a/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java b/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java similarity index 100% rename from testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java rename to testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Grade.java diff --git a/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java b/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java similarity index 100% rename from testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java rename to testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/Person.java diff --git a/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java b/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java similarity index 100% rename from testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java rename to testing-modules/easy-random/src/main/java/org/baeldung/easy/random/model/YearQuarter.java diff --git a/testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java b/testing-modules/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java similarity index 100% rename from testing-libraries/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java rename to testing-modules/easy-random/src/main/java/org/baeldung/easy/random/randomizer/YearQuarterRandomizer.java diff --git a/testing-libraries/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java b/testing-modules/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java similarity index 100% rename from testing-libraries/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java rename to testing-modules/easy-random/src/test/java/org/baeldung/easy/random/EasyRandomUnitTest.java diff --git a/testing-libraries/easymock/pom.xml b/testing-modules/easymock/pom.xml similarity index 100% rename from testing-libraries/easymock/pom.xml rename to testing-modules/easymock/pom.xml diff --git a/testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java b/testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java similarity index 100% rename from testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java rename to testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/ForecastProcessor.java diff --git a/testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/Location.java b/testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/Location.java similarity index 100% rename from testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/Location.java rename to testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/Location.java diff --git a/testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java b/testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java similarity index 100% rename from testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java rename to testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/ServiceUnavailableException.java diff --git a/testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java b/testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java similarity index 100% rename from testing-libraries/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java rename to testing-modules/easymock/src/main/java/com/baeldung/testing/easymock/WeatherService.java diff --git a/testing-libraries/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java b/testing-modules/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java similarity index 100% rename from testing-libraries/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java rename to testing-modules/easymock/src/test/java/com/baeldung/testing/easymock/ForecastProcessorUnitTest.java diff --git a/testing-libraries/gatling/README.md b/testing-modules/gatling/README.md similarity index 100% rename from testing-libraries/gatling/README.md rename to testing-modules/gatling/README.md diff --git a/testing-libraries/gatling/pom.xml b/testing-modules/gatling/pom.xml similarity index 100% rename from testing-libraries/gatling/pom.xml rename to testing-modules/gatling/pom.xml diff --git a/testing-libraries/gatling/src/test/resources/gatling.conf b/testing-modules/gatling/src/test/resources/gatling.conf similarity index 100% rename from testing-libraries/gatling/src/test/resources/gatling.conf rename to testing-modules/gatling/src/test/resources/gatling.conf diff --git a/testing-libraries/gatling/src/test/resources/logback.xml b/testing-modules/gatling/src/test/resources/logback.xml similarity index 100% rename from testing-libraries/gatling/src/test/resources/logback.xml rename to testing-modules/gatling/src/test/resources/logback.xml diff --git a/testing-libraries/gatling/src/test/resources/recorder.conf b/testing-modules/gatling/src/test/resources/recorder.conf similarity index 100% rename from testing-libraries/gatling/src/test/resources/recorder.conf rename to testing-modules/gatling/src/test/resources/recorder.conf diff --git a/testing-libraries/gatling/src/test/scala/Engine.scala b/testing-modules/gatling/src/test/scala/Engine.scala similarity index 100% rename from testing-libraries/gatling/src/test/scala/Engine.scala rename to testing-modules/gatling/src/test/scala/Engine.scala diff --git a/testing-libraries/gatling/src/test/scala/IDEPathHelper.scala b/testing-modules/gatling/src/test/scala/IDEPathHelper.scala similarity index 100% rename from testing-libraries/gatling/src/test/scala/IDEPathHelper.scala rename to testing-modules/gatling/src/test/scala/IDEPathHelper.scala diff --git a/testing-libraries/gatling/src/test/scala/Recorder.scala b/testing-modules/gatling/src/test/scala/Recorder.scala similarity index 100% rename from testing-libraries/gatling/src/test/scala/Recorder.scala rename to testing-modules/gatling/src/test/scala/Recorder.scala diff --git a/testing-libraries/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala b/testing-modules/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala similarity index 100% rename from testing-libraries/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala rename to testing-modules/gatling/src/test/scala/org/baeldung/RecordedSimulation.scala diff --git a/testing-libraries/groovy-spock/.gitignore b/testing-modules/groovy-spock/.gitignore similarity index 100% rename from testing-libraries/groovy-spock/.gitignore rename to testing-modules/groovy-spock/.gitignore diff --git a/testing-libraries/groovy-spock/README.md b/testing-modules/groovy-spock/README.md similarity index 100% rename from testing-libraries/groovy-spock/README.md rename to testing-modules/groovy-spock/README.md diff --git a/testing-libraries/groovy-spock/pom.xml b/testing-modules/groovy-spock/pom.xml similarity index 100% rename from testing-libraries/groovy-spock/pom.xml rename to testing-modules/groovy-spock/pom.xml diff --git a/testing-libraries/groovy-spock/src/main/java/mocks/EventPublisher.java b/testing-modules/groovy-spock/src/main/java/mocks/EventPublisher.java similarity index 100% rename from testing-libraries/groovy-spock/src/main/java/mocks/EventPublisher.java rename to testing-modules/groovy-spock/src/main/java/mocks/EventPublisher.java diff --git a/testing-libraries/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java b/testing-modules/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java similarity index 100% rename from testing-libraries/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java rename to testing-modules/groovy-spock/src/main/java/mocks/ExternalItemProviderException.java diff --git a/testing-libraries/groovy-spock/src/main/java/mocks/Item.java b/testing-modules/groovy-spock/src/main/java/mocks/Item.java similarity index 100% rename from testing-libraries/groovy-spock/src/main/java/mocks/Item.java rename to testing-modules/groovy-spock/src/main/java/mocks/Item.java diff --git a/testing-libraries/groovy-spock/src/main/java/mocks/ItemProvider.java b/testing-modules/groovy-spock/src/main/java/mocks/ItemProvider.java similarity index 100% rename from testing-libraries/groovy-spock/src/main/java/mocks/ItemProvider.java rename to testing-modules/groovy-spock/src/main/java/mocks/ItemProvider.java diff --git a/testing-libraries/groovy-spock/src/main/java/mocks/ItemService.java b/testing-modules/groovy-spock/src/main/java/mocks/ItemService.java similarity index 100% rename from testing-libraries/groovy-spock/src/main/java/mocks/ItemService.java rename to testing-modules/groovy-spock/src/main/java/mocks/ItemService.java diff --git a/testing-libraries/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java b/testing-modules/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java similarity index 100% rename from testing-libraries/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java rename to testing-modules/groovy-spock/src/main/java/mocks/LoggingEventPublisher.java diff --git a/testing-libraries/groovy-spock/src/test/groovy/FirstSpecification.groovy b/testing-modules/groovy-spock/src/test/groovy/FirstSpecification.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/FirstSpecification.groovy rename to testing-modules/groovy-spock/src/test/groovy/FirstSpecification.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/Notifier.groovy b/testing-modules/groovy-spock/src/test/groovy/Notifier.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/Notifier.groovy rename to testing-modules/groovy-spock/src/test/groovy/Notifier.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/PaymentGateway.groovy b/testing-modules/groovy-spock/src/test/groovy/PaymentGateway.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/PaymentGateway.groovy rename to testing-modules/groovy-spock/src/test/groovy/PaymentGateway.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/CustomTitleTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreIfTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreRestTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/IgnoreTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/IssueTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/IssueTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/IssueTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/IssueTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/PendingFeatureTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/RequiresTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/RestoreSystemPropertiesTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/RetryTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/RetryTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/RetryTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/RetryTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/SeeTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/SeeTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/SeeTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/SeeTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/StackTraceTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/StepwiseTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/SubjectTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy b/testing-modules/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/extensions/TimeoutTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy b/testing-modules/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy rename to testing-modules/groovy-spock/src/test/groovy/mocks/ItemServiceUnitTest.groovy diff --git a/testing-libraries/groovy-spock/src/test/resources/SpockConfig.groovy b/testing-modules/groovy-spock/src/test/resources/SpockConfig.groovy similarity index 100% rename from testing-libraries/groovy-spock/src/test/resources/SpockConfig.groovy rename to testing-modules/groovy-spock/src/test/resources/SpockConfig.groovy diff --git a/testing-libraries/junit-4/README.md b/testing-modules/junit-4/README.md similarity index 100% rename from testing-libraries/junit-4/README.md rename to testing-modules/junit-4/README.md diff --git a/testing-libraries/junit-4/pom.xml b/testing-modules/junit-4/pom.xml similarity index 100% rename from testing-libraries/junit-4/pom.xml rename to testing-modules/junit-4/pom.xml diff --git a/testing-libraries/junit-4/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java b/testing-modules/junit-4/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java similarity index 100% rename from testing-libraries/junit-4/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java rename to testing-modules/junit-4/src/main/java/com/baeldung/junitparams/SafeAdditionUtil.java diff --git a/testing-libraries/junit-4/src/main/resources/logback.xml b/testing-modules/junit-4/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/junit-4/src/main/resources/logback.xml rename to testing-modules/junit-4/src/main/resources/logback.xml diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junitparams/SafeAdditionUtilUnitTest.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/junitparams/TestDataProvider.java b/testing-modules/junit-4/src/test/java/com/baeldung/junitparams/TestDataProvider.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/junitparams/TestDataProvider.java rename to testing-modules/junit-4/src/test/java/com/baeldung/junitparams/TestDataProvider.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java rename to testing-modules/junit-4/src/test/java/com/baeldung/rules/MessageLogger.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/rules/RuleChainUnitTest.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/rules/RulesUnitTest.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java rename to testing-modules/junit-4/src/test/java/com/baeldung/rules/TestMethodNameLogger.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/rules/VerifierRuleUnitTest.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/MyTestSuite.java b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/MyTestSuite.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/MyTestSuite.java rename to testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/MyTestSuite.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java rename to testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/RunJUnit4TestsFromJava.java diff --git a/testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java similarity index 100% rename from testing-libraries/junit-4/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java rename to testing-modules/junit-4/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java diff --git a/testing-libraries/junit-4/src/test/resources/JunitParamsTestParameters.csv b/testing-modules/junit-4/src/test/resources/JunitParamsTestParameters.csv similarity index 100% rename from testing-libraries/junit-4/src/test/resources/JunitParamsTestParameters.csv rename to testing-modules/junit-4/src/test/resources/JunitParamsTestParameters.csv diff --git a/testing-libraries/junit-5-advanced/README.md b/testing-modules/junit-5-advanced/README.md similarity index 100% rename from testing-libraries/junit-5-advanced/README.md rename to testing-modules/junit-5-advanced/README.md diff --git a/testing-libraries/junit-5-advanced/pom.xml b/testing-modules/junit-5-advanced/pom.xml similarity index 100% rename from testing-libraries/junit-5-advanced/pom.xml rename to testing-modules/junit-5-advanced/pom.xml diff --git a/testing-libraries/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java rename to testing-modules/junit-5-advanced/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java diff --git a/testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java rename to testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/Tweet.java diff --git a/testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java rename to testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetException.java diff --git a/testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java b/testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java rename to testing-modules/junit-5-advanced/src/main/java/com/baeldung/junit5/testinstance/TweetSerializer.java diff --git a/testing-libraries/junit-5-advanced/src/main/resources/logback.xml b/testing-modules/junit-5-advanced/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/junit-5-advanced/src/main/resources/logback.xml rename to testing-modules/junit-5-advanced/src/main/resources/logback.xml diff --git a/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/DisplayNameGeneratorUnitTest.java diff --git a/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/displayname/ReplaceUnderscoresGeneratorUnitTest.java diff --git a/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestResultLoggerExtension.java diff --git a/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/extensions/testwatcher/TestWatcherAPIUnitTest.java diff --git a/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java diff --git a/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/AdditionUnitTest.java diff --git a/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/OrderUnitTest.java diff --git a/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerJUnit4UnitTest.java diff --git a/testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java b/testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java rename to testing-modules/junit-5-advanced/src/test/java/com/baeldung/junit5/testinstance/TweetSerializerUnitTest.java diff --git a/testing-libraries/junit-5-advanced/src/test/resources/lorem-ipsum.txt b/testing-modules/junit-5-advanced/src/test/resources/lorem-ipsum.txt similarity index 100% rename from testing-libraries/junit-5-advanced/src/test/resources/lorem-ipsum.txt rename to testing-modules/junit-5-advanced/src/test/resources/lorem-ipsum.txt diff --git a/testing-libraries/junit-5-basics/README.md b/testing-modules/junit-5-basics/README.md similarity index 100% rename from testing-libraries/junit-5-basics/README.md rename to testing-modules/junit-5-basics/README.md diff --git a/testing-libraries/junit-5-basics/pom.xml b/testing-modules/junit-5-basics/pom.xml similarity index 100% rename from testing-libraries/junit-5-basics/pom.xml rename to testing-modules/junit-5-basics/pom.xml diff --git a/testing-libraries/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java b/testing-modules/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java similarity index 100% rename from testing-libraries/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java rename to testing-modules/junit-5-basics/src/main/java/com/baeldung/failure_vs_error/SimpleCalculator.java diff --git a/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java b/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java similarity index 100% rename from testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java rename to testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/Employee.java diff --git a/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java b/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java similarity index 100% rename from testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java rename to testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeDAO.java diff --git a/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java b/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java similarity index 100% rename from testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java rename to testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/EmployeeRowMapper.java diff --git a/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java b/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java similarity index 100% rename from testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java rename to testing-modules/junit-5-basics/src/main/java/com/baeldung/junit/tags/example/SpringJdbcConfig.java diff --git a/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java b/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java similarity index 100% rename from testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java rename to testing-modules/junit-5-basics/src/main/java/com/baeldung/junit5/Greetings.java diff --git a/testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java b/testing-modules/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java similarity index 100% rename from testing-libraries/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java rename to testing-modules/junit-5-basics/src/main/java/com/baeldung/junit5/bean/NumbersBean.java diff --git a/testing-libraries/junit-5-basics/src/main/resources/jdbc/schema.sql b/testing-modules/junit-5-basics/src/main/resources/jdbc/schema.sql similarity index 100% rename from testing-libraries/junit-5-basics/src/main/resources/jdbc/schema.sql rename to testing-modules/junit-5-basics/src/main/resources/jdbc/schema.sql diff --git a/testing-libraries/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml b/testing-modules/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml similarity index 100% rename from testing-libraries/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml rename to testing-modules/junit-5-basics/src/main/resources/jdbc/springJdbc-config.xml diff --git a/testing-libraries/junit-5-basics/src/main/resources/jdbc/test-data.sql b/testing-modules/junit-5-basics/src/main/resources/jdbc/test-data.sql similarity index 100% rename from testing-libraries/junit-5-basics/src/main/resources/jdbc/test-data.sql rename to testing-modules/junit-5-basics/src/main/resources/jdbc/test-data.sql diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/ExceptionUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/FirstUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/GreetingsUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/JUnit5NewFeaturesUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/LiveTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/LiveTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/LiveTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/LiveTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOCategoryIntegrationTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/EmployeeDAOUnitTestSuite.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/IntegrationTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/categories/UnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/exception/ExceptionAssertionUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/SharedTemporaryDirectoryUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/extensions/tempdir/TemporaryDirectoryUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/failure_vs_error/SimpleCalculatorUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/bean/test/NumbersBeanUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/spring/GreetingsSpringUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/junit5/spring/SpringTestConfiguration.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AnnotationTestExampleUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/AssertionsExampleUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeAndAfterAnnotationsUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/BeforeClassAndAfterClassAnnotationsUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/ExceptionAssertionUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/RuleExampleUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/Annotations.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/categories/JUnit4UnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit4/rules/TraceUnitTestRule.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AnnotationTestExampleUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssertionsExampleUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/AssumptionUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeAllAndAfterAllAnnotationsUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/BeforeEachAndAfterEachAnnotationsUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/RuleExampleUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/migration/junit5/extensions/TraceUnitExtension.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/resourcedirectory/ReadResourceDirectoryUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/suites/AllUnitTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java diff --git a/testing-libraries/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java similarity index 100% rename from testing-libraries/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java rename to testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOTestSuite.java diff --git a/testing-libraries/junit-5-basics/src/test/resources/example_resource.txt b/testing-modules/junit-5-basics/src/test/resources/example_resource.txt similarity index 100% rename from testing-libraries/junit-5-basics/src/test/resources/example_resource.txt rename to testing-modules/junit-5-basics/src/test/resources/example_resource.txt diff --git a/testing-libraries/junit-5/README.md b/testing-modules/junit-5/README.md similarity index 100% rename from testing-libraries/junit-5/README.md rename to testing-modules/junit-5/README.md diff --git a/testing-libraries/junit-5/pom.xml b/testing-modules/junit-5/pom.xml similarity index 100% rename from testing-libraries/junit-5/pom.xml rename to testing-modules/junit-5/pom.xml diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java b/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java rename to testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCalling.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java b/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java rename to testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependent.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java b/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java rename to testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/indepedentmethod/ConcreteImpl.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java b/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java rename to testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFields.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java b/testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java rename to testing-modules/junit-5/src/main/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethods.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/User.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/MailClient.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/SettingRepository.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/repository/UserRepository.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/DefaultUserService.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/Errors.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5/mockito/service/UserService.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java diff --git a/testing-libraries/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java b/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java similarity index 100% rename from testing-libraries/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java rename to testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java diff --git a/testing-libraries/junit-5/src/main/resources/logback.xml b/testing-modules/junit-5/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/junit-5/src/main/resources/logback.xml rename to testing-modules/junit-5/src/main/resources/logback.xml diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java b/testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java rename to testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/EmployeesUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/MultipleExtensionsUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/NestedUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/NestedUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/NestedUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/NestedUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/ProgrammaticEmployeesUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java b/testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java rename to testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/StringUtils.java b/testing-modules/junit-5/src/test/java/com/baeldung/StringUtils.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/StringUtils.java rename to testing-modules/junit-5/src/test/java/com/baeldung/StringUtils.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/TaggedUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/TestLauncher.java b/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/TestLauncher.java rename to testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/abstractmethod/AbstractMethodCallingUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/indepedentmethod/AbstractIndependentUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/instancefields/AbstractInstanceFieldsUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/abstractclass/privatemethod/AbstractPrivateMethodsUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDaoParameterResolver.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/EmployeeDatabaseSetupExtension.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/EnvironmentExtension.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/IgnoreFileNotFoundExceptionExtension.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/LoggingExtension.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java b/testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java rename to testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/helpers/Employee.java b/testing-modules/junit-5/src/test/java/com/baeldung/helpers/Employee.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/helpers/Employee.java rename to testing-modules/junit-5/src/test/java/com/baeldung/helpers/Employee.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java b/testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java rename to testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeDao.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java b/testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java rename to testing-modules/junit-5/src/test/java/com/baeldung/helpers/EmployeeJdbcDao.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java b/testing-modules/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java rename to testing-modules/junit-5/src/test/java/com/baeldung/helpers/JdbcConnectionUtil.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5/mockito/UserServiceUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/AlphanumericOrderUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrder.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/CustomOrderUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5/order/OrderAnnotationUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/methodorders/DefaultOrderOfExecutionUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/methodorders/JVMOrderOfExecutionUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/methodorders/NameAscendingOrderOfExecutionUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/InvalidPersonParameterResolver.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/param/Person.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/Person.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/param/Person.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/Person.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/param/PersonValidator.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidator.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/param/PersonValidator.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidator.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/PersonValidatorUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java b/testing-modules/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java rename to testing-modules/junit-5/src/test/java/com/baeldung/param/ValidPersonParameterResolver.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Person.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Person.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Strings.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/Strings.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java b/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java rename to testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/FirstUnitTest.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java b/testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java rename to testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/RunJUnit5TestsFromJava.java diff --git a/testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java b/testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java similarity index 100% rename from testing-libraries/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java rename to testing-modules/junit-5/src/test/java/com/baeldung/runfromjava/SecondUnitTest.java diff --git a/testing-libraries/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension b/testing-modules/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension similarity index 100% rename from testing-libraries/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension rename to testing-modules/junit-5/src/test/resources/META-INF/services/org.junit.jupiter.api.extension.Extension diff --git a/testing-libraries/junit-5/src/test/resources/com/baeldung/extensions/application.properties b/testing-modules/junit-5/src/test/resources/com/baeldung/extensions/application.properties similarity index 100% rename from testing-libraries/junit-5/src/test/resources/com/baeldung/extensions/application.properties rename to testing-modules/junit-5/src/test/resources/com/baeldung/extensions/application.properties diff --git a/testing-libraries/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties b/testing-modules/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties similarity index 100% rename from testing-libraries/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties rename to testing-modules/junit-5/src/test/resources/com/baeldung/helpers/jdbc.properties diff --git a/testing-libraries/junit-5/src/test/resources/data.csv b/testing-modules/junit-5/src/test/resources/data.csv similarity index 100% rename from testing-libraries/junit-5/src/test/resources/data.csv rename to testing-modules/junit-5/src/test/resources/data.csv diff --git a/testing-libraries/junit5-migration/README.md b/testing-modules/junit5-migration/README.md similarity index 100% rename from testing-libraries/junit5-migration/README.md rename to testing-modules/junit5-migration/README.md diff --git a/testing-libraries/junit5-migration/pom.xml b/testing-modules/junit5-migration/pom.xml similarity index 100% rename from testing-libraries/junit5-migration/pom.xml rename to testing-modules/junit5-migration/pom.xml diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AnnotationTestExampleUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AssertionUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/AssumeUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/ExceptionAssertionUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/RuleExampleUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/TestAnnotationsUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/TraceUnitTestRule.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/categories/Annotations.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4/categories/JUnit4UnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AnnotationTestExampleUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AssertionUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/AssumptionUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/ConditionalExecutionUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/NestedUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleExampleUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/RuleMigrationSupportUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/TestAnnotationsUnitTest.java diff --git a/testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java similarity index 100% rename from testing-libraries/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5/TraceUnitExtension.java diff --git a/testing-libraries/load-testing-comparison/README.md b/testing-modules/load-testing-comparison/README.md similarity index 100% rename from testing-libraries/load-testing-comparison/README.md rename to testing-modules/load-testing-comparison/README.md diff --git a/testing-libraries/load-testing-comparison/pom.xml b/testing-modules/load-testing-comparison/pom.xml similarity index 100% rename from testing-libraries/load-testing-comparison/pom.xml rename to testing-modules/load-testing-comparison/pom.xml diff --git a/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java rename to testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java diff --git a/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java rename to testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java diff --git a/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java rename to testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java diff --git a/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java rename to testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java diff --git a/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java rename to testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java diff --git a/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java rename to testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java diff --git a/testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java rename to testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java diff --git a/testing-libraries/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala rename to testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala diff --git a/testing-libraries/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx b/testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx rename to testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx diff --git a/testing-libraries/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties b/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties rename to testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties diff --git a/testing-libraries/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py b/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py similarity index 100% rename from testing-libraries/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py rename to testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py diff --git a/testing-libraries/mockito-2/.gitignore b/testing-modules/mockito-2/.gitignore similarity index 100% rename from testing-libraries/mockito-2/.gitignore rename to testing-modules/mockito-2/.gitignore diff --git a/testing-libraries/mockito-2/README.md b/testing-modules/mockito-2/README.md similarity index 100% rename from testing-libraries/mockito-2/README.md rename to testing-modules/mockito-2/README.md diff --git a/testing-libraries/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml similarity index 100% rename from testing-libraries/mockito-2/pom.xml rename to testing-modules/mockito-2/pom.xml diff --git a/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java similarity index 100% rename from testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobPosition.java diff --git a/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java similarity index 100% rename from testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/JobService.java diff --git a/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java similarity index 100% rename from testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/Person.java diff --git a/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java similarity index 100% rename from testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentService.java diff --git a/testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java b/testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java similarity index 100% rename from testing-libraries/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java rename to testing-modules/mockito-2/src/main/java/com/baeldung/mockito/java8/UnemploymentServiceImpl.java diff --git a/testing-libraries/mockito-2/src/main/resources/logback.xml b/testing-modules/mockito-2/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/mockito-2/src/main/resources/logback.xml rename to testing-modules/mockito-2/src/main/resources/logback.xml diff --git a/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java similarity index 100% rename from testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithLambdaUnitTest.java diff --git a/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java similarity index 100% rename from testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/ArgumentMatcherWithoutLambdaUnitTest.java diff --git a/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java similarity index 100% rename from testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithLambdaUnitTest.java diff --git a/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java similarity index 100% rename from testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/CustomAnswerWithoutLambdaUnitTest.java diff --git a/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java similarity index 100% rename from testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/JobServiceUnitTest.java diff --git a/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java similarity index 100% rename from testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java diff --git a/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java similarity index 100% rename from testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/UnemploymentServiceImplUnitTest.java diff --git a/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java similarity index 100% rename from testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/ExpectedTestFailureRule.java diff --git a/testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java similarity index 100% rename from testing-libraries/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/misusing/MockitoUnecessaryStubUnitTest.java diff --git a/testing-libraries/mockito/.gitignore b/testing-modules/mockito/.gitignore similarity index 100% rename from testing-libraries/mockito/.gitignore rename to testing-modules/mockito/.gitignore diff --git a/testing-libraries/mockito/README.md b/testing-modules/mockito/README.md similarity index 100% rename from testing-libraries/mockito/README.md rename to testing-modules/mockito/README.md diff --git a/testing-libraries/mockito/pom.xml b/testing-modules/mockito/pom.xml similarity index 100% rename from testing-libraries/mockito/pom.xml rename to testing-modules/mockito/pom.xml diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/City.java b/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/City.java rename to testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/Location.java b/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/Location.java rename to testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java b/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java rename to testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java b/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java rename to testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java b/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java rename to testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java b/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java rename to testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Callback.java b/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Callback.java rename to testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Data.java b/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Data.java rename to testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Response.java b/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Response.java rename to testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java diff --git a/testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Service.java b/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java similarity index 100% rename from testing-libraries/mockito/src/main/java/org/baeldung/mockito/service/Service.java rename to testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java diff --git a/testing-libraries/mockito/src/main/resources/logback.xml b/testing-modules/mockito/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/mockito/src/main/resources/logback.xml rename to testing-modules/mockito/src/main/resources/logback.xml diff --git a/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java similarity index 100% rename from testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorForPartialMocking.java diff --git a/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java similarity index 100% rename from testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithFinalMethods.java diff --git a/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java similarity index 100% rename from testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/CollaboratorWithStaticMethods.java diff --git a/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java similarity index 100% rename from testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGenerator.java diff --git a/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java diff --git a/testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java rename to testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java rename to testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/FinalList.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/FinalList.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockFinals.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockFinals.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVoidMethodsUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/MyList.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/MyList.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MyList.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java diff --git a/testing-libraries/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java similarity index 100% rename from testing-libraries/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java diff --git a/testing-libraries/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/testing-modules/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker similarity index 100% rename from testing-libraries/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker rename to testing-modules/mockito/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker diff --git a/testing-libraries/mockito/src/test/resources/test1.in b/testing-modules/mockito/src/test/resources/test1.in similarity index 100% rename from testing-libraries/mockito/src/test/resources/test1.in rename to testing-modules/mockito/src/test/resources/test1.in diff --git a/testing-libraries/mocks/README.md b/testing-modules/mocks/README.md similarity index 100% rename from testing-libraries/mocks/README.md rename to testing-modules/mocks/README.md diff --git a/testing-libraries/mocks/javafaker/pom.xml b/testing-modules/mocks/javafaker/pom.xml similarity index 100% rename from testing-libraries/mocks/javafaker/pom.xml rename to testing-modules/mocks/javafaker/pom.xml diff --git a/testing-libraries/mocks/javafaker/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java b/testing-modules/mocks/javafaker/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java similarity index 100% rename from testing-libraries/mocks/javafaker/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java rename to testing-modules/mocks/javafaker/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java diff --git a/testing-libraries/mocks/jmockit/README.md b/testing-modules/mocks/jmockit/README.md similarity index 100% rename from testing-libraries/mocks/jmockit/README.md rename to testing-modules/mocks/jmockit/README.md diff --git a/testing-libraries/mocks/jmockit/pom.xml b/testing-modules/mocks/jmockit/pom.xml similarity index 100% rename from testing-libraries/mocks/jmockit/pom.xml rename to testing-modules/mocks/jmockit/pom.xml diff --git a/testing-libraries/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java b/testing-modules/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java rename to testing-modules/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java diff --git a/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java diff --git a/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java diff --git a/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java diff --git a/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java diff --git a/testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java b/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java rename to testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java diff --git a/testing-libraries/mocks/jmockit/src/main/resources/logback.xml b/testing-modules/mocks/jmockit/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/mocks/jmockit/src/main/resources/logback.xml rename to testing-modules/mocks/jmockit/src/main/resources/logback.xml diff --git a/testing-libraries/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java b/testing-modules/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java rename to testing-modules/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java diff --git a/testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java b/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java rename to testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java diff --git a/testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java b/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java rename to testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java diff --git a/testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java b/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java rename to testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java diff --git a/testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java b/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java similarity index 100% rename from testing-libraries/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java rename to testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java diff --git a/testing-libraries/mocks/jukito/pom.xml b/testing-modules/mocks/jukito/pom.xml similarity index 100% rename from testing-libraries/mocks/jukito/pom.xml rename to testing-modules/mocks/jukito/pom.xml diff --git a/testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/Calculator.java b/testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/Calculator.java similarity index 100% rename from testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/Calculator.java rename to testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/Calculator.java diff --git a/testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java b/testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java similarity index 100% rename from testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java rename to testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java diff --git a/testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java b/testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java similarity index 100% rename from testing-libraries/mocks/jukito/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java rename to testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java diff --git a/testing-libraries/mocks/jukito/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java b/testing-modules/mocks/jukito/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java similarity index 100% rename from testing-libraries/mocks/jukito/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java rename to testing-modules/mocks/jukito/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java diff --git a/testing-libraries/mocks/mock-comparisons/README.md b/testing-modules/mocks/mock-comparisons/README.md similarity index 100% rename from testing-libraries/mocks/mock-comparisons/README.md rename to testing-modules/mocks/mock-comparisons/README.md diff --git a/testing-libraries/mocks/mock-comparisons/pom.xml b/testing-modules/mocks/mock-comparisons/pom.xml similarity index 100% rename from testing-libraries/mocks/mock-comparisons/pom.xml rename to testing-modules/mocks/mock-comparisons/pom.xml diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java b/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java rename to testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java b/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java rename to testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java b/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java rename to testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java b/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java rename to testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java b/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java rename to testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java b/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java rename to testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java b/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java rename to testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java b/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java rename to testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java b/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java rename to testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java b/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java rename to testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java diff --git a/testing-libraries/mocks/mock-comparisons/src/main/resources/logback.xml b/testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/main/resources/logback.xml rename to testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml diff --git a/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java diff --git a/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java diff --git a/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java diff --git a/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java diff --git a/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java diff --git a/testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java diff --git a/testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java diff --git a/testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java diff --git a/testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java b/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java similarity index 100% rename from testing-libraries/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java rename to testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java diff --git a/testing-libraries/mocks/pom.xml b/testing-modules/mocks/pom.xml similarity index 100% rename from testing-libraries/mocks/pom.xml rename to testing-modules/mocks/pom.xml diff --git a/testing-libraries/mockserver/README.md b/testing-modules/mockserver/README.md similarity index 100% rename from testing-libraries/mockserver/README.md rename to testing-modules/mockserver/README.md diff --git a/testing-libraries/mockserver/pom.xml b/testing-modules/mockserver/pom.xml similarity index 100% rename from testing-libraries/mockserver/pom.xml rename to testing-modules/mockserver/pom.xml diff --git a/testing-libraries/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java b/testing-modules/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java similarity index 100% rename from testing-libraries/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java rename to testing-modules/mockserver/src/main/java/com/baeldung/mock/server/ExpectationCallbackHandler.java diff --git a/testing-libraries/mockserver/src/main/resources/logback.xml b/testing-modules/mockserver/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/mockserver/src/main/resources/logback.xml rename to testing-modules/mockserver/src/main/resources/logback.xml diff --git a/testing-libraries/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java b/testing-modules/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java similarity index 100% rename from testing-libraries/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java rename to testing-modules/mockserver/src/test/java/com/baeldung/mock/server/MockServerLiveTest.java diff --git a/testing-libraries/parallel-tests-junit/README.md b/testing-modules/parallel-tests-junit/README.md similarity index 100% rename from testing-libraries/parallel-tests-junit/README.md rename to testing-modules/parallel-tests-junit/README.md diff --git a/testing-libraries/parallel-tests-junit/math-test-functions/pom.xml b/testing-modules/parallel-tests-junit/math-test-functions/pom.xml similarity index 100% rename from testing-libraries/parallel-tests-junit/math-test-functions/pom.xml rename to testing-modules/parallel-tests-junit/math-test-functions/pom.xml diff --git a/testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java b/testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java similarity index 100% rename from testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java rename to testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ArithmeticFunctionUnitTest.java diff --git a/testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java b/testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java similarity index 100% rename from testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java rename to testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/ComparisonFunctionUnitTest.java diff --git a/testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java b/testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java similarity index 100% rename from testing-libraries/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java rename to testing-modules/parallel-tests-junit/math-test-functions/src/test/java/com/baeldung/FunctionTestSuite.java diff --git a/testing-libraries/parallel-tests-junit/pom.xml b/testing-modules/parallel-tests-junit/pom.xml similarity index 100% rename from testing-libraries/parallel-tests-junit/pom.xml rename to testing-modules/parallel-tests-junit/pom.xml diff --git a/testing-libraries/parallel-tests-junit/string-test-functions/pom.xml b/testing-modules/parallel-tests-junit/string-test-functions/pom.xml similarity index 100% rename from testing-libraries/parallel-tests-junit/string-test-functions/pom.xml rename to testing-modules/parallel-tests-junit/string-test-functions/pom.xml diff --git a/testing-libraries/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java b/testing-modules/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java similarity index 100% rename from testing-libraries/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java rename to testing-modules/parallel-tests-junit/string-test-functions/src/test/java/com/baeldung/StringFunctionUnitTest.java diff --git a/testing-libraries/pom.xml b/testing-modules/pom.xml similarity index 100% rename from testing-libraries/pom.xml rename to testing-modules/pom.xml diff --git a/testing-libraries/rest-assured/.gitignore b/testing-modules/rest-assured/.gitignore similarity index 100% rename from testing-libraries/rest-assured/.gitignore rename to testing-modules/rest-assured/.gitignore diff --git a/testing-libraries/rest-assured/README.md b/testing-modules/rest-assured/README.md similarity index 100% rename from testing-libraries/rest-assured/README.md rename to testing-modules/rest-assured/README.md diff --git a/testing-libraries/rest-assured/pom.xml b/testing-modules/rest-assured/pom.xml similarity index 100% rename from testing-libraries/rest-assured/pom.xml rename to testing-modules/rest-assured/pom.xml diff --git a/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/Application.java b/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/Application.java similarity index 100% rename from testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/Application.java rename to testing-modules/rest-assured/src/main/java/com/baeldung/restassured/Application.java diff --git a/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java b/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java similarity index 100% rename from testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java rename to testing-modules/rest-assured/src/main/java/com/baeldung/restassured/controller/AppController.java diff --git a/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java b/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java similarity index 100% rename from testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java rename to testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/Course.java diff --git a/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java b/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java similarity index 100% rename from testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java rename to testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseController.java diff --git a/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java b/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java similarity index 100% rename from testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java rename to testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseControllerExceptionHandler.java diff --git a/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java b/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java similarity index 100% rename from testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java rename to testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseNotFoundException.java diff --git a/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java b/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java similarity index 100% rename from testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java rename to testing-modules/rest-assured/src/main/java/com/baeldung/restassured/learner/CourseService.java diff --git a/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java b/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java similarity index 100% rename from testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java rename to testing-modules/rest-assured/src/main/java/com/baeldung/restassured/model/Movie.java diff --git a/testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java b/testing-modules/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java similarity index 100% rename from testing-libraries/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java rename to testing-modules/rest-assured/src/main/java/com/baeldung/restassured/service/AppService.java diff --git a/testing-libraries/rest-assured/src/main/resources/1 b/testing-modules/rest-assured/src/main/resources/1 similarity index 100% rename from testing-libraries/rest-assured/src/main/resources/1 rename to testing-modules/rest-assured/src/main/resources/1 diff --git a/testing-libraries/rest-assured/src/main/resources/2 b/testing-modules/rest-assured/src/main/resources/2 similarity index 100% rename from testing-libraries/rest-assured/src/main/resources/2 rename to testing-modules/rest-assured/src/main/resources/2 diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/Odd.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Odd.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/Odd.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Odd.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssured2IntegrationTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredAdvancedLiveTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredIntegrationTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXML2IntegrationTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/RestAssuredXMLIntegrationTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/Util.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/Util.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/Util.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicAuthenticationLiveTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/BasicPreemtiveAuthenticationLiveTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/DigestAuthenticationLiveTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAuthenticationLiveTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/FormAutoconfAuthenticationLiveTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuth2AuthenticationLiveTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/authentication/OAuthAuthenticationLiveTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/controller/AppControllerIntegrationTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerIntegrationTest.java diff --git a/testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java b/testing-modules/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java similarity index 100% rename from testing-libraries/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java rename to testing-modules/rest-assured/src/test/java/com/baeldung/restassured/learner/CourseControllerUnitTest.java diff --git a/testing-libraries/rest-assured/src/test/resources/employees.xml b/testing-modules/rest-assured/src/test/resources/employees.xml similarity index 100% rename from testing-libraries/rest-assured/src/test/resources/employees.xml rename to testing-modules/rest-assured/src/test/resources/employees.xml diff --git a/testing-libraries/rest-assured/src/test/resources/event_0.json b/testing-modules/rest-assured/src/test/resources/event_0.json similarity index 100% rename from testing-libraries/rest-assured/src/test/resources/event_0.json rename to testing-modules/rest-assured/src/test/resources/event_0.json diff --git a/testing-libraries/rest-assured/src/test/resources/logback.xml b/testing-modules/rest-assured/src/test/resources/logback.xml similarity index 100% rename from testing-libraries/rest-assured/src/test/resources/logback.xml rename to testing-modules/rest-assured/src/test/resources/logback.xml diff --git a/testing-libraries/rest-assured/src/test/resources/odds.json b/testing-modules/rest-assured/src/test/resources/odds.json similarity index 100% rename from testing-libraries/rest-assured/src/test/resources/odds.json rename to testing-modules/rest-assured/src/test/resources/odds.json diff --git a/testing-libraries/rest-assured/src/test/resources/teachers.xml b/testing-modules/rest-assured/src/test/resources/teachers.xml similarity index 100% rename from testing-libraries/rest-assured/src/test/resources/teachers.xml rename to testing-modules/rest-assured/src/test/resources/teachers.xml diff --git a/testing-libraries/rest-assured/src/test/resources/test.txt b/testing-modules/rest-assured/src/test/resources/test.txt similarity index 100% rename from testing-libraries/rest-assured/src/test/resources/test.txt rename to testing-modules/rest-assured/src/test/resources/test.txt diff --git a/testing-libraries/rest-testing/.gitignore b/testing-modules/rest-testing/.gitignore similarity index 100% rename from testing-libraries/rest-testing/.gitignore rename to testing-modules/rest-testing/.gitignore diff --git a/testing-libraries/rest-testing/README.md b/testing-modules/rest-testing/README.md similarity index 100% rename from testing-libraries/rest-testing/README.md rename to testing-modules/rest-testing/README.md diff --git a/testing-libraries/rest-testing/pom.xml b/testing-modules/rest-testing/pom.xml similarity index 100% rename from testing-libraries/rest-testing/pom.xml rename to testing-modules/rest-testing/pom.xml diff --git a/testing-libraries/rest-testing/src/main/resources/cucumber.json b/testing-modules/rest-testing/src/main/resources/cucumber.json similarity index 100% rename from testing-libraries/rest-testing/src/main/resources/cucumber.json rename to testing-modules/rest-testing/src/main/resources/cucumber.json diff --git a/testing-libraries/rest-testing/src/main/resources/karate/cucumber.feature b/testing-modules/rest-testing/src/main/resources/karate/cucumber.feature similarity index 100% rename from testing-libraries/rest-testing/src/main/resources/karate/cucumber.feature rename to testing-modules/rest-testing/src/main/resources/karate/cucumber.feature diff --git a/testing-libraries/rest-testing/src/main/resources/logback.xml b/testing-modules/rest-testing/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/rest-testing/src/main/resources/logback.xml rename to testing-modules/rest-testing/src/main/resources/logback.xml diff --git a/testing-libraries/rest-testing/src/main/resources/wiremock_intro.json b/testing-modules/rest-testing/src/main/resources/wiremock_intro.json similarity index 100% rename from testing-libraries/rest-testing/src/main/resources/wiremock_intro.json rename to testing-modules/rest-testing/src/main/resources/wiremock_intro.json diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/CucumberIntegrationTest.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/cucumber/StepDefinition.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/AbstractStory.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundSteps.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserNotFoundStoryLiveTest.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeSteps.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponseMediaTypeStoryLiveTest.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadSteps.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/GithubUserResponsePayloadStoryLiveTest.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseSteps.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/jbehave/IncreaseStoryLiveTest.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/karate/KarateIntegrationTest.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/JUnitManagedIntegrationTest.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/introduction/ProgrammaticallyManagedLiveTest.java diff --git a/testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java b/testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java rename to testing-modules/rest-testing/src/test/java/com/baeldung/rest/wiremock/scenario/WireMockScenarioExampleIntegrationTest.java diff --git a/testing-libraries/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java b/testing-modules/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java rename to testing-modules/rest-testing/src/test/java/org/baeldung/rest/GitHubUser.java diff --git a/testing-libraries/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java b/testing-modules/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java similarity index 100% rename from testing-libraries/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java rename to testing-modules/rest-testing/src/test/java/org/baeldung/rest/RetrieveUtil.java diff --git a/testing-libraries/rest-testing/src/test/resources/Feature/cucumber.feature b/testing-modules/rest-testing/src/test/resources/Feature/cucumber.feature similarity index 100% rename from testing-libraries/rest-testing/src/test/resources/Feature/cucumber.feature rename to testing-modules/rest-testing/src/test/resources/Feature/cucumber.feature diff --git a/testing-libraries/rest-testing/src/test/resources/github_user_not_found.story b/testing-modules/rest-testing/src/test/resources/github_user_not_found.story similarity index 100% rename from testing-libraries/rest-testing/src/test/resources/github_user_not_found.story rename to testing-modules/rest-testing/src/test/resources/github_user_not_found.story diff --git a/testing-libraries/rest-testing/src/test/resources/github_user_response_mediatype.story b/testing-modules/rest-testing/src/test/resources/github_user_response_mediatype.story similarity index 100% rename from testing-libraries/rest-testing/src/test/resources/github_user_response_mediatype.story rename to testing-modules/rest-testing/src/test/resources/github_user_response_mediatype.story diff --git a/testing-libraries/rest-testing/src/test/resources/github_user_response_payload.story b/testing-modules/rest-testing/src/test/resources/github_user_response_payload.story similarity index 100% rename from testing-libraries/rest-testing/src/test/resources/github_user_response_payload.story rename to testing-modules/rest-testing/src/test/resources/github_user_response_payload.story diff --git a/testing-libraries/rest-testing/src/test/resources/increase.story b/testing-modules/rest-testing/src/test/resources/increase.story similarity index 100% rename from testing-libraries/rest-testing/src/test/resources/increase.story rename to testing-modules/rest-testing/src/test/resources/increase.story diff --git a/testing-libraries/rest-testing/src/test/resources/karate/user.feature b/testing-modules/rest-testing/src/test/resources/karate/user.feature similarity index 100% rename from testing-libraries/rest-testing/src/test/resources/karate/user.feature rename to testing-modules/rest-testing/src/test/resources/karate/user.feature diff --git a/testing-libraries/runjunitfromjava/src/main/resources/logback.xml b/testing-modules/runjunitfromjava/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/runjunitfromjava/src/main/resources/logback.xml rename to testing-modules/runjunitfromjava/src/main/resources/logback.xml diff --git a/testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java similarity index 100% rename from testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java rename to testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java diff --git a/testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java similarity index 100% rename from testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java rename to testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java diff --git a/testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java similarity index 100% rename from testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java rename to testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java diff --git a/testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java similarity index 100% rename from testing-libraries/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java rename to testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java diff --git a/testing-libraries/selenium-junit-testng/README.md b/testing-modules/selenium-junit-testng/README.md similarity index 100% rename from testing-libraries/selenium-junit-testng/README.md rename to testing-modules/selenium-junit-testng/README.md diff --git a/testing-libraries/selenium-junit-testng/geckodriver.mac b/testing-modules/selenium-junit-testng/geckodriver.mac similarity index 100% rename from testing-libraries/selenium-junit-testng/geckodriver.mac rename to testing-modules/selenium-junit-testng/geckodriver.mac diff --git a/testing-libraries/selenium-junit-testng/pom.xml b/testing-modules/selenium-junit-testng/pom.xml similarity index 100% rename from testing-libraries/selenium-junit-testng/pom.xml rename to testing-modules/selenium-junit-testng/pom.xml diff --git a/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java similarity index 100% rename from testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/SeleniumExample.java diff --git a/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java similarity index 100% rename from testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/config/SeleniumConfig.java diff --git a/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java similarity index 100% rename from testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/models/BaeldungAbout.java diff --git a/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java similarity index 100% rename from testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungAboutPage.java diff --git a/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java similarity index 100% rename from testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/BaeldungHomePage.java diff --git a/testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java b/testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java similarity index 100% rename from testing-libraries/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java rename to testing-modules/selenium-junit-testng/src/main/java/com/baeldung/selenium/pages/StartHerePage.java diff --git a/testing-libraries/selenium-junit-testng/src/main/resources/logback.xml b/testing-modules/selenium-junit-testng/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/selenium-junit-testng/src/main/resources/logback.xml rename to testing-modules/selenium-junit-testng/src/main/resources/logback.xml diff --git a/testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java similarity index 100% rename from testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java rename to testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumPageObjectLiveTest.java diff --git a/testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java similarity index 100% rename from testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java rename to testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/junit/SeleniumWithJUnitLiveTest.java diff --git a/testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java b/testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java similarity index 100% rename from testing-libraries/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java rename to testing-modules/selenium-junit-testng/src/test/java/com/baeldung/selenium/testng/SeleniumWithTestNGLiveTest.java diff --git a/testing-libraries/spring-testing/README.md b/testing-modules/spring-testing/README.md similarity index 100% rename from testing-libraries/spring-testing/README.md rename to testing-modules/spring-testing/README.md diff --git a/testing-libraries/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml similarity index 100% rename from testing-libraries/spring-testing/pom.xml rename to testing-modules/spring-testing/pom.xml diff --git a/testing-libraries/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java b/testing-modules/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java rename to testing-modules/spring-testing/src/main/java/com/baeldung/config/ScheduledConfig.java diff --git a/testing-libraries/spring-testing/src/main/java/com/baeldung/config/WebConfig.java b/testing-modules/spring-testing/src/main/java/com/baeldung/config/WebConfig.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/com/baeldung/config/WebConfig.java rename to testing-modules/spring-testing/src/main/java/com/baeldung/config/WebConfig.java diff --git a/testing-libraries/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java b/testing-modules/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java rename to testing-modules/spring-testing/src/main/java/com/baeldung/controller/parameterized/EmployeeRoleController.java diff --git a/testing-libraries/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java b/testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java rename to testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/Application.java diff --git a/testing-libraries/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java b/testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java rename to testing-modules/spring-testing/src/main/java/com/baeldung/overrideproperties/resolver/PropertySourceResolver.java diff --git a/testing-libraries/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java b/testing-modules/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java rename to testing-modules/spring-testing/src/main/java/com/baeldung/scheduled/Counter.java diff --git a/testing-libraries/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java b/testing-modules/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java rename to testing-modules/spring-testing/src/main/java/com/baeldung/testpropertysource/ClassUsingProperty.java diff --git a/testing-libraries/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java b/testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java rename to testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/User.java diff --git a/testing-libraries/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java b/testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java rename to testing-modules/spring-testing/src/main/java/org/baeldung/mockito/repository/UserRepository.java diff --git a/testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java rename to testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/Employee.java diff --git a/testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java rename to testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/EmployeeService.java diff --git a/testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java b/testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java similarity index 100% rename from testing-libraries/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java rename to testing-modules/spring-testing/src/main/java/org/baeldung/reflectiontestutils/repository/HRService.java diff --git a/testing-libraries/spring-testing/src/main/resources/logback.xml b/testing-modules/spring-testing/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/spring-testing/src/main/resources/logback.xml rename to testing-modules/spring-testing/src/main/resources/logback.xml diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedClassRuleIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/controller/parameterized/RoleControllerParameterizedIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ContextPropertySourceResolverIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/ProfilePropertySourceResolverIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/PropertyOverrideContextInitializer.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/SpringBootPropertySourceResolverIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/overrideproperties/TestResourcePropertySourceResolverIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledAwaitilityIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/scheduled/ScheduledIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/LocationTestPropertySourceIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/testpropertysource/PropertiesTestPropertySourceIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java b/testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java rename to testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockAnnotationUnitTest.java diff --git a/testing-libraries/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java b/testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java rename to testing-modules/spring-testing/src/test/java/org/baeldung/mockito/MockBeanAnnotationIntegrationTest.java diff --git a/testing-libraries/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java b/testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java similarity index 100% rename from testing-libraries/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java rename to testing-modules/spring-testing/src/test/java/org/baeldung/reflectiontestutils/ReflectionTestUtilsUnitTest.java diff --git a/testing-libraries/spring-testing/src/test/resources/application-test.properties b/testing-modules/spring-testing/src/test/resources/application-test.properties similarity index 100% rename from testing-libraries/spring-testing/src/test/resources/application-test.properties rename to testing-modules/spring-testing/src/test/resources/application-test.properties diff --git a/testing-libraries/spring-testing/src/test/resources/application.properties b/testing-modules/spring-testing/src/test/resources/application.properties similarity index 100% rename from testing-libraries/spring-testing/src/test/resources/application.properties rename to testing-modules/spring-testing/src/test/resources/application.properties diff --git a/testing-libraries/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties b/testing-modules/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties similarity index 100% rename from testing-libraries/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties rename to testing-modules/spring-testing/src/test/resources/com/baeldung/testpropertysource/DefaultTestPropertySourceIntegrationTest.properties diff --git a/testing-libraries/spring-testing/src/test/resources/context-override-application.properties b/testing-modules/spring-testing/src/test/resources/context-override-application.properties similarity index 100% rename from testing-libraries/spring-testing/src/test/resources/context-override-application.properties rename to testing-modules/spring-testing/src/test/resources/context-override-application.properties diff --git a/testing-libraries/spring-testing/src/test/resources/other-location.properties b/testing-modules/spring-testing/src/test/resources/other-location.properties similarity index 100% rename from testing-libraries/spring-testing/src/test/resources/other-location.properties rename to testing-modules/spring-testing/src/test/resources/other-location.properties diff --git a/testing-libraries/test-containers/README.md b/testing-modules/test-containers/README.md similarity index 100% rename from testing-libraries/test-containers/README.md rename to testing-modules/test-containers/README.md diff --git a/testing-libraries/test-containers/pom.xml b/testing-modules/test-containers/pom.xml similarity index 100% rename from testing-libraries/test-containers/pom.xml rename to testing-modules/test-containers/pom.xml diff --git a/testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java b/testing-modules/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java similarity index 100% rename from testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java rename to testing-modules/test-containers/src/test/java/com/baeldung/testconainers/DockerComposeContainerLiveTest.java diff --git a/testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java b/testing-modules/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java similarity index 100% rename from testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java rename to testing-modules/test-containers/src/test/java/com/baeldung/testconainers/GenericContainerLiveTest.java diff --git a/testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java b/testing-modules/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java similarity index 100% rename from testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java rename to testing-modules/test-containers/src/test/java/com/baeldung/testconainers/PostgreSqlContainerLiveTest.java diff --git a/testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java b/testing-modules/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java similarity index 100% rename from testing-libraries/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java rename to testing-modules/test-containers/src/test/java/com/baeldung/testconainers/WebDriverContainerLiveTest.java diff --git a/testing-libraries/test-containers/src/test/resources/test-compose.yml b/testing-modules/test-containers/src/test/resources/test-compose.yml similarity index 100% rename from testing-libraries/test-containers/src/test/resources/test-compose.yml rename to testing-modules/test-containers/src/test/resources/test-compose.yml diff --git a/testing-libraries/testng/README.md b/testing-modules/testng/README.md similarity index 100% rename from testing-libraries/testng/README.md rename to testing-modules/testng/README.md diff --git a/testing-libraries/testng/pom.xml b/testing-modules/testng/pom.xml similarity index 100% rename from testing-libraries/testng/pom.xml rename to testing-modules/testng/pom.xml diff --git a/testing-libraries/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/DependentLongRunningUnitTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/GroupIntegrationTest.java b/testing-modules/testng/src/test/java/com/baeldung/GroupIntegrationTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/GroupIntegrationTest.java rename to testing-modules/testng/src/test/java/com/baeldung/GroupIntegrationTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java b/testing-modules/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java rename to testing-modules/testng/src/test/java/com/baeldung/MultiThreadedIntegrationTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/ParametrizedLongRunningUnitTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/PriorityLongRunningUnitTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/RegistrationLongRunningUnitTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/SignInLongRunningUnitTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java b/testing-modules/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java rename to testing-modules/testng/src/test/java/com/baeldung/SimpleLongRunningUnitTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java b/testing-modules/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java rename to testing-modules/testng/src/test/java/com/baeldung/SummationServiceIntegrationTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java b/testing-modules/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java rename to testing-modules/testng/src/test/java/com/baeldung/TimeOutIntegrationTest.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedListener.java b/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedListener.java rename to testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedListener.java diff --git a/testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedReports.java b/testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java similarity index 100% rename from testing-libraries/testng/src/test/java/com/baeldung/reports/CustomisedReports.java rename to testing-modules/testng/src/test/java/com/baeldung/reports/CustomisedReports.java diff --git a/testing-libraries/testng/src/test/resources/logback.xml b/testing-modules/testng/src/test/resources/logback.xml similarity index 100% rename from testing-libraries/testng/src/test/resources/logback.xml rename to testing-modules/testng/src/test/resources/logback.xml diff --git a/testing-libraries/testng/src/test/resources/parametrized_testng.xml b/testing-modules/testng/src/test/resources/parametrized_testng.xml similarity index 100% rename from testing-libraries/testng/src/test/resources/parametrized_testng.xml rename to testing-modules/testng/src/test/resources/parametrized_testng.xml diff --git a/testing-libraries/testng/src/test/resources/reportTemplate.html b/testing-modules/testng/src/test/resources/reportTemplate.html similarity index 100% rename from testing-libraries/testng/src/test/resources/reportTemplate.html rename to testing-modules/testng/src/test/resources/reportTemplate.html diff --git a/testing-libraries/testng/src/test/resources/test_group.xml b/testing-modules/testng/src/test/resources/test_group.xml similarity index 100% rename from testing-libraries/testng/src/test/resources/test_group.xml rename to testing-modules/testng/src/test/resources/test_group.xml diff --git a/testing-libraries/testng/src/test/resources/test_setup.xml b/testing-modules/testng/src/test/resources/test_setup.xml similarity index 100% rename from testing-libraries/testng/src/test/resources/test_setup.xml rename to testing-modules/testng/src/test/resources/test_setup.xml diff --git a/testing-libraries/testng/src/test/resources/test_suite.xml b/testing-modules/testng/src/test/resources/test_suite.xml similarity index 100% rename from testing-libraries/testng/src/test/resources/test_suite.xml rename to testing-modules/testng/src/test/resources/test_suite.xml diff --git a/testing-libraries/xmlunit-2/README.md b/testing-modules/xmlunit-2/README.md similarity index 100% rename from testing-libraries/xmlunit-2/README.md rename to testing-modules/xmlunit-2/README.md diff --git a/testing-libraries/xmlunit-2/pom.xml b/testing-modules/xmlunit-2/pom.xml similarity index 100% rename from testing-libraries/xmlunit-2/pom.xml rename to testing-modules/xmlunit-2/pom.xml diff --git a/testing-libraries/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java b/testing-modules/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java similarity index 100% rename from testing-libraries/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java rename to testing-modules/xmlunit-2/src/main/java/com/baeldung/xmlunit/IgnoreAttributeDifferenceEvaluator.java diff --git a/testing-libraries/xmlunit-2/src/main/resources/logback.xml b/testing-modules/xmlunit-2/src/main/resources/logback.xml similarity index 100% rename from testing-libraries/xmlunit-2/src/main/resources/logback.xml rename to testing-modules/xmlunit-2/src/main/resources/logback.xml diff --git a/testing-libraries/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java b/testing-modules/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java similarity index 100% rename from testing-libraries/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java rename to testing-modules/xmlunit-2/src/test/java/com/baeldung/xmlunit/XMLUnitTest.java diff --git a/testing-libraries/xmlunit-2/src/test/resources/control.xml b/testing-modules/xmlunit-2/src/test/resources/control.xml similarity index 100% rename from testing-libraries/xmlunit-2/src/test/resources/control.xml rename to testing-modules/xmlunit-2/src/test/resources/control.xml diff --git a/testing-libraries/xmlunit-2/src/test/resources/students.xml b/testing-modules/xmlunit-2/src/test/resources/students.xml similarity index 100% rename from testing-libraries/xmlunit-2/src/test/resources/students.xml rename to testing-modules/xmlunit-2/src/test/resources/students.xml diff --git a/testing-libraries/xmlunit-2/src/test/resources/students.xsd b/testing-modules/xmlunit-2/src/test/resources/students.xsd similarity index 100% rename from testing-libraries/xmlunit-2/src/test/resources/students.xsd rename to testing-modules/xmlunit-2/src/test/resources/students.xsd diff --git a/testing-libraries/xmlunit-2/src/test/resources/students_with_error.xml b/testing-modules/xmlunit-2/src/test/resources/students_with_error.xml similarity index 100% rename from testing-libraries/xmlunit-2/src/test/resources/students_with_error.xml rename to testing-modules/xmlunit-2/src/test/resources/students_with_error.xml diff --git a/testing-libraries/xmlunit-2/src/test/resources/teachers.xml b/testing-modules/xmlunit-2/src/test/resources/teachers.xml similarity index 100% rename from testing-libraries/xmlunit-2/src/test/resources/teachers.xml rename to testing-modules/xmlunit-2/src/test/resources/teachers.xml diff --git a/testing-libraries/xmlunit-2/src/test/resources/test.xml b/testing-modules/xmlunit-2/src/test/resources/test.xml similarity index 100% rename from testing-libraries/xmlunit-2/src/test/resources/test.xml rename to testing-modules/xmlunit-2/src/test/resources/test.xml From c20918329f1ff4c03f0700c0a525603f9ec7a1ad Mon Sep 17 00:00:00 2001 From: Andrew Shcherbakov Date: Wed, 4 Sep 2019 22:25:22 +0200 Subject: [PATCH 115/396] Refactor the utility class --- .../com/baeldung/logreg/DataUtilities.java | 102 ----------------- .../com/baeldung/logreg/MnistClassifier.java | 16 +-- .../com/baeldung/logreg/MnistPrediction.java | 10 +- .../main/java/com/baeldung/logreg/Utils.java | 103 ++++++++++++++++++ 4 files changed, 119 insertions(+), 112 deletions(-) delete mode 100644 ml/src/main/java/com/baeldung/logreg/DataUtilities.java create mode 100644 ml/src/main/java/com/baeldung/logreg/Utils.java diff --git a/ml/src/main/java/com/baeldung/logreg/DataUtilities.java b/ml/src/main/java/com/baeldung/logreg/DataUtilities.java deleted file mode 100644 index 2f18d30219..0000000000 --- a/ml/src/main/java/com/baeldung/logreg/DataUtilities.java +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2015-2019 Skymind, Inc. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ******************************************************************************/ - -package com.baeldung.logreg; - -import org.apache.commons.compress.archivers.tar.TarArchiveEntry; -import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; -import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; -import org.apache.http.HttpEntity; -import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; - -import java.io.*; - -/** - * Common data utility functions. - * - * @author fvaleri - */ -public class DataUtilities { - - /** - * Download a remote file if it doesn't exist. - * @param remoteUrl URL of the remote file. - * @param localPath Where to download the file. - * @return True if and only if the file has been downloaded. - * @throws Exception IO error. - */ - public static boolean downloadFile(String remoteUrl, String localPath) throws IOException { - boolean downloaded = false; - if (remoteUrl == null || localPath == null) - return downloaded; - File file = new File(localPath); - if (!file.exists()) { - file.getParentFile().mkdirs(); - HttpClientBuilder builder = HttpClientBuilder.create(); - CloseableHttpClient client = builder.build(); - try (CloseableHttpResponse response = client.execute(new HttpGet(remoteUrl))) { - HttpEntity entity = response.getEntity(); - if (entity != null) { - try (FileOutputStream outstream = new FileOutputStream(file)) { - entity.writeTo(outstream); - outstream.flush(); - outstream.close(); - } - } - } - downloaded = true; - } - if (!file.exists()) - throw new IOException("File doesn't exist: " + localPath); - return downloaded; - } - - /** - * Extract a "tar.gz" file into a local folder. - * @param inputPath Input file path. - * @param outputPath Output directory path. - * @throws IOException IO error. - */ - public static void extractTarGz(String inputPath, String outputPath) throws IOException { - if (inputPath == null || outputPath == null) - return; - final int bufferSize = 4096; - if (!outputPath.endsWith("" + File.separatorChar)) - outputPath = outputPath + File.separatorChar; - try (TarArchiveInputStream tais = new TarArchiveInputStream( - new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(inputPath))))) { - TarArchiveEntry entry; - while ((entry = (TarArchiveEntry) tais.getNextEntry()) != null) { - if (entry.isDirectory()) { - new File(outputPath + entry.getName()).mkdirs(); - } else { - int count; - byte data[] = new byte[bufferSize]; - FileOutputStream fos = new FileOutputStream(outputPath + entry.getName()); - BufferedOutputStream dest = new BufferedOutputStream(fos, bufferSize); - while ((count = tais.read(data, 0, bufferSize)) != -1) { - dest.write(data, 0, count); - } - dest.close(); - } - } - } - } - -} diff --git a/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java index 395307712d..1246de973f 100644 --- a/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java +++ b/ml/src/main/java/com/baeldung/logreg/MnistClassifier.java @@ -67,18 +67,20 @@ public class MnistClassifier { final String path = basePath + "mnist_png" + File.separator; if (!new File(path).exists()) { - logger.debug("Downloading data {}", dataUrl); + logger.info("Downloading data {}", dataUrl); String localFilePath = basePath + "mnist_png.tar.gz"; - logger.info("local file: {}", localFilePath); - if (DataUtilities.downloadFile(dataUrl, localFilePath)) { - DataUtilities.extractTarGz(localFilePath, basePath); + File file = new File(localFilePath); + if (!file.exists()) { + file.getParentFile() + .mkdirs(); + Utils.downloadAndSave(dataUrl, file); + Utils.extractTarArchive(file, basePath); } } else { - logger.info("local file exists {}", path); - + logger.info("Using the local data from folder {}", path); } - logger.info("Vectorizing data..."); + logger.info("Vectorizing the data from folder {}", path); // vectorization of train data File trainData = new File(path + "training"); FileSplit trainSplit = new FileSplit(trainData, NativeImageLoader.ALLOWED_FORMATS, randNumGen); diff --git a/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java index 5ec1348e07..56097d9a45 100644 --- a/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java +++ b/ml/src/main/java/com/baeldung/logreg/MnistPrediction.java @@ -36,18 +36,22 @@ public class MnistPrediction { } public static void main(String[] args) throws IOException { - String path = fileChose().toString(); + if (!modelPath.exists()) { + logger.info("The model not found. Have you trained it?"); + return; + } MultiLayerNetwork model = ModelSerializer.restoreMultiLayerNetwork(modelPath); + String path = fileChose(); File file = new File(path); INDArray image = new NativeImageLoader(height, width, channels).asMatrix(file); new ImagePreProcessingScaler(0, 1).transform(image); - + // Pass through to neural Net INDArray output = model.output(image); logger.info("File: {}", path); - logger.info(output.toString()); + logger.info("Probabilities: {}", output); } } diff --git a/ml/src/main/java/com/baeldung/logreg/Utils.java b/ml/src/main/java/com/baeldung/logreg/Utils.java new file mode 100644 index 0000000000..fa4be127cd --- /dev/null +++ b/ml/src/main/java/com/baeldung/logreg/Utils.java @@ -0,0 +1,103 @@ +package com.baeldung.logreg; + +import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; + +import org.apache.commons.compress.archivers.ArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveEntry; +import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; +import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * Utility class for digit classifier. + * + */ +public class Utils { + + private static final Logger logger = LoggerFactory.getLogger(Utils.class); + + private Utils() { + } + + /** + * Download the content of the given url and save it into a file. + * @param url + * @param file + */ + public static void downloadAndSave(String url, File file) throws IOException { + CloseableHttpClient client = HttpClientBuilder.create() + .build(); + logger.info("Connecting to {}", url); + try (CloseableHttpResponse response = client.execute(new HttpGet(url))) { + HttpEntity entity = response.getEntity(); + if (entity != null) { + logger.info("Downloaded {} bytes", entity.getContentLength()); + try (FileOutputStream outstream = new FileOutputStream(file)) { + logger.info("Saving to the local file"); + entity.writeTo(outstream); + outstream.flush(); + logger.info("Local file saved"); + } + } + } + } + + /** + * Extract a "tar.gz" file into a given folder. + * @param file + * @param folder + */ + public static void extractTarArchive(File file, String folder) throws IOException { + logger.info("Extracting archive {} into folder {}", file.getName(), folder); + // @formatter:off + try (FileInputStream fis = new FileInputStream(file); + BufferedInputStream bis = new BufferedInputStream(fis); + GzipCompressorInputStream gzip = new GzipCompressorInputStream(bis); + TarArchiveInputStream tar = new TarArchiveInputStream(gzip)) { + // @formatter:on + TarArchiveEntry entry; + while ((entry = (TarArchiveEntry) tar.getNextEntry()) != null) { + extractEntry(entry, tar, folder); + } + } + logger.info("Archive extracted"); + } + + /** + * Extract an entry of the input stream into a given folder + * @param entry + * @param tar + * @param folder + * @throws IOException + */ + public static void extractEntry(ArchiveEntry entry, InputStream tar, String folder) throws IOException { + final int bufferSize = 4096; + final String path = folder + entry.getName(); + if (entry.isDirectory()) { + new File(path).mkdirs(); + } else { + int count; + byte[] data = new byte[bufferSize]; + // @formatter:off + try (FileOutputStream os = new FileOutputStream(path); + BufferedOutputStream dest = new BufferedOutputStream(os, bufferSize)) { + // @formatter:off + while ((count = tar.read(data, 0, bufferSize)) != -1) { + dest.write(data, 0, count); + } + } + } + } +} From e925b07dabe28b6b4acf5d1a98582da0e186333e Mon Sep 17 00:00:00 2001 From: Rodrigo Graciano Date: Wed, 4 Sep 2019 21:05:08 -0400 Subject: [PATCH 116/396] BAEL-3173 --- libraries-primitive/pom.xml | 24 ++++++- .../PrimitiveCollectionsUnitTest.java | 70 +++++++++++++++++++ 2 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java diff --git a/libraries-primitive/pom.xml b/libraries-primitive/pom.xml index 12fc35c1b5..cddb3ab1fe 100644 --- a/libraries-primitive/pom.xml +++ b/libraries-primitive/pom.xml @@ -9,9 +9,14 @@ 1.0-SNAPSHOT libraries-primitive + + 1.8 + 1.8 + + - - + + it.unimi.dsi fastutil 8.2.2 @@ -36,5 +41,18 @@ 1.19 test + + + org.eclipse.collections + eclipse-collections-api + 10.0.0 + + + + org.eclipse.collections + eclipse-collections + 10.0.0 + + - + \ No newline at end of file diff --git a/libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java b/libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java new file mode 100644 index 0000000000..2adecd37fc --- /dev/null +++ b/libraries-primitive/src/test/java/com/baeldung/PrimitiveCollectionsUnitTest.java @@ -0,0 +1,70 @@ +package com.baeldung; + +import org.eclipse.collections.api.list.primitive.ImmutableIntList; +import org.eclipse.collections.api.list.primitive.MutableLongList; +import org.eclipse.collections.api.map.primitive.MutableIntIntMap; +import org.eclipse.collections.api.set.primitive.MutableIntSet; +import org.eclipse.collections.impl.factory.primitive.*; +import org.eclipse.collections.impl.list.Interval; +import org.eclipse.collections.impl.list.primitive.IntInterval; +import org.eclipse.collections.impl.map.mutable.primitive.IntIntHashMap; +import org.junit.Test; + +import java.util.stream.DoubleStream; + +import static org.junit.Assert.assertEquals; + + +public class PrimitiveCollectionsUnitTest { + + @Test + public void whenListOfLongHasOneTwoThree_thenSumIsSix() { + MutableLongList longList = LongLists.mutable.of(1L, 2L, 3L); + assertEquals(6, longList.sum()); + } + + @Test + public void whenListOfIntHasOneTwoThree_thenMaxIsThree() { + ImmutableIntList intList = IntLists.immutable.of(1, 2, 3); + assertEquals(3, intList.max()); + } + + @Test + public void whenConvertFromIterableToPrimitive_thenValuesAreEquals() { + Iterable iterable = Interval.oneTo(3); + MutableIntSet intSet = IntSets.mutable.withAll(iterable); + IntInterval intInterval = IntInterval.oneTo(3); + assertEquals(intInterval.toSet(), intSet); + } + + @Test + public void testOperationsOnIntIntMap() { + MutableIntIntMap map = new IntIntHashMap(); + assertEquals(5, map.addToValue(0, 5)); + assertEquals(5, map.get(0)); + assertEquals(3, map.getIfAbsentPut(1, 3)); + } + + @Test + public void whenCreateDoubleStream_thenAverageIsThree() { + DoubleStream doubleStream = DoubleLists + .mutable.with(1.0, 2.0, 3.0, 4.0, 5.0) + .primitiveStream(); + assertEquals(3, doubleStream.average().getAsDouble(), 0.001); + } + + @Test + public void whenCreateMapFromStream_thenValuesMustMatch() { + Iterable integers = Interval.oneTo(3); + MutableIntIntMap map = + IntIntMaps.mutable.from( + integers, + key -> key, + value -> value * value); + MutableIntIntMap expected = IntIntMaps.mutable.empty() + .withKeyValue(1, 1) + .withKeyValue(2, 4) + .withKeyValue(3, 9); + assertEquals(expected, map); + } +} \ No newline at end of file From 68d755274960d71920fd4f08cdd238694c631731 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Thu, 5 Sep 2019 09:50:34 +0200 Subject: [PATCH 117/396] Update pom.xml From f173646635285a51abc83cca1d2381cac80db7d6 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Thu, 5 Sep 2019 09:56:24 +0200 Subject: [PATCH 118/396] Update pom.xml From b003e69e0a57b57a766b8f3aa1d58f162e8f9479 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Thu, 5 Sep 2019 09:59:01 +0200 Subject: [PATCH 119/396] update pom --- spring-core-2/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index e24839b737..d68beda64a 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -57,4 +57,4 @@ 2.22.1 - + \ No newline at end of file From b04f8dad95605b165027156d192123a204b552e0 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 5 Sep 2019 20:20:14 +0530 Subject: [PATCH 120/396] BAEL-17361 Slice 11 | The top 100 articles should have their own package in the module (#7683) --- .../java8/{ => streams}/Java8FindAnyFindFirstUnitTest.java | 2 +- .../baeldung/java8/{ => streams}/Java8StreamApiUnitTest.java | 2 +- .../SpringBootSecurityApplication.java | 4 ++-- .../{basic_auth => autoconfig}/config/BasicConfiguration.java | 2 +- .../config}/BasicConfigurationIntegrationTest.java | 4 +++- 5 files changed, 8 insertions(+), 6 deletions(-) rename java-streams/src/test/java/com/baeldung/java8/{ => streams}/Java8FindAnyFindFirstUnitTest.java (97%) rename java-streams/src/test/java/com/baeldung/java8/{ => streams}/Java8StreamApiUnitTest.java (99%) rename spring-boot-security/src/main/java/com/baeldung/springbootsecurity/{basic_auth => autoconfig}/SpringBootSecurityApplication.java (80%) rename spring-boot-security/src/main/java/com/baeldung/springbootsecurity/{basic_auth => autoconfig}/config/BasicConfiguration.java (95%) rename spring-boot-security/src/test/java/com/baeldung/springbootsecurity/{basic_auth => autoconfig/config}/BasicConfigurationIntegrationTest.java (93%) diff --git a/java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java b/java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java similarity index 97% rename from java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java rename to java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java index 8c2e0628fa..5f52fe375e 100644 --- a/java-streams/src/test/java/com/baeldung/java8/Java8FindAnyFindFirstUnitTest.java +++ b/java-streams/src/test/java/com/baeldung/java8/streams/Java8FindAnyFindFirstUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.java8.streams; import org.junit.Test; diff --git a/java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java b/java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java similarity index 99% rename from java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java rename to java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java index 5005cf7f47..75cfbc049f 100644 --- a/java-streams/src/test/java/com/baeldung/java8/Java8StreamApiUnitTest.java +++ b/java-streams/src/test/java/com/baeldung/java8/streams/Java8StreamApiUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.java8.streams; import com.baeldung.stream.Product; import org.junit.Before; diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/SpringBootSecurityApplication.java similarity index 80% rename from spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java rename to spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/SpringBootSecurityApplication.java index 7007c15596..3afeda66a4 100644 --- a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/SpringBootSecurityApplication.java +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/SpringBootSecurityApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.springbootsecurity.basic_auth; +package com.baeldung.springbootsecurity.autoconfig; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @@ -7,7 +7,7 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfi @SpringBootApplication(exclude = { SecurityAutoConfiguration.class // ,ManagementWebSecurityAutoConfiguration.class -}, scanBasePackages = "com.baeldung.springbootsecurity.basic_auth") +}, scanBasePackages = "com.baeldung.springbootsecurity.autoconfig") public class SpringBootSecurityApplication { public static void main(String[] args) { SpringApplication.run(SpringBootSecurityApplication.class, args); diff --git a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicConfiguration.java b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfiguration.java similarity index 95% rename from spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicConfiguration.java rename to spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfiguration.java index 3cfa45421c..7060792df5 100644 --- a/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/basic_auth/config/BasicConfiguration.java +++ b/spring-boot-security/src/main/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfiguration.java @@ -1,4 +1,4 @@ -package com.baeldung.springbootsecurity.basic_auth.config; +package com.baeldung.springbootsecurity.autoconfig.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; diff --git a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicConfigurationIntegrationTest.java b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfigurationIntegrationTest.java similarity index 93% rename from spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicConfigurationIntegrationTest.java rename to spring-boot-security/src/test/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfigurationIntegrationTest.java index f221712513..a28d0f5e26 100644 --- a/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/basic_auth/BasicConfigurationIntegrationTest.java +++ b/spring-boot-security/src/test/java/com/baeldung/springbootsecurity/autoconfig/config/BasicConfigurationIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.springbootsecurity.basic_auth; +package com.baeldung.springbootsecurity.autoconfig.config; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; @@ -18,6 +18,8 @@ import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.springbootsecurity.autoconfig.SpringBootSecurityApplication; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = RANDOM_PORT, classes = SpringBootSecurityApplication.class) public class BasicConfigurationIntegrationTest { From 434bfc980e2bfa497e268101ed394775a9ba1812 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 5 Sep 2019 21:31:32 +0530 Subject: [PATCH 121/396] BAEL-17391 Slice 13 | The top 100 articles should have their own package in the module (#7723) - Moved folders to respective packages --- .../groupingby}/Java8GroupingByCollectorUnitTest.java | 2 +- .../JacksonSerializationIgnoreUnitTest.java | 8 ++++---- .../{dtos/ignore => ignore/dtos}/MyDtoIgnoreField.java | 2 +- .../ignore => ignore/dtos}/MyDtoIgnoreFieldByName.java | 2 +- .../{dtos/ignore => ignore/dtos}/MyDtoIgnoreNull.java | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) rename core-java-modules/core-java-8/src/test/java/com/baeldung/{java8 => java_8_features/groupingby}/Java8GroupingByCollectorUnitTest.java (99%) rename jackson-simple/src/test/java/com/baeldung/jackson/{test => ignore}/JacksonSerializationIgnoreUnitTest.java (98%) rename jackson-simple/src/test/java/com/baeldung/jackson/{dtos/ignore => ignore/dtos}/MyDtoIgnoreField.java (94%) rename jackson-simple/src/test/java/com/baeldung/jackson/{dtos/ignore => ignore/dtos}/MyDtoIgnoreFieldByName.java (95%) rename jackson-simple/src/test/java/com/baeldung/jackson/{dtos/ignore => ignore/dtos}/MyDtoIgnoreNull.java (96%) diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java similarity index 99% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java rename to core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java index eea019da2c..323586b85f 100644 --- a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8GroupingByCollectorUnitTest.java +++ b/core-java-modules/core-java-8/src/test/java/com/baeldung/java_8_features/groupingby/Java8GroupingByCollectorUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java8; +package com.baeldung.java_8_features.groupingby; import com.baeldung.java_8_features.groupingby.BlogPost; import com.baeldung.java_8_features.groupingby.BlogPostType; diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java similarity index 98% rename from jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java index 146f274380..da8b464d03 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/test/JacksonSerializationIgnoreUnitTest.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/JacksonSerializationIgnoreUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.jackson.test; +package com.baeldung.jackson.ignore; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.not; @@ -15,9 +15,9 @@ import com.baeldung.jackson.dtos.MyDtoIncludeNonDefault; import com.baeldung.jackson.dtos.MyDtoWithFilter; import com.baeldung.jackson.dtos.MyDtoWithSpecialField; import com.baeldung.jackson.dtos.MyMixInForIgnoreType; -import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreField; -import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreFieldByName; -import com.baeldung.jackson.dtos.ignore.MyDtoIgnoreNull; +import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreField; +import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreFieldByName; +import com.baeldung.jackson.ignore.dtos.MyDtoIgnoreNull; import com.baeldung.jackson.serialization.MyDtoNullKeySerializer; import com.fasterxml.jackson.annotation.JsonInclude.Include; import com.fasterxml.jackson.core.JsonGenerator; diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java similarity index 94% rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java index f573501e85..8cbcb773cc 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreField.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreField.java @@ -1,4 +1,4 @@ -package com.baeldung.jackson.dtos.ignore; +package com.baeldung.jackson.ignore.dtos; import com.fasterxml.jackson.annotation.JsonIgnore; diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java similarity index 95% rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java index e7b8ea2a8e..1aee31a1b3 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreFieldByName.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreFieldByName.java @@ -1,4 +1,4 @@ -package com.baeldung.jackson.dtos.ignore; +package com.baeldung.jackson.ignore.dtos; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; diff --git a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java similarity index 96% rename from jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java rename to jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java index bc443500a1..75532f18c2 100644 --- a/jackson-simple/src/test/java/com/baeldung/jackson/dtos/ignore/MyDtoIgnoreNull.java +++ b/jackson-simple/src/test/java/com/baeldung/jackson/ignore/dtos/MyDtoIgnoreNull.java @@ -1,4 +1,4 @@ -package com.baeldung.jackson.dtos.ignore; +package com.baeldung.jackson.ignore.dtos; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude.Include; From e7e2c0a8a6a650dbd36cc0ae559abe4c301d5489 Mon Sep 17 00:00:00 2001 From: maryarm Date: Thu, 5 Sep 2019 21:00:26 +0430 Subject: [PATCH 122/396] BAEL-3009: Logging Spring WebClient calls. -Review notes applied --- .../logging/WebClientLoggingIntegrationTest.java | 14 ++++++++------ .../reactive/logging/jetty/RequestLogEnhancer.java | 7 ++++--- .../reactive/logging/netty/CustomLogger.java | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java index d5f1ef77a0..95c63f267f 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/WebClientLoggingIntegrationTest.java @@ -3,7 +3,6 @@ package com.baeldung.reactive.logging; import ch.qos.logback.classic.spi.LoggingEvent; import ch.qos.logback.core.Appender; import com.baeldung.reactive.logging.filters.LogFilters; -import com.baeldung.reactive.logging.jetty.RequestLogEnhancer; import com.baeldung.reactive.logging.netty.CustomLogger; import com.fasterxml.jackson.databind.ObjectMapper; import java.net.URI; @@ -21,6 +20,7 @@ import org.springframework.web.reactive.function.client.WebClient; import reactor.netty.channel.BootstrapHandlers; import reactor.netty.http.client.HttpClient; +import static com.baeldung.reactive.logging.jetty.RequestLogEnhancer.enhance; import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; @@ -69,13 +69,13 @@ public class WebClientLoggingIntegrationTest { } @Test - public void givenJettyHttpClient_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + public void givenJettyHttpClient_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { SslContextFactory.Client sslContextFactory = new SslContextFactory.Client(); org.eclipse.jetty.client.HttpClient httpClient = new org.eclipse.jetty.client.HttpClient(sslContextFactory) { @Override public Request newRequest(URI uri) { Request request = super.newRequest(uri); - return new RequestLogEnhancer().enhance(request); + return enhance(request); } }; @@ -94,7 +94,7 @@ public class WebClientLoggingIntegrationTest { } @Test - public void givenNettyHttpClientWithWiretap_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + public void givenNettyHttpClientWithWiretap_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { reactor.netty.http.client.HttpClient httpClient = HttpClient .create() @@ -108,11 +108,12 @@ public class WebClientLoggingIntegrationTest { .body(BodyInserters.fromObject(post)) .exchange() .block(); + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains("00000300"))); } @Test - public void givenNettyHttpClientWithCustomLogger_whenEndpointIsConsumed_thenRequestAndResponseBodyShouldBeLogged() { + public void givenNettyHttpClientWithCustomLogger_whenEndpointIsConsumed_thenRequestAndResponseBodyLogged() { reactor.netty.http.client.HttpClient httpClient = HttpClient .create() @@ -128,11 +129,12 @@ public class WebClientLoggingIntegrationTest { .body(BodyInserters.fromObject(post)) .exchange() .block(); + verify(nettyAppender).doAppend(argThat(argument -> (((LoggingEvent) argument).getFormattedMessage()).contains(sampleResponseBody))); } @Test - public void givenDefaultHttpClientWithString_whenEndpointIsConsumed_thenRequestAndResponseLogged() { + public void givenDefaultHttpClientWithFilter_whenEndpointIsConsumed_thenRequestAndResponseLogged() { WebClient .builder() .filters(exchangeFilterFunctions -> { diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java index ac333feb6c..43e3660743 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/jetty/RequestLogEnhancer.java @@ -13,7 +13,7 @@ import org.eclipse.jetty.http.HttpHeader; @Slf4j public class RequestLogEnhancer { - public Request enhance(Request request) { + public static Request enhance(Request request) { StringBuilder group = new StringBuilder(); request.onRequestBegin(theRequest -> group .append("Request ") @@ -63,7 +63,7 @@ public class RequestLogEnhancer { return request; } - private String toString(ByteBuffer buffer, Charset charset) { + private static String toString(ByteBuffer buffer, Charset charset) { byte[] bytes; if (buffer.hasArray()) { bytes = new byte[buffer.capacity()]; @@ -75,7 +75,7 @@ public class RequestLogEnhancer { return new String(bytes, charset); } - private Charset getCharset(HttpFields headers) { + private static Charset getCharset(HttpFields headers) { String contentType = headers.get(HttpHeader.CONTENT_TYPE); if (contentType != null) { String[] tokens = contentType @@ -88,5 +88,6 @@ public class RequestLogEnhancer { } return StandardCharsets.UTF_8; } + } diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java index 529549f99b..9f2a4d127f 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/logging/netty/CustomLogger.java @@ -20,7 +20,7 @@ public class CustomLogger extends LoggingHandler { ByteBuf msg = (ByteBuf) arg; return decode(msg, msg.readerIndex(), msg.readableBytes(), defaultCharset()); } - return ""; + return super.format(ctx, event, arg); } private String decode(ByteBuf src, int readerIndex, int len, Charset charset) { From 3e155818d52d61a1550272c821ec61eaffb87c74 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Thu, 5 Sep 2019 17:44:52 +0100 Subject: [PATCH 123/396] [BAEL-13505] Move articles out of core-java part 1 --- .../core-java-exceptions/README.md | 5 +++++ .../core-java-exceptions/pom.xml | 20 +++++++++++++++++++ .../com/baeldung/exceptions/Arithmetic.java | 0 .../exceptions/ArrayIndexOutOfBounds.java | 0 .../com/baeldung/exceptions/ClassCast.java | 0 .../com/baeldung/exceptions/FileNotFound.java | 0 .../exceptions/GlobalExceptionHandler.java | 0 .../baeldung/exceptions/IllegalArgument.java | 0 .../com/baeldung/exceptions/IllegalState.java | 0 .../InterruptedExceptionExample.java | 0 .../com/baeldung/exceptions/MalformedURL.java | 0 .../com/baeldung/exceptions/NullPointer.java | 0 .../com/baeldung/exceptions/NumberFormat.java | 0 .../exceptions/ParseExceptionExample.java | 0 .../exceptions/StackTraceToString.java | 0 .../exceptions/StringIndexOutOfBounds.java | 0 .../java/com/baeldung/optional/Modem.java | 0 .../baeldung/optional/OrElseAndOrElseGet.java | 0 .../OrElseAndOrElseGetBenchmarkRunner.java | 0 .../java/com/baeldung/optional/Person.java | 0 .../baeldung/optional/PersonRepository.java | 0 .../GlobalExceptionHandlerUnitTest.java | 0 ...vaTryWithResourcesLongRunningUnitTest.java | 0 .../optional/PersonRepositoryUnitTest.java | 0 .../core-java-networking-2/README.md | 2 ++ .../baeldung/curltojava/JavaCurlExamples.java | 0 .../PostJSONWithHttpURLConnection.java | 0 .../curltojava/JavaCurlExamplesLiveTest.java | 0 .../core-java-reflection/README.MD | 1 + .../reflection/BaeldungReflectionUtils.java | 0 .../com/baeldung/reflection/Customer.java | 0 .../com/baeldung/reflection/Employee.java | 0 .../baeldung/reflection/MonthEmployee.java | 0 .../java/com/baeldung/reflection/Person.java | 0 .../BaeldungReflectionUtilsUnitTest.java | 0 .../PersonAndEmployeeReflectionUnitTest.java | 0 36 files changed, 28 insertions(+) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/Arithmetic.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/ClassCast.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/FileNotFound.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/IllegalArgument.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/IllegalState.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/MalformedURL.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/NullPointer.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/NumberFormat.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/StackTraceToString.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java (100%) rename core-java-modules/{core-java-8 => core-java-exceptions}/src/main/java/com/baeldung/optional/Modem.java (100%) rename core-java-modules/{core-java-8 => core-java-exceptions}/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java (100%) rename core-java-modules/{core-java-8 => core-java-exceptions}/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java (100%) rename core-java-modules/{core-java-8 => core-java-exceptions}/src/main/java/com/baeldung/optional/Person.java (100%) rename core-java-modules/{core-java-8 => core-java-exceptions}/src/main/java/com/baeldung/optional/PersonRepository.java (100%) rename core-java-modules/{core-java => core-java-exceptions}/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-exceptions}/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-exceptions}/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java (100%) rename core-java-modules/{core-java => core-java-networking-2}/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java (100%) rename core-java-modules/{core-java => core-java-networking-2}/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java (100%) rename core-java-modules/{core-java => core-java-networking-2}/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java (100%) rename core-java-modules/{core-java => core-java-reflection}/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java (100%) rename core-java-modules/{core-java => core-java-reflection}/src/main/java/com/baeldung/reflection/Customer.java (100%) rename core-java-modules/{core-java => core-java-reflection}/src/main/java/com/baeldung/reflection/Employee.java (100%) rename core-java-modules/{core-java => core-java-reflection}/src/main/java/com/baeldung/reflection/MonthEmployee.java (100%) rename core-java-modules/{core-java => core-java-reflection}/src/main/java/com/baeldung/reflection/Person.java (100%) rename core-java-modules/{core-java => core-java-reflection}/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java (100%) rename core-java-modules/{core-java => core-java-reflection}/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java (100%) diff --git a/core-java-modules/core-java-exceptions/README.md b/core-java-modules/core-java-exceptions/README.md index 79e5bad23a..78599c6b7b 100644 --- a/core-java-modules/core-java-exceptions/README.md +++ b/core-java-modules/core-java-exceptions/README.md @@ -1,3 +1,8 @@ ## Relevant Articles: - [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch) +- [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler) +- [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions) +- [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception) +- [How to Find an Exception’s Root Cause in Java](https://www.baeldung.com/java-exception-root-cause) +- [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) diff --git a/core-java-modules/core-java-exceptions/pom.xml b/core-java-modules/core-java-exceptions/pom.xml index 2e5200944a..43c4e31033 100644 --- a/core-java-modules/core-java-exceptions/pom.xml +++ b/core-java-modules/core-java-exceptions/pom.xml @@ -26,10 +26,30 @@ commons-lang3 ${commons-lang3.version} + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator-annprocess.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + 3.9 + 1.19 + 3.10.0 + 1.19 diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/Arithmetic.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/Arithmetic.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/Arithmetic.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/Arithmetic.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ClassCast.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ClassCast.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ClassCast.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ClassCast.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/FileNotFound.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/FileNotFound.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/FileNotFound.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/FileNotFound.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalArgument.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalArgument.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalArgument.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalArgument.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalState.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalState.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/IllegalState.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalState.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/MalformedURL.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/MalformedURL.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/MalformedURL.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/MalformedURL.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NullPointer.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullPointer.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NullPointer.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullPointer.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NumberFormat.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NumberFormat.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/NumberFormat.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NumberFormat.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StackTraceToString.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StackTraceToString.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StackTraceToString.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/Modem.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/Modem.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/Person.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/Person.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/PersonRepository.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/PersonRepository.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/PersonRepository.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md index 6b6151248e..2bc648449a 100644 --- a/core-java-modules/core-java-networking-2/README.md +++ b/core-java-modules/core-java-networking-2/README.md @@ -1,3 +1,5 @@ ### Relevant Articles - [Checking if a URL Exists in Java](https://www.baeldung.com/java-check-url-exists) +- [Making a JSON POST Request With HttpURLConnection](https://www.baeldung.com/httpurlconnection-post) +- [Using Curl in Java](https://www.baeldung.com/java-curl) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/curltojava/JavaCurlExamples.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java rename to core-java-modules/core-java-networking-2/src/test/java/com/baeldung/curltojava/JavaCurlExamplesLiveTest.java diff --git a/core-java-modules/core-java-reflection/README.MD b/core-java-modules/core-java-reflection/README.MD index c8766d6858..d9cc95ad08 100644 --- a/core-java-modules/core-java-reflection/README.MD +++ b/core-java-modules/core-java-reflection/README.MD @@ -1,3 +1,4 @@ ## Relevant Articles - [Void Type in Java](https://www.baeldung.com/java-void-type) +- [Retrieve Fields from a Java Class Using Reflection](https://www.baeldung.com/java-reflection-class-fields) \ No newline at end of file diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/BaeldungReflectionUtils.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/Customer.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Customer.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/Customer.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Customer.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/Employee.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/Employee.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Employee.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/MonthEmployee.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/MonthEmployee.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/MonthEmployee.java diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/reflection/Person.java b/core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Person.java similarity index 100% rename from core-java-modules/core-java/src/main/java/com/baeldung/reflection/Person.java rename to core-java-modules/core-java-reflection/src/main/java/com/baeldung/reflection/Person.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/BaeldungReflectionUtilsUnitTest.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java b/core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java rename to core-java-modules/core-java-reflection/src/test/java/com/baeldung/reflection/PersonAndEmployeeReflectionUnitTest.java From 2747b3b5e49e1e55e782481ada4ecec9aaddcc42 Mon Sep 17 00:00:00 2001 From: Eric Martin Date: Thu, 5 Sep 2019 14:45:00 -0500 Subject: [PATCH 124/396] import java.util.Arrays; --- .../core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java index c4663a429c..2659b29491 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/uuid/UUIDGenerator.java @@ -3,6 +3,7 @@ package com.baeldung.uuid; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.util.Arrays; import java.util.UUID; public class UUIDGenerator { From 78ca924a13817c591603ff00dddca7b370e587e8 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Fri, 6 Sep 2019 01:31:18 +0530 Subject: [PATCH 125/396] [BAEL-15393] - Update Spring File Upload article --- spring-mvc-java/pom.xml | 31 +++---------------- .../java/com/baeldung/aop/LoggingAspect.java | 6 ++-- .../com/baeldung/aop/PerformanceAspect.java | 2 +- .../com/baeldung/aop/PublishingAspect.java | 4 +-- .../baeldung/spring/web/config/WebConfig.java | 12 +------ .../src/main/resources/application.properties | 26 +++------------- 6 files changed, 17 insertions(+), 64 deletions(-) diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index da9bd04d3d..87d2f612af 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -19,14 +19,6 @@ org.springframework.boot spring-boot-starter-web - - org.springframework.boot - spring-boot-starter-tomcat - - - org.springframework.boot - spring-boot-starter-jdbc - javax.servlet javax.servlet-api @@ -40,7 +32,11 @@ javax.servlet jstl - ${jstl.version} + + + org.apache.tomcat.embed + tomcat-embed-jasper + provided @@ -62,17 +58,6 @@ - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - - commons-io - commons-io - - - net.sourceforge.htmlunit htmlunit @@ -143,12 +128,6 @@ org.springframework.boot spring-boot-starter-websocket - - - - - - org.glassfish javax.el diff --git a/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java b/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java index 7ae37404be..169d664471 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java +++ b/spring-mvc-java/src/main/java/com/baeldung/aop/LoggingAspect.java @@ -23,15 +23,15 @@ public class LoggingAspect { } }; - @Pointcut("@target(org.springframework.stereotype.Repository)") + @Pointcut("within(com.baeldung..*) && execution(* com.baeldung.dao.FooDao.*(..))") public void repositoryMethods() { } - @Pointcut("@annotation(com.baeldung.aop.annotations.Loggable)") + @Pointcut("within(com.baeldung..*) && @annotation(com.baeldung.aop.annotations.Loggable)") public void loggableMethods() { } - @Pointcut("@args(com.baeldung.aop.annotations.Entity)") + @Pointcut("within(com.baeldung..*) && @args(com.baeldung.aop.annotations.Entity)") public void methodsAcceptingEntities() { } diff --git a/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java b/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java index 1f2076adff..8f374cc1e5 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java +++ b/spring-mvc-java/src/main/java/com/baeldung/aop/PerformanceAspect.java @@ -15,7 +15,7 @@ public class PerformanceAspect { private static Logger logger = Logger.getLogger(PerformanceAspect.class.getName()); - @Pointcut("within(@org.springframework.stereotype.Repository *)") + @Pointcut("within(com.baeldung..*) && execution(* com.baeldung.dao.FooDao.*(..))") public void repositoryClassMethods() { } diff --git a/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java b/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java index 7791c63e7b..a45402dc18 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java +++ b/spring-mvc-java/src/main/java/com/baeldung/aop/PublishingAspect.java @@ -20,11 +20,11 @@ public class PublishingAspect { this.eventPublisher = eventPublisher; } - @Pointcut("@target(org.springframework.stereotype.Repository)") + @Pointcut("within(com.baeldung..*) && execution(* com.baeldung.dao.FooDao.*(..))") public void repositoryMethods() { } - @Pointcut("execution(* *..create*(Long,..))") + @Pointcut("within(com.baeldung..*) && execution(* com.baeldung.dao.FooDao.create*(Long,..))") public void firstLongParamMethods() { } diff --git a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java index 7aa9d6c5b5..96e300464b 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java +++ b/spring-mvc-java/src/main/java/com/baeldung/spring/web/config/WebConfig.java @@ -12,7 +12,6 @@ import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.http.MediaType; import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; -import org.springframework.web.multipart.commons.CommonsMultipartResolver; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; @@ -63,7 +62,7 @@ public class WebConfig implements WebMvcConfigurer { final SpringResourceTemplateResolver templateResolver = new SpringResourceTemplateResolver(); templateResolver.setPrefix("/WEB-INF/templates/"); templateResolver.setSuffix(".html"); - templateResolver.setTemplateMode("HTML5"); + templateResolver.setTemplateMode("HTML"); return templateResolver; } @@ -87,15 +86,6 @@ public class WebConfig implements WebMvcConfigurer { public void addResourceHandlers(final ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); } - - @Bean(name = "multipartResolver") - public CommonsMultipartResolver multipartResolver() { - - final CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); - multipartResolver.setMaxUploadSize(100000); - - return multipartResolver; - } @Override public void extendMessageConverters(final List> converters) { diff --git a/spring-mvc-java/src/main/resources/application.properties b/spring-mvc-java/src/main/resources/application.properties index 4f618c96a9..00c491c271 100644 --- a/spring-mvc-java/src/main/resources/application.properties +++ b/spring-mvc-java/src/main/resources/application.properties @@ -1,21 +1,5 @@ -spring.servlet.multipart.max-file-size=10MB -spring.servlet.multipart.max-request-size=10MB -spring.http.multipart.enabled=true -spring.servlet.multipart.location=${java.io.tmpdir} - -logging.level.org.springframework=DEBUG -logging.level.com.baeldung=DEBUG - -#output to a temp_folder/file -logging.file=${java.io.tmpdir}/application.log - -# Logging pattern for the console -logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} - %msg%n - -# Logging pattern for file -logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg% -spring.http.encoding.charset=UTF-8 -# Enable http encoding support. -spring.http.encoding.enabled=true -# Force the encoding to the configured charset on HTTP requests and responses. -spring.http.encoding.force=true \ No newline at end of file +server.servlet.context-path=/spring-mvc-java +spring.servlet.multipart.max-file-size=1MB +spring.servlet.multipart.max-request-size=1MB +spring.servlet.multipart.enabled=true +spring.servlet.multipart.location=${java.io.tmpdir} \ No newline at end of file From c85be3d29dd0146446ac2e79debf138e62edcb04 Mon Sep 17 00:00:00 2001 From: at508 <52303242+at508@users.noreply.github.com> Date: Thu, 5 Sep 2019 17:38:17 -0400 Subject: [PATCH 126/396] BAEL-2076: loading resources (#7347) * commits for BAEL-2076 - Created core-java-io2 module - added resource loading example code - added core-java-io2 to tutorials pom.xml * Committing review changes - change to try-with-resources - change the order of main method * Reformatting try-with-resources * Moving resources example from core-java-io2 to core-java-io. Removing core-java-io2 * Removing stray core-java-io2 in tutorials pom file. --- core-java-modules/core-java-io/pom.xml | 17 ++++++++ .../baeldung/resource/MyResourceLoader.java | 42 +++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml index 1a133d2cbe..84bf3baeed 100644 --- a/core-java-modules/core-java-io/pom.xml +++ b/core-java-modules/core-java-io/pom.xml @@ -207,6 +207,21 @@ ${maven.compiler.target} + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + com.baeldung.resource.MyResourceLoader + + + +
@@ -274,6 +289,8 @@ 1.18 0.1.5 + 3.1.0 + \ No newline at end of file diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java new file mode 100644 index 0000000000..7512b177df --- /dev/null +++ b/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java @@ -0,0 +1,42 @@ +package com.baeldung.resource; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.stream.Collectors; + +public class MyResourceLoader { + + private void loadFileWithReader() throws IOException { + + try (FileReader fileReader = new FileReader("src/main/resources/input.txt"); + BufferedReader reader = new BufferedReader(fileReader)) { + String contents = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + System.out.println(contents); + } + + } + + private void loadFileAsResource() throws IOException { + + try (InputStream inputStream = getClass().getResourceAsStream("/input.txt"); + BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream))) { + String contents = reader.lines() + .collect(Collectors.joining(System.lineSeparator())); + System.out.println(contents); + } + } + + public static void main(String[] args) throws IOException { + + MyResourceLoader resourceLoader = new MyResourceLoader(); + + resourceLoader.loadFileAsResource(); + resourceLoader.loadFileWithReader(); + + } + +} From cb1de34d0f6e04f13cf61c959adf314af26feeab Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Fri, 6 Sep 2019 07:06:26 +0300 Subject: [PATCH 127/396] BAEL-3190 - working with webservices in groovy - followed test names convention --- .../webservice/WebserviceUnitTest.groovy | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy index 0d4b5cd7ee..302959d0d9 100644 --- a/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy +++ b/core-groovy-2/src/test/groovy/com/baeldung/webservice/WebserviceUnitTest.groovy @@ -7,6 +7,7 @@ import wslite.rest.RESTClientException import wslite.soap.SOAPClient import wslite.soap.SOAPMessageBuilder import wslite.http.auth.HTTPBasicAuthorization +import org.junit.Test class WebserviceUnitTest extends GroovyTestCase { @@ -19,7 +20,7 @@ class WebserviceUnitTest extends GroovyTestCase { client.httpClient.sslTrustAllCerts = true } - void testHttpGetRequest() { + void test_whenSendingGet_thenRespose200() { def postmanGet = new URL('https://postman-echo.com/get') def getConnection = postmanGet.openConnection() getConnection.requestMethod = 'GET' @@ -29,7 +30,7 @@ class WebserviceUnitTest extends GroovyTestCase { } } - void testHttpPostRequest() { + void test_whenSendingPost_thenRespose200() { def postmanPost = new URL('https://postman-echo.com/post') def query = "q=This is post request form parameter." def postConnection = postmanPost.openConnection() @@ -37,7 +38,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert postConnection.responseCode == 200 } - void testHttpPostRequestWithParams() { + void test_whenSendingPostWithParams_thenRespose200() { def postmanPost = new URL('https://postman-echo.com/post') def form = "param1=This is request parameter." def postConnection = postmanPost.openConnection() @@ -54,7 +55,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert jsonSlurper.parseText(text)?.json.param1 == "This is request parameter." } - void testRssFeed() { + void test_whenReadingRSS_thenReceiveFeed() { def rssFeed = new XmlParser().parse("https://news.google.com/rss?hl=en-US&gl=US&ceid=US:en") def stories = [] (0..4).each { @@ -64,7 +65,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert stories.size() == 5 } - void testAtomFeed() { + void test_whenReadingAtom_thenReceiveFeed() { def atomFeed = new XmlParser().parse("https://news.google.com/atom?hl=en-US&gl=US&ceid=US:en") def stories = [] (0..4).each { @@ -74,7 +75,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert stories.size() == 5 } - void testSoapClient() { + void test_whenConsumingSoap_thenReceiveResponse() { def url = "http://www.dataaccess.com/webservicesserver/numberconversion.wso" def soapClient = new SOAPClient(url) def message = new SOAPMessageBuilder().build({ @@ -89,7 +90,7 @@ class WebserviceUnitTest extends GroovyTestCase { assert words == "one thousand two hundred and thirty four " } - void testRestClientGet() { + void test_whenConsumingRestGet_thenReceiveResponse() { def path = "/get" def response try { @@ -101,7 +102,7 @@ class WebserviceUnitTest extends GroovyTestCase { } } - void testRestClientPost() { + void test_whenConsumingRestPost_thenReceiveResponse() { def path = "/post" def params = ["foo":1,"bar":2] def response @@ -117,7 +118,7 @@ class WebserviceUnitTest extends GroovyTestCase { } } - void testBasicAuthentication() { + void test_whenBasicAuthentication_thenReceive200() { def path = "/basic-auth" def response try { @@ -131,7 +132,7 @@ class WebserviceUnitTest extends GroovyTestCase { } } - void testOAuth() { + void test_whenOAuth_thenReceive200() { RESTClient oAuthClient = new RESTClient("https://postman-echo.com") oAuthClient.defaultAcceptHeader = ContentType.JSON oAuthClient.httpClient.sslTrustAllCerts = true From e9e4f633138a44d88fb4fe61fdcc4b0b85ab9dc8 Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Fri, 6 Sep 2019 06:19:30 -0300 Subject: [PATCH 128/396] [BAEL-9497] Fix failing context tests - part 1 (#7719) * fixed context dependency issue and added LiveContext notes in persistence-modules/spring-data-couchbase-2 module * fixed Context tests and added notes for spring-cloud-bus/spring-cloud-config-client module * Added context test in spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server module, mainly due to incompatible dependencies, plus fixed parent pom path in different modules * fixed context tests for spring-cloud/spring-cloud-task/springcloudtaskbatch module, renamed ContextLiveTest as IntegrationTest, now configured to run with an H2 embedded instance. Moved the run note to the application * Added SpringContextLiveTests in persistence-modules/spring-data-mongodb module --- .../spring-data-couchbase-2/pom.xml | 16 +++++++- .../org/baeldung/SpringContextLiveTest.java | 39 +++++++++++++++++++ .../mongoconfig/SpringContextLiveTest.java | 26 +++++++++++++ .../SpringContextLiveTest.java | 26 +++++++++++++ .../SpringContextLiveTest.java | 26 +++++++++++++ .../SpringContextIntegrationTest.java | 18 --------- .../org/baeldung/SpringContextLiveTest.java | 21 ++++++++-- .../data-flow-server/pom.xml | 20 ++++++++-- .../src/main/resources/application.properties | 2 + .../org/baeldung/SpringContextLiveTest.java | 16 -------- .../src/test/resources/application.properties | 1 + .../data-flow-shell/pom.xml | 2 +- .../log-sink/pom.xml | 2 +- .../time-processor/pom.xml | 2 +- .../time-source/pom.xml | 2 +- .../springcloudtaskbatch/pom.xml | 8 +++- .../main/java/com/baeldung/task/TaskDemo.java | 7 ++++ ...java => SpringContextIntegrationTest.java} | 12 +----- .../src/test/resources/application.yml | 11 ++++++ 19 files changed, 199 insertions(+), 58 deletions(-) create mode 100644 persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java create mode 100644 persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java create mode 100644 persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java delete mode 100644 spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java create mode 100644 spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties delete mode 100644 spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java create mode 100644 spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties rename spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/{SpringContextLiveTest.java => SpringContextIntegrationTest.java} (60%) create mode 100644 spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml diff --git a/persistence-modules/spring-data-couchbase-2/pom.xml b/persistence-modules/spring-data-couchbase-2/pom.xml index a857ee538f..f57d9aaa62 100644 --- a/persistence-modules/spring-data-couchbase-2/pom.xml +++ b/persistence-modules/spring-data-couchbase-2/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 org.baeldung @@ -59,13 +60,24 @@ ${spring-framework.version} test + + javax.el + javax.el-api + ${javax.el.version} + + + org.glassfish + javax.el + ${javax.el.version} + - 4.3.4.RELEASE + 4.3.4.RELEASE 2.1.5.RELEASE 5.3.3.Final 2.9.6 + 3.0.0 diff --git a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java index af228735b8..5e20a98a1d 100644 --- a/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/persistence-modules/spring-data-couchbase-2/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -9,6 +9,45 @@ import org.springframework.test.context.TestExecutionListeners; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; +/** + * This LiveTest requires: + * + * 1- Couchbase instance running (e.g. with `docker run -d --name db -p 8091-8096:8091-8096 -p 11210-11211:11210-11211 couchbase`) + * + * + * 2- Couchbase configured with (we can use the console in localhost:8091): + * + * 2.1- Buckets: named 'baeldung' and 'baeldung2' + * + * 2.2- Security: users 'baeldung' and 'baeldung2'. Note: in newer versions an empty password is not allowed, then we have to change the passwords in the project) + * + * 2.3- Spacial View: Add new spacial view (in Index tab) in document 'campus_spatial', view 'byLocation' with the following function: + * {@code + * function (doc) { + * if (doc.location && + * doc._class == "org.baeldung.spring.data.couchbase.model.Campus") { + * emit([doc.location.x, doc.location.y], null); + * } + * }} + * + * 2.4- MapReduce Views: Add new views in document 'campus': + * 2.4.1- view 'all' with function: + * {@code + * function (doc, meta) { + * if(doc._class == "org.baeldung.spring.data.couchbase.model.Campus") { + * emit(meta.id, null); + * } + * }} + * + * 2.4.2- view 'byName' with function: + * {@code + * function (doc, meta) { + * if(doc._class == "org.baeldung.spring.data.couchbase.model.Campus" && + * doc.name) { + * emit(doc.name, null); + * } + * }} + */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { MultiBucketCouchbaseConfig.class, MultiBucketIntegrationTestConfig.class }) @TestExecutionListeners(listeners = { DependencyInjectionTestExecutionListener.class }) diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java new file mode 100644 index 0000000000..a2a3d1761f --- /dev/null +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoconfig/SpringContextLiveTest.java @@ -0,0 +1,26 @@ +package com.baeldung.contexttests.mongoconfig; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.config.MongoConfig; + +/** + * This Live test requires: + * * mongodb instance running on the environment + * + * (e.g. `docker run -d -p 27017:27017 --name bael-mongo mongo`) + * + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MongoConfig.class) +public class SpringContextLiveTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } + +} diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java new file mode 100644 index 0000000000..d2a946fb90 --- /dev/null +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/mongoreactiveconfig/SpringContextLiveTest.java @@ -0,0 +1,26 @@ +package com.baeldung.contexttests.mongoreactiveconfig; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.config.MongoReactiveConfig; + +/** + * This Live test requires: + * * mongodb instance running on the environment + * + * (e.g. `docker run -d -p 27017:27017 --name bael-mongo mongo`) + * + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = MongoReactiveConfig.class) +public class SpringContextLiveTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } + +} diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java new file mode 100644 index 0000000000..6e8905c139 --- /dev/null +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/contexttests/simplemongoconfig/SpringContextLiveTest.java @@ -0,0 +1,26 @@ +package com.baeldung.contexttests.simplemongoconfig; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import com.baeldung.config.SimpleMongoConfig; + +/** + * This Live test requires: + * * mongodb instance running on the environment + * + * (e.g. `docker run -d -p 27017:27017 --name bael-mongo mongo`) + * + * + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(classes = SimpleMongoConfig.class) +public class SpringContextLiveTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } + +} diff --git a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index c0298daeb1..0000000000 --- a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.SpringCloudConfigClientApplication; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringCloudConfigClientApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void contextLoads() { - } - -} diff --git a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java index 8a33efef43..a401d41e1e 100644 --- a/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-cloud-bus/spring-cloud-config-client/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -7,12 +7,27 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.SpringCloudConfigClientApplication; +/** + * This LiveTest requires: + * 1- The 'spring-cloud-bus/spring-cloud-config-server' service running, with valid Spring Cloud Config properties, for instance: + * 1.1- `spring.cloud.config.server.git.uri` pointing to a valid URI, which has `user.role` and `user.password` properties configured in a properties file. For example, to achieve this in a dev environment: + * 1.1.1- `cd my/custom/path` + * 1.1.2- `git init .` + * 1.1.3- `echo user.role=Programmer >> application.properties` + * 1.1.4- `echo user.password=d3v3L >> application.properties` + * 1.1.5- `git add .` + * 1.1.6- `git commit -m 'inital commit'` + * 1.1.7- 'spring-cloud-bus/spring-cloud-config-server' with property `spring.cloud.config.server.git.uri=my/custom/path` + * + * Note: This is enough to run the ContextTest successfully, but to get the full functionality shown in the related article, we'll need also a RabbitMQ instance running (e.g. `docker run -d --hostname my-rabbit --name some-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management`) + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringCloudConfigClientApplication.class) public class SpringContextLiveTest { - @Test - public void contextLoads() { - } + @Test + public void contextLoads() { + } } diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml index cf583c216a..7166b0fd32 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 data-flow-server @@ -12,7 +13,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 @@ -20,6 +21,16 @@ org.springframework.cloud spring-cloud-starter-dataflow-server-local + + org.hibernate + hibernate-core + ${hibernate.compatible.version} + + + org.hibernate + hibernate-entitymanager + ${hibernate.compatible.version} + @@ -42,8 +53,9 @@ - 1.1.0.RELEASE - Brixton.SR7 + 1.3.1.RELEASE + Edgware.SR6 + 5.2.12.Final diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties new file mode 100644 index 0000000000..20ad5d5bcb --- /dev/null +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/main/resources/application.properties @@ -0,0 +1,2 @@ +#spring.datasource.url=jdbc:h2:mem:dataflow +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java deleted file mode 100644 index 980c096f5e..0000000000 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/java/org/baeldung/SpringContextLiveTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung; - -import org.baeldung.spring.cloud.DataFlowServerApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = DataFlowServerApplication.class) -public class SpringContextLiveTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties new file mode 100644 index 0000000000..70e3e5c65b --- /dev/null +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-server/src/test/resources/application.properties @@ -0,0 +1 @@ +spring.datasource.url=jdbc:h2:mem:dataflow \ No newline at end of file diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml index 52cb204201..9c379624d3 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml index ecabb91a98..73fb82d79f 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/log-sink/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml index de354ca698..28a9d3e6e0 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-processor/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml index a4d06e13d2..3b748fd7df 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/time-source/pom.xml @@ -12,7 +12,7 @@ parent-boot-1 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-1 + ../../../parent-boot-1 diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml index 89c9318c4e..b6b5a1cf0f 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/pom.xml @@ -1,4 +1,5 @@ - 4.0.0 org.baeldung.cloud @@ -43,6 +44,11 @@ org.springframework.cloud spring-cloud-task-batch + + com.h2database + h2 + test + diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java index be2a173589..30e17cb956 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/main/java/com/baeldung/task/TaskDemo.java @@ -14,6 +14,13 @@ import org.springframework.cloud.task.configuration.EnableTask; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; +/** + * This Application requires: + * * a MySql instance running, that allows a root user with no password, and with a database named + * + * (e.g. with the following command `docker run -p 3306:3306 --name bael-mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true -e MYSQL_DATABASE=springcloud mysql:latest`) + * + */ @SpringBootApplication @EnableTask @EnableBatchProcessing diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 60% rename from spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java index ddbcbf65ea..0caa626c14 100644 --- a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -10,18 +10,10 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.task.JobConfiguration; import com.baeldung.task.TaskDemo; -/** - * This Live Test requires: - * * a MySql instance running, that allows a root user with no password, and with a database named - * - * (e.g. with the following command `docker run -p 3306:3306 --name bael-mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=true -e MYSQL_DATABASE=springcloud mysql:latest`) - * - */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootApplication -@ContextConfiguration(classes = { JobConfiguration.class, TaskDemo.class }, initializers = { - ConfigFileApplicationContextInitializer.class }) -public class SpringContextLiveTest { +@ContextConfiguration(classes = { JobConfiguration.class, TaskDemo.class }, initializers = { ConfigFileApplicationContextInitializer.class }) +public class SpringContextIntegrationTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml new file mode 100644 index 0000000000..794ac4d247 --- /dev/null +++ b/spring-cloud/spring-cloud-task/springcloudtaskbatch/src/test/resources/application.yml @@ -0,0 +1,11 @@ +spring: + datasource: + url: jdbc:h2:mem:springcloud + username: sa + password: + jpa: + hibernate: + ddl-auto: create-drop + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect \ No newline at end of file From 0d648321dca8d224f4319b7622e0c090b679c31a Mon Sep 17 00:00:00 2001 From: Joel Juarez Date: Fri, 6 Sep 2019 15:17:21 +0200 Subject: [PATCH 129/396] Bael 3043 datastax cassandra (#7616) * BAEL-3043: Datastax Java Driver for Apache Cassandra * changed statement to use query builder * fixed concatenation vulnerability --- persistence-modules/java-cassandra/pom.xml | 5 +++ .../datastax/cassandra/Application.java | 2 +- .../repository/KeyspaceRepository.java | 20 ++++----- .../cassandra/repository/VideoRepository.java | 45 +++++++++++-------- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml index e7c93bc4e5..3f8367d130 100644 --- a/persistence-modules/java-cassandra/pom.xml +++ b/persistence-modules/java-cassandra/pom.xml @@ -35,6 +35,11 @@ java-driver-core ${datastax-cassandra.version} + + com.datastax.oss + java-driver-query-builder + ${datastax-cassandra.version} + io.netty diff --git a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java index 23140e0455..f067ee8b73 100644 --- a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java +++ b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/Application.java @@ -26,7 +26,7 @@ public class Application { KeyspaceRepository keyspaceRepository = new KeyspaceRepository(session); - keyspaceRepository.createKeyspace("testKeyspace", "SimpleStrategy", 1); + keyspaceRepository.createKeyspace("testKeyspace", 1); keyspaceRepository.useKeyspace("testKeyspace"); VideoRepository videoRepository = new VideoRepository(session); diff --git a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java index fd4581d055..899481738a 100644 --- a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java +++ b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/KeyspaceRepository.java @@ -1,7 +1,11 @@ package com.baeldung.datastax.cassandra.repository; +import com.datastax.oss.driver.api.core.CqlIdentifier; import com.datastax.oss.driver.api.core.CqlSession; +import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; +import com.datastax.oss.driver.api.querybuilder.schema.CreateKeyspace; + public class KeyspaceRepository { private final CqlSession session; @@ -9,19 +13,15 @@ public class KeyspaceRepository { this.session = session; } - public void createKeyspace(String keyspaceName, String replicationStrategy, int numberOfReplicas) { - StringBuilder sb = new StringBuilder("CREATE KEYSPACE IF NOT EXISTS ").append(keyspaceName) - .append(" WITH replication = {") - .append("'class':'").append(replicationStrategy) - .append("','replication_factor':").append(numberOfReplicas) - .append("};"); + public void createKeyspace(String keyspaceName, int numberOfReplicas) { + CreateKeyspace createKeyspace = SchemaBuilder.createKeyspace(keyspaceName) + .ifNotExists() + .withSimpleStrategy(numberOfReplicas); - final String query = sb.toString(); - - session.execute(query); + session.execute(createKeyspace.build()); } public void useKeyspace(String keyspace) { - session.execute("USE " + keyspace); + session.execute("USE " + CqlIdentifier.fromCql(keyspace)); } } diff --git a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java index 9a09d77072..48eb000eba 100644 --- a/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java +++ b/persistence-modules/java-cassandra/src/main/java/com/baeldung/datastax/cassandra/repository/VideoRepository.java @@ -7,6 +7,12 @@ import com.datastax.oss.driver.api.core.cql.BoundStatement; import com.datastax.oss.driver.api.core.cql.PreparedStatement; import com.datastax.oss.driver.api.core.cql.ResultSet; import com.datastax.oss.driver.api.core.cql.SimpleStatement; +import com.datastax.oss.driver.api.core.type.DataTypes; +import com.datastax.oss.driver.api.querybuilder.QueryBuilder; +import com.datastax.oss.driver.api.querybuilder.SchemaBuilder; +import com.datastax.oss.driver.api.querybuilder.insert.RegularInsert; +import com.datastax.oss.driver.api.querybuilder.schema.CreateTable; +import com.datastax.oss.driver.api.querybuilder.select.Select; import java.util.ArrayList; import java.util.List; @@ -27,15 +33,12 @@ public class VideoRepository { } public void createTable(String keyspace) { - StringBuilder sb = new StringBuilder("CREATE TABLE IF NOT EXISTS ").append(TABLE_NAME).append(" (") - .append("video_id UUID,") - .append("title TEXT,") - .append("creation_date TIMESTAMP,") - .append("PRIMARY KEY(video_id));"); + CreateTable createTable = SchemaBuilder.createTable(TABLE_NAME).ifNotExists() + .withPartitionKey("video_id", DataTypes.UUID) + .withColumn("title", DataTypes.TEXT) + .withColumn("creation_date", DataTypes.TIMESTAMP); - String query = sb.toString(); - - executeStatement(SimpleStatement.newInstance(query), keyspace); + executeStatement(createTable.build(), keyspace); } public UUID insertVideo(Video video) { @@ -47,17 +50,23 @@ public class VideoRepository { video.setId(videoId); - String absoluteTableName = keyspace != null ? keyspace + "." + TABLE_NAME: TABLE_NAME; + RegularInsert insertInto = QueryBuilder.insertInto(TABLE_NAME) + .value("video_id", QueryBuilder.bindMarker()) + .value("title", QueryBuilder.bindMarker()) + .value("creation_date", QueryBuilder.bindMarker()); - StringBuilder sb = new StringBuilder("INSERT INTO ").append(absoluteTableName) - .append("(video_id, title, creation_date) values (:video_id, :title, :creation_date)"); + SimpleStatement insertStatement = insertInto.build(); - PreparedStatement preparedStatement = session.prepare(sb.toString()); + if (keyspace != null) { + insertStatement = insertStatement.setKeyspace(keyspace); + } + + PreparedStatement preparedStatement = session.prepare(insertStatement); BoundStatement statement = preparedStatement.bind() - .setUuid("video_id", video.getId()) - .setString("title", video.getTitle()) - .setInstant("creation_date", video.getCreationDate()); + .setUuid(0, video.getId()) + .setString(1, video.getTitle()) + .setInstant(2, video.getCreationDate()); session.execute(statement); @@ -69,11 +78,9 @@ public class VideoRepository { } public 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෼r~5(jyj8wH+RW- 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
  • cvo@>>KRA_ewqv=Wf=+zw@*R)auUuj>~FxBG# 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≠mUT4^gVSLIYPY(10O20 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%0D^~N4=L&Csc`hjNM)gX(^N7l|9&I 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%0D_4 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%0Dc+*Iir|$5g)tjq9S^{e4KSx7O-rHkCbrk)FO{-} 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�f#)5F{Hxyrc!4$O&gkOL}qw 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%0A5i%qjRz7Z0tR;E0NETJwv(85V^qp;G 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≥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 diff --git a/play-framework/introduction/project/build.properties b/play-framework/introduction/project/build.properties index 6d9fa6badb..c0bab04941 100644 --- a/play-framework/introduction/project/build.properties +++ b/play-framework/introduction/project/build.properties @@ -1,4 +1 @@ -#Activator-generated Properties -#Wed Sep 07 12:29:40 EAT 2016 -template.uuid=c373963b-f5ad-433b-8e74-178e7ae25b1c -sbt.version=0.13.11 +sbt.version=1.2.8 diff --git a/play-framework/introduction/project/plugins.sbt b/play-framework/introduction/project/plugins.sbt index 51c5b2a35a..1c8c62a0d5 100644 --- a/play-framework/introduction/project/plugins.sbt +++ b/play-framework/introduction/project/plugins.sbt @@ -1,21 +1,7 @@ // The Play plugin -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.6") +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.7.3") -// Web plugins -addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.3") -addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.7") -addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0") -addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.2") - -// Play enhancer - this automatically generates getters/setters for public fields -// and rewrites accessors of these fields to use the getters/setters. Remove this -// plugin if you prefer not to have this feature, or disable on a per project -// basis using disablePlugins(PlayEnhancer) in your build.sbt -addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") - -// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using -// enablePlugins(PlayEbean). -// addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "1.0.0") +// Defines scaffolding (found under .g8 folder) +// http://www.foundweekends.org/giter8/scaffolding.html +// sbt "g8Scaffold form" +addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.11.0") diff --git a/play-framework/introduction/public/javascripts/hello.js b/play-framework/introduction/public/javascripts/hello.js deleted file mode 100644 index 02ee13c7ca..0000000000 --- a/play-framework/introduction/public/javascripts/hello.js +++ /dev/null @@ -1,3 +0,0 @@ -if (window.console) { - console.log("Welcome to your Play application's JavaScript!"); -} diff --git a/play-framework/introduction/public/javascripts/main.js b/play-framework/introduction/public/javascripts/main.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/play-framework/introduction/test/ApplicationLiveTest.java b/play-framework/introduction/test/ApplicationLiveTest.java deleted file mode 100644 index beeef1a602..0000000000 --- a/play-framework/introduction/test/ApplicationLiveTest.java +++ /dev/null @@ -1,172 +0,0 @@ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Arrays; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.junit.Before; -import org.junit.Test; -import model.Student; -import play.test.*; -import static play.test.Helpers.*; - -public class ApplicationLiveTest{ - private static final String BASE_URL = "http://localhost:9000"; - - @Test -public void testInServer() throws Exception { - TestServer server = testServer(3333); - running(server, () -> { - try { - WSClient ws = play.libs.ws.WS.newClient(3333); - CompletionStage completionStage = ws.url("/").get(); - WSResponse response = completionStage.toCompletableFuture().get(); - ws.close(); - assertEquals(OK, response.getStatus()); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - }); -} - @Test - public void whenCreatesRecord_thenCorrect() { - Student student = new Student("jody", "west", 50); - JSONObject obj = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))); - assertTrue(obj.getBoolean("isSuccessfull")); - JSONObject body = obj.getJSONObject("body"); - assertEquals(student.getAge(), body.getInt("age")); - assertEquals(student.getFirstName(), body.getString("firstName")); - assertEquals(student.getLastName(), body.getString("lastName")); - } - - @Test - public void whenDeletesCreatedRecord_thenCorrect() { - Student student = new Student("Usain", "Bolt", 25); - JSONObject ob1 = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))).getJSONObject("body"); - int id = ob1.getInt("id"); - JSONObject obj1 = new JSONObject(makeRequest(BASE_URL + "/" + id, "POST", new JSONObject())); - assertTrue(obj1.getBoolean("isSuccessfull")); - makeRequest(BASE_URL + "/" + id, "DELETE", null); - JSONObject obj2 = new JSONObject(makeRequest(BASE_URL + "/" + id, "POST", new JSONObject())); - assertFalse(obj2.getBoolean("isSuccessfull")); - } - - @Test - public void whenUpdatesCreatedRecord_thenCorrect() { - Student student = new Student("john", "doe", 50); - JSONObject body1 = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))).getJSONObject("body"); - assertEquals(student.getAge(), body1.getInt("age")); - int newAge = 60; - body1.put("age", newAge); - JSONObject body2 = new JSONObject(makeRequest(BASE_URL, "PUT", body1)).getJSONObject("body"); - assertFalse(student.getAge() == body2.getInt("age")); - assertTrue(newAge == body2.getInt("age")); - } - - @Test - public void whenGetsAllRecords_thenCorrect() { - Student student1 = new Student("jane", "daisy", 50); - Student student2 = new Student("john", "daniel", 60); - Student student3 = new Student("don", "mason", 55); - Student student4 = new Student("scarlet", "ohara", 90); - - makeRequest(BASE_URL, "POST", new JSONObject(student1)); - makeRequest(BASE_URL, "POST", new JSONObject(student2)); - makeRequest(BASE_URL, "POST", new JSONObject(student3)); - makeRequest(BASE_URL, "POST", new JSONObject(student4)); - - JSONObject objects = new JSONObject(makeRequest(BASE_URL, "GET", null)); - assertTrue(objects.getBoolean("isSuccessfull")); - JSONArray array = objects.getJSONArray("body"); - assertTrue(array.length() >= 4); - } - - public static String makeRequest(String myUrl, String httpMethod, JSONObject parameters) { - - URL url = null; - try { - url = new URL(myUrl); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - HttpURLConnection conn = null; - try { - - conn = (HttpURLConnection) url.openConnection(); - } catch (IOException e) { - e.printStackTrace(); - } - conn.setDoInput(true); - - conn.setReadTimeout(10000); - - conn.setRequestProperty("Content-Type", "application/json"); - DataOutputStream dos = null; - int respCode = 0; - String inputString = null; - try { - conn.setRequestMethod(httpMethod); - - if (Arrays.asList("POST", "PUT").contains(httpMethod)) { - String params = parameters.toString(); - - conn.setDoOutput(true); - - dos = new DataOutputStream(conn.getOutputStream()); - dos.writeBytes(params); - dos.flush(); - dos.close(); - } - respCode = conn.getResponseCode(); - if (respCode != 200 && respCode != 201) { - String error = inputStreamToString(conn.getErrorStream()); - return error; - } - inputString = inputStreamToString(conn.getInputStream()); - - } catch (IOException e) { - - e.printStackTrace(); - } - return inputString; - } - - public static String inputStreamToString(InputStream is) { - BufferedReader br = null; - StringBuilder sb = new StringBuilder(); - - String line; - try { - - br = new BufferedReader(new InputStreamReader(is)); - while ((line = br.readLine()) != null) { - sb.append(line); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - return sb.toString(); - - } -} diff --git a/play-framework/introduction/test/controllers/HomeControllerUnitTest.java b/play-framework/introduction/test/controllers/HomeControllerUnitTest.java new file mode 100644 index 0000000000..42a2e871f0 --- /dev/null +++ b/play-framework/introduction/test/controllers/HomeControllerUnitTest.java @@ -0,0 +1,97 @@ +package controllers; + +import org.junit.Test; +import play.Application; +import play.inject.guice.GuiceApplicationBuilder; +import play.mvc.Http; +import play.mvc.Result; +import play.test.WithApplication; + +import java.util.Optional; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static play.mvc.Http.Status.*; +import static play.test.Helpers.GET; +import static play.test.Helpers.route; + +public class HomeControllerUnitTest extends WithApplication { + + @Override + protected Application provideApplication() { + return new GuiceApplicationBuilder().build(); + } + + @Test + public void givenRequest_whenRootPath_ThenStatusOkay() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + } + + @Test + public void givenRequest_whenHtmlPath_ThenStatusOkay() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/html"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + } + + @Test + public void givenRequest_whenBadRequest_ThenStatusBadRequest() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/bad-req"); + + Result result = route(app, request); + assertEquals(BAD_REQUEST, result.status()); + } + + @Test + public void givenRequest_whenNotFound_ThenStatusNotFound() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/not-found"); + + Result result = route(app, request); + assertEquals(NOT_FOUND, result.status()); + } + + @Test + public void givenRequest_whenCustomContentTypePath_ThenContextTypeTextHtml() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/custom-content-type"); + + Result result = route(app, request); + assertTrue(result.contentType().isPresent()); + assertEquals("text/html", result.contentType().get()); + } + + @Test + public void givenRequest_whenAsyncPath_ThenStatusOkay() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/async"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + } + + @Test + public void givenRequest_whenHeadersPath_ThenCustomHeaderFieldSet() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/baeldung/headers"); + + Result result = route(app, request); + final Optional headerOptional = result.header("Header-Key"); + assertTrue(headerOptional.isPresent()); + assertEquals("Some value", headerOptional.get()); + } +} diff --git a/play-framework/routing-in-play/LICENSE b/play-framework/routing-in-play/LICENSE deleted file mode 100644 index 4baedcb95f..0000000000 --- a/play-framework/routing-in-play/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -This software is licensed under the Apache 2 license, quoted below. - -Licensed under the Apache License, Version 2.0 (the "License"); you may not use this project except in compliance with -the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0. - -Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific -language governing permissions and limitations under the License. \ No newline at end of file diff --git a/play-framework/routing-in-play/README b/play-framework/routing-in-play/README deleted file mode 100644 index f21d092edf..0000000000 --- a/play-framework/routing-in-play/README +++ /dev/null @@ -1,49 +0,0 @@ -This is your new Play application -================================= - -This file will be packaged with your application when using `activator dist`. - -There are several demonstration files available in this template. - -Controllers -=========== - -- HomeController.java: - - Shows how to handle simple HTTP requests. - -- AsyncController.java: - - Shows how to do asynchronous programming when handling a request. - -- CountController.java: - - Shows how to inject a component into a controller and use the component when - handling requests. - -Components -========== - -- Module.java: - - Shows how to use Guice to bind all the components needed by your application. - -- Counter.java: - - An example of a component that contains state, in this case a simple counter. - -- ApplicationTimer.java: - - An example of a component that starts when the application starts and stops - when the application stops. - -Filters -======= - -- Filters.java: - - Creates the list of HTTP filters used by your application. - -- ExampleFilter.java - - A simple filter that adds a header to every response. \ No newline at end of file diff --git a/play-framework/routing-in-play/app/Filters.java b/play-framework/routing-in-play/app/Filters.java deleted file mode 100644 index 255de8ca93..0000000000 --- a/play-framework/routing-in-play/app/Filters.java +++ /dev/null @@ -1,46 +0,0 @@ -import javax.inject.*; -import play.*; -import play.mvc.EssentialFilter; -import play.http.HttpFilters; -import play.mvc.*; - -import filters.ExampleFilter; - -/** - * This class configures filters that run on every request. This - * class is queried by Play to get a list of filters. - * - * Play will automatically use filters from any class called - * Filters that is placed the root package. You can load filters - * from a different class by adding a `play.http.filters` setting to - * the application.conf configuration file. - */ -@Singleton -public class Filters implements HttpFilters { - - private final Environment env; - private final EssentialFilter exampleFilter; - - /** - * @param env Basic environment settings for the current application. - * @param exampleFilter A demonstration filter that adds a header to - */ - @Inject - public Filters(Environment env, ExampleFilter exampleFilter) { - this.env = env; - this.exampleFilter = exampleFilter; - } - - @Override - public EssentialFilter[] filters() { - // Use the example filter if we're running development mode. If - // we're running in production or test mode then don't use any - // filters at all. - if (env.mode().equals(Mode.DEV)) { - return new EssentialFilter[] { exampleFilter }; - } else { - return new EssentialFilter[] {}; - } - } - -} diff --git a/play-framework/routing-in-play/app/Module.java b/play-framework/routing-in-play/app/Module.java deleted file mode 100644 index 6e7d1766ef..0000000000 --- a/play-framework/routing-in-play/app/Module.java +++ /dev/null @@ -1,31 +0,0 @@ -import com.google.inject.AbstractModule; -import java.time.Clock; - -import services.ApplicationTimer; -import services.AtomicCounter; -import services.Counter; - -/** - * This class is a Guice module that tells Guice how to bind several - * different types. This Guice module is created when the Play - * application starts. - * - * Play will automatically use any class called `Module` that is in - * the root package. You can create modules in other locations by - * adding `play.modules.enabled` settings to the `application.conf` - * configuration file. - */ -public class Module extends AbstractModule { - - @Override - public void configure() { - // Use the system clock as the default implementation of Clock - bind(Clock.class).toInstance(Clock.systemDefaultZone()); - // Ask Guice to create an instance of ApplicationTimer when the - // application starts. - bind(ApplicationTimer.class).asEagerSingleton(); - // Set AtomicCounter as the implementation for Counter. - bind(Counter.class).to(AtomicCounter.class); - } - -} diff --git a/play-framework/routing-in-play/app/controllers/HomeController.java b/play-framework/routing-in-play/app/controllers/HomeController.java index 6e340d594f..c7f6daa898 100644 --- a/play-framework/routing-in-play/app/controllers/HomeController.java +++ b/play-framework/routing-in-play/app/controllers/HomeController.java @@ -1,8 +1,13 @@ package controllers; +import play.libs.concurrent.HttpExecutionContext; import play.mvc.*; +import play.twirl.api.Html; -import views.html.*; +import javax.inject.Inject; +import java.util.concurrent.CompletionStage; + +import static java.util.concurrent.CompletableFuture.supplyAsync; /** * This controller contains an action to handle HTTP requests @@ -16,18 +21,33 @@ public class HomeController extends Controller { * this method will be called when the application receives a * GET request with a path of /. */ - public Result index(String author,int id) { - return ok("Routing in Play by:"+author+" ID:"+id); - } - public Result greet(String name,int age) { - return ok("Hello "+name+", you are "+age+" years old"); - } - public Result introduceMe(String data) { - String[] clientData=data.split(","); - return ok("Your name is "+clientData[0]+", you are "+clientData[1]+" years old"); - } - public Result squareMe(Long num) { - return ok(num+" Squared is "+(num*num)); + public Result index() { + return ok(views.html.index.render()); } + public Result writer(String author) { + return ok("Routing in Play by " + author); + } + + public Result viewUser(String userId) { + final String response = String.format("Got user id {} in request.", userId); + return ok(response); + } + + public Result greet(String name, int age) { + return ok("Hello " + name + ", you are " + age + " years old"); + } + + public Result squareMe(Long num) { + return ok(num + " Squared is " + (num * num)); + } + + public Result writer(String author, int id) { + return ok("Routing in Play by: " + author + " ID: " + id); + } + + public Result introduceMe(String data) { + String[] clientData = data.split(","); + return ok("Your name is " + clientData[0] + ", you are " + clientData[1] + " years old"); + } } diff --git a/play-framework/routing-in-play/app/filters/ExampleFilter.java b/play-framework/routing-in-play/app/filters/ExampleFilter.java deleted file mode 100644 index 67a6a36cc3..0000000000 --- a/play-framework/routing-in-play/app/filters/ExampleFilter.java +++ /dev/null @@ -1,45 +0,0 @@ -package filters; - -import akka.stream.Materializer; -import java.util.concurrent.CompletionStage; -import java.util.concurrent.Executor; -import java.util.function.Function; -import javax.inject.*; -import play.mvc.*; -import play.mvc.Http.RequestHeader; - - -/** - * This is a simple filter that adds a header to all requests. It's - * added to the application's list of filters by the - * {@link Filters} class. - */ -@Singleton -public class ExampleFilter extends Filter { - - private final Executor exec; - - /** - * @param mat This object is needed to handle streaming of requests - * and responses. - * @param exec This class is needed to execute code asynchronously. - * It is used below by the thenAsyncApply method. - */ - @Inject - public ExampleFilter(Materializer mat, Executor exec) { - super(mat); - this.exec = exec; - } - - @Override - public CompletionStage apply( - Function> next, - RequestHeader requestHeader) { - - return next.apply(requestHeader).thenApplyAsync( - result -> result.withHeader("X-ExampleFilter", "foo"), - exec - ); - } - -} diff --git a/play-framework/routing-in-play/app/services/ApplicationTimer.java b/play-framework/routing-in-play/app/services/ApplicationTimer.java deleted file mode 100644 index a951562b1d..0000000000 --- a/play-framework/routing-in-play/app/services/ApplicationTimer.java +++ /dev/null @@ -1,50 +0,0 @@ -package services; - -import java.time.Clock; -import java.time.Instant; -import java.util.concurrent.CompletableFuture; -import javax.inject.*; -import play.Logger; -import play.inject.ApplicationLifecycle; - -/** - * This class demonstrates how to run code when the - * application starts and stops. It starts a timer when the - * application starts. When the application stops it prints out how - * long the application was running for. - * - * This class is registered for Guice dependency injection in the - * {@link Module} class. We want the class to start when the application - * starts, so it is registered as an "eager singleton". See the code - * in the {@link Module} class to see how this happens. - * - * This class needs to run code when the server stops. It uses the - * application's {@link ApplicationLifecycle} to register a stop hook. - */ -@Singleton -public class ApplicationTimer { - - private final Clock clock; - private final ApplicationLifecycle appLifecycle; - private final Instant start; - - @Inject - public ApplicationTimer(Clock clock, ApplicationLifecycle appLifecycle) { - this.clock = clock; - this.appLifecycle = appLifecycle; - // This code is called when the application starts. - start = clock.instant(); - Logger.info("ApplicationTimer demo: Starting application at " + start); - - // When the application starts, register a stop hook with the - // ApplicationLifecycle object. The code inside the stop hook will - // be run when the application stops. - appLifecycle.addStopHook(() -> { - Instant stop = clock.instant(); - Long runningTime = stop.getEpochSecond() - start.getEpochSecond(); - Logger.info("ApplicationTimer demo: Stopping application at " + clock.instant() + " after " + runningTime + "s."); - return CompletableFuture.completedFuture(null); - }); - } - -} diff --git a/play-framework/routing-in-play/app/services/AtomicCounter.java b/play-framework/routing-in-play/app/services/AtomicCounter.java deleted file mode 100644 index 41f741cbf7..0000000000 --- a/play-framework/routing-in-play/app/services/AtomicCounter.java +++ /dev/null @@ -1,26 +0,0 @@ -package services; - -import java.util.concurrent.atomic.AtomicInteger; -import javax.inject.*; - -/** - * This class is a concrete implementation of the {@link Counter} trait. - * It is configured for Guice dependency injection in the {@link Module} - * class. - * - * This class has a {@link Singleton} annotation because we need to make - * sure we only use one counter per application. Without this - * annotation we would get a new instance every time a {@link Counter} is - * injected. - */ -@Singleton -public class AtomicCounter implements Counter { - - private final AtomicInteger atomicCounter = new AtomicInteger(); - - @Override - public int nextCount() { - return atomicCounter.getAndIncrement(); - } - -} diff --git a/play-framework/routing-in-play/app/services/Counter.java b/play-framework/routing-in-play/app/services/Counter.java deleted file mode 100644 index dadad8b09d..0000000000 --- a/play-framework/routing-in-play/app/services/Counter.java +++ /dev/null @@ -1,13 +0,0 @@ -package services; - -/** - * This interface demonstrates how to create a component that is injected - * into a controller. The interface represents a counter that returns a - * incremented number each time it is called. - * - * The {@link Modules} class binds this interface to the - * {@link AtomicCounter} implementation. - */ -public interface Counter { - int nextCount(); -} diff --git a/play-framework/routing-in-play/app/views/index.scala.html b/play-framework/routing-in-play/app/views/index.scala.html index 4539f5a10b..68d37fb1d4 100644 --- a/play-framework/routing-in-play/app/views/index.scala.html +++ b/play-framework/routing-in-play/app/views/index.scala.html @@ -1,20 +1,5 @@ -@* - * This template takes a single argument, a String containing a - * message to display. - *@ -@(message: String) +@() -@* - * Call the `main` template with two arguments. The first - * argument is a `String` with the title of the page, the second - * argument is an `Html` object containing the body of the page. - *@ @main("Welcome to Play") { - - @* - * Get an `Html` object by calling the built-in Play welcome - * template and passing a `String` message. - *@ - @play20.welcome(message, style = "Java") - +

    Welcome to Play!

    } diff --git a/play-framework/routing-in-play/app/views/main.scala.html b/play-framework/routing-in-play/app/views/main.scala.html index 9414f4be6e..c5f755f236 100644 --- a/play-framework/routing-in-play/app/views/main.scala.html +++ b/play-framework/routing-in-play/app/views/main.scala.html @@ -13,11 +13,12 @@ @title - @* And here's where we render the `Html` object containing * the page content. *@ @content + + diff --git a/play-framework/routing-in-play/bin/activator b/play-framework/routing-in-play/bin/activator deleted file mode 100644 index a8b11d482f..0000000000 --- a/play-framework/routing-in-play/bin/activator +++ /dev/null @@ -1,397 +0,0 @@ -#!/usr/bin/env bash - -### ------------------------------- ### -### Helper methods for BASH scripts ### -### ------------------------------- ### - -realpath () { -( - TARGET_FILE="$1" - FIX_CYGPATH="$2" - - cd "$(dirname "$TARGET_FILE")" - TARGET_FILE=$(basename "$TARGET_FILE") - - COUNT=0 - while [ -L "$TARGET_FILE" -a $COUNT -lt 100 ] - do - TARGET_FILE=$(readlink "$TARGET_FILE") - cd "$(dirname "$TARGET_FILE")" - TARGET_FILE=$(basename "$TARGET_FILE") - COUNT=$(($COUNT + 1)) - done - - # make sure we grab the actual windows path, instead of cygwin's path. - if [[ "x$FIX_CYGPATH" != "x" ]]; then - echo "$(cygwinpath "$(pwd -P)/$TARGET_FILE")" - else - echo "$(pwd -P)/$TARGET_FILE" - fi -) -} - - -# Uses uname to detect if we're in the odd cygwin environment. -is_cygwin() { - local os=$(uname -s) - case "$os" in - CYGWIN*) return 0 ;; - *) return 1 ;; - esac -} - -# TODO - Use nicer bash-isms here. -CYGWIN_FLAG=$(if is_cygwin; then echo true; else echo false; fi) - - -# This can fix cygwin style /cygdrive paths so we get the -# windows style paths. -cygwinpath() { - local file="$1" - if [[ "$CYGWIN_FLAG" == "true" ]]; then - echo $(cygpath -w $file) - else - echo $file - fi -} - -# Make something URI friendly -make_url() { - url="$1" - local nospaces=${url// /%20} - if is_cygwin; then - echo "/${nospaces//\\//}" - else - echo "$nospaces" - fi -} - -declare -a residual_args -declare -a java_args -declare -a scalac_args -declare -a sbt_commands -declare java_cmd=java -declare java_version -declare -r real_script_path="$(realpath "$0")" -declare -r sbt_home="$(realpath "$(dirname "$(dirname "$real_script_path")")")" -declare -r sbt_bin_dir="$(dirname "$real_script_path")" -declare -r app_version="1.3.10" - -declare -r script_name=activator -declare -r java_opts=( "${ACTIVATOR_OPTS[@]}" "${SBT_OPTS[@]}" "${JAVA_OPTS[@]}" "${java_opts[@]}" ) -userhome="$HOME" -if is_cygwin; then - # cygwin sets home to something f-d up, set to real windows homedir - userhome="$USERPROFILE" -fi -declare -r activator_user_home_dir="${userhome}/.activator" -declare -r java_opts_config_home="${activator_user_home_dir}/activatorconfig.txt" -declare -r java_opts_config_version="${activator_user_home_dir}/${app_version}/activatorconfig.txt" - -echoerr () { - echo 1>&2 "$@" -} -vlog () { - [[ $verbose || $debug ]] && echoerr "$@" -} -dlog () { - [[ $debug ]] && echoerr "$@" -} - -jar_file () { - echo "$(cygwinpath "${sbt_home}/libexec/activator-launch-${app_version}.jar")" -} - -acquire_sbt_jar () { - sbt_jar="$(jar_file)" - - if [[ ! -f "$sbt_jar" ]]; then - echoerr "Could not find launcher jar: $sbt_jar" - exit 2 - fi -} - -execRunner () { - # print the arguments one to a line, quoting any containing spaces - [[ $verbose || $debug ]] && echo "# Executing command line:" && { - for arg; do - if printf "%s\n" "$arg" | grep -q ' '; then - printf "\"%s\"\n" "$arg" - else - printf "%s\n" "$arg" - fi - done - echo "" - } - - # THis used to be exec, but we loose the ability to re-hook stty then - # for cygwin... Maybe we should flag the feature here... - "$@" -} - -addJava () { - dlog "[addJava] arg = '$1'" - java_args=( "${java_args[@]}" "$1" ) -} -addSbt () { - dlog "[addSbt] arg = '$1'" - sbt_commands=( "${sbt_commands[@]}" "$1" ) -} -addResidual () { - dlog "[residual] arg = '$1'" - residual_args=( "${residual_args[@]}" "$1" ) -} -addDebugger () { - addJava "-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=$1" -} - -get_mem_opts () { - # if we detect any of these settings in ${JAVA_OPTS} we need to NOT output our settings. - # The reason is the Xms/Xmx, if they don't line up, cause errors. - if [[ "${JAVA_OPTS}" == *-Xmx* ]] || [[ "${JAVA_OPTS}" == *-Xms* ]] || [[ "${JAVA_OPTS}" == *-XX:MaxPermSize* ]] || [[ "${JAVA_OPTS}" == *-XX:MaxMetaspaceSize* ]] || [[ "${JAVA_OPTS}" == *-XX:ReservedCodeCacheSize* ]]; then - echo "" - else - # a ham-fisted attempt to move some memory settings in concert - # so they need not be messed around with individually. - local mem=${1:-1024} - local codecache=$(( $mem / 8 )) - (( $codecache > 128 )) || codecache=128 - (( $codecache < 512 )) || codecache=512 - local class_metadata_size=$(( $codecache * 2 )) - local class_metadata_opt=$([[ "$java_version" < "1.8" ]] && echo "MaxPermSize" || echo "MaxMetaspaceSize") - - echo "-Xms${mem}m -Xmx${mem}m -XX:ReservedCodeCacheSize=${codecache}m -XX:${class_metadata_opt}=${class_metadata_size}m" - fi -} - -require_arg () { - local type="$1" - local opt="$2" - local arg="$3" - if [[ -z "$arg" ]] || [[ "${arg:0:1}" == "-" ]]; then - echo "$opt requires <$type> argument" - exit 1 - fi -} - -is_function_defined() { - declare -f "$1" > /dev/null -} - -# If we're *not* running in a terminal, and we don't have any arguments, then we need to add the 'ui' parameter -detect_terminal_for_ui() { - [[ ! -t 0 ]] && [[ "${#residual_args}" == "0" ]] && { - addResidual "ui" - } - # SPECIAL TEST FOR MAC - [[ "$(uname)" == "Darwin" ]] && [[ "$HOME" == "$PWD" ]] && [[ "${#residual_args}" == "0" ]] && { - echo "Detected MAC OSX launched script...." - echo "Swapping to UI" - addResidual "ui" - } -} - -process_args () { - while [[ $# -gt 0 ]]; do - case "$1" in - -h|-help) usage; exit 1 ;; - -v|-verbose) verbose=1 && shift ;; - -d|-debug) debug=1 && shift ;; - - -ivy) require_arg path "$1" "$2" && addJava "-Dsbt.ivy.home=$2" && shift 2 ;; - -mem) require_arg integer "$1" "$2" && sbt_mem="$2" && shift 2 ;; - -jvm-debug) require_arg port "$1" "$2" && addDebugger $2 && shift 2 ;; - -batch) exec &1 | awk -F '"' '/version/ {print $2}') - vlog "[process_args] java_version = '$java_version'" -} - -# Detect that we have java installed. -checkJava() { - local required_version="$1" - # Now check to see if it's a good enough version - if [[ "$java_version" == "" ]]; then - echo - echo No java installations was detected. - echo Please go to http://www.java.com/getjava/ and download - echo - exit 1 - elif [[ ! "$java_version" > "$required_version" ]]; then - echo - echo The java installation you have is not up to date - echo $script_name requires at least version $required_version+, you have - echo version $java_version - echo - echo Please go to http://www.java.com/getjava/ and download - echo a valid Java Runtime and install before running $script_name. - echo - exit 1 - fi -} - - -run() { - # no jar? download it. - [[ -f "$sbt_jar" ]] || acquire_sbt_jar "$sbt_version" || { - # still no jar? uh-oh. - echo "Download failed. Obtain the sbt-launch.jar manually and place it at $sbt_jar" - exit 1 - } - - # process the combined args, then reset "$@" to the residuals - process_args "$@" - detect_terminal_for_ui - set -- "${residual_args[@]}" - argumentCount=$# - - # TODO - java check should be configurable... - checkJava "1.6" - - #If we're in cygwin, we should use the windows config, and terminal hacks - if [[ "$CYGWIN_FLAG" == "true" ]]; then - stty -icanon min 1 -echo > /dev/null 2>&1 - addJava "-Djline.terminal=jline.UnixTerminal" - addJava "-Dsbt.cygwin=true" - fi - - # run sbt - execRunner "$java_cmd" \ - "-Dactivator.home=$(make_url "$sbt_home")" \ - ${SBT_OPTS:-$default_sbt_opts} \ - $(get_mem_opts $sbt_mem) \ - ${JAVA_OPTS} \ - ${java_args[@]} \ - -jar "$sbt_jar" \ - "${sbt_commands[@]}" \ - "${residual_args[@]}" - - exit_code=$? - - # Clean up the terminal from cygwin hacks. - if [[ "$CYGWIN_FLAG" == "true" ]]; then - stty icanon echo > /dev/null 2>&1 - fi - exit $exit_code -} - - -declare -r noshare_opts="-Dsbt.global.base=project/.sbtboot -Dsbt.boot.directory=project/.boot -Dsbt.ivy.home=project/.ivy" -declare -r sbt_opts_file=".sbtopts" -declare -r etc_sbt_opts_file="${sbt_home}/conf/sbtopts" -declare -r win_sbt_opts_file="${sbt_home}/conf/sbtconfig.txt" - -usage() { - cat < path to global settings/plugins directory (default: ~/.sbt) - -sbt-boot path to shared boot directory (default: ~/.sbt/boot in 0.11 series) - -ivy path to local Ivy repository (default: ~/.ivy2) - -mem set memory options (default: $sbt_mem, which is $(get_mem_opts $sbt_mem)) - -no-share use all local caches; no sharing - -no-global uses global caches, but does not use global ~/.sbt directory. - -jvm-debug Turn on JVM debugging, open at the given port. - -batch Disable interactive mode - - # sbt version (default: from project/build.properties if present, else latest release) - -sbt-version use the specified version of sbt - -sbt-jar use the specified jar as the sbt launcher - -sbt-rc use an RC version of sbt - -sbt-snapshot use a snapshot version of sbt - - # java version (default: java from PATH, currently $(java -version 2>&1 | grep version)) - -java-home alternate JAVA_HOME - - # jvm options and output control - JAVA_OPTS environment variable, if unset uses "$java_opts" - SBT_OPTS environment variable, if unset uses "$default_sbt_opts" - ACTIVATOR_OPTS Environment variable, if unset uses "" - .sbtopts if this file exists in the current directory, it is - prepended to the runner args - /etc/sbt/sbtopts if this file exists, it is prepended to the runner args - -Dkey=val pass -Dkey=val directly to the java runtime - -J-X pass option -X directly to the java runtime - (-J is stripped) - -S-X add -X to sbt's scalacOptions (-S is stripped) - -In the case of duplicated or conflicting options, the order above -shows precedence: JAVA_OPTS lowest, command line options highest. -EOM -} - - - -process_my_args () { - while [[ $# -gt 0 ]]; do - case "$1" in - -no-colors) addJava "-Dsbt.log.noformat=true" && shift ;; - -no-share) addJava "$noshare_opts" && shift ;; - -no-global) addJava "-Dsbt.global.base=$(pwd)/project/.sbtboot" && shift ;; - -sbt-boot) require_arg path "$1" "$2" && addJava "-Dsbt.boot.directory=$2" && shift 2 ;; - -sbt-dir) require_arg path "$1" "$2" && addJava "-Dsbt.global.base=$2" && shift 2 ;; - -debug-inc) addJava "-Dxsbt.inc.debug=true" && shift ;; - -batch) exec ^&1') do ( - if %%~j==java set JAVAINSTALLED=1 - if %%~j==openjdk set JAVAINSTALLED=1 -) - -rem Detect the same thing about javac -if "%_JAVACCMD%"=="" ( - if not "%JAVA_HOME%"=="" ( - if exist "%JAVA_HOME%\bin\javac.exe" set "_JAVACCMD=%JAVA_HOME%\bin\javac.exe" - ) -) -if "%_JAVACCMD%"=="" set _JAVACCMD=javac -for /F %%j in ('"%_JAVACCMD%" -version 2^>^&1') do ( - if %%~j==javac set JAVACINSTALLED=1 -) - -rem BAT has no logical or, so we do it OLD SCHOOL! Oppan Redmond Style -set JAVAOK=true -if not defined JAVAINSTALLED set JAVAOK=false -if not defined JAVACINSTALLED set JAVAOK=false - -if "%JAVAOK%"=="false" ( - echo. - echo A Java JDK is not installed or can't be found. - if not "%JAVA_HOME%"=="" ( - echo JAVA_HOME = "%JAVA_HOME%" - ) - echo. - echo Please go to - echo http://www.oracle.com/technetwork/java/javase/downloads/index.html - echo and download a valid Java JDK and install before running Activator. - echo. - echo If you think this message is in error, please check - echo your environment variables to see if "java.exe" and "javac.exe" are - echo available via JAVA_HOME or PATH. - echo. - if defined DOUBLECLICKED pause - exit /B 1 -) - -rem Check what Java version is being used to determine what memory options to use -for /f "tokens=3" %%g in ('java -version 2^>^&1 ^| findstr /i "version"') do ( - set JAVA_VERSION=%%g -) - -rem Strips away the " characters -set JAVA_VERSION=%JAVA_VERSION:"=% - -rem TODO Check if there are existing mem settings in JAVA_OPTS/CFG_OPTS and use those instead of the below -for /f "delims=. tokens=1-3" %%v in ("%JAVA_VERSION%") do ( - set MAJOR=%%v - set MINOR=%%w - set BUILD=%%x - - set META_SIZE=-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=256M - if "!MINOR!" LSS "8" ( - set META_SIZE=-XX:PermSize=64M -XX:MaxPermSize=256M - ) - - set MEM_OPTS=!META_SIZE! - ) - -rem We use the value of the JAVA_OPTS environment variable if defined, rather than the config. -set _JAVA_OPTS=%JAVA_OPTS% -if "%_JAVA_OPTS%"=="" set _JAVA_OPTS=%CFG_OPTS% - -set DEBUG_OPTS= - -rem Loop through the arguments, building remaining args in args variable -set args= -:argsloop -if not "%~1"=="" ( - rem Checks if the argument contains "-D" and if true, adds argument 1 with 2 and puts an equal sign between them. - rem This is done since batch considers "=" to be a delimiter so we need to circumvent this behavior with a small hack. - set arg1=%~1 - if "!arg1:~0,2!"=="-D" ( - set "args=%args% "%~1"="%~2"" - shift - shift - goto argsloop - ) - - if "%~1"=="-jvm-debug" ( - if not "%~2"=="" ( - rem This piece of magic somehow checks that an argument is a number - for /F "delims=0123456789" %%i in ("%~2") do ( - set var="%%i" - ) - if defined var ( - rem Not a number, assume no argument given and default to 9999 - set JPDA_PORT=9999 - ) else ( - rem Port was given, shift arguments - set JPDA_PORT=%~2 - shift - ) - ) else ( - set JPDA_PORT=9999 - ) - shift - - set DEBUG_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=!JPDA_PORT! - goto argsloop - ) - rem else - set "args=%args% "%~1"" - shift - goto argsloop -) - -:run - -if "!args!"=="" ( - if defined DOUBLECLICKED ( - set CMDS="ui" - ) else set CMDS=!args! -) else set CMDS=!args! - -rem We add a / in front, so we get file:///C: instead of file://C: -rem Java considers the later a UNC path. -rem We also attempt a solid effort at making it URI friendly. -rem We don't even bother with UNC paths. -set JAVA_FRIENDLY_HOME_1=/!ACTIVATOR_HOME:\=/! -set JAVA_FRIENDLY_HOME=/!JAVA_FRIENDLY_HOME_1: =%%20! - -rem Checks if the command contains spaces to know if it should be wrapped in quotes or not -set NON_SPACED_CMD=%_JAVACMD: =% -if "%_JAVACMD%"=="%NON_SPACED_CMD%" %_JAVACMD% %DEBUG_OPTS% %MEM_OPTS% %ACTIVATOR_OPTS% %SBT_OPTS% %_JAVA_OPTS% "-Dactivator.home=%JAVA_FRIENDLY_HOME%" -jar "%ACTIVATOR_HOME%\libexec\%ACTIVATOR_LAUNCH_JAR%" %CMDS% -if NOT "%_JAVACMD%"=="%NON_SPACED_CMD%" "%_JAVACMD%" %DEBUG_OPTS% %MEM_OPTS% %ACTIVATOR_OPTS% %SBT_OPTS% %_JAVA_OPTS% "-Dactivator.home=%JAVA_FRIENDLY_HOME%" -jar "%ACTIVATOR_HOME%\libexec\%ACTIVATOR_LAUNCH_JAR%" %CMDS% - -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end - -@endlocal - -exit /B %ERROR_CODE% diff --git a/play-framework/routing-in-play/build.sbt b/play-framework/routing-in-play/build.sbt index 083d071676..4fb0126eaa 100644 --- a/play-framework/routing-in-play/build.sbt +++ b/play-framework/routing-in-play/build.sbt @@ -1,13 +1,10 @@ -name := """webapp""" +name := """play-routing""" +organization := "com.baeldung" version := "1.0-SNAPSHOT" lazy val root = (project in file(".")).enablePlugins(PlayJava) -scalaVersion := "2.11.7" +scalaVersion := "2.13.0" -libraryDependencies ++= Seq( - javaJdbc, - cache, - javaWs -) +libraryDependencies += guice diff --git a/play-framework/routing-in-play/conf/application.conf b/play-framework/routing-in-play/conf/application.conf index 489d3f9b3e..85c184dcb1 100644 --- a/play-framework/routing-in-play/conf/application.conf +++ b/play-framework/routing-in-play/conf/application.conf @@ -1,353 +1,2 @@ # This is the main configuration file for the application. # https://www.playframework.com/documentation/latest/ConfigFile -# ~~~~~ -# Play uses HOCON as its configuration file format. HOCON has a number -# of advantages over other config formats, but there are two things that -# can be used when modifying settings. -# -# You can include other configuration files in this main application.conf file: -#include "extra-config.conf" -# -# You can declare variables and substitute for them: -#mykey = ${some.value} -# -# And if an environment variable exists when there is no other subsitution, then -# HOCON will fall back to substituting environment variable: -#mykey = ${JAVA_HOME} - -## Akka -# https://www.playframework.com/documentation/latest/ScalaAkka#Configuration -# https://www.playframework.com/documentation/latest/JavaAkka#Configuration -# ~~~~~ -# Play uses Akka internally and exposes Akka Streams and actors in Websockets and -# other streaming HTTP responses. -akka { - # "akka.log-config-on-start" is extraordinarly useful because it log the complete - # configuration at INFO level, including defaults and overrides, so it s worth - # putting at the very top. - # - # Put the following in your conf/logback.xml file: - # - # - # - # And then uncomment this line to debug the configuration. - # - #log-config-on-start = true -} - -## Secret key -# http://www.playframework.com/documentation/latest/ApplicationSecret -# ~~~~~ -# The secret key is used to sign Play's session cookie. -# This must be changed for production, but we don't recommend you change it in this file. -play.crypto.secret = "changeme" - -## Modules -# https://www.playframework.com/documentation/latest/Modules -# ~~~~~ -# Control which modules are loaded when Play starts. Note that modules are -# the replacement for "GlobalSettings", which are deprecated in 2.5.x. -# Please see https://www.playframework.com/documentation/latest/GlobalSettings -# for more information. -# -# You can also extend Play functionality by using one of the publically available -# Play modules: https://playframework.com/documentation/latest/ModuleDirectory -play.modules { - # By default, Play will load any class called Module that is defined - # in the root package (the "app" directory), or you can define them - # explicitly below. - # If there are any built-in modules that you want to disable, you can list them here. - #enabled += my.application.Module - - # If there are any built-in modules that you want to disable, you can list them here. - #disabled += "" -} - -## IDE -# https://www.playframework.com/documentation/latest/IDE -# ~~~~~ -# Depending on your IDE, you can add a hyperlink for errors that will jump you -# directly to the code location in the IDE in dev mode. The following line makes -# use of the IntelliJ IDEA REST interface: -#play.editor="http://localhost:63342/api/file/?file=%s&line=%s" - -## Internationalisation -# https://www.playframework.com/documentation/latest/JavaI18N -# https://www.playframework.com/documentation/latest/ScalaI18N -# ~~~~~ -# Play comes with its own i18n settings, which allow the user's preferred language -# to map through to internal messages, or allow the language to be stored in a cookie. -play.i18n { - # The application languages - langs = [ "en" ] - - # Whether the language cookie should be secure or not - #langCookieSecure = true - - # Whether the HTTP only attribute of the cookie should be set to true - #langCookieHttpOnly = true -} - -## Play HTTP settings -# ~~~~~ -play.http { - ## Router - # https://www.playframework.com/documentation/latest/JavaRouting - # https://www.playframework.com/documentation/latest/ScalaRouting - # ~~~~~ - # Define the Router object to use for this application. - # This router will be looked up first when the application is starting up, - # so make sure this is the entry point. - # Furthermore, it's assumed your route file is named properly. - # So for an application router like `my.application.Router`, - # you may need to define a router file `conf/my.application.routes`. - # Default to Routes in the root package (aka "apps" folder) (and conf/routes) - #router = my.application.Router - - ## Action Creator - # https://www.playframework.com/documentation/latest/JavaActionCreator - # ~~~~~ - #actionCreator = null - - ## ErrorHandler - # https://www.playframework.com/documentation/latest/JavaRouting - # https://www.playframework.com/documentation/latest/ScalaRouting - # ~~~~~ - # If null, will attempt to load a class called ErrorHandler in the root package, - #errorHandler = null - - ## Filters - # https://www.playframework.com/documentation/latest/ScalaHttpFilters - # https://www.playframework.com/documentation/latest/JavaHttpFilters - # ~~~~~ - # Filters run code on every request. They can be used to perform - # common logic for all your actions, e.g. adding common headers. - # Defaults to "Filters" in the root package (aka "apps" folder) - # Alternatively you can explicitly register a class here. - #filters = my.application.Filters - - ## Session & Flash - # https://www.playframework.com/documentation/latest/JavaSessionFlash - # https://www.playframework.com/documentation/latest/ScalaSessionFlash - # ~~~~~ - session { - # Sets the cookie to be sent only over HTTPS. - #secure = true - - # Sets the cookie to be accessed only by the server. - #httpOnly = true - - # Sets the max-age field of the cookie to 5 minutes. - # NOTE: this only sets when the browser will discard the cookie. Play will consider any - # cookie value with a valid signature to be a valid session forever. To implement a server side session timeout, - # you need to put a timestamp in the session and check it at regular intervals to possibly expire it. - #maxAge = 300 - - # Sets the domain on the session cookie. - #domain = "example.com" - } - - flash { - # Sets the cookie to be sent only over HTTPS. - #secure = true - - # Sets the cookie to be accessed only by the server. - #httpOnly = true - } -} - -## Netty Provider -# https://www.playframework.com/documentation/latest/SettingsNetty -# ~~~~~ -play.server.netty { - # Whether the Netty wire should be logged - #log.wire = true - - # If you run Play on Linux, you can use Netty's native socket transport - # for higher performance with less garbage. - #transport = "native" -} - -## WS (HTTP Client) -# https://www.playframework.com/documentation/latest/ScalaWS#Configuring-WS -# ~~~~~ -# The HTTP client primarily used for REST APIs. The default client can be -# configured directly, but you can also create different client instances -# with customized settings. You must enable this by adding to build.sbt: -# -# libraryDependencies += ws // or javaWs if using java -# -play.ws { - # Sets HTTP requests not to follow 302 requests - #followRedirects = false - - # Sets the maximum number of open HTTP connections for the client. - #ahc.maxConnectionsTotal = 50 - - ## WS SSL - # https://www.playframework.com/documentation/latest/WsSSL - # ~~~~~ - ssl { - # Configuring HTTPS with Play WS does not require programming. You can - # set up both trustManager and keyManager for mutual authentication, and - # turn on JSSE debugging in development with a reload. - #debug.handshake = true - #trustManager = { - # stores = [ - # { type = "JKS", path = "exampletrust.jks" } - # ] - #} - } -} - -## Cache -# https://www.playframework.com/documentation/latest/JavaCache -# https://www.playframework.com/documentation/latest/ScalaCache -# ~~~~~ -# Play comes with an integrated cache API that can reduce the operational -# overhead of repeated requests. You must enable this by adding to build.sbt: -# -# libraryDependencies += cache -# -play.cache { - # If you want to bind several caches, you can bind the individually - #bindCaches = ["db-cache", "user-cache", "session-cache"] -} - -## Filters -# https://www.playframework.com/documentation/latest/Filters -# ~~~~~ -# There are a number of built-in filters that can be enabled and configured -# to give Play greater security. You must enable this by adding to build.sbt: -# -# libraryDependencies += filters -# -play.filters { - ## CORS filter configuration - # https://www.playframework.com/documentation/latest/CorsFilter - # ~~~~~ - # CORS is a protocol that allows web applications to make requests from the browser - # across different domains. - # NOTE: You MUST apply the CORS configuration before the CSRF filter, as CSRF has - # dependencies on CORS settings. - cors { - # Filter paths by a whitelist of path prefixes - #pathPrefixes = ["/some/path", ...] - - # The allowed origins. If null, all origins are allowed. - #allowedOrigins = ["http://www.example.com"] - - # The allowed HTTP methods. If null, all methods are allowed - #allowedHttpMethods = ["GET", "POST"] - } - - ## CSRF Filter - # https://www.playframework.com/documentation/latest/ScalaCsrf#Applying-a-global-CSRF-filter - # https://www.playframework.com/documentation/latest/JavaCsrf#Applying-a-global-CSRF-filter - # ~~~~~ - # Play supports multiple methods for verifying that a request is not a CSRF request. - # The primary mechanism is a CSRF token. This token gets placed either in the query string - # or body of every form submitted, and also gets placed in the users session. - # Play then verifies that both tokens are present and match. - csrf { - # Sets the cookie to be sent only over HTTPS - #cookie.secure = true - - # Defaults to CSRFErrorHandler in the root package. - #errorHandler = MyCSRFErrorHandler - } - - ## Security headers filter configuration - # https://www.playframework.com/documentation/latest/SecurityHeaders - # ~~~~~ - # Defines security headers that prevent XSS attacks. - # If enabled, then all options are set to the below configuration by default: - headers { - # The X-Frame-Options header. If null, the header is not set. - #frameOptions = "DENY" - - # The X-XSS-Protection header. If null, the header is not set. - #xssProtection = "1; mode=block" - - # The X-Content-Type-Options header. If null, the header is not set. - #contentTypeOptions = "nosniff" - - # The X-Permitted-Cross-Domain-Policies header. If null, the header is not set. - #permittedCrossDomainPolicies = "master-only" - - # The Content-Security-Policy header. If null, the header is not set. - #contentSecurityPolicy = "default-src 'self'" - } - - ## Allowed hosts filter configuration - # https://www.playframework.com/documentation/latest/AllowedHostsFilter - # ~~~~~ - # Play provides a filter that lets you configure which hosts can access your application. - # This is useful to prevent cache poisoning attacks. - hosts { - # Allow requests to example.com, its subdomains, and localhost:9000. - #allowed = [".example.com", "localhost:9000"] - } -} - -## Evolutions -# https://www.playframework.com/documentation/latest/Evolutions -# ~~~~~ -# Evolutions allows database scripts to be automatically run on startup in dev mode -# for database migrations. You must enable this by adding to build.sbt: -# -# libraryDependencies += evolutions -# -play.evolutions { - # You can disable evolutions for a specific datasource if necessary - #db.default.enabled = false -} - -## Database Connection Pool -# https://www.playframework.com/documentation/latest/SettingsJDBC -# ~~~~~ -# Play doesn't require a JDBC database to run, but you can easily enable one. -# -# libraryDependencies += jdbc -# -play.db { - # The combination of these two settings results in "db.default" as the - # default JDBC pool: - #config = "db" - #default = "default" - - # Play uses HikariCP as the default connection pool. You can override - # settings by changing the prototype: - prototype { - # Sets a fixed JDBC connection pool size of 50 - #hikaricp.minimumIdle = 50 - #hikaricp.maximumPoolSize = 50 - } -} - -## JDBC Datasource -# https://www.playframework.com/documentation/latest/JavaDatabase -# https://www.playframework.com/documentation/latest/ScalaDatabase -# ~~~~~ -# Once JDBC datasource is set up, you can work with several different -# database options: -# -# Slick (Scala preferred option): https://www.playframework.com/documentation/latest/PlaySlick -# JPA (Java preferred option): https://playframework.com/documentation/latest/JavaJPA -# EBean: https://playframework.com/documentation/latest/JavaEbean -# Anorm: https://www.playframework.com/documentation/latest/ScalaAnorm -# -db { - # You can declare as many datasources as you want. - # By convention, the default datasource is named `default` - - # https://www.playframework.com/documentation/latest/Developing-with-the-H2-Database - #default.driver = org.h2.Driver - #default.url = "jdbc:h2:mem:play" - #default.username = sa - #default.password = "" - - # You can turn on SQL logging for any datasource - # https://www.playframework.com/documentation/latest/Highlights25#Logging-SQL-statements - #default.logSql=true -} diff --git a/play-framework/routing-in-play/conf/logback.xml b/play-framework/routing-in-play/conf/logback.xml index 86ec12c0af..e8c982543f 100644 --- a/play-framework/routing-in-play/conf/logback.xml +++ b/play-framework/routing-in-play/conf/logback.xml @@ -27,12 +27,6 @@ - - - - - - diff --git a/play-framework/routing-in-play/conf/routes b/play-framework/routing-in-play/conf/routes index f72d8a1a14..43dc4c8733 100644 --- a/play-framework/routing-in-play/conf/routes +++ b/play-framework/routing-in-play/conf/routes @@ -1,7 +1,15 @@ -GET / controllers.HomeController.index(author="Baeldung",id:Int?=1) -GET /:author controllers.HomeController.index(author,id:Int?=1) -GET /greet/:name/:age controllers.HomeController.greet(name,age:Integer) -GET /square/$num<[0-9]+> controllers.HomeController.squareMe(num:Long) +# Routes +# This file defines all application routes (Higher priority routes first) +# ~~~~ + +# An example controller showing a sample home page +GET / controllers.HomeController.index +GET /writer controllers.HomeController.writer(author = "Baeldung", id: Int ?= 1) +GET /writer/:author controllers.HomeController.writer(author: String, id: Int ?= 1) +GET /baeldung/:id controllers.HomeController.viewUser(id: String) +GET /greet/:name/:age controllers.HomeController.greet(name: String, age: Integer) +GET /square/$num<[0-9]+> controllers.HomeController.squareMe(num: Long) +GET /*data controllers.HomeController.introduceMe(data) + # Map static resources from the /public folder to the /assets URL path -GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) -GET /*data controllers.HomeController.introduceMe(data) +GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) diff --git a/play-framework/routing-in-play/libexec/activator-launch-1.3.10.jar b/play-framework/routing-in-play/libexec/activator-launch-1.3.10.jar deleted file mode 100644 index 69050e7decce1da12207fe83f49afb1d26308acb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1206790 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෼r~5(jyj8wH+RW- zu^VSz%OlZ|+A|i3-nW2+Cz%h4H&N0R02LHT@3!!Wyw&x&EJ<{MT-VvJLE^K@AQ?7~ ziea|oG+3QHioFZA@S3cMdlOsWgoOeMtdq?OMK@?$pYUrR!aaC(Ty2$(bib#=#SoZpFZ3DX4An zFc6lV6&>r9h-=Wp!7TB!f|)h#T#`!JXw;H?V!;d>%X~OF5-hOmtCUQVygdTa#)%K& zk#3|mBL09>)%`dby}N_t`O{7&E#%TBXy)O*6K9wb^hCl zpObhKoofda&4KONjQ2-LOhfrMY^i0%P0`?!$RSp~j~g0)k{a$EGdNgjK#Rp3Hle4= zNl%@pid8K%r!mDDq7U+g8CKOxmaOd0(X9X(_JXa)$Gy*pOtozN{ZGLZ#KKlfMO($S;dr!s*X~?<_)Fpba?m zr6x@6-Ooi;}!{G;M#fI*y*vTy?ZYZ<%eT$-{+|{kswU#E_t4G zoH0=Ba!3$!DB#+482yG6Wi4A^Jj^Y zai^Fje z8pbgd-4sB@oWeWg&c1I8IrDUlfRJTg=uA0|y+i4t7>bqTq_wrfxjf)hBf zQI0)kX-08$L?(%RLi`5wR~nUww6iv*AFuJi0yUylW^OZKMQVKw_hw0+G#*?~xTljn)SzQb)U^nddl(wi;HzE#)*R56ytvv!d+14iNnUXMDW?e?} zjx!907hUe+;+qN#)9Z+zI1*Vd>!Lx!vs(Ic<}zw!P8bU5EC!?8D36b?z=*PO^>arK z;bWqL%-okIj^JHF-$Z8cuRwv%H@jo-#?Y-_n5cX+c>*Y_sIwQjAFSwTp)C(b-975* zY9Zy+5{Jbzyc2XB$ukq>nS{<0q&yd-aDQXB$_%+0^Tncxxnj?vT*?ZZ93Pz=M`7R+ z*Rz=IaaNN1yzw(-yRY{>cfXq9BDh)}8s(~224k-M32K&8M@Q*;{3 zup?!KT$6o7rOMQ(RK95G{-fM5OY%`<(O!;x&hiGz*u+}8GU90+q|A)OoGz{}C&Wx3 zCwD|^-2S7}vRHM&l0DiuFMoAEK2#-R1J;~+*e@JMSjr<&@2wOl=HDcCEM8)}HrY~VcP+qv?Qm{n5!Ft`qq~u9CzsKUNKOh2vDGKU9sxBaDkCs>2~soYKzlk zR@;e@s_vWzi03lbYQ(n-7t~CKS{lb_5Y+T3Z0L+4cUkp@MlMwpI|HLjifodMVv{r= z9~NEJrnb?hcL?m(^mQSzeYZco1}CVaL2A~XxI9O44i>XcE<+E8v-)}-x=wORSi{*g zFU!|blFks#YD!u)*o2=A$QGrY$F*6v3ER163f=GC12-#Fo;v+dIM@`S=mo zyx)6zwUyOJ)6~vg%Sm_YDV}@aDkrBYrT;hwEbHfu3b|_e2C)Wzf_v3G74Y17L zq2bWqz6lZkw?^y#C|duK&Hk%sRhs=<%zb?>qzDKa1yLBW-Atpd-cPtRiVnIP#f?9G zhk+sznN->$lm14vfXS(eDQ4OyX>Sw3+YCA_w4=jx`sZT~SL4^T$}9XgOSk-9r7I}` z<-Ux7LudEC#g*Xe@$>mtmR6@4Pw{O+fAKU zh<>KA%GZs{T5Ru=A!fF^xe8e8{tt)?6L`KVV-IL=c+VsZMK%ag!PM@3w zBuE40Fn-&WIJ38WaHyykmLPx-inR^{2Jiw> zWHy=lDi@>Tk=7O@lMJq$r8eXXSENy3@e`u@4fSN`n>Nx|Q_0oS-=i#g;-G5yU!`o| ze=TLX|Fe|+r<47=ly!47a3VIawRIwv`qy6$#@4nj|7Pm2PWY!#iZgEu3$3)ErUtKq zne-{KUou{sAA($YX%k1$?hK4Z$NKitHI^r?{0CHzAC;Jw5)Ojt2O|0)dpLp|e&e;qmZ(YiC7 z4{4tgC30b*qm#n#(07I*H!++EfZNUQ39qX&iNE}>ekdHY3sgJ`dGXx~lVh9+BWHLg zlXP#u4##w(eNd>EfbI#0<`eF+a~Fo(D3kUl>0I}-1DZc)@03bee_~T&wh^LzNFIY1 zGA*lyJ9SvhL^|gY7A%g;|MX4=B?N3qVQC^?e~%RWIa$XFl}J6;C)Y09r9{@h+@ZdI zh+;7yN;qM3nYPn+x-ef;n&eXY*lLYfe#9Pm#%+8^@hVFhFUXSM0)eZMKzS~f-tEy1 z*(4`o4b)mEHbyDTMNbaHtZ{x>c6Pb>8YStZJr?c@bo=69TQ6Z7@8!~+p6LAoH+_IG^hO3t!fV25kk`?enW-1_*6Q?EkMyGR zPVf7nz9i*-3*`|i{9dwXE{!oZsSGLzOfx<>OQ#RLu z{#81`7Ym&}uLdWHD47G@e7^lNtO&oj{4On*IoK~c$Tfn_2}y^Uy-w*HWMxP*h$#ZzL6^`jFFcc zNH&9vh)!zfA_E|<&tj2UrEOCDpS?`Lw{m|^(|rSakh01=%3NWnw-gW@{{d10i=6@s zfeq?yi!pUfbdOAF@*&M^TF*^l<~E=iAb9y{MPrj?-}f~=bIaIe3Yr}U&vIeaO5+x7e=DQfiz+KZK`b z{AG0XiJq{(j2`os(IXK1w#)xv^wa4YN#QRki=C-7Cy=NaB?AOwza{6Hfs(QH3aqlS z@)gdHkO#PTsU=4UVc-5-^bVop^o@p=1%$lYw~~L z_z8cD1&w?rF88*JAp!M?@@wfOmTB%(7?&&AL+>L*fS_Bt;P&@3HeO7X4BGCJT~#Ra zlEbH%_Qa!)PwnM3gdUfF$UfG3n!Frd+J0>?7Eabr+24*W5j3@Ehl&o{{r zbB8h3YL)BDiZS z^emo)K1tw&NPzoJxa#hy1pbSVy{K-)KFne%sNhuGkcP0mqX6i!<@7KGk0GjadZka% zdBtpwbpUKOfEzJ#TgYSQsvpLQu&V~|&H(v~(C(#;tClWNPH1OcT;G!r&&Zw_s)5r! zQ7ZjP%VYX|ftZlKBOO`<#UcS-IO*3G!@yeR0$WaP^L5FiD^7kB=Ts6?-0*Rp;GSH* zIr(fwY_oxq|H!FO<0Inmw>%M;veT9!4QcZq2 z$JBp43jb4A>_1}i-$-zRw(UGUN{H?w6>}RlcJ4ZP-HwYkXG$=PO+=f(UBwIxDKTyK zL?xpFnFTWFCv;K0`1fm&C;70ws_zR;0hy00BbSD+D~BV~wZDP5LoEC1>uh)8g9AAw z+T=wsEm<*Y)|ss_)L9%RN86*JRoF9Dm>Y&>`@u!AUD;jgCujR;Vt6(VjtoNcH!-uu z9_ONq@O}z@DuJ2X)}|S(sGDVhGbUWniw~$JmM^9ozof%SUD#cloV(|WcEc<3Ilr^Z zYznYT>y8CQ$@*XivPUS{I1gO2OBUmoZ?uAVO%#r3v*$=IL24u|h2;Kv$ z@=h~o7Qs`bTy6i|0PL-m9iRR3j@JL$8~@KmqyOO@|L@R+zMY+w`@h`9`!C+azXXAb zwL7$ns>}2cm1^2Hu~HUA!@?OJ%!L!Nknt~R(H-=Eu3KGV?W+m^6Ic|)l72BKI%yX6 z?T$+wOpK(bXW{el`GQ@6YQt2bwFR@l#8S7RaiVo%RhTX5?YxXOSk zd{Jit+iXCx}0U%cxSg4`~%_Bd5t)UNhaR;}!RwPVbUV?(@KT zTK*O89{!ZTkaTR6K`kw+^u$Qlr6gDL>3Du5mlc|mGlrkDUAM!qi8 zB3A=N_woDU#tXloK04?=$nu0Y<^5Z=%b+?unN(%HEZ-T@pV*kf>$UklW&tltKVO?hZYdb_zEGintKM5%>UkjMs-=L2w48km) zvUm~%3~Fo1#2;)Ko5Mxu16nCuO!x%it`MP7CJ0ivGix*5@nGWY&+mcUo^P!6HoXjT zEOi!olf9iabGQEC{yZ6S|nj2O-IVGOWfk;Fu-666+XE%kox*pg3rhM35#D)i=s z0TdyfisjljXs*Q$kH+6yFi0t!H}4FV6)9a@q2PqFn8PR@7=CMjwoN5Z_O8%ALWYSu--Mfox_O= za8Yg9x^wTv6tQGP;Y-lX3G;EF``$O`doH9zD!b?TKCXXmncl}KC%zBE!!DS@h9!`B z<_r|*PD!*gLRp}s)3WAWs6ff%+&kdddZC>V2MzK^mjOlRr|eu$R&f5^f%P3GPjoD- zhqZ`qu)YKz^Eo5^HKOp?go2Wodhb`@1iH4G>lH+$=jb(>(tF2F*x$nqxMG~plG3<9 zEJ<7NiKfj@--`X9!$7NMQY29>739q+0%+I= zhGtutVG$t3$GxI8gcp)QcE1BzZ)JnSNVLr-@)~e=!h_4 zz7G(M6O9(`waYJAQ8K2ywK@@PK1iwlp4}H7-z4@7=ntKS z^}S5e(w<`6wT##?M_KXK+17-MkFq!_xsY*$G{wrq+*CT_f$OVMULq$g<%+UOr*@yF zXTL*1nO0(JO!--3>(jPk@qzI*|yxi(|H3spzj(OX+c3D=uCd>SAY|#Yj)}sY+D$ggwE73NGZTy0? zVKbg>5MUqwWT$*+0`IW#SA+^PI-fzg$(cXc8oy@bnVc?(G=w$n&lFL2PYr{%aPo=p z*oC~3w%A4O!lvljUb0WX?NaMfO>mgAfF=-&(Z%#~4mf4I!KC6ve_WAqx`P^$nHhVz z5r!l0V&qxR)G}R{mJ4X8YtG&w8XQlzIc-z*@}fN8a`cb*%w_-nD+~e)9hF+XLZIir zB0&FZ7<^Tc=BCaL`v1pHuIj5UjwYkV*M~KQs3OUEF z<6^$$%peZhqrFp$I0Z436#~Pb7+o@;k*Q}b%ZC%7p*tz*tBJBGTFi_W#15&W;hSDV zp&dHiJk-T#3_3eJi-R=QsjX0#s1>Odsqe#j!RDG?<3!eCxglbL{O(l**Xd6MXpNx5 zc1F=*Kd}x2ydY9xy;6rB>20=ArLf#kIY8L1P(f<<+(B%6_3e{~SkS~l*sj4qZ1>bb zB-_lk*+#LRXpq2tAXEk2Z)bgAohL;hYBU;EsLhK@42W!&#HH^o%1E7Q^+~E%?1r7^ zC=||Dm7-VFM
    )%L_Q{XjDL3A3fvpbkb}w7D#Q9#ij#Dzz~&CAzNiTlN0>Imj5! zl8WtWxOd!y&6WO(I6LT1$ChSLHX(yS$1{KcR#@!wtdngMN8ny~hTp?tOcSg6H6SU~ zP5M1}{8IMkLsE7!K046Ao~rqlLXYTB%>No8`hBCmY$7I$GJg zM9|002fL^j2%Q}%yV_8xE1FIN>p!hL2&Y#s4khT6D?BQ#xhz{BRsr7f>lBrZ-Vi4; z>fX}7RLLwMh{g!z?lwbVJ94?bX z_n6f=iLzY+75?if($eE5~}QJbVXyUq9jPW;wMub><~*j6<=p zLU#6Zr<04@oibZidjI7B$z|AZ(Q5tUmzudPYB}oB=@_(pUJu>@GET@dm#Z6@dg$3*ry87pc9cD`eR=0G@k_>gzbMjLKUCY&B zqdSzSlZ|V>uSsibyG-v3?mecScvi(+Ky-MJy7#-dEKPZs=bc$8%V%@t){{*o*XT|- zB*V>@I?Hlh+=UG7gb($=6zaw}23SmGf(9@^+kXF&lEOh$-0Gyw8O@ zU+vhHmR5<_x-BQA1g&|=us#<@Ra(nB$|ExTns?zZC9+PMwshi;xha>4aY9KV!Ug>! z2EoHIcPtm<)KplXB9q%Q`~^d0Y{AWx&0<)&qeIxt28Ni5g%r(wKY`Vfm%~#=-jIw<$2~ z2^kG5G!8!U0nN}JHr9fQqwd!h&C|Lh$FS5M@w#G`&a6SfS6k3yfm7Iueq;?lwlpi| z$1hf=iG=UxOSIA7bor!wRSVc&Wf2-#lAAPHU*7|o8iY2u&U>`;<=*FU8Vr7%Sw%hw zm1i;opNON_73n0b86mPP!(<{Vu~A7A@peNUVVAdRiw4x@B`5aDA6(gMseEZkm|>ZP z*y;`E?mz}tL=EfY5QK(ow$$WB!p^VsqnTS#HMNIm=!ic;^H$i^#p1jH(7hp|eKN)h zGbqLRhRrDIHK-}V`1*omI|UdHDfm|1kiDAwJAOFnCP@N^99@*Y0ybmkaCHTr)%I|4 zbOh!pFWwugFx3qkNR45~Gg5gPW)+Qv9o+L;waO6Xr@tfJpJe;1pWg937#^Rn)Lihc4F}%IjcTG z0BU?84te503HlBa=DddX1KXqB5~J+76(UU9FQ_Ve%-3Da4TeB{NN$mn2dw2zDiUSJ ztjtg+JD?Q(#*8`5j64i=r4zJ&0-7nZUNpC-rxUBlv&b^Z(3ugOy%o*W|u7nDbOEl)b3Bd-KtRDm`u4AFt}E zDKY@syRpSC8mgL#5wx$BCMo=k3D$g(qmpQlIS?lAMe7}9awZ*pL z$g<}+aPPTI#qX)@xb@YK)eqPA)nf{i4U+`XQxZhA`9T3eK_Ny#r6I&6&4eIA;V2?; z(o@K932+ZLMWu@UatrokT#7frP?=kc_o=8%sqA)?8T09T zlzL|$p`X#S+T@UHjT9}}QRLhb<0`4W=w4pZ8X*{Vz$F}zcmWZtby#(nZ5%X zJL=7rZY?wC9QPDkRtwULET)0|%|k!qb`fj6usK(y4V?C7L=9sG!E|Abdqos{9YIsn zfx|w+2)49ZTlOMw#E4&5gq|!x4+oV;6$Na$lS(tW)p?g*lH2{VlwtY^_G>u(NIMA0 zz=}!Ia=hYjq~X%L1je3yA9I9KV+%R$ubRp5!8i7-R zWw8=>B{!hRJy#cr3k&W93kxO9Ju}l!D!6KPCu%?_#l{?~J$-CkQ%}RKpCb~E4Zc5y z9nA*7HO%3h&S)j}bsc*YqGy(^jyELh8ZL;`A5SC2FZHLH@8}9fTuQYo6TJ?`Zu=z} z(l7rsr9bl;u!}CLZ+8JVuO@b|B~3V>@f$WPaiKNqNlFc`o(hHqb3q_&xP^$#NKOdF z9sd|)>Qo!t+Ql23H{&Vv+Kw6o`O_IkWRF_z=Etk|*FYPh{Nd-C-0+zPU~vM6y`GBu zQIS=f#&Os@uC3b;Ph*c5&4p31_+8(Mqy#l2{HM{Shc>8DsX%r}+^y|Lp<-z`^7QO% z@u>p8u6Qk_YzQrbYRxDN;WTms_#k=08H?ufHd!s_c`Z3EIYe;owym=;o!0JyYt@gZX;|p$3edzQC|MA7@!0| z*uaCVp+H2C;>PaQpbh(C4SnM4IQteC%w!yytWZA%H@>gRXL9n)v3AXIb~_WJ7uxr1M?0zvYX+l3c@6GZY=+r>|L5+(i!8^lk3GDPAdxE>+- z2pY^ydQwF4)!3aDds7eRBfCyS^3~ZbMEWcn)Qx+h2p1*BOMXfl9I2KY1FxcwOxDPc zNLJUUZB*CCqiXHaIa9^Ls z0U2VHm8m%VbMaRl=vG2s-w(zqhxDjMYJxObJ8%J(K6TJZ#)X03MrMA#1a%^qSgYxv znMP{RzRCKSn$mS4dgy(40lb)d24reda)NbPdZ>M?pr=rrP%VgOByE1%gaLw}qL3nx zTcTG!0pmtyCJBIX%tU>#H^q?T2|_`bOo9PQH_?#ADt>UX@kD*t@l<`9H_?zr3WU?` zCct6uI%C#2f5?5*c%47$*o?%?u!Zr;s8N73C0A&wFoYC&7csFw8U2kS{jfY<<4v!O8Tk|WT-A*d&hOZ z>$o5`bqqR-nS0=N%{oe#|4>% zJn?;$XjHXLssbLFBiqev=r5c^tH1ey%8Cj zFOsvCfKGCS2HLf*14U;%hN?4Wv*gOdrLrHpY`pl)IhfASm9jIutL(}Ijp!+@KXv}Q zs@#CY14VFaT_tLFgm&T8;u%9Q*J@k;a-A%>7ma6*p3=@?T#w`GB($!q2{xn#)EXqK z!YSz#N_TMQnI69UlT7>RE(!GSp<$Hn%z~EC&FU)~H2EhTtZ^Nz$Vi;C!lm~!l3?9Y zpZu#xvw%y2Qkw_N;Kw>_RNe_4xhF(8XgqBA<^o*-%RHwA|)od<#7o>=dcZAWNd zz7Fx7)cDl#U$>}dhtNF<;7%m3js3Cpwp4GF5Aead($&j#xfE|8XF$QfdwI*Ruvfax7d2U*aum7uWA4`2&75B97P?~Iw0U0)TLGM8H$RBZ9qq7~6k$eN!*-oZULu~tu? zK4J~SD4@8&KNt*Zf_(7We#+5r2_%P4(Yn^@Mt;febwwXO1M}GEdiFYE3^7@xoFTTw z3aC#eydPJpq{kJDXpTDjay9qyk7C1tipuHeCY}%&kNNxe`RU$-EVoNPQC z8avZbK;t0-%bWys{bCkIGF7wA$XQ%?Hj;E~iv6LGNGp{wnX-e(^G1N!#iXcw?OVlZ z$;hFpnJ90D6kc^dd*yUY>)JD#LG52c+tJ8kBI61J7hNDuu2_p(jfJAV#BhU!`Di|4=B(;CeP<)t`A5@y&%L*#WBxX}8%0-Ulg_UDwuNeV_#% zYpk0{9Cc3VF5?3an2Ec&giansGA89$7CyW>Zg#Jp(Rt~c`A#SuKBi)?+ zul0v%R+dUhHpx>8>weGq#nPIQUptu#Tje`>P5RZUY=X-&Ov~w9<>^XRNu;Lg^O#%~ z4K^t09e*s4jpw^2_7SYu>RC7*oTRE#tbM1t3g#7ca|OLUl+YCE`IcpQnC6kKou#J& z8OoJNE1Npv4IzTxaFCxn*i|kNv0c&N(^0v9BISP4o|UXv&#WtdR<~+FnY#>5OHX|q z!xDMwm~xF62ibP0%YF)03#4LCXmx9n#aPKOO3dTQ)0UKGaWdI2@v&R4H=1}PG0F~8hc*YZC}zo$GryK9tmQUm6m{xkm^y2g zJf6K^R&X`X#Kl^;2ujCH&Yqo)ol%2(4*IVp8F9qIhYRkk9cz-^C8QWBqd6uT8n+*x z9H(6{wQjP|tZzsf++d#YPj;Ipq0a{{HAUDvOTWPI54)38M(7Hnom-(Z{LXcU8@&$s z$&29>YlU3|Z!c*v*ZJp(Jx+HX9a4o!PZ9&Asu-inFm4&^Xc0qgt&`wpbDV#*eGC8Q zVm9EVR9=|Q3)X-cAhFivQ|)M$Ckk^x2m(HI%#@RSFBvx(RW~#&G*oqzq+$fgc^xG% zO+o=^D3nIIX%TmUtEH3!v9>3%KPlA!Tw$c8W%C^S9DwEuULm|%i?@WSjEl9v zeMj)K6>D{+GMK?kr~_CV1~(#;)m9Ff;lc?XfiKujvo6hPSJ4boiV?jK zPdfxfsM)QJs_HY%&Bi1F0$v-tQ06QPF*$#XPBNJL2#nou$)5SZMd=E43sHui+U8c&A5M2 z_!k~aqu8AB%HY&bg}ZBdl8M^R#u%gz-w)b_X<{klerM`NA{2e~x}ax-@EmC;ernlv z`cQ4rS5xn-X;(-WG#hvCNh~Jkx>}6BJoj{NgtGrJn9FyylXq~jn242rFm&JS_NAEn zF53A-?JkH70Y1Qfo4z%}I??joL+nr3BKFC{izkTak0M^~1`hslT2JI;;P7Dha*^lI zjW&F}(IJ-ZUGGWhah7U$kR+}5S>Ec0JIL&TTv z6gt(sTIN{L4_ezyL1_3Pu@Pl)?r@4-^>A%nA5RJquk2v*a;)3DSsr79IC$S{Pyjd= zsLvUP=p2d&kS=h~UKlz2bv^mEkmJ$hvalixCliCPI(!W?mk%r$==-{SJ3v@ z;kK6;>w04nD{%=x_-F<9;^p1n&5}x&`03f1F`gBM&MhwCZUMHZ22bfoRX|z(;bQufSXF$XN^}2m;wXtlgJo1F2AO*fWRY5>^sGz z*!S%G-%x2hz|lh!B1OpYT7ETP%zB~&sGG<0|ug_%;ap%Y^ zXeB(TI#auqgz{34AA|}NhFXdCMI9^z>WzIHWS}?xR{d-JA`2(?s?IMR7nk97p3h(J zrX=#rr4>JPEvc)V!*l-TOq!~Jty(Hw#zFCST<#KysHNi6(m_@=dr@OUD{1zT8K9Yi zC9zd~Zfb|k{Zx3;vB6S?$oK=FoB4ejkAAH3cXVh`QqlG2a*K3%6k6?%r?td)A|SM; z1=Ru+nUZdzoprsX<&Y#FSM25nZtbR=E#!kgZ(GRLOt(x0+CA_O^)f#;Eo&u8>>TUuV_6(J}-x1Mw9&qV=dlc`~KZ^|m`{Bk@ zQDaO7yJ(RHw7~J?p?%*h-&REn>?+-R;WV!~>xA|iuiuXGTCf#?+g!MPQiB~RNq8mKK55;5 zAU$9L243&?!;i@6fa_K(o59RwvC`e*BZ{0GKbVYE&$B&peRe4M3@h>IzPNHLxZ-r> zJmf@6ki`}SuEcUHG6Ne~a+jXjx^VkkWF!ZYn;u*@!*9;1<8|hO+a*?i*$?sivDD^4 zpM2X)3l;FP=ynAZxp-?AzV#uA)iOp)Bw!sQ>pbEIHSh?jp1h4Hd|si7i)jGy%Qj7W z;cKqUybnV2w1I0T{IkwUIpdb1yoW42Q0Z?StQOlq>XjQiKuVjHN~Un#nF)4bU35QK zp1=R(CU!VCr?N{G?ubtlWO4$RUL|sPBS&3f zQ-*R-hUBkpM-$*`jAB5qz(K)A!h9yuGlPV4R`P%;^lQc=bxqT&VYLx*FFNmQo#Eh~ zly^1P!F76INBJFxi7xKUAbaP7A-(2te@uMmgJ~`}k{HghLC7p_AW2+{oNj7o3tka7 zoUMI&pvJ;0Ge8!tHWRcV;Z|lgm_dHmrn7|rXg346ZcBcqDp}qf1&0y^cx3$A@`{Pj z_S%~L6D&w)y?#_pbg#48QWhHHD_YH~qfDh>a|Kw%korXv$GFy%LbFtJ`5#Ih^Y_IY z`zIa{Vn0RasU^`b{cAUg?C2`{DSMUp4Gt=BD(w?$=az~J<&!M(&h4ta>vGh+E0_(y z`0$P@Ad4wJ>tq5_E1K%4s_3Our2!%8lXpN2!6>E*zle2^U#8B@tpd#gR>0r?U~a>f88iO>fQdS`sp&-MqZ7mWK0 zrwz+*zs)P{{lmv?xF=rH9qb7(J|ny*#QAO1B?wzaz6WLiA1VrG&>2VcVh?`+DU=I> zdb|`;6*$VWfKLQQ8fd006LwM_#_o?K#AlZoT2gj5ED8P?OF!Bzf-;T?9r`l$P;Md% z72;wC>+GC?W34w1jSB-qapABBmZ(pG!u^NS`xaK*(N5@*gSBobNkXo1nR&7j8-M$!GHS?(gTGQosJlpbLT zoQsCSIrTr4>YmY%lAtP}=){_V1)3E~g|gZME~pE%6=(`@70+*M#xyM)IjX0A6tK)a zSd>PYYe{Y{>f17~j}(u|KedVNI#PsJ%ezqkiyGABoRB#zNWuTyAI38rNcI>1J`j(tn*N+24!-TiAgt zZ7vo%D8r)p9holqlWj23eKYKDM&K$L1{D;q?Tf(LzBoQ(dJgYAcFoOZ~bgXyaHu`}Hl?eE&Ywd!v@C*F}OP>V)R0?G_C3o`rVYn?T}69h$O@$a4G(LqB~-)b)zi z_e1*b&-Yq)!@ropOLYw}Tf+v&Rqe6m?G0ZSeho5m+D(JCAn(nBovzT@HEwPXNznT> zeB08ExyD%7~A_evaQhhrU%$^MOxGmFWn86>!S@Y zKKu3_$;7barT5tntS$06Jb2{TBhbk5;y)o-=_MxH!Qci9zs{t6k8ztr9(3KSV44{2 zhmH_iqjEdEO|*NI)KBIHocJl8wWi4a6MKa$Iz|JaGSNra*%wR}77iITn3rs$i?(Pu zQbeR))(s8q1tsc9l$KO7uN+G$c$0t;+O>{BAmIGB-D&78M#P1 zZPqFW9qCe;R&Ft57^)c4XQGOS#`^!T_Li}6Xv@B5Vv3>7%*@Qp%#1O$9Wygy>^3tq zGqW8tGc!}n46&V<#`~Oo-<^5$&Xz`ZKD5+dT59RPs#aC4s$VUt)adM$V0;f%ThC_s zrZv}1ahn~@d=iFO)7y5fZXQz83*AAHuP1TTh>WbK^I{pdv)pin<+K{YQixOOw6M5$ z%dZz>va*+$2`To1L1OlK(duLO#envW8z2_O0291@68i1(KD86l^@&o(w_m{e{tnal zk@v8aAJTSsLv`k?R1lIt5-sr9t`--wuowNiIzysZzWovPjFOrn03g1zN44Pq>&Zm0 z1?`PIp4a-juhad3RNq;0*MU!E{(}10X@Vc2!Tc^aU)hRwK!+G%E49E&QTY8XELAH<=!c?+4CR{w~M@cF&Uyq39p zmm54oU1Xov-S>a>*`_>u>g0YvK=3}M+WvFj-~UDl`B#nq@3+q^Z5Tt`#o0GgpUS4S zr&v_pjB%Mgh+#=N6lh_XSR`wv6@}1*RuUzeaVtr&Y4UDHzp!p ztk3`q*v_lxTzdW!pHDWu?-Q3}ao<*9x>0muTOb;g~yl4eqZ@h2~YEXuIP6OVV5E+`F2m zbWw_Wx(a$JY*~0djd;0AB@KDGN;yq=d16_(tU8;zLq&Ks&7E42t~!lck&1e`+F$|A zVmXU}I!38XRQW>rn20*Fnn_$aokkKlgWA3cl+I3{k@sY9(bEsO@oRWYjr|OUOprnA zjK5vmOrTwREylLPuCw=Yu**|6+}Vu}CdW<%n4tZx^~($-q3_Q=?x#AqqdiIn>wZP{ z)*ErCK%qLQEK7DZr38=+AI&uic#?T(A1cn_zBm*Ox>jBu=#-tV&lsoTK@xtvRLU@{ zM+e@8MM<&>r{f6)oPNF*F9wc}^ja34_8Kz445IR~hOLrJzMn?h8{KzU2p(tsnK4Q} zYpxc`V0K2z1dJeH5hr~h$n+)VLoh6`2)4#p5~YGVCtr$drzrk=vyTrLcpT{0PZaZo z75R>zP&An4OZHG*mAi6$MZkg{ZFil1iWi-o7O;0iBK2Gu!!}TZMcEL;TLNhE2@brC z-MZJ0?cvD}TM9Fku~y5lsD~!1Wse*FXjeMG4DxMENIw7r{;Nec$VRO!5C7fOnArCU z6d>5DtXR@kmqi0nzG>cnXR8~!4gHc3u+%#H*N-T!KWY&3)Y9vao)8bv=jiT9Jtkl^ z$j7KyXst3tbV&2m;x&sW96vO6cmmEKZIN1~cU-_~Fk7{EFakKCH)yUU0ytqhw0G#i z>=sXKoU;||Fx@dXOXr`D>9V#MnMmxvWRco;^?c3}5Xx}*k-)Hc!hqcw;R=0@#smok z@o?tca_ut%;>Z#ZGdsQq@@SUCNSzfdl+6zxgJlUQ;5z?-a5;7knp!#`_#slFI492I zBO@Uw-|q4UpjR+&R;F1p4RdklT&EyOT{_>{C|jZ&=SG-SHvihFT=He4L^Yk`giS(^ zCu%&>7z{DqpoDSsSoPjAD;wjGah{yVC%F0aUOnxGeXV$Y`9vnGi&)k-;o;<-el^W* z{Mb!w%*~|fYBre1Cx?XRRY=QM>~mH&YVwiTOAf>vUBr7Z!}3WD%Qffe^2t@Bc!^)A z>>G8XUl`OoM%Pi9UI}LD*Ah(e7eA`}+hj9Em?06K`6jX~C?A=kDw6`T zV3!Hb#L>#!oGJ-$A3V7_s)3Vto-Ikx;d6R2L10=i^kmtHiW3QZo~!4% zjQFh+DI-XO?WYQ?#C|qkap1wpd)x{=JnJe08!7+cVg_9HXW7FYGlwH|tf{Z;-4JUp z?W%RPZ2_3aJdiLAXwiYu>udINIxh98T5gskB2%eJtF#I{AGo--w8QJgKa)#`2h*JU z>wDk5pTy(C(&Cm@>`AO|F~;~mXYufQMIKN*vJp~F*pD#SEW-a*K+gMWrgWr$o}ul$ zWv1sH(VcJ!PL;QMS{I>OM*)P8YTW*LyNryD5G4A#MNDuzM8ALFS-Kwm)#^m9^cWyMak-$BgS|~p zb2nfS>{{&#NdS=1 zQ>$x7UgSx2&sa8?<5!A?>Ul*CUX0?jxql@?Mlt#o*@#l^cKNLdp#khS)%_S9Pdm%D zR`i9r`%0s2dDu%Y!P(X}_5mPLr*EMeAM^agx`Hw>hbx!tPioIZv&}1q@L5>#p78wT zgfSr`qBEqCLMhtS$>qxAav(qQiC2QMU8AYWE%*zfC&cy1OnXnZ~2?oQQ+CTP&oZn&ISCH6%G z2F#MlIJ}sx`3Hi=gjxH%&=XON7cr-rgjw6FVn~UToH;5ZsTH)fh$gAJrSW7;H$5(- z`9DxGlkS0Tf&Ioz1oAf(Xe}afVk|@v<#}T3N_3+UiNPouRMOT#D49#po!Rp{)7=E9WnvJ6eLmYbML#bl6G1>*8g3GNsZ*xeF&u)iGO9 zOe>xBWgXkI=I{yP-JRmg*sM)z+301_Q00TRa>Q@VB(0mjIK(1$|`gEgAxwfQTvg z)Dv`?N2-Zjx`NCm!v}$}H!P7Vb8=Cx;ePj-V=^f zs4B2as;D)KOh>;&#pXACotez#}8+vIdU1E zWj$KEJjRayBnu)zVM>=b=OvRiuy9*zTexC5@J`K+b?9fC4r{?wpvY((M{BA@z*T|~ z3LqBTb{Z$`e!Ei*jzDR|7wg}sfD#rsh2V(X-F(!^qWKXa!XbL1kqCrTa=wGu@I{Q; zU9{*ZE^D_!YuA~3l5)badw7<~ruxxGCA~jGX6aKj$HNzvB%rRdESJBi$q|6=Td<%M zRnLrf{~V65pQ3zzZ8=x({!973&>^^>TAE>a&4%gyM|Et1oZYWn;hUY6t~GV`cy`Q@4jq$M8SfAT zoQEZG=>rtoU>5L-eHRsJJ&xUVJ*C*9b5|9vLssy%@Q*l6zT16lmvZ~^UE&2R!(dfg zRr^l^(CLxl7P=l^G@^}S>Zn+M@@*4MBNpB~kZPUBZgB;US!fV=hVWfw_oVq6?_zDG z3=K;-v=!Zb(4z;JW+b}n+yPfd#Kt$s6B#`u-OPS~FVW8%9h8Lly~d#AA*(BYFEmWA zu{mfqTw8;rnz>S${qNS(1*N#X76q;O%Z6)Q55<>6q>T)dg0Vt-@ohJr@02 zCYo3A`Zs)wj_9_`!!xfT=0pi2JWhg^^HL06K+AT^fQn05(W!#*3EAmft0&6W`PSvD zucmR!IO8nevU{RvB@Jyto2Xs(Tg~ut@CK*0NRTi*0p97QOl@ z*Ns1fX1hnM;Ls92>8f9#F(~8PcCRHwcIHjEeqc&)#1A1c^V|WgEAhGj`qeAEbb_P?oKa;jY7(lbY^#S-9 zqf2Yz4(*#U3@fKm+R#>r81qb;rK>+6drNwLcf z`Vuk29>DG!^46w&e*DXQ$f2K0;A7pEv}DGxz3L;?0|!CBXb{`hsyARC!T?5a7#fvp ze4C_=g(dn?VK1L<$_@Y5v&?+!G)>F1XBwX{*6?uD+Ca%$I_Yy^aZU}`mI`WmLsreGQs>TS!L4^Fg$=#w%oNxT59f# zh8Zb!adnT5J1E(<&Kww#+TE`?M@4Rirq?Mk$}Bh5SldWIF|yAkER)7YNUU{0?+CB} zTP~cEjh55n4WOtFu6QwSUFx6esMhXM%%2dItfgbkT>+;M!I7_s>ke^O1Fv}l!*IT2CWs`dvvQBbAt9sxNDP9O+c@RA*knzXu#>`%-Hky+l&?t3)fMl%#rf5qq%jV$>+|bgkuV39bK|;2qdobd z2=BIx^m-I#G1b^@M0!+Jf)Z z826I$Cf|6o#t8SPMjqYum{uA@B@X5xAIT9nR@iZ;OX__UMyZWOR^uoBEza}H!+Y{Y z2`*i>3VN)7DhgZxNkYvq-DjcLNG=BYG%bU7ug);fT?gxeu7@j0My_rB5f!~b2;RAa znV*b{L%Nz!d`#~pT!n(vBSXd#%M$C)^Z;L2A2(sNMTqO{EV(w(YFP%zIZWdM_DpLw zw7_5;`wQAy&4}Pxu%Z045tQ$lw(xJo9~D(}J}K+Zb|Wp@%I@0vHEGa)18ix=PHy-< z+E45MaSZu?BGljPku24(R;a>Q{0W8H3Dq_XQO#SHXF8nH>+DqmQsPu)0Ya6Cae>f% z=ce){)~5aXGQS493vdLUpy?{xtM}$dqw8wcR`w6T; zC@oUhp4Qe5)Ea8=O1`9iB}nn9z=affa6|b+)<_Cu2Nwh&wqmx6l}w&~7M-o^lEHx4 zwuDi1q3Le(3tpP&UO9S*I}_twln&qRHns*HmRpjDB>9W3x z(peoA2|tDrEk1eFh3f1#KEbmEAv|*RdrL~W2@UI(rd$d}3`8I8ETa@p%PQT78$ zF291fhxdV8KWBI66R3zf>seV&p@^%Tyhw)uI)c~xK(83x(CoTNrPkC0V$K~AjwHO% zXiGmPGI(s{xHxYio}xIbiZiG{uRT2@cW&bES`tP(I_<7f3Yn$i%t^nYg4M$4)*nfe zWLDkpL!_trnOg4;GPH2YjZ34MFClD?y@qYu&Da1cw2It>Y{&T}y|MWVzous_OIq(8#$MPDklp^h6gQqN+!6Pqg}&z>+n~k&KRS#L z+>oj<&>E=ZXyd~Or5nxH}DiYC=A=^E;vZ~Y!22&dtm{k zaP+aDbMhDss05B^Hym5rztOAZ!11OUt|T$?eLJ4E6HtA&yB$o4vNTlZXRHn9bG|S` zwMjqdNx7VRcU`KI(WiI*ivp^LEj4XpAv>L(5S>cJVSQ;o{(u(}IM+s=lG5+5i4R0K zAuVQ3+g=5FJ&BB;eXqR?br`$#ZU6op*f8F!|$|_3WFd>Z57VvYv~MN^T2R&bOaSR=df` zl&gNqUBEe0T=B<3Z3CkXvU)Ue12g&U*+@C_Q0+Qq$8H-`@Yn!%vb&*R#xI{39eum* z&oa#V$-#_mqz1!mzaA8TTt7sM-YlQ;a7Rpl@|w5-(-(%(GR60jVQPiSDlc=hN20r& z-zHeFm#p}5TfxigLFJXmDeFw9RZA+Mw5XO|rY47Rrq;7IMbYJzb1P|x_r|kQnwQ=x zy9DBv1H?e)bTvJqTPf3eOPtwH6Xn9FqbJFQC#cftl5vH*V)dl+5imbTJrgx(*?yvs zU8N@Nc@+}EcSLCl(-22G^+fYo z>cig{X&~f{k+>zEP*Y&MdVG-)(WMK%IDZ3{4(7>0S=xCY^FCDO71W1!F&-+RS~#_a zbskEgcA7HGiY-mJaKte?jZ%0{sGs{iZX34uIP2(#BMkfgYjg_?A88Wr!xV`=miGMT z`}==xj(@Yjf>l4Zuqb`-WP(A-N|wlw2W6jS;UJW}1BeQ)%lHam`-jOo_Xhv6Mqxj6 z9wW1F60e7mexpZQY^-Rf#w?o|o03@(WmNrH`<8$ATmpIbl(z2>sGrAdmw*~cczs*`6@e^Qs|m0^vrOA%kFT=* zg88T05m-GV8}HQbgeaEgC6=Cw8GVh3r9;qWGL^eDo&#vY=85Rrwd(B}?JNOVpc45c zrx35xP0k>rcOUZT!U@a68!2fl6AIEY%nPZIb6(RiU{kmJ#9bO!FF>Jg#z_i)4VSS( zGd<=>(i3QOUm*tt%pdC*uH#nQo6o`fPyDu&?!hSLn4H;CVjX2~&aqW;liffC(d#eE z%8CoSgg)tq%HfgVWacrtmIFZSvzV>SQsG%wULF-Vu@kyw5k*)t4FR$GFv5dj{ z8vKP^c*EviS{TFBbUM??H1%yl+w5FkV%arHgV@s?y^=>KMkq*1)|89 z+YlmJkrjE%TD}RwB?rzmeekm^LsYEcg~3;_cE$#>Z~V3pCOia^Za4t*F$MSdAMFs6 z8->#-3Z%X{UuzBx<6#Dk5Ah+(WXwxFJ&9RMWbNHEpvK?|)%3ec&Qyp8T_|+t9pr~! zPXKABxczrx3Qzvz>$aGBK5Jkj_w18;zfRzy;3f*nktN?XoEeUFFZuHBbKwHH@o9O$ z33-+b{ZyCPXO%9d4q0WgFcS&icQ_}YC;lB$oI!@_%YTHm$Nw1Gek3UWukq9W&OsbM zn1z4qor54j#DrJ=+C$O#;+zRUm< zG;C8#my&V2HhlZlI>n9Zt3i2?T9xnAOewdU4=2V$@8l$qsz!`5%$-hTwbBnUx;3`M zR}cnm^bh9Sx@J)ETGlG6%D^)KHDtGF+K`JcZtIuE_WoxxDjtzP!_w2g3Ro|pAhe$B z+Q4G2%to5}$!=egl_vP!^HO;M7Uh9nJh_rei&ElY-%7n<)@=k)_>d4uCr?YI{k87B zpL;HbkstRk^vVlcVDb`eI0439_n+r~#y6r^pvYD+Ms9-e9mT;5O7ikIh#qOikj8Y% zBE`|nHS)?Opraf|f7nBfSR=&x_7;L9PvacWSQ7&X23cgbE8+JFsW7W1iRUzoLnD6y zUQZA|)}#*HQ~qU#(uF>VE*~0-e%RuFzKaZn(GbrGstpW9DXm_`VAV`rez92yCWm-Ln8Dk{IA*P00>B zky}3OtCW}3E))umY%w^d91gXz?H4g@;o-dMOv#M%J8WA)d{L2ojLmZ~FAgNGhP`@K z0cuSaVknMzFq}Iv_SOE1DF)z95A>C)GGCx~n-Sb&<%dz*5JwkYpFU!#WBcx-`5B$}hRs@1}-PKiF^cL&^k2)v?RkEmcQ zW?FAT(x9`T&)PfaKuk?b&+cN$g3W1YiK9?~x1u*t%3xE@U&<>i>f&d8D4+HJoAQ6# za+J#Uhw?~o9MV^FXBO*N6~8o%`N*VuSq0We%<~jOV3B8sJI8TatX=!J^p)RfAZ>(u z1$zW#GA|DPQvP}J19NdV$@IK`w0!l6U`GLWo!B;b1!fj*)?g5pLCoA}QuKV+CSKpQEn|~& z43^FpQyQ#2o|~;S*nUrnCU>1lC!m2lGAPRr&1A)M%7(hQbMNt~pFot2If;HC@7@Kh zOADIcL@O`Cb9zQUb2gq?v?SYsr1GbXZ)xz=+xE@^Fw30w;-_w5%-x)}eyix|;{0Vo zA}jlc@V@CE!sFC98;M&i)Rhj)4q?p?eKjo&Kx-h*1Ac1-JF?qnaajj6XY z?-CGS0aBV@`AP^KLR1i*#O=ZYg)rR3R|bp7JG%=%v}c5tC_grIm zC!Qtd@lT-2-N86$EYmUcis5a?`Geb$jkEh8e0FS=gE3l=2Di2opVPX7_&g5`Z`|rl z$H>Obk2>1yFi}aKxc$*XD!K6kpt(l}Em)tY4#BF~jnVNr>l;eU;vyCINt=Zhoc- zJ<15;?T5V{4A=l*KEA`Vd&u(<0Q>U!k{2WrGd|<7`zu(P5?Ig(fWusJHD2~P;f}Yx z_#H;?J=n{%ML1VpRW#uA6#~I6>k($$hy{Cq#qm$y#%Yjp&xLsgfXW}9Cw=AWR?2~z z5p-)r1_fU*9V6}-6`t$<3j#}{S^*m>C7Um@h`G_F&f{U5GMIRR57u)bFy%@bF?t|Z{oD_r~;TUlFuXuS9E=8 zD+)uwXX(rxb>n=B%uq5*KKCHE1ykxkm0y1t{YZ+YOJ~9+h%t5XkqZ?L;7MzB*ig1M^^cWvP=4y@);5$L z)$hdr=we`E{D$UUIcgkR{Msc*Hu6KIyg9VLFA`SRfo-zQ@NFOE0fY*Y^!SA3j0FCe+Y_;b3p%$p*D;Th~be3k;Y}X@0c-brN(Ip)Exl>B# zl^teUm+q7=aBia25|;sfBw(FgEHKP$yj#n4HAQDPVvsrF9ob{s3c1=>f0PS1`^9V| zPZRLSnU`5qzGWta=$4BzEA%b2))OZ!WB`gTjtdNHohmr@{X;VIPNm5o5>yQahBpwy zW;#&gobc<*HoKv}GxM!@99{4LmXs3*0#*{rx+bQl`s@J3GaK42P*eUOWXkZoIFlce zB*}b<+jp(52q?nis=Kzojq&e~ z#Se<6PeyF313cMo0igw~2y&2rZ6CT?nS4?LTvDK?0WTb#qiex09CTlFDSD}o6#>3z zMjLGO`RWL~1wMDCTey?2{gd?mHXUx)L%m~gQQ9l}2N58yYi;20Ky&8l952)+RqSPdf^A~(IhXSR>CwIJ1bOaaH z{^0XtS&}EdTHcqP!!;zpd~i17AHe(7Bp)HaV_vI?4}X;&FrH$s$B6ffCK@x!;?h23mm z^5vCy(C@~nTK%N!1r88%`d3f~C6Y`R5#+uXupBN; zRGI6(J9yG0J(G*kB_EG0$=O~uSsna_`W~zUMxcJ0q5ei{K*l6{g^Q_?L^ z-0ki4__>EHnVrsDYr$T<-vyqNZDYaEYQ&1lQftm$w%-Q62!ahyhA5yP=6=^7MKX!2 z`ulEbGy~uaVzs6~^8y8HHm`pHNK{oo_~jX?9~m554r|0{t%o|2+F`CoJX3YABY>6* zXb5EnKhej+6p|U>5sBLhf`fv^GGUqsKXSKKWf_oX1O!dja%R;n;~ezRc$%)kyt%M&a;qk$9TQ2dW^1bURcBnxj1b!cAa8qzCOkef zBY~8rL|tRHE?MpzWwAO&_{sA-aDHq^P`V6rA2acW9JG?DiLRDU(R4GC4D3m+rV47R zzfMUa?%%N+z(TM)C?~>CVCuISFq59}xCC#*`J>y5PV~#m7wf?eo#A^jYyA61!l801b}fEF4oNM3yu2 z1z#Wgm;tXH9rR!Z;gtDnV!%KsRmRC80%uB9%e9$O*)nXDDmDZ23mJrR2hmdMIlgo~ z{>HV{Sw+L(q!%l)tAinZ(x!ks&XtCMi)rRJf>+wj(`$4nN8A&CzNcEz!N_6t0~w``qo*0N(pUK!M=coi<*P1B)BX9yFZ2$nTbxrD$Ce+j6TJyrjq|z zi%U5J*sQ~A=&pScgy7cJv>a1-)x`UKCi<^eF00|I!Ri$h$+-k+y3vhje#zgHt~Mmk zZJ}V)3gV2^1)rZ6!|X#;7tbEv0i?}oAv7ivKHe-o^1=faI_E-4*L~El5R9!C zDk3*3xS-z=WLPpO9xRnF5qP52XTt%c%|+=f%TcX&rXi2Rs`DM&oatdM+bZ>wqIKlo zmGF}XbFXA1CG-aOgdm7r*mMA#?|gH%=Rcmi?vG!y5%8EvWNwQaW8b97$;ceqNn$sW zu25JiMuA9PaeT;2#=MbWmtx)R*70gZ3raFkVqHLp{bjWvxcQcTr8EH+z~%2P<#TLA ztmJoJC-XUq5{o!hDRddj?J+@HR7UX2R9?XyP>U0>^cf*ptl!Se zW=_UuQ{F>^AJOt?$tGeUeUUV3`Ko;+k}T@2e%X!qLGkhpZ)i3Mh%M<7ig0p*M$%-< zh;I+M4+TqCF+H(^8Vq^b+$4K({|yuGL(gC#`S9ZX{}?X+^MU*OIlxC{R^hM0%zUzf z4u%aJRk;6g__~dWs6k39QqsUTY6@}+zA1(Z1cvrW*QH#8qOig+veS$(MBn(Esb;7m zct$tVOa8|RZq~=6D@KFQ&NF+h!wxz9Kizw7V*B^Z9aqp39ppni(E-a9R3|;ktTR3M z;IdjXyPyD;{16S zn7eWKEgU$XPQ)yaOnFm5$H8082`xsJ`PvmPeQs&$Ro^?wI=6cANcz#D?eoU=C8foL zZqXPtm++J780h(UzNxy+MuduqNQOUBVTqK%{tU8QCD@2~%k-~a0z{hjO=2Qye>n$x=X z2Ofua_R4hfX&I@Aqr|JoF<}vywG<%Ox@B}C-D_I(4Vve7r9JH^vSeFWzn_WE%K&d4nqrlERz7qr*qw(7`{lZ7g34_4g~Ar{WDl*N@4aND-A7Yo(zvP&U!jPn6R`#(ms); zmsONd!~$jirtdYpN1%6w!=}KQL!E53iP$Mp>1PrM?TziemH?GGm7Zq!;&F+%Bmu2i z_omuiwobO=53{CJ3Bu8_g8=<#ZC7Ch)@kZ{?ziGtrqLNIk$R88jQpO{P><*Gp}C534+ zKRk4P{J!!!m|nX7UDt%MA0D?IpP=!1LQY3I#YaiYOozj%%S?y7 z4U@wV-^ks}KwB&`4fU>5d;7e!p}!sC8#*CUbYu{xSn*3hLeO{*X`iqxbr)k5&0~ji zReR!oH`#(G;b+OXVBA~yzyosRRnhI|dzFJvCv(U{0@MiLpWH?%dI7LU?HNx02DQzm zBtJ`k_&1Dyd=C0&|MtJikAD}QZR;;wE7n&ujGNTkPbrjB?!}o&LRU)I=nJ6*M$cU% zRa+XyO`Fx;zrTwMe^r|4g868MQBawo5E$uc`zStNwe`RLJ{#x!bY{MGZL`tnFg|31 z8xZv)Y6xJR>C|Jt6#zNi)A7CDfwuHVtA7Q9rIxb;JRCzcu2#P|C_D#4=O+M8xU*px z(LL3E5wRtoANh=Y6BZLSEu+)$q>FQt?RT*ZMnZnH$2FxMU#XAP02P>6%yWJ%GFY=NVRR6urXpxsn_b)<*o%K~2@lA5DJ9bCsobO6gELxx?i8k4O&kNbRjzf^8hxdYRgN_cVfW zoJAVVUSy4o3W%gXdxTu^XZtLh8`=hSz1YmiVq6BM%(xG-Ko}IyQQa2NZZV^}`~EW% zT}+5~PK8=0P2#plgl(}LB`f5i`eg8oPf~}+Mh}WOW5RMVD@}r)6`P{rCb#fO-r{S} zNxP)|2r;W{u_-?A5?C38E9}D_7V9?dxR_L&ouUE~9Rxx-Nmn4+pg>p~Q40 zLSU1)FaiN?G2bYZek}#Y3>pxUIhIX^3>}H5l|}fO)7TwoYQ(B)nx6Jk)bvjVkIj_~ z3D&UbZSSM!)t1-8#&Gr9+v9ZiC%HXwEJTQJkfmUbU~He)!CWCy!RS6iey;Y9_df!A zfW#9+8vF&l#)KoxTkXI+H3-kpwYNusY2f5Q8%{A$0KFSQrPB&+OcoCPjwu`;VV4g< z?i3d)GN6^%*ADHEtd4t4ClH9f;Br!li5V6wdgDhyMFc9NT zvu8FD{sieJb`De@V3mtts%0RVPU$uh4~mi`2~P!@C($j>T7#yZq%0Mwsiik%w&vk& z!hzQV->4219H*4R2NR2avSmDYPMw?JedTl;!6Uu%Wj;F|P25XAtv*`EBV08+4v(>3 z%(f@@UAiSEi@}TG%$-f$a&{S!aaB~szhx*7&m&VGXELw)YRYoOBeOIU*l()0dEM`I z7L1yZ)taKmVx_GR3&fvN7l>hJu^^{!u|C*nfYCq|_zLM8kB4~b-lD|htiJ1vc~l~y zP*u^aKIikJ<&^i!?`pKCAHwG5){1$TEedDFmm9^uGLz;@W1KX)gmkTQ+;m10lI-zCTO>hq%>EhfS0GZd=Hap`9EvELaa(h_!y4cMTT(fPo;H}M zYR1#kAu52s=tct;vYbeIa)LRi;YWfd>>QV929BCT*s_+Ijl2V!pq|KvD||n#kg$U* zOdO6fS&89p8nihddF9fD^0;J0VmpF5U zY{z_yQ|o!ZGnV;Z5bQehR>im6jgVX`6VQU=?M$%*>~u=`ni~3;l&s>(2FZ>x*izs_ zLd#FL8v&Fqj>}9R=xey+aG_j9aQ;alv&in7d-Cub%+>jOB`==oN9lPddC%nT^FmTI z=_~F$y4ms|Q=NG?xh=WQID@=rxBKxzuajlX05ypiJeq=Ma-JNrt+C2TfwdEExegzB zXkuOQ`237midA7PLqw(^TR_5FwzZG>pD!s8jqj3$8KJJcsY2y&2&P~Nm{P2B^g(>~ zQhuplmdB#b1==nGBZCS6!`L8f2`pz2T7RdyR&*~7+dcwehdcZCAtW;0LAygSku&d zWjZ$&GM`o`W)P|X>;(hJtGo_&e^Cowb?EG-Fmm|X74*o;N3!qGAv}a8FlrClWd-Dz zJat5t+)!gvrO&Jvt$ounCSLUV`Hw~ ziF=C-X+E8BcPI{#dkYO|-qc3c>~^wrMRSh26WEzN1xDKKY_fEXUW4^VxRdsyviJ@t zrmT*eG(W)*B;K%kD-GFQBlTmNyd-1#h9JTS8IBO%#^CBqB@XW4LU` zuX)O0mIAOWWZ5B;A-{SlQtiudRUa4ZX1B)6xWKYu%6h?*7pFHa#kMs2Jq6)3g%2p4 zN_o?Vac^AL0=0GtNaG4;oX`9%BCVpkc{D}g+Mh{RZ*{eGBUD~MU2c?Bl@ry8w@rqa zVKffpW<`7}o-4k~%9Jvb&{s=)G*y*whqC%KTSB!|z#^5_=0u%c0bCg>eB@&)l=fAF z4jR4Qz5K?9VlKGdQskKVOcgAJLV6Rf>L0&W@$&G_>+!g}Ty&r~`3d=ahty&tuzNlLNRlI!PH z7Yj-Sp>w3tV`d|oDz0Z;yLPnFlSSty!7MC|j|XgJLkr;ZLK4-$t+<8GK9pCFn(--g zLSCCcC2u4QJBN^iqgSg{*{B*OP%2Hcvbpzc=Z_O`ziSe0Z^|NCY z3mS&qnl62}hXM;*pKm>f8rlvLqM>`HIp% z$jh*fx4lAL^#XCh2#kab3xv?4ydr~eR)qKrHIA9hm<6OSlhnxg@myAR@Rurs;sMS| zHU+_}IDE3l#!&ddW7qf)C)-$Lb*&+(mBIc6m}^lVz3Q z;38d%vV2eFg|-EXYK+)a5k_gNfMm$u`dOS}2-KgxmY78joHCf%Sz(|(TiCgxs5vc* zsmb#YFJL4yDgMmVMSBZ8o=LUHbaq$5cIz*5BDk&pnxu97NWN-DS+n@V)3N5cNtn6_ zJ0WH)8P;0aXcnHdKVyWd#(^5j>@sMjWgMB^ z!fpheAAC`m-1%dn%e&$lc37oqlfn>N0c+hi>54>1sw<;Fyfk}JiX&_Bf-;(}^uSn| zFykC-t6-A*1v-pv{ON56f;4(|GMtW?pD;4yJ2!s5kZYzmVJ9ft^RTwd4(H+m`#u}A z;0sl8syS2GpSB=ZU{mXZ;H6Md=L5yLqU?2EI-To>^VaKBikm)2JDulhj$;MIe^mFa zv_oGEL~}|@f~m|MLf_CDmO?WnN5GXZph;xwym>WU=#KE>^lt4kzHHWS^W<2Bv38~>G$p@*V_RnkM`ZC* zx9k~#mSDgd=i)aXJ*{a=eOlVDE`!&;TwLQgl9un|X5-FU;+(jCLG(b754iF;uZ|BU z5i56&qszmgQ?nsmB-{sTE?$*;rcGm?(=OOjUSKv%)l(>5Bcr_hC)h}S0*me(A5xI18!+O6DG12}XC!l`Wu^=o-cO@XfK3*1j2 z*z}=(c~$*#3%qS$i;HR9jfm^K{Iybto;k{Tt+4g5fM=K9hLPRY_uFFh$tIV^fR?te zClsv3mZ-`u*`-^}+8Zp3LwFNET;`A(H|YXeMSk0t4taP2O7z^o$*KzLIxjrbazxqj zAu||))>47I|vEpyK9=5;E3zWzHA=)33)p9|WH?0iUF#lyQ zF+Hf45{|^b4Pk;5uIy}Z5J?4p%?TeQQ1p8m2~CcI_8Q_D6|X-_iX5^?IC;t^>sM;p z+s1s!{+*V`S7VtWD1tQ}!tWL*9)-pwk)&0U8qD1e3!eyOU=cKu9VWhj%OMCb(N8s! zYAAP_!gwyy9UR6)p_b%YO4BTQjfU6mIT5y4KxdOAzlU{E+uKP2t1M1E5*-s|ANQ5E z&P~fgf1XcHACb7XOHuAhn%XU^Y+X>_6g96@{T?yWczqv&JAXDgGd-sBF`BixkLF>s z&I3bYF`BlLA2V(^`^`$P{}K|`xpzga5eJKx6yZS}>Z7E-^G9;w``vB;qMw5C-LBI2 z_cxh<+s?>eM0(dITEcr>MC3qr#OQd%C(^Y&s1w0Z6+$q;+2~2R&_8G3gvw}Q6Bmie zdNv1!rf>E#uWggWbXEl5Av{taIHNOqR_s$TP~*8WG2O0%l|CF8XT<&6TrS#*-BK*P z!3eJT-S{0$YY zZGvI}TMgPpf*$m*yzgK44jWd{7qB&)aZ9Lq%~PG5CiBh{nwSQkX{2*#MnNx7s6QZ{LXF74E&9_LQ zug+f4zKv{X-3UfvD7z%CNyQN$;x@btDF=tM?MS+9g{J^Jp@0AlVm0DxrEY?CF=0)Q zi_RhQNuP-+ef=)TmSC(QtdI%EB;$-d+>pK*op%xg(0%b?_~n#0)EU%9GrhQzS}g&p zhLzRuqx6q!J6LgZd2 z%LyZ0SHh%;M-|3QzZ}z_lqCQWJ`~T`?M6<$jG-gs-g1`vW1t`vC)ob_HGns@szRje zsHV{O-=H+MHNTAXz&Z$)`B$v-2UE0ACXWQwnrwe5+%g0DjrW@%ie7cz`67f}Np&ac zUeE;+PI`55wo@mUnjHu18kQ3NN;503B$@V8S0;6P6vug|r1i&X^*O|1&Uo!|BLcdh zc^cdqFX~v=j7obZ&vwo#zfUJPi0+Xkf(HC$cw0&W!bNuYd*j*;dvM~ftmE!laM;K5 zHwF|sl)up;xAragrER`AA~_HoUb2!_8U7%@q|}{?W6!9Jp=KBC@l-&~NH8HUoy+`( zUyk6?>g?WI0&V^+7Ebe@mq-6Cf&MB)e;W0^At@@WRU3@T<-|tXAhomiHOU6v-Ko?> z3TumnR=s;?ZSy_n^7UEl+ttc}9C4yPtk)92%O>^!<@%AVUyg^Fyl;vyId3kZ%b#>b zG)2TjR7K?a%E7Kk$zU&Fp(6zpk~2_8SpI$A*J$z^9_8AUK~<>R7Teq}*0rs62Eb;( z`ar%v`?`r_28*)ZFq3Lkhk*voTF5g}vp1p3*JS78R;!8|`*6bxQesq_?1^So>VV1Q z4focmN;L&|U}gax6i&G5uhL8Eu{dQ-ju^(c4H}ofy}*M zk<)-?HmDvGrKcV{tQSwv!}^8FJY+XP<4u4MqErZ<*Hfjw42&bnLnC z!0TJOb28#{)?RtrT^_t>Gec6qdd8>#CWORe&qd>sYT=7={_lcjmA}Ewz0s{bicec8 zI9QZXUkpDhTe=X6?&r%_q~^H$iv?<(^XAM}Lgzd+}%w7x501STwb>M3<6g*TPbNP zKg`VBeP3U1kh)cDxHOz=F1nqsriHe1b%o%av8=ET8RjbtT9m|kdfDvSG`hnhV6k-B zYR`7#V77!2n}O1L>A*Z7*0b7CP|h{ePC5341QjXA8bHPOG}dtGH`OA$R{7?GD_`a0 zXF(R0vq8R{_dNUwL&6E)@dS~Bl+x2{`dBf)wI^@-(JHzZ9VtuQ2IRFQ5F*05m$s}l ztDdm)D2H{PiICrE6H>V3`Kk`_R5$c1o)@P@571f8nYDw5F5Q2eNES=}gzp>GukECl z`k-8PET*45v^zfxVxFhmavf*4`C`cJZYoY`m|4y>r$vo^p%`Y^Sclb-Lu((=HcGX& z#BV)*Fqk*(!yQ?*#?8kY!kO83>)9LW(}Vuqz)1^SB$aaHD3(4|BbK3>J3yPSQLz@4 zAN6%jb##Tuk@ZN}maw8ltobswQHmR8cVN5J8KT6;A0dl2>&ATCw-Bz6zZZ@9Dx$`} zNa@0QG?UV<$$osdNY)%Eb z|Dz9D-j2LFdaFco|6fz)pLbn<_=Nuf zBtW40RJz^No`Abs`_D~2{GHd!ql1!8YQ7`_RHgfMW1!@H5J^3O8+0J|*A2-Qz+4re zU;a6dA)mA3d@iJ{q7HE2hi9Jpt%(dQOczO}&=IR;RaeyV_{x5%Cs{9I71-|s4nMZe z2Qlc{=!^0z*KmwH6~sP~|7u#>kv;~AySZqz-MLXcymTtUn*6%$qKcOfZl`^3FA-&;fG?4kxX-6`+JW?>%W2m1BDm^2(IefTn*CjIO)x*oRs78)$o`b?TbC&g; zEvlB>pc)T&0ZWA)?EiSs|AXn(=Lf3+_g02<|2C)oZxKWzQyWv0e>By$v45QUV+<%P zy1Le1C}g$4d)@TdhKuQA>ca*oW-?v#pYINjYn{yQ3@JOn2|PhOEACEUh;l-=Erdh(I>Q=L~!JQ8*uPJPx9oa$U9M*lW5k)38FDY*-3C&R?r-`{T$rvm~ zur#r;W0IV3+~$=c>Um{)>9b$iL<*(=Y_9Sza+9yLCU@Vxu;2(%(es%pP7 zF)KZUeSXbzpgM42b&qY{Hb~eA z{w?~xE#@HrHBAUlL*IXOjQRxwPw-fv(^{$01^IB;9r?(_Q*7sRaGAXBhlM{I)EoAN zb^fJloi~^lH&52{Ya=4Ld4of+FL1T=vQ2D<8RanNKTt`k> z(l&$xo^j-EXf-(tDSVM^1o|h+3$nc-&z{L>1M+l8Kz0%mSF~ZQ+2qBK2VQr}-(I(m z-`+944K^Lo`Ytxd9)*TteN(tjxHq^6xN7Wg*ZswYx_!n-8Stq!XgGtx(BfA~{zBdb z{bEo&lmPs`W>}?SB=V&6{w3*g924fe{z4%$ONwGyowp*OtpVBvqjAcu54cm-J#F^$ zKN}dqtIIwIjZt2Z8Sna|ecO!>BQ*oc7nV5jKGQVoUM!q7PGjrY`jaGQdt!{pfmu%& z#TO5RViP)cpAf_AmVH{ZRvkxodO?iT&M9lACvAm@CoAnyu_-zw=-YN8Eu#>9Bff|G z51vHc75ar_D1A0REyQw4x5bHm9u7Tqas{_<4EdhIRjF5(zejOZkL~^ zB_S@AjcWtQxOcdN2kl0#mlp6bX0vBRw#v8`q@+ocys#35+sREWB!n=zR$?H&Tr-JwRw}Jsjw@x6Kh{P>Ln{GN{->%cHnb)fb2-E8UyFSxK8#E{wPzD}NXf zQ88$F`s^3Y;!PMdc@gNIg=cw+xA{x&d!DztNd7eh;dvHI-_;Iq4{d{mXTt`t_gyP* zgBa}z)j3Fq%r;W(-lCehBc^^rk~@0Kz#R@9CpQJI>}ecglATN+kvxQSjD+;#BgxRu zICh-xET^%*MI+-O)bvRfdQ(0+2(D)Og=x>R276l(3%Gx&U0D{yvDtwxP_^Fy)p8U0 z1<&kSlM`L;xr8?|2@q1v^rk_1&(L$w1isl?WcQXW6r(`tN|8HI(K0`9@E9e|U*bB3 zx!n6`Gfv~il{`8+{rrf3$zU40e?EMB|NBpFp3IF9tJqr^(dN zd+q!eLae6gyavK}H5p6ZE4MqNACQ}4Bma`nz$>Xqg8=tr($To>Qrn)*w9ftz*zoFdj;^}f{YK;m z>3|mV^6{802$_7Jf(af5UJM?Y97N8SXdqcC%|t;jQ`#srh-Vv0+%ti~In=^EIk9H= zw6xEHW+A93I1}?uJ8QxLpu&XmnEVA%)kx_`~Wfr&1D^KJ( zIYxw?yI;l!s~2A-1$`!b={~fo2WL08fU0SU)wM){b@6l8|2m_8(<=8(W zpitfOp`+N*mV{4HCuRjp>C%;oMI4eo!g~QB-kX76qJ^F!lE2L7;A=Nne+o&5ljiTaGM`Rb~)8KcKoQo7~3b7P`m z7t}=eql-iIQ^|A5X^gVR$;s97ACFRXLv7vLkjc)`DitvJJ57svE8FO|L+vmUq{Z?& z$Y~&H^MokoBBB;!>EyR`nL+j9=^JAwXmqSml)T$K9A2>qd!A-UYTGiygB*D`i-#l+ zO&3@w&Q(XLc{c!_#&a(*KltO%QtnC+>9#YLi?sBDYq$*!g^BdZjMHX&DRo^k_ERrWCrjcdk(1eU)_YN3>jx}YE~=TtvNK}PxS5KUhv%0uf= z;WcDYh4REOBU{Z!l<#G}Z=8!rzb<%_^0nZbYY+Lv&CF)P?e!+6U!D6v&V_C*xSp|bsOYD$Ks7hE;~)j0Q&?B* zQV@lX%V+&*Yy<_vwj;c&t#_F@k`m$3G(3zm%!7ha*&^e2Hrv~*_*xQ=Q+(@4F8qy{ ztH4?>GuEgs+lWn4Jc*iUA;@9Xk|r#2mRM1x!qicaJXNtT=R?z_<|UCxUX2hOy%sb^nxZHIx!J#(cccLtTZmRl;}G#KZ#EoNrgF54-s$KiylTe&WX+ ze{%!>L~-DGhZ^Rh%p3IT50c;v$nfQPa5nh8^?{iE9m_ASy33F6;o0M0K_#rUC)I1j zjEDkyFh8^H&d3C$1<%R)$gGcX1e(Nohu^e(g?D#xZAo?g*_GR(m%7%J=pme&7SsMw zy_=oe-QC_;)dGOOgU0dxy?WbOx>y?8SbCcN)k`I5AZp;NW4@ZNZ1A?r65BwIP?E$3 zk&i*He9}sf)xeZq1wodP=k;sx(u<^;tmL)VlZ)D()@$Wl%QXm;Gjz#W)KBO8v!z?H z3zRo?u~$x6E&MF~>C@;jc?RXCNyvDX<~7Ctxc)o)Hiwt>*D)e;7L;O$-$;wd;HgQ6 z-XNZdH)wFk#9L<&2;54%W&m!bTq^*l;AIgqu{|`l1G?2=x+oo#wo(0w;GPw?9sQ}G zeaWwk{d3@+LEGk#g4j>N-8sl>y8}@;HupUa02bVek#G!%XBctv~w@O z2+_Q&0V}5N1 z?_r}^3vW~=8H zrZ@Jb@)duFdXKS3dw~9KJ%VpACtb^UB~|M^Mzilk<<@o}f^S4K?Gu4O;r8R%B{F^X zU~GWkZWJ0ZNp**JJ+wrtJ<~L8o`v)0Wu`IX9XkdzcBBHYh@gY6(PXmkUvS~dcKZCA zs>rma*V8KPILSPpn95S(cyK`?RtE0$_-w9ZIx?$8mbTi0r;@5^YA{iXlJ&AsA&oUy zGlBk;?CUslA{*^w;zTQU!=@FF_XDzxbcHZlchqE~x2l8<`y}ug-tZ1>sLPch4OvoO znN^Ts9>gMj8H~PbB~r4R11C4<@?cU9O;77y=*^Vpe)C$YS*(mPZk;{vhpLY%8ELC| zG{TAHaxL8jIv>+Coch!ov(dFL+~SBC8LC{)K~{oSWPXO*0BCOCKKzEu*&;dCJ@_4R z%zgR75kjF2S=?zIeJL5Nh}Xf6`hu71fcg5HhM{@V%u=kEQZw$`UuH%8&F&m_BZeI< zEMve*I&X%d0$sD*F(z5P^6D*FMlLRW0o$Yla!4gKr1^Mv7!gkm&g$gt^&}g~D6}&< z@n%XP%W#YGGTYj9DU^xIrKU5>Z}P&15rm6c#y+}QCW0YBaBzP(PJY-BFU(r32q zho5AegM;GL3cNod4K&=mhBD{6TW=ijiw7AU*l`-gXy3qn2qWe%f))COJZQphBPiF${b1o(xiWxi zJ~WGJppwd|Olv*pmlxS!ZT~}x8C9B{NGq+sodrpwOhMGa{dMtvS3y~0A(JDEjif_x zR3QHEaIHEPqafKk);q;zE1(dAw6Dpk1ZTaXFa)Q070FC9Q-omH6?=~t{3K{Up6Y5}|GRLH__D*7T);9u| z1tkoxIM}n-5({_2(>B7V!+MCbD3}Qysl?s1Md`CIOmGgU?l}AJwv}kJft@z>cRxhw zIivccZ_5nv=SbzO66t!`lx-X|C?qZUux8{K$XbWsWhY0AQI6)-OAX1^(Ggkmuxd&R z@b;gvfHR~auLG&tN@RQG12|Lx5{octC5b^v&RI`DRLdNoWmwneKrM{MH(!awO%eRN zY5A$1`MPW4a#tVP&z&~9ct6rotL$2?;Mc`s@^kVxS=w$SB8@kwtGJC_ZJuK@*l<1( z-k*pKZLQqY{D!b;+;Y3Y=y-JmxkTq5&|AGEKSU>(*SbP$^OQ3xetU3P2!_8g2qA(P z+hZDmyn&$}F8K!8wyDsGwwx^y+}%baYzD+7xKN8iAx!W0~NejziejcU}Ch) zfefaQ0?1%>U+u5sh$8ff_trepBWbM40$kt3d?k&jQ?W%*2d|=`Vb>^b5)?k7c9ON^ z8{?ZcT**}IS={Z%Q4<85IezHdiPJbBMwOVuv9oZ9%w0XTaBvfVEb2S$2n{gA@XB)3 zVGp7>8zqa%v+X_QicuAb-#AU}FXwWT%eR15b+oZZAsnEicTVZlBNPuamlEGfQ~!uP zCUT|z`TTVf);*l!hu$M~6#@8+LiHTS%~=PmbULCSzs1Af6PH~>#cinVB>dfLa4%hN zfjv@=&|UmnKbh$rd{V`7QtbfhQ-a~`GPQus=5Z|*Ddtd;>VlW{n`?tRJ{?bIv=WHc47Z^{7oW(t-SVhI+8V z<+Pp|3e|@-XVz)Bugo1CjaK-lycL$MrxJ?jLo&M_Gvv~HEk7|3mP-ex09HBT+qL+K z{(h=7BHT?zmBE7$CtLH5JNWVxY6*iQ^Kv2z>h4Y15(g+9>2x25YMt@%Bwy+OfUEA+&Mx;R}d@C zB9t+AT_f{8_nz*@mtba|#M{SyHm&9Z`-o_mHGW=+-iL1O5v$Rq8OO4#(96{MxL!V@ z#Fa>Dlh0%;&Q5EHVy}>o@Thc2YITLvNK{fwWpT!`;)HVtj;si{$z#u2=i_8-A&O^=jn*JPUVzTSFSVD7ji1TmKg*t2p+i*YvjAR=1LEtW;Cak0AE> zl4nOJOoI_*lob9;3g6U33xURG>gxQ0Xvgq-~g-TK=$FV9B@ij)^Evk8{D<+D+%p|R>XrMlEyAZIJ84{ z&<=ua2HXdyg-yqY+*n>4yF+{j0lCrjwiF@{{ei`_!+h>QT;wo&KEd$FrI(xb^~yZ3YB}BfxzeN(qq{(ypV zl~$CI~Rfv!M;_w65W zKRoE{Z@0XKq$lt+FB<93kdRe*Fv)+7bd4d|ve{t5=agXeoq`&;*Jb)(PFmNws2`f= zLfP1G1PB)Lro-v*M_mt3D5C9qkhF44n-DRq`dk{iEx$W1YDA4K7e^K5S-4XM3eW4h zVL=slqR3H$3Za`eSsiVK`)O!}6m!NjH`D8sl6M^o=78HOAH&P4W;1yemVPmjnqAst3;x6;#ii#zP^%YaXMCkhE^RN z#!0^QLyuO$vaiVX0g;vKH3aRSRNq|c4;?ITu_*rAc>MbX)_;zNh?A+Ii|M~2A}90q zNHWjWts+;|DyU{eV$}u|t12F;Uy^F3rFxcn;2Q~%DVN-B1j+S~|ZF^c6hULwiM9+l|@uiZhSuL1TySJ$W zyt1w%w{D3KzjLGpv7)Z{K7Q<1LbG1TR=DOQmdP4;K@)-*0(FB$`B5U zI+XCR#^H>7RymMD6O5NmRA6pE;8Zark2z3bu2cC!siL+SW`I(>cr_f&f;l1gh_i}p zX%VPsjR%O|?>!d9k!cHg^SfLbXAiz~E?ST)eg^e7i0v$2=7k{WhRr}pM^UD06nh4@ z>5fv2-Uliq>MMB_rzaO^jI9ugwS5oh?3^yW_?Gwc2Dy>>_q&Qe1M+?O=P~nJFv|Zn zApb60_P+(>FAy$DX-pbQ2<5AMB;KBtk+&c^g=GG2Jbnjt07Ag_9tx@`-?*Ll+kY@> zrZ!(a8xauT@lepeDJnD{7*dw@y{zh@cxy99@7+98ia1ApG1j|1dv46j=d|*)ir%2zY!#zQ;imXFp6r}^?ZKW-5Hy$ zS^4|{b@3IWiEjsS2+=#I6`^4+GSb24ho%{;vabj@bF;I!f#o!)sxp@Z{y~j8IBv`q zO4v=^vXzKk7f3kxBS@A%R9L~TB6XUEH*`#<3@->n@EK3|;z%*byCkO#kaV?RJ7oFl zCx?bWV2EQ`kUqQOpiPO9y%O!hTPZD>v0VY$X*<9jLW0~oyD~ZVtOKF(Oq<6sE+_`S zU3dC_4hvgV6`PyQoY(_75x5?Hn;QFwdzC7VLv2Xr44i~CpNNR~myPr-3Z zzfPDZ-0|fY`0^iLkxw*qu*iu1sB_sN%TlrZ1Ag~yB9@5h zo2A|6RYSIr*~zWMppQpM4BCH(4%!_$ul>H`=-z6l`mAaN4MOWP_e*qq7_Bgnd}gWV z{l#}XK563n@_LQ_3BDdz`VBUv#U->zomX7AQhZ}{M1m!x8uA3gHb3NN`q{Q{h|KM0GygwcBbfGu#~Z!Ou+&Emg}Y#V+Z<7 zfP*un*Jy3RM}2L&d!(IVtyi1SywrNU505R4({}_Xu&>ZNT5(B=8x!p6U78O3G^7FM z9|O>f9kAw<^~Y9-a9u4I z0zYX*bkXTvv=RkdItgCsv->3MM?*LpdgQiXp1O{=h^CoZr{J)OPEXN5l0S-9uqtG8WCk^sKx8I2+d5J z%WV7%w8brpmA!@aoK@H`mFKKg`>|`N9f#rSh&lqXIU;)*XLF`V zqRQ)-p5OnGpopDKk@9cJssFbZjU4}Jk@a8A5%YiJtvNW@eEz4tUhrGS&M9K}G6pV0 z-EhE&Zf2^jBPzl|8im0Vld~Gf0@!>z7_go48swI6uheNEnA1zQWS^A==W2(sK6PcT zIZts<-QKlwfBWtI^1%Q%0-+d#Plc(%K)$CV;OI@vwL{T>d>Y&Zjd4fm@E!`D+<_AT zIo_ZpMbsK&wY_3oZ-R1HC0BcbG0vpoLDXuX+24mu^RHy^0PooTpZGGn4`FGwcgQ6;?i^>OV ztF)_Z=Sp1&Iwg5pEFzH%8Gz82{*X)0G z?cG~-@m880mH{tfx=S#X(sgb7r+&R=aY-s98{NsHd9Dmi%DePD0YJG{`W{2yC?1bp z#4WE-I+WjU<$fXYsdzd(0TY%}pW;Bi$YYWgEP7SiWTqi2m4tB9b z@E-Yor5Z}=1&p6-8R?}uYZ*-*%Nx`iwgj9J%vbfU?h`-e1Oy{i+r7Yp{G}hQTlUn$)~Ut-y>6ysu)1Wip*?y=WAX@kgb}9l zw<-(9sInS1kQC9c+r?RQBw*z!W~wR(%HW}oJV_17D+u7_AvB23n}RcNJsz{$_HR|G*^C5)J#t<<4g{5o6Z#qo>{*pYf3tuX4 zUuOf zUd|ixx7E;Wbk_Bagt<4A{$LxGXc2}v{^8k(ulZE-7UPQd?;ks4UyNG_dM)6vMOyk} z%~MTNjavpCvhunWO{kgIO7PqssH9Zz?j7uJ9fI-0<6e{Nm;9MUjFWF>{h=Ds_;|cC)r6ly6rru_iAUXfB;%W@)W^^t_7#We47wH8 zpx$9mrleii7xU;i+>+?(^N)j;tIv14Av+?%vM@+?!T`i`UjTZ1(OklQ)U-Tnz^6lg z@RqRbm}Q+1HlI}991b1|E)j;-Yv0enI%o^~Dq>~bUNxc39uCJ^ttZGI>>o@8MJ^0v zW+Eh?j=dw*j6!AKkIdqo>2`z9xc%<&61}8;tM_jj$jol_6fcER6wdD0ZLeWMSFBLj zyo$p6@W;y=$J@aBt9o9|q)|N!L?*tdqXqVs5)(D{gUkD0(c0Vw#toD9pf!C zI3tMML47c(i@=$TWFXDf>>Y$5zX(gx9gM~lE$cWRTmEsOFl4feP7tw!@uo+(Qt}TC zXM;C8!9Q;4_5W7Ii0prTMgQtb{wn3RvAi-+LKwkQ`;E-v=*GBl2H_ZC!5JFM)B(_t z!l9D=uajJZ@a?Q)Z-bD2QIf$9@|8pwXUyy&;l#f2Aw^NnMipN?e}%){1{^|A1+{|u?KPeXcTeU-ZMBb6_1yf-kbibsv)e6f|8BP2hAXUjh8^3j@B zrTNK+(=vlHZ+@%#Gu~py1ud&Fz7s&ZqWJ`>>~`(96)Ls?f`@ zr`ph*Fc0DWDY0ka{*PkM(*4z9&*J^|V$bsZmtxOC{X}BVBK?A5&occms0v|E&7r?T zpQ=Mk#Q4ZaPXj{>k*PHliO|6J)ltLVNEE8p)3|jrGu_4o1tr_>tXIJ9U(g}03ws8phzzV&OYkCBODfhF<_77V!#oI z4tQkF?4bc7@A|Mz?k2Dh_Li9NMQWRRL)a%=!^w|vg($FQCSHrZUH+yxq(t7f$PK1k zqXPANhD`aw4S_Mt-kA1r*X$iqgG)fdp$t=RDEp*qxel4Z$Io|AZ?G})H3?9#cgW-! z+CJr4Wu0VC!6PJ6aIcT$wYTA0UD>zV1clvB$U`Xs2q$7ATr<)TNUOjK-VbGgR+5|| z=WThmSWJHLCZ%Ei(-&PLTK$Y9?kmaJILn!=vEij)+|{fGS5~3I1r>6weqvkF5ZHzw zvy-@K4)&Sk#VCt*(?KaWQ*KRuLWMP}oV;M3JB;ei*uv=IpJ$3WmaBOj0gMy!RAKer zu;vn^1WWWuQP7?sGXB;q%P>Z{Mp9-{b!hcRE{{)N=voq}#sXMHm`^m_c`PmPq)MtZ za!UYFXD4C}9Rze)HTNya$R~Q0-%@9carfKv8j)6T>yOaV=>m#I(jzvLTTkSy4sOm( z!TZFsuqq+(&fh5lr zrO28lWbaO)PIOebg|kx7XfN_tidtVj)aXuO@xR^VAfl{>HcdoYL6W=KX4OMLuy?dh zx^yVix3yB2K^G^liU1pEV$w%T!oTUXl;8Ltv!QE!Ih0HJj)tYhoS|4^R}-l`KWKZX z#PG%`?LC^KaM#x+t{s|nf-RBqYD}~QSb2eXla2IzMhpi*j!PHkzj)lBE#{>}8BA5+ z+^Hf-Ai6rqSF5yTt;Q_b2HAPd#PRMy#`RLd6H!*At2hdHP4ZL(a-=5R4Y&nuVqP2! zx-#s8s=R23w@9R}X_j>Pj!rbCx=py;9WrupE0Y_xb?(y)y_$#K=h2pPO1s-o=iCfG=u zN|~0>l+Qdvd{bZ2i=54TgXq7Bk|k?bm8zO^ z_C`r_j;-5q{#XNM!?327`b<2=;FzIyMnV;xg*ozhdaZq0aL)95h=W#Q6-%! z5cnXo{H&BV{H%0Q&N8S%+(EX?8-=}ZxeAmmBxm2k6Ie0Xjaj8+f$?FfE^pOAcT!Pz zQ&HDHFTEoVslX!r6MwK>g`Xa*Z9>;mFd$pv7SLo`)59JuSD*o`QZDyMS(xkcz_edJ z7hS82owsxAy{uMz27Vu`dAQ;Ub?gvoME)1INGl&00GovSM%FqdS z3WtqWRp@>s?&(&}){dF7!x#@NSvu^yoAi#%PQ$K|T@Dw|Bccluu|V6^U`*8@#rG!# zkP@$l!tPLxW7`eV?r^Xnx)X=KFV(OU^1O%)P$ev@D5O(IFE|Zv=VPC! zUi-9#t^bTL&^*{kpI3VkEeUo-b$ZCyF4f}m6iZm^PLt~qYDq5f*~dW)}6-`5NjB(oPN74 zd9&v9Y*huWtxC|B_d}Is(IK2yuib#p2fYE-0I_i1z}Vdn5#b>*{uAQ_BLd9+Vx0`e z9!jvB5cI zb`nObU|ElE#*eK3KqB+D9h~vrkVsSXzeBw+|3`E67hfzmc1*rk5e58Pg|Vn;y>kl< ziSkQWl#S4vHzO_LO#gvpnTMn;e1rIwv=M0-xxg1>(@c(j56zl1Zr0lgL8{+>9zXCj znc565C)O4bgBuWF#e$*P0qN5GVj`$%O#5tKjl}wR>HxLU_vwZuMt~=%rQnk0U}Mhm z!R6f#OYJ?=wWmnn&hTq44xf!XK7CG)Z7p|(sZPungMOc#)+ogT57dTj$#P5XUd&f` zkveX_er>%eGsU&ua{_Tbkx7&)AJp}Xhte^*kilT05Rp1rtDDb9ccWZ%b2mlUk@UQL zqp{n4dAI$sF|WH0&DHMX{lDE=q><@(qC zlZy0E72R~X!8OzX<`~w7f%jbM(?W?bJT-a81fvR&WjuCcX}#oC+9_Ju$^I0 z>)!CfWRm-FGL84~SInD=<+?}&*>=l7ZNFoNaT?iIBeX_Z+SHqFroFtNwh)%d&p~p( zEVeshV03OBq3Q*&9D9c3bna*RDZpWeHxI-YEc5AEP&3$ZbxPWnKXMJ!25XoHawNb- zDy>+Ds`F9ECcD02;w0de!wc%yel3PzlKdM*-~l0XV$Lf6$aZ7WN_z%{Fe3OQn#GA< zFw*p=aDV!7ndAGYNk^=9>ZV1p43_$~kDNhkQ;@q)T8}GZleb^W?N<2YOyc^OXriO< ztlP8*E5=RdqxEV=w`0_bFP;yQ^8~IiZAU=xm74$t20#xRr#!*vv14W{h`cH*qo2mQ zl;sjJYs@ZY=heP`fH&|HjD7 z<`d1V?(Us~#*xiRMG*`HYocmkSly@>dAwqU3DLH@BJkN-gc?s&_QmcPvr_P@yyGbejnWqW%UavRUj z#`d-ju76;o|6GvU{)<8oxf&9abWAE)u{~`^7l6@5i=eiyFl(6>Kc479+Vn39fh=}_ z-9?ty#aVWE1nmXK2Vl5(I!9BYAlNe zxy62;rY+zFJUgOl5aJkrrW|`@jh8BakuuuV4tTL>1jz9zRNnFWViP0|lY$|E8l?+L zLzJr8AcE?d?jnq5WNVX7@-8_XUB?wl5OkXJiU`PluZAJR3O}RU&qs+uEQuAS&07Df)(qg_5dm^L!z>BYl=G20d$E z0f&)~vpv42KJopY26a!(vO>c;wRqgPUby6p^ZoDLewnQO4L502K2IpkSyp3SkO~5~8n}0h)QYCggo3 zGh9=mnbnv)O zheMXLGc8ks@aK29mfwgCx(zt1cJ^F{tQS-|(a#wU_!2*DFh97^?uTv%thE~-x15r} ze#}9nxq}gL%)KxMU&NZTc;Zw4AQsmgZB)GRz`YJ)WdjQjF0H8Glr;0nhHm_{kI~Al zV+*eiGGtSSXKRSP4dlY)L!FW-3RfG80!p)Hn}~Z0AT<)v7QKx9AV-ax<|47iA&9UW zYY|$+tPxA9Ef=bO5hJ4hY){>#*i(v>h;5K#b;DdjxIZ7B=bPIxDo~^`WHu>KsK7AF zetAqFc8OlJ#O?~V9mPub`{OHT|MX#y;q5E`Lksgi|G54;M_$a%)z;L>@Q)j(e=NY0 z-t0@zC2)L`iH(!R4)o|sExwY3(phw}En=a3wS6}xhI?Y005Ei{$K%9+@HQ+8en74mHeWBoQytIK7ufuqbb$2t%eoTAhNO-LF^ZP~ciPzUG)ud(g3af7o zaLKA;{1m%G295y=7(ONLu!5(6T?S9_JG|gi04GkD`IG;S1UToJy3g3xMtm6=hU#TG zVCZEzoa%WQEKlP3QrbrYq~N0KpJVa%0EL#A*a*kSLYJ5_@sXj+d_$QUr5*yNJ++za zdMQ&T+mZY<0U>PAX2vQ-6|h)2=!i2!kGP0SaMPlo?q&us0}vgBLXUz&;ZfBc;L(M3 zFnUpXF-R-B{fo9)vQ?OZQ!r%7Dhyx)g)I>DdSV0UJT!YMJd}E@aTKq3Ch0t&$PhOB z5fL^~@h(Y=w)r7m-@(J^hgIA6P=MZNkfE;@7UQO;f!YBK3Ggx&#S5}JtZeLdK-d`G zHq&w`J16a!3f=UTw1p_q7~3Ma_9euM5@k(^2%t{XF)&22%i#7iJW|i$Ou(Lv042se zVHO@dB)g~mqm%hM+AoG4Qtgx}y}`B$5v}-X+u&oNp~VUEo)Q*ji73tF0=JA6jAnL2 z`|S=h6Yi6F&y(1l|3lh4M%lV8+kz`?+qSXNwr$(CSK3%<+qP}nwr%IC+~?eV-#gXn z?OWBVwV6L=%lwgZ#`t3Ni0IM#CGNTDGEw=x5@C~fZ^t6H`h3)KuAM&Wn<3HxB!ZC2 z{#qZFR0P>(uU_pFh7IhU!vmnQ=oJl)NhDgJ z(&Wqq=}mT$+=g+9nZyd}nx`B|Lj7`ZPhA$2{iokMziUXQuj_#O0OK^-Oz(m5kf=PD z+LHkn8vMrFy`wHbAfM|<7lBkcD=D(jNkh!4i`bR~f*zl;aig8Uh(`icmZI-*wcV5$ zPRwp20!Ka7I5u2e#QdH7bSPqeNUjL!GZ#@HU!k*k1mf}Z#taf$MW4!qPjL|QhoLDU zT-pT`x11V<`be=N8BL_*LiC%_jp8gbNdS0f9oY-!tF^@-RgN|!d4`$o6^nOoS{sc_ zRhDlNL#(S{N#bs3Vq!K|j+Q+IXRE+%siA+6hNt7_f0laL!C@3pzd|^|4 z95o+Hm|O&qF*%R-T44co8)77FrOC}eY|u(R@X+_GkaBd5%k$Q4oSAKX#n^eiM^sFt^Vc2QBq(k2=nTkXLf_x3C0BX!JoNVVDE z<6(Ii@#KLv>Ueg|lDP+N=eD3^}boYfJqCJ9SX->beKp zg@#|FhbW>Xaw^{$^|9gBE|Du_1`x2>egzDz<`=-Fw|n9yd*V79p+180tlT*l?3BSf zcG@w#mcT0wbFhSMu0ATKh{n~-X%wsG)dzo4;vVHHc%2eiYrF=d9A1$eud=wdT3{MS z$dTfLoAi82?j}dVM*tP{`jtR~%L70df^4B#@?BS!Lq32~eD%Spvz3i~OvbQZI#oy_ z0{Q@f7#03z;k|=Xj+sw@S(YW7eS44af{0+3djkYysc+uYU<~Sxq{HoU3rdA zT+{i>%fIrmL|j3(==TgI6zZSyF~NTT+5asc6RYT3IUE1IhClfi?=@(e*nDouY;A4n ztr_W!2;Hf?1tCaaR=D6@oFjq49Pm_Vz|;o5F zG{#!z;~G6x3L0bFSzK>RIGKO04^E+DtR2bzi4nrhZzg&LR}n_U=F<(dQSN6!LM-9= zGMx-kzm`~x+))U@%b2!%Q$o3g)bqA1F=DvGd5Nluy+p|Vul+vND!k#b&*!v!1~^4O z#XG+&;3yTMciz;+k%^oN#S6WFGT2O5M_6*0Ejf=|80jLjqhuTb%@Wj{p?l1+k=se# z21!Tfv8f$5@sD1_p>fOMb=py5KdqzwW~P2GQET?!vi$ybEdnkKg@&*PBkZ{|dw3 z)kBohzX@SUfXldG36O+&a)$$5qX1omD2Ih5;_eK}k$BaY{$R_SM{TAvzY1dwh-1H9 zImq|13&$j*d|FaBS5r;1Qa4-ic)NXo=%bGHwcv=5hAQccn7QWYi}iK-{ey*JBr%hI zaxLCa0|E*9g^JEZ>EqzER1ihVCVCMBuPbh$Ki`uT)U(z)tobJ|ul?WxWRPI#Uhb@We+ALzo-!FeO8bndJjb<$*g#L6PZxbqTM#O_O@lW8%IgrrS#lApAXY|*D z>B9m8I@BUUzIEhJtIpoGC?OmmUAxoY{urMuzA|$?@S_j~F}wA^xP;spU(r=SPVjEq z`jnj^SxP2wou%GdALw=*AUD27;1fBQpZWcx|H9d-%&eSI-xxddAE`M19}fE8b6W*z z+wX$RJDqKHp+y>VZB8ynPU>6!j8Zfl9xt!h2U`JUc74r?3e1#s*MnasK>j3-NugEe&gV~oiZ_dU?!atSq2kqjs+sM zO0GW#DmvNAMa$6=tqw+8#nuwl1_YOkZqjk&p^6R8i)yibokFbeUJfl>-P&Js5w&3r zqK%QZc;p_c?}Bar49$Z)9dz8WDW6%aF|0t2NXZ+iWQ5D0HvK>)p2?-EE=$@cq_HU} zhyWFQ=2389vIJ#RN8_KO_GnMDf|E&-s}oLyFNjFY6&2xKv!oY>5%&2u5CG@Z=B2 z2j4*I#+u>HR*~N=P-PVFT-P~d;i68FR=%r)g-ttsmWM+ON?HhFRDiH8_n%v4&Y(4B zR0ct@02%GHc*IJd@=qi$$NejW49;wMcfHOJm}BAox1dr%C9EZc3%H#nf{Hy>DX)p3 z8opX70sK-+;jz|?;O5v%LiijD3XMyN z_}?vug$9^qg<{m!h$Z~wYt5r31B>3HtH~`mJqGJoW|A0A|&G4V@| zUk;}(n5Ml`J+HT3kGpxZ08{)9Uc&b|M1u@74deGMqiLekv76btc3-mg!C-sk4{O*g zK2Q2zeI5+!@HnO@Z~Z`nBZFx(=4S#D5Wf{lm>>EU#P^B4-deh& zXp*kZkq=}QIu*gK(6d~g$n?69GZ(`ih)?t_bSW=#WTumlOOzwAW&}NNB-lkrU-pgRClNR9+8t#!SSG7e>h5@bI8}=h9 zg*@=eL4-KRmDlKf2=~}@@1Zw&<;U-DyIw3|fNFBGNT56GwZ@2Lh%??Tqnfjk25u-O ztl%vf|80fnqAg;-L*c7G0{g9_zx9+5A+Xc#bPUuvX7>i75RGFx+00$n;3m6O#{3px47#F9ON-*%b@q`MkD;h1PGnc()K zfDlNN?P+@Y&h-c-(Q^vifUZv4oK~fu9A4$&11$&ebK%HX0cBopkeTDDu9nqgh~o)J z@Xq-cXz<3lf-c{ri#yRKM)2)a8&+SKas-ZrsnmRdYQPtITQH)9+5CH~+M}4`*c-@^rcwxQD6WR;oZ_$CVy!V2ySvls5fV^y z*D}9a-QV7UyOR@!k%$g?e$OrpHHn+Or=VM_gSVB?m($EQSJ&vjUcey^tI9WVRFsJI z{wVZB;wF#NOhXBs7dd;K*>*HWR8``1e42WkL5R$ylA%jq>+Lm1H?{RTy?u1Jx4iKF z^@P9FD&GWu(|E+e{t15a{?8ETzn}2`Meg|z$DgRbN%Do<9@ukB&2yA5bxY@s4oS8} z0|V$cl2D{SiND47hx5Q(Jtv)Ga=ImubP%KH{zW_9^ap4p{`@A&Gfi_b)z|a>@_vKV z!;l0m@dE=r1GNHz0g?uy0g8d7r!N*>1?Ha>LM1_B_a56X3$j#ekQ;=7dX}%ffrmoH z)*>63XG`QFNNL8}49F$Zri(6Yr<@BVlLD2iy(=bLa-^g2Mx~cDnclNDCs>Q!1O4YY{7*CVp7M)6 zsCuhY7>wlLUjKmX+t+Rrpe{`GyC%={zo^8e3K`!7`DtgtSFB#*3JjKk)HeFD;o zTtOba0!6>XTFF3JD~pUM$$aNx;t?L;Sn5cym;D0LVUf4^qUSX?5QF&KK&(O;Kau7A zv}Ib!O?AF}UA_Hdqt`n6XS61^aWtf8;`hZ8&_ALFSx<>hTP{XaEWpn{2z*D$R)?9y zP`wL^`tu}Z-i`_4XNB3y0AjyYYn?ZFbl@)db^5=t<$WIWh44;ir7ZaM!iiF2c@%_j-Lk81z`ub}aNOna;%+ zpHS1ab#Rg$u%OHO(}B!I8siF5k)Wa^T0KLFH7_jnYD4_!sS9z1D$OisJ3D~~_i>8b z;kg&pPMT?2qDm`tg`c$?^=v-vq8YaKS;hhiOet9MBPHm6P;`u!x;g za_Aq;vq^q5*zcEiw~6`;p`9Zxg|{Qn`Fv{fOivX;RBb~sfk@+0I!ZozCLrpB3u7d&dlHezPwC{g$<$gT82G{NT4ZX04-?{m z<5Cp$kYy|Yq> zACDgC|D5Ii#=Y{|l7QdpiTle-O^2dM-U@IE7IS&kBJi=YCU6on`xhKzBUcrX_41!( z9^&MoS?}_*6`&BW4s^#8?8iDs-z%oxKS~Uz`FeYj{H%dEL0zQbD^f!HnPYqEf}mCM zSpxO4k&Fwb4lkCqN+o0u;}UIY`xEJDDV$OQ}7XRo47sfnMJnUHUo zm1Fkq_OHk{ApwtNX*R1B5W;`TAzPLZly)cM7sbGj8`b*#jH<&_X2x6QcD;je_>6w} zRz@g210Je3fmm{uK8-FF)IDBquJ#-tr9z_ar2c)BFF*46ul>_U&O~j+?+o$wkM%gg ze}qZU!Pe1HZ`I%&q=b#8Z8BMOsGr5?PNFF@zXTx~!EJET3yMd1qVZF z8d`uF1htTmH1@O#HWP#*D6mdrK254RMI|qkn`?uDk*tBSPme2do<4>91iK@9$oSfL z%2?`jWoAku=?#mX>a^{0-R|6OzwY9k+x~iyq1AUy{2~80-*E%cUUL8k!8W3W%7A|$FO&q~S!e_8Hae6y;w1vD5&bR?Hl)L> zmrM=19$nu)W3X5)L+{ocwODOpq@=e3n)j(bB>`bT95p+3bddq$k!{34Mg$zslwr&u za!?;NJ7Lxrh%xO3I%2vuB`&v)7e!PpvOXng7FxRK_q+Olaf3lO9G2Zeh=^3pONGB` ztX{0)Eq27Qx|hzkmI@4Nb?r-%|MgBfq|Wd%iWgp+Ki*D*Ki=JmDAyaqR2^IK4vdl7 z0gBcD2uQN~APOpPzdOjXn^WdsdWQ?HI0)-+g&R~u*4qmIZKCoWxQhqv4EY;hvMoXW z-t6BhH#|-NQ%}(Z0FReA{ib`zd)#4e7FDKJXOS$K+sd#p$Mqf-(K}JV$3^>LZn6Z` zWFB$19}nhfr|fx?=EtrWJTVw|fj?B=;la%CmG>;j6Uo-8SA&;iS8_Qq=s;6t$Pj_g zPL*Wqe#gj?FvpK=`Ddjtbo_qLEmPX$;x}4bqY6-pYHuymj~!797XLllLlnsaye`*x zIE?GB2-~dETkfgWEX@R=d|&tdN2@G?i;-jQ8ZQt-vQthj85b-{?|K(TuCAuTIle~< z8)?yX1>%iw2acIIT4srkvlQHmxR=p48oB9^71iyo=|9Z%IC6_0K5PK8033JLlCx$@ z*q)5%TQ?YJ((|ox3d1j1o+$9?D~cOt1so*CWp4N(z*WYTqf(P+og|>H_lyUR`_-*Q z(v1raW0&>!Z(cW)x=blEr=AlOcNh0YR=)E4!TJC{LiSfXaAi|K0S|7S2skTo7E-k) z-FSFDFT}VEWr3Vty?<$e%$ck^e;JvC1!H>=k~bDscmb@s|8!klRoETlfO*bK)>-m-Tih#jW$W}XM?PrI$*oR(Yb)Jmd_+;yWqCX= zDr#=p9gR@^?dw}Tqljbv6*_LF-gmV=BuGQUZHQ?_JV|;rqHWbB3oBK&~DJu6Tff)c)tX2p+Xz`inOmfq?WjRwPc zhSwJOL&(EoWk`#KRm)Hu6(wR&B{Map7|-xb*haexlIU~{=@9JWD{{;8#BK+ni26;2 z>4Ysi8&dZamSu=oxy@L0)}{ya#S1}bbo1TApV7wgxy@E{k1{d3>s zN^~!6&ulX;Y{7qOi&}>+D8C3s5jCwI8Xd7q6KwjBOKC8}!7B(x)Hn2_HXK$D378n7=mr^Al%}3btLPR^1l*2X5HwszPV_ncJyW~7wf6+wnx%O_ve>5 zJ+$GVNzl|-Y7BDpH7r381qz{tl)~Mo%ynYL3^A?DDzW;Z$yD0G3a$42wylTu?$(VL zSj)3uiQN>zQQHGeDgru440bKUl`6VWx`-6+kJ6wwf?K3|sH*Vw4Y3;R#?!{@&bI=E9C1m|H3lk~Cao16nxyha`jK2ee4Q3zVj zrV|4{ofhW9{uJ&bPhau!yM2IjCcq5%_!mEk{Aedb{~KH~{9`}!KdGLAws!7+gGyyh zS4?H(FHlgK6saq5O)I21P^x6+loDxagNolG^0bt>u>OZA?u6H@m`<5o+g@LZLERt)Ek!QG_ z5weBO5GAA(=k`$4=BFy3(Wmtj%F^+V#jiyPaL1*lV;qn!P8~iJnG!qiVrd64Q zy6Q5g*n0Ht9(A>A@Ytzz@fvAvvJTwPgU6fJc0S?Svd6%HM+(+`uK7+#Aj@ zDV!AzBdI{ov)M(~aK_)yzmvRw=_(=B|KWg{#rFR?j1{~W&!HvFY56Gh# zbpqWX`Gq#v3~IJ?c>>5%;9Bmku@_0MqMBs+xy#~*7fza{aP}h$yGhnMZnX56ncreJ z>+VclL9Aeqx|q6?#AupN8ME+5lAdx0!57u~Vpz?k4M>0MsMSWPyI~yOz~Mq#Ln3dw zoZ1rkQf{3)xr^CEx3Dq9Y=_j6M;y=j0aUA_Mra+8C8>tOmq)!{V%GrG?H z*^D)sXdeBt?M$`pUo6e|(%J%#;T5TBwI57X8}jGU>1?Yg(GnGZtl6Mj@2){~0-;Ww z^>n`bU-V;*tRT<5??!>dKej~wQyt`AN#eh={C_k)gZ^e3OAgagH7ElkSMF)N15oco zh{J@bh>J~U-=Y#U6ZmUt0J*ZG#PbyUO=4KYGPKO$3k>!Be)lYM%;5Kk7= z+m+w|Q5MLQ`r1IQ{wRY}oc;)dPdP96s_IRRoOcB`zlx=I90YJzCIy^*%SIKNC_Xj1(Dl{SC-zy&+7vMom!tI*BHz5Yb}>u)v(xzT)=XsFG4o4Fus9X~rLJxABLzn;I*P`Vz9nt!tsEA#T z!|$IN9o!=LMarmNH|Jf(m9q}|7@q)jI3`;&^aMfbDjU0^`37kD;~m+{*4?+%HsxEw z?hT0m16M&x9@K<9PI4hySP1^Dh{_GBxS9ninMAR&cPb&%o zv8^_J7}IS_Zv(?Bbtg~hMiSD(d5hW+3pDY*{g&H$(V;Zwp+{zU=+Z;45GOe^=Y+q7 zg(DOg!gWrv7at+I8ZKq5qxq11Q@dy`!M875vqwbdomqRqYIEE}FtKLkX|~Yi0xd3` zXG2yOZ);cHUeiZ6BT>Mq+DI@u+0T@55-3pGqU<+oj=1u{7;7d?BTV9o+qSWm<#Bpq z5R;k^tWPbQ5vwfO8zI`lc%x7z0V6DWJ~8*-wT9cXFI?m=>%i*X(xAJ6EoX*yr#~=D ztgkM99fe7x4?7Noo*yNv;EZ>#H=d>}Atk!9b0o-}18T~}Jl8^x2`{RyKu#537jRAQA zR`n~LAt41bw~ z7Z-2C?xs@)wsz7m!PQb@^c7nQ?~V;fVPf<*p?Zu)jE!X=^DQiGXrgJFud2wz&;?;t z@mi>TAx&q>&usqjA;JdDFxX1QwlR9M$>4BvW29#8wtFT7k~$wD&quQ&bM678wUc}y z&uPj|%CZAPOe6Tr*l7I&4+}QguP6kJ;&fTkVu~15)IWaT!7LG=ZDgU!T zu(dHUH+B9urB>0&)2SGSpVOYE}zd@JDp1c-`J9 z(ZPQ^7%bNzB8jsS`XuJ%k-q@=B(S9?TUH1 zfQqYO1~ady`}4!dpi)3&DkShvez$(Y02I|id=P8)sf4@Q#y!?Jv> z$h*X>MSRLac^-9jGs>_5w&F;RFZKy!86@%}gHEiMzdITldmZ#MFiH3~CD5DiEeSE$ zzRyW&jhN<(@~4jk4)FunnfSSqxl7wypw(j*wfj@#1kv207okjK`xgjHCn&l<#HsKIeiC5V~2l7w@?GZ3u|#UJC>%pVT-Lcj&1dK zgpjz?O6)YYgA6Aa=rBaBp(;CMU8hUJNL+ruxG$=N-_}EpDw~JEd=hRi$SOZbpRtCA zZUSJZIlD#<%|p>ay1T|`T}P8KkI!zm?eXM9dMYc^b!FV}cFVKRj}jJ|njJ={s)ij( zC>3>jt6m={5o$KQ-hI@MP!QX?9SW!|tKN0$7Yrz$N&kM-k0Ow6!`^H4n`hLI0FXas zz1J?FB36Vr%B;vZ87Ea3 zH%gjnB3Z;9XI^DQ883BDJnuDHprKDNRqv1EV+sQHu?0!%wglOD14gy*Ef`V*`(+gb zb3+G6-PkAMHU){}mW#3lIIX$+qeCw!;3f|mZN~}&wQt&3El|=(4Vss%VFmqYqy|A5gQd6HXa%}EK_BXT zeQc&@W&~*+y@}~UZ)MaDK@h2b5IUKjxxd>vf|LCLiGl! zMYVT+rE({^R;HJeA!kRmR-u=mLjH!jiLrsojjl?SeiZ3hKf)hQFT@{i7Z(IiM7me> z=C^;$9s-EyO@V(*u4J!mZoGb`e~e+H|Ms8*NcLcf|FnL+|MWgAh;B~=$_JBd$G`+# zJ%9C%3CJIRZ^$ngLC7zh?dTuiES{=t=&;5_)@_}f^uK*5>YhOaZpi_w1X3C;%w^f? z8h8<}mI-U)CBvA9cddB#@NPW)zvQY-U5^nesZ_EhZK8w$b9D%Hf0GUy`sI-2Jz9`) zd4ANUphC=6#GB-6f8}foMu3US<73}FSP;-4p4>6N3Bug+)p&{$Z-{n`N4Wucd*7yX zGnKff0nM%~XjN)V$Y?o+oeMQE9i2jl7z#KgcW0k~z?!!Ae1ex5HmUeA&<_WXDXO zlf_Qm&Edg0D& zsg;3dn#HgA$0V^a=4jl>_jVh56Hll=wV_;u8AIeHm{^?hXJ^vL%cfnM)bX z7T!YHxub%kKrL7Q)+cEqhTPDgNik~P6J6g%!ZxGfebo@#bz~E%XdNX|qda6Eq$q6d zoSPq%<7?Sab4#KKmk5nTGyoAufjbxbbinG&fyS^J(7lzEsN>X+UQWL7n69>X)u&_+Hg3rvPoD$Zn)&E+*5Xxm5Y6*IgXMS@%F4+4BiZe!t2|Cg!zox`}E+-JneF( z#3{pz=Au3hNGv7avI>a+NSUk{vV#!?*8~DQH zV&aHj&^YkU(I|$ME)Y)Ex|MiB3oiHy$SO$I5GaV*J-x8~JOh@n)SqCicnQX&og#WE zGd7P1UWfbhxNH@kC)fF!$kyEE^q@0j@HlcBh&0(a7KCXylFY*&(u z&8sK?hTjHem`EEF4MVv6=g~EXgvO&B+LfibMZR`n`lVGs;ApOiO-Rvr8G0Fp1-b>s znVI+);Tmxtq<1@zMuI|UJk^4f z(!&al0Y)L!d7EI_2~y)Zxq$uhNmO9RHRSUnlq$)Z&o3@94y#R#1}empm>{B3pEI&g z6AnE?vR90-K%xennBSBqhbf8hEGFfRi2ANZp7dpf!x^>-*34Vwk0JR03ba~@VRJH! z0ACQp8(0v-6!=9yUUlG4On`u9FG~}l0D%IHhjc#=Y+O8r$Z=E;8{S*7Sb`JQXx94V z71npfUfe8>kEL&BZRzt>@h&ywpdN={SrtM*5nxs5rQV>-_D8C_8aj9gbxogUy-A5z z3;}A(3a`!9s3|t^BnLalD@0xF+2+n~pWnsT1bcG@BFwxn=BpizG`@G;aXVwJ#vc&Y z_8FKizw|N`eI05fBjR%MVp?oY8ijsYOD8g@r`gD0=%O9SUG!4PIM@stUWf#;ggMKz z+|YOG2<1y^qD3W)q!i>pbgj$=s@wjSaKXxdbezhvM=q;VrwCsuzAP=EnL6{v$SgIR zwTUthM9#ZiHjz-xM8BG6gj6UVUs+D8t!^~bExr5xl&K-~zc!#ZgVTXT&3j1{nYGVS z6(6rg6YW&9G6H^u7ECvN_ymr%uvc}?qvxFrbFCjshLUw(dSvvz!{0xOupj1dw zW7F1f;39sb8ccQI#yx}1Hp5aTgt2S7y4sa*lcyLy{n##l4D~9Y;?1UXvFUWl4;ZU* zy=|jdX<@EwHw+K6uvDV;9$Do))j}Ma{`p~&e}eAS5VeatUxOy?v7k_%`av#YCo`q@ z91@BNw^~kF+^hK$X6wxSW=T506=w7B{-AOyyOH$Q(%Ogm`JHKIu%_j`sdh5&xkq3) zm-_2Uy&`SJWc;rS>p+s_L%LLLUuuo`?h>CE{n9b6!Uw@j;idx$#@^H^O3XXuSdOXT z=d@EH_lrzllJfh62`zvkB#O>}`Vs7Wyy~F``haexJgVImTM&+e;a|KnA>(caLy`Gw z;`)M3bqmwFh8LKhXE{j57p!1Py`XB)KS=3sb(7~x{QgWOW!;C~p||~D5U~|a4ah3j z>N*P1aus}@lsl_Kffc;KozV(<=6l9>a&EyZqPUEF-v#rvIjjM`sKAtkPvQgEt*1vb z5yaq%xGrjDr2n2e0%J`DNUfRwAn#QmA5^usw$Nw7$(sR}vx^_+2G0cPw|l4eYBE+0 zvX()_^ga}{JEr%VI{q1hj4eM2;Wo@(a)Ww%vgSCmo4Ak{>o2)T$gumQ;pRjWQz5Q) zsYp|%oEW^5$z!VzSY_B&F?ZsDi*kPgs<3xY$-)k??p9kJIw&C`Rb58%X29f5jGA6J zh0VZSIE9RK-dV_n7_mBFP*^6NNrIYAfU0?&SvfU>mfoMgVBlz7A77J+_FkrDwH10w z>6|sAzMnZwRGX3(2${{Hs~oa}ncXavt(%inc;vkWWhH^=Qj=8;!5twYMe7{9bMJw6 zFLt6%_&}|a49*Sp_*!_@*N_EeT`0aX>d{5}K#kW+ws`1o+r2zRlxrF^W2mYM&OQF{ zns`>%kfq$TN31pAF$K;&h0ww8eCE>bM*PqcgqwVZ>Vf^{)p{m&URpCLA%Jw=DtU4n zsaJW1;Du{T5)+t3+2{aFCr5>JQ{}kxpmKk*Sy2`&dW{k6_p_19gKm0>BzLY@rTnL( zWk{}UrDA#TjyKQs8E{8-@p1|C+YhMf!`Ue6j%ZQ5gVjf_x8F6BmQ<2`gI4P~HP-#$ z8znaIP3)am?!;E>#9rU;5P6o)@6#9G7CNl2=r_^=J+d__rZD_9J2V#_#a9L_x_|qY z$JMMB)1v#&L$vr?ucZZg^EgMf32&BFWwzUZU){41=WZ5{Sp;xsYL`_hjW13L+Wko- zuDC133f>t2GB_BG%t)QRn=q3%VWwlE9F3gd8bfwPNaW;0LHl_HF#hTs9E-B%M3?Rm6X*${VoAFKOfgA{gvPO}FTqpxHt4?G?|>qRNq5GnvsZ<-jt!A#$n zOnVrC9Dj)?2HV{9_oWatRGqHc*SPuP?BEC7RWZbz-~vm1P;SW_8D@Pd=dES^V4=-6 zWZnLsZvu}4BY@+M@3hXvlI$qc3cxA`?^?v3 z&-7lTs%P-x-Vi`-3GrUXhmxC3ui|C|rQrl(=%KIT7wc}Nv`rZmM}sAc4R2aD8kDJ2 zIr3b1gG6mT652Tf!cnGl@6Oe|gx-3GzcdTRmChLNTO-G{8vu@{`dp=Y^1(_9918`B zy{Vqg=0r#6c*N7q!0>oLf?Q$xVqw4Wra4~x&OJ=;2>uJw%`NbTP_J~K2BG(yiFgmi z+^;ba(e+Z`4J)cTeLx-#=hJ-KIPJmnU|$ zIA2au2Ydkn&Zx~c!e$?ol+3x`z9FEyjJf@(ROlp7UH+oZy_X&m?7}0V+z^^0&2$Q~ zmf{%B1^ND!7`7qQD%d&g{q}3uvIcUh?pPEFr>pz4xE-j zyZoCAi*H@Y@_CJ~T7ox|7uHiz8;i)TX!h;2=eZ*c&N_&wcU$sj8w}%2;30@JyuiI$ zyOw6V)BF0`Zbb6z7gTdwtrSDeB)f<#dsxUHkdUqI8*b;-B+AdG7OgVXhr$&Ss`crM z(6MP@N?M{-UI^_@D9ZuDfg`5rvsU$&b(2=LllQ2weTNWkSo$GOc+|HjEt=jzhm|~z z!sXRsG*;YTXY?K10NHF{$~sK$f5Z@7VgXPr2y7>~hhnwxQ9XRAc|`NUO6R$SGOzV- z`iKq|16m|mPaz}-!m^qZ)`=w&4QT>ymS7>r>|=>kx1hn;1!bc7(%rHGEbi4`x*%+V zhnRDBsJ*6vGo+80OX&qE5zS3qT9q*`bDNlf`ypPKL&BShw0Bh~FCeRK{GCeE6$*KZ zh7_$oD8l#V?IN=f+)S9?37JQuvoxCnizM;u57z=;T=cy^-nrljVS%{%qi1OyS1 znanPJ`GIV*MPk>*Z&{>MlFscP@-S&jz?f|8T*d+G3f-SCz9KQ@MF9X8*WDmJ>BYtj ze>x8F0>1ewynixsDN`+P>Xk@7Jd=N}BlJ3rqE`e7v6-lddid}}ixB(rZy!6xjIdW6 z#2-JT=>CawK>R;-oBnPls=O*9xg!6eCSEmC4}xD1Y0!}u1Qcq}fK;I(r?F3&47S}zHZ-k?Vk2*@A!57 z^#$g;`7#)#XwxyVPl9`W>y|wX#>I1Rix3mz?$x&s8B@+xb^8)Gtjg7ObW0SI?e;NY zxDmj}wdWT~3O6=;!4HD_*c0&?iLF0D)X5jQ<=JiEVU1PUHgDEfK zAyi9(uiH}pDn6^?E6 zdvOton<6uou&e+^)I&;eHaMMKX}XR^QJyH6i#kT6jbuInCaQoZ&SWo+Qh1G;#)h(O ziEqRDdmvg>RyP?#UYcMm!Jr&1lo%7g3=^5pSL~IsQAIx*EG#)queT7>Wo@y2!?TFc1BbrtH@* zFBjB$Eb64$D}hN=s#IclNT?AgHf;4JGm^u}{0?q4dH|?=mq8f?zXCLx1u9^DwIw6L zFi{PX%0Yz%q4eD1@ODmQt*S)f8k(~tK|{Nm8E1t1)gf#~X!8oHOoDmuUcyW@an)80 z*sD)_)~88TTC0`@+>04JB?BaTGXo6Y{I;JCmKF#YMU>-{>cF0nb`% zTe2iHNlzUfE^koG2}7I({c`Vndvog_$@+fw=CBoT`*W_xNzl~6YL953GbFC#F$kj6M3Ri3}+pB4Qd}>v2CNUU~jj&Fi;V?YZvy(5= z+^?a=PVj3>kSJD_s!xW`C)tce%Y+s&LD<;Q>C%-_fmI&5|&)PN9I!xw8pWO51u&2|fXTcc2Rc(uD}VDgx6CoUfAYsrZ8=1^}sajdAr!>NokpGqKHe?nKRd!{wWG895aVc z>9Q(&s|QZ40W33zKY~1B9fsIh8r|t}R(qeY-SgA31Sx|}U$?2|F4KfF(g6vIQi+0!A_{-Z0YC5 zS`(+!GmH~&rws`0k*0UPwgvGdhXuDQHOOo5sRc)*_GtW;$9QQ2Lo?MkAw}}yBbTjV zFw4i(Anm^nnVAUoB3B#F|1D%k$E?VA_$?(M{*U&jO#kDx@!vcKCkJ!uzxiq3LOYUw z`30HsDi|&{s0;?25QvqVl`Mzj2W5prqFkr9B+;A}S+V4OQFfBM!B2mY-wrxm{rnayy<^Boqazt+mDauKC%rG^0m3N8p zdn;@SN0Ppj#Vh<#DPm7bFcOB;0XX36YAS)x;~+i!D8yQi4A^Ta@p$v{Ax1VRMN1(g z&(!F3rgU>&)pzR#`GX2@sEh-DRY4fZ$Rv!*sg`od4ugzRInPA>qJu79yeAVvKbslO*ijo&~2XPuq@ zJ1O9Q8w>t>V)VZ#0Zz8xhFZpsf5#(8Vf!!BnXjS*+=PH6e{e!xVl=-bw{bYGHjdh}@}wxnP31MC|4zP-t*6Rg`4UfG$=Q`a43v0?74Cp#6147+62ipBVhxd4}ZvFWSB`D9*IoHiFZ*HSX^25Zr^i zySsaEch>}WcMt9oTspWr1W$n5nVIi9Quj=qxmCBS-yi*Z?`P}UYh5viDGF0FWhAA} zv^4(8ymYWMmdA@^LTShEj=VEDRZFuM4i4#wpf^vkd!?X3tF91rlajF9?Hd7NRbxMY zY+|L&X7SQqR#{!}F*(YZ9pk4&Uz*UCN`HdBQpAZ8MW(@(95)^VGU5Q z%a|BqNfQOyaid(=M}Dm7)OX<-Wj4H7L)+r=T* z|Nc#aMZ8S@B%AmP9FU@FtBj_O?q?UMSx+ZTVr5&w;9B812mG>(Sq=%H$06c~6gwNA z+y#hnyU4^NY5FJ?;aL^To#NuPe$= zhAQ5QGYX5B3jM|iQ8>944_f`K2-EC71zXw(8Wta(Tt zK1fu`Rnt1jgcYYcf@VhPYLc9^!rsbA2v#4Pq$-lFg%K12-mw^OGKgceRgIWKb&Dz{ zFar3#rU#%3urP(m115Hq-@^krFENS{RG17mQO>b7`i7x$je-p)8ru#YXDi{9=W(6- zWglH7GT99~_%>&+_?4f`meGrKFv#@w^JwP)%;QK!FhD5fqgkBSgah64s$E(Zht3qo zPz#!_5eNDvd;7e03LEZR0UD$9!}8_Ew(%d$7wwG{RF7U%o(mW`Ov-sXi=rR)585*b zV>fyiG3?4KjClRTAQ0ViKC750P2v~e1n0UOlL%gnt0roP<#j3gk1?%@t&7dx@uGQE zy^D6KSwB;;?9xnmEWa54)p$YAOKaHSX-dE*W}pcowLH`e*lZFz5ACCAgj3<`y*81w z6|93DcHYGg&9&^I05Z5;xi*-NI27-C7ztFWi(N`CBonVxkw=gQ04LC{$x>)3$p)Be zr1#nrTyX0CVopE9xYrLiqp!q8JlI2(Z+7gMvh5rzm?rFF zVwa5@i37iul+9$DDaN4n?{&@Zi!9OqjFoU!)@czF$s^$kbEdRTQxCEJ=0kxC=gNJF zOA?P;HH89L5Uco*!lyz!E9hln3HP#rr+9{#yFF^93>N|8XUU`@R46T~kSP@=pk5E$(*?hrl zFQ2F$$-qv=skNy4HC`K2mFhuEdFwxo%j z4YAb2#$$>L33MmOJ|zmfG27Pmn{YIc%qm31;;^dGAxX3SDbS&Otpipd!f>lBmM$ll>iWa?`D4h#N(ok)ZPdx0k2EO#Hj*~y-pr0_9J`aExq&X zqg1i!c~=lypUraa<4njrdoDVS)A{S1NnNt#$ofl}WF-i# zyShomhD!x7oA8OlwRwGs$ecm`p=~IKVRl5`eLiLg?>?{f*3rfR%dzf*^Bk}8(Htxy z>O{Q-PH1W7v89e9AT&4#+26Y=(`EJZPau2c)I&`cS~UkfE95*Cs5-X zTpN>Z)~t4*?-<||xrZik{&^oOjS)G41I|!)e~Vxg`)3ZRWa?n=YzYQ8S(-YF`~i6S z7e7*n(l@K$&X`oJnPs=ewqUi;td*Kbu{|63fUMZKT+*0Y3?ndQM`3zwW|onYaI8*U z3JG~DcUdsNEA?SOL;u`#3dDLavGwxscm)3m-v*);Wz+1_!W-+ic95<7L2zajRK%6} zr{iqc}oCJUKI^W-I`d-mXrK^ zs;xbroIW2IKe0{!IA!m@-sJ)=`uU%HHC@R|jdb$yN{s|nFwIMNx`rh1CD{*Ei+^z( z8w&_0qzqx_Yx4exK>FRR^}tqQ-Hol+4IO({5Veh=a6vrMh;5+OYs(!QOle0brh{@k zFSs7(Rx5X+0!0s}QFXo)epjucJ>W`*>Xq>^tI=9{{vfN$-r(m23g|KXSX-D%q8#J+ zL)J0svGJ7ec5*3WOSkbIt2E=3i;VJW)M=+j7*aW_MH-NAS(gm zVGnDR3d-stuFbaNSf-jWL}3Kd<<8B{`R_rz2kVblKgQMHm?pFDvhA{?v!SzBT4~JH zR`5{P_bNlcSDw>DN87Y6I>FF_ZVs^i1$lhpj0C_&Vg_ zM}27%)n=gUvwrXXbm`!DMd%UT;eblPg#_@7F)pfS#tTJja z`*F(d*tV=KsL0j3AC0GF^`{mP`IK>rk!MTcO8PsxWrDnT=Wi)&>Lfs0*UUnNG^^n2 zZYT%edHPaX#BSBY=VIy&LKn|PIfv= zWd)tx1s%r}9hHoH3?btgoKPo4uVz$eg)an<(pKM%t-g^GmATX|9mfPKIa?*v&|W0+ z*p_OjJpTyUCKkSpOV{!RTKasr-a{@-i2*S2i*`0~d^l#^M?~>0`3k|Af)E}6Jywpz zlGhOy|MW@rinllvrUfefQH{#4PsQ-l%DvDdS{vUa7ewk>7mVQS~z(>9Cy9w-!B;kf<^O z8RLnoBi69b%q=4)<+!F^3%@1hD!NY0G+Am{xFhuqu?!nZbCQ6Z-Aw3ur2 zm6{Ja??l>ynPpc;`kNKMiejtEninYzQToss!x94btz2t{8C!9k7F^f-1h^J41<~L4v2eKoN)k5A?4-8Kd;5$V;6^F!N_1yhOn=FR$Qa>A zG3AMqiFpBU9%Z;4lZh9qEMYM!;>q5qiyO$JDt;I8bNsh*^@_Y|e3w_y*3ZuaoYjP4 zL-<$3!&{LvD%^Fk?-IyLgeev)V>$rULYa3{4jVtAup@q6`0PMPir zf7^XeB`@MPUQ_CC+pd3ZcV#ezJeX+UUv|$))c}ufjA`juAZ}Cu>=0z_R7a6+E*Wu&CCe7O(ZbK1Z%! zC;8o}{}yu|wVoUwco0_T z1SEPmL~Kf-km2xEMxfpb{C@xEvgtV(w-xhIo4rWja%P3>ivfeKimR*Q&C>lar2e5z|Q2({c7vMNEjiP@`c2l@V9 zJ2{GhvmeNLHgywLuWk4cKf{dqgCJt4aUJM2sB%jp)|3?~XT!rgDE(~M;AJ@zgtSWK z9A1Dwhi+3?&aotrmGj{X5)h5-S|whiV9U`BKP%vD!b|}0RKfNQ z+zkCeMb%-8#tign<8(gfKgi8!15;7Gz-=-tz5~J3q8o63mHw3VR;`3NB7+9lM>8gt z{?#U2rWMr)u?czUn@OqYDz71Mtm^gv(4zI7^d)l`TmAV#%85*=rOA)LNW(>|zvkHX{_vSL%sN(UoL#zK^b{37E`A+(3`vBw0X~WY_fv znj-=h+0(4E59G1hKn+Bl7#VfGrx=rRRr$&51e$g(%- zjEa;a%vDen2cjmg>C}JB6qO~MljOQp>W~kqL+vBykr+uLYr@8LYlQ*%*uNSa6n5bv zKS~11?lZig{j8cPYveQBaxu5}Z zD=xiq8OICxHU&}6bY_mmY^V`}J=C3hj>4kd__@{H-Yakzlpi5<|1>~v@I`45UD{6H z@w*ctbf|v3pttB2tjK+}D|0pG(|lXSd4D$mUZ43fh0+7bUy`x`yVUOw+MnExVrU(( zDG~nGl;Z!ul)sNHz=AIhrcN%NqNZk+c9#D+YsaW)E6;sEe@PYQL?}xQOe?impt2RB z^*{orSfcwN9Fs_=nR^w%>M)L31tX4>p=Vq~ zV)6i3JT(+CX~ zBM6Y-vd_@3;1y(Bexr~a)GOPq){IB1euo#f*nF^0V`z|q_bt2|XLYLb(lQBuvhRX5 znzQ#6dekNa_%y5iSmSsj!dXj8!g&OV1jG5V+qnO+jKD6C(=DTXjP69QWcIP7NhzMz zQ!gI(4#e#(a6@m&py3yjXxHuOGU9f&Ng{Gm%Sj8op~xFP31haIUaL+A(2{R$B&eE7 za#+s<_#@|;*UsN?9m!C zfoCUL7>0m&VP&nd#H8jrc$Jt1Q^kkoz2#|jYkGRx5Vz~Od=)e%_`>e7i&@=!|Q?_FjdCl5J$C*flXi%g_%+!6cp_jY75qm ztMw)&8gImuc;9VD6S=|lbTk$bgcFx4sl4RP2#gZ`z8UwjV%Pl0H z+jyf?R}kG>B%_X^e%ln}iymCb3!mpdeLgHNsef^3lxYn)uB8q}7hgIm6GsRgAr-#p z>e8R-j;2BZwI!bU#!cC5c)OUU)!xe~3!^Z_q+%TpHT3-PcE3TAGfRS-D|)EEOWprq z&1LW4Vg}xG{j0(bQIeBK7ee-JqT{UxoYqr~wIss!RU7Is;(^y(Un6QvV26ySXKZl7 z&ZX?*gru*%T>Ut~{$!s1gXzd{tiLe~8wrV@ z59b4HkSX#nmdLiF;rKX1&^>cxWSnL+vUI>`c4KgN$RK~;ufCx?586J_L$_9Z{ITUK zy7gcfXMZ&9DVpyuaw-%$>Jg`jvAhZJq{cd}RyP4w=4xD~H?g(&mg?6DMF-Nf_kjvJ z>^~EkUXZqxC@~|5R5+4TwO16$&Z@&v&8A<>-{pZ=GGa^_BADi#NcmMW2;_uLlL@xRfz~*Nj}c|{p@V*dk_y}O`QCjROTIn`QG#(M`$#}Vm#RvV)$uD zk&-CP#tsNxzMC)O{X|fF(L@)9sNVsTA=@bZHhC^nj2_6&st99SZQ-ZVSB!%*_qrN& z;^oKESHXEb4%fOpd9HM=`2nZpDznwhjW);1y-bZ|3mKKgq1t5&0-O;{QBniOQ!}cG z(x*jD3hD0&h6<-r7?Nh7@)kLkIr~bWbG~0M8d|QIJJ9m5CoCr*n1(K$Twx@ztjt+; zsI@>``{R8}>Um~$>A66n>60WFKZ#pFBP^6kNnuB+42xjrtLH6?#FAEV?(n~&buRwq$QO|Uv*cspV6u14UrP5Y0SrMg zdARS#K+5|AjiPM?eOyS&^#`q)&gUoGS4hfbw44NkHU4rKy;Xn!i8@z zJ=Wan9&d*yk_nu3aUX!kn-TgkbIsGM&v?#kBZ!lyY?z`;#yft! zpI!s4jH;h>^xep0R1k*-{P>#5NN-+J2(!;KAm60^e)xudi8`4@odjTfB-48|)mM<_ z=zml$w})oNuDkx@*suG%-Oq2uwYe(igHwvm!7N(+eBMxONd$vN>>eXaaN2kJ-uUAW z91ED{hqT(Ur4TXg@%EnIDO|2;$^vx{A;dyo73qSS)qHSF(# zb+P2}Lxr&~OYSGBNQ)F*wT%Y^F#^G|UkGQgqCxl>Ob?B^P28r4e?yzCT@ov&O zd5AqwfuzhV5lWy8s-|nId8t}d@EL*tl}2P8O3s}Y}Yj79z9}iWH6GTdi;hmYiLI~hTJ6qjw$hH zL@sIVqzLFCVG{ofC9mVB_0!$AH>bpj`YNti8gM2e20U$ZXC`-l2t>46X(OhAJ%8wL zdGr6l_8#p0%BD_krcVFPZ+}e=jRn+p77rJ#=B<2SY-RJceN`b)d?F(Zs2_gM4NY=% z&CG*t)io``HK+uBg7+ZewavoV`+DbX_u0JtZT_v#2nO&Kh?w|3F14oygF>$FJX<+B zX^F#>U?FAOFPTh5RtDeg>(Cj-607U~9IDl`|NKMX-t?4kMAD{ZE?xq3K_NbLTr)Q1 z@0A2Ap7ec-$WL1vI_h#T&=W`?=14?=jjuQBFJRyrt|W#A4p@f=OGa1U!1 z#z$k#5X*jpvgz|98X=*x3Jh0`V`C=cs$@;HhK0gz5s_fG~8LeUr{fHhtG)P{LFIsny^@ zOS<6ZnayG=d^hO&NtT8cXo>}`4Yd>P3aF}Pt(dAB%&ZX1HKmwFIi;rVFX#LTLq-eqM zhp6bDv4^bap7DpUX#e&vM&JYKU>%LnT6kK6)>>3fmd;Ee^Kd56Zl4vPy%tl1p|YPC zGQ^`Ikfc*QAbN?GYRDR+)gkB|q`jg-U>fZ%_n<>VAY7+h0IpDIKR^*Og=@qiy|)|B zj0wZzk|>rc^lEFn9|Au6)IpJ(e2z(7YD7UTDCrU;VWTV6PT#r_)Q*DNQ^jfl=8@ zi|%nH9kNV`VdNi7tQc6-DmKX9n)9a^J957Sw!qM(V`ztp50t)&BV)fWz|tpTYaD>Y z6wT}tvLzInL^Gsm|L(pbeZZEcd+ZXXzW@-o)kRZ$X%`yD*X6%G*X4 z__B=)n0u&=q`Z{Ekl*&D$?fA+$u?u0-u#HsGvtWTV;Hq@4Z64l|1(cHxTMDLH-Mhr zvBU5mutmjV&s6VI^0!@*dkQBAKi*gPV!la1ntaOT-_D60moCEAm0OHP%wG;Iti~o? zjxr7q4GmM4@+Go@XeWW?aC@*uTJ}%~9PVMX{}l5AZ~lYEZoIqXp2T{_A-cHGG@Pr5I`$$PAfl7+?HjOmN5V=+sH#kFi3Gk4kxD2`p#i9*s` zmZStj(%KDaf_zWHGW*F2KQ`ug06;^H#UTf!0X3lzLvX)?!Y(+bH{3FKdU`Dy|LW!- zV?*6rM4)(!uRM**x!3N3eL|0PT42J_5NGu3?UE}!&4AETE$2qyx=mBl3tb7Va`9v- zbqlO-nZ~?D@h#`$!ITc!*@0-i<&C~cmBh7rzuPNaNlq#^5L z_woNOe2|s0d!GA!$^Gm~%E2`*J!jD&`iGj(3i(qvh5q>dVsGjl#aPU&b#lVhQcBLh5*ll5rDpFV`6!b{D&j?eD z2id^n#`&*-Ot|hfNwOPaqa!}_W_5R=qNJn8GmoixK+ZxN=1i3YcPC2m*s3#|$?^h~ zP|kN!$&E-P$eVNm9uo)>(&18=Z5QFnJlU&REghAOQOTiZK4q%!UMwya@@5g_4K#7t z=G9*Hb*(MVI? z7=nY5d5B@aeHcBX9hvpoHfNoZ^%}Rf)3tIX;9a@dbI8V{@YTO>^tj;@NTP!? zZ>=}Z8t&{&G0{ayoiSWdrZeCqM41*K@U}@G{bRu?M7fwDPF7rj4 z&J@#K*+gMJ8KiZ!Q_2;KsK^%*$+r4XTyZWm50h4G;zQFcPmI214*3)P8lu{~qzYjU z(R#>IYN~APBR+Jn*OcWEkmGJnKDqeY9s^a{99TQOMU4YiT_Kr!_K>W}(dJufcs<*l ztl<%v8sy2)w;#xe=tQM$CGdL4cD!IppHU@fnZkX?+3Po&m z0zGA%4oc+Oy>`ud|5TlX)|kgXUF zuV)c0q*Ov6l#VTBoqT0;(lU9fym5_2E|{3Bv9a3F5?V$tmBHMSUPisP z(GJx*Fkh4og?3OnZmD6YVX?suZ^`OJUeeeoG>viCI_Pqx^Bi3uYiWqC21jVN`pf=w z{oR_ob%XnfD1Ae<`QojXNT{nwD)@H`W!6PJ-kw07bxVD6m9}kK9LUo8t-X&B*b(Zth)bcdvD|?(=J{c8gXW2>yfzDzNo05bpwgNQ8b{B#A zu4O>U6DK*{*RnIZsw{yo>LA;cs(9!c(uxUMQOpBQ>_*xjGN$9G>ID%eZZ7KC_(t!Q zu4_>+ZcYhzN>ai>tsPPx%fq306EMZYP_jY&B)0=QoW!-q6=aV0+G}Y}{82Hu17LgBH&gmF&m5~cWzG#2q%bk z1BtlWcKBuWmlwS66cPw}Bfm1$!3CPqX3_QS*mZ3l?%Odt0?Ip7on13=hGLwolTYCo zY5Fqq%l9U^wHh*ta275L3-SRUSN!~7WbUM>^AqGFgT0wDRqaXlNN~DbZz&a(mmE-C zU1KP>YS5;VN~_R9C>7=7swxOacJ_#I;2pMKe^-qHt}M@EVD)$dFl*@lyt|VAM-B3S zts4Jh-^lzIAzaSC5HP}Nc374b=t7W!YNya{y5xR&6p`C9c>_3To>{tJ2n@J-%ppIl znS}@aQ+A~!xUCSRp3%-()0YsS0e9jUTxRqFQ6G*J~tY7R^EhLPs7nHAAx z{$jmag(02M@P=hKb*1+y$BP?Y@`V5(h8ENPC-`atl<2B4&S-NND6$VqRAXY5-gsGQ27c*ll7R-wPI)y)E4kBs^Eg6|8Z(M0 zSp0$421AHZTnG<81J)<}p(r(gM2aNn8-`QHjA|&i3tA*kt_%TnGC{#j9T4sk&teer z5=Dr__n10eYusI{#zcco?Nd+uCXwViLSp9AN6N|Vf!Wtw%yqQ^2Z87>(J|g?KZz~CJhbYr;-^=>RHoa`=Ei%I!9qkke zc)a}4p?02>nm~gamV&H zX$0}5idG^HLR`a1D>i6~V@)&g1>HY{0xm)>nG?-F`O0oBoDiab@g5Ag%5J-#0zE&S z?NGk4*4T64O69h5R^ckgV~^z-h8xb|n<}sf$TJ}hiYjX}A-@_+rY|mXhA*0#W?CH z`GM(wz#h&iyxPS^F{M=GIddO_qDlIr_E3!X9R{%$ja{>o@ns;1jJwH zQI4cW_D9~^k4$Z?K9v5v;WZhVp6@YmdL!OGI^FaHtZR&&chTkGdnYsNqo#^^gW zltLPqZ*Z!;<8q)-`Xli~IYs@!GzCUCr*m6{4MktbiVRYV0F{YyYp7Ah@u8l&qj}11TG{^IW%OYxh zC|D^G0>|D2LF@^ZPlv?G0V?{DZ$ITJVgCTCdx|})sgSD<>*wk6k-P>cn4_Pk2s2d~ zy;OLWzWB zPm)k&TS5ZQW;^MP)$jqaIaP;JMArid?J3-wxU8bbyM0?Jn8URx^XJ;|dF-Tug;?F) zV72V7rk^8<9;?brrZMm-d#f=xl`om|`yH!psj=y9n?rMF>^Bf+N8L4=yKCsv{V#$c z+br7ry88Eq?fa!>tzqW#33+F%g@=4)W5l*yqM9M~nnsq9MSJSC`|q7-;|@DWKNKHL zDni&D6(#wm$STWPxE;YR`XX7fX9V{C5#*CUAh&9OjfeEN#$*3SuTjd)^IriTykGeP zxfDTBaZ(;}p?+x)FWO72havR-tx)tAj}cq9oZy5>FmegunDc?zOYw>*_nE3L$pd+! zD6;(g$j+*}dqeQeX~Ci4N`GXSDv~t;hY!<(089EcbL{9FPl&gvO!x-)4FKc4vD-IU zfVI5_?Qdv&nC+9eTUF5@p}n5LS{1vOTlwgSq8XJDe3~i{O25Y>NHTOG^Beub$0~=h zLwG|p%lkyhfk4AMSxe7cH(|>fQJ`{*zoioHX!~(g<)Pb-HxBiM$~J1KL9GI|Kqc18 znRz;H^nThb4N67W*8F6irSh4I#Ptr7qnc=S?s2KVN=olZ1XoH7=KCHQ;b9SDJVHm$ zGBUQdGKQui-m~v%<)tJtbxNPm{V4Rml9)+iNZO*9hnKhs_UgrZ2i=P%8s;)d0QgX6 z-G2#Cq27N#ouZ}4m1tzRaW^>sBZMwgJt`}KjdlY5{^!E*A3zYn?0?yi4O+z&pdU~01D^4$wKn|^IOji4`wSi9E{DVyXC>ltG zXB=a;l}oqS9*A(`H93M)|0>BPj!m*O(*AgB3@nu_A}VRXLaLzVX)~+14l1 zkxO6Mu;5NpbPL-O&k5_pcS%Uv66E)UWDSS=7fXi@nc~qn#_|n1T_@>Gs{3cCuhCEQJo|!48FCuCDO7M3A;cs9IFagJ(pub&({8#n9 zKd(OiqPhLQOvi;B9R5P-fKNpJRT<={epkZ{$L@O^1|IrtU!V;glbd7 zregc>O@XOdi?W{>KYap_lo6=sbq4={nNlRBt~ox0t2+*T={WC;8azL+d8~8FZ$AC< ze7ElG_xj^;`VB=b?$EFyAB+eR>GT!ka2j457a$e^vA1qianobM(8-b7mq+9 zqW=JfD_7J3Dgs8YpBDu{M9|9}O$%cv`gYhGt`Dd>6IA#P11%Ax;D9p+m(f-6Mg918 zt6dn;3>{!3+p8%{y=$r@2KTwNHB37Zl)4*B=B{c|M>iTt_PJc6zcSKQ%1J}vihEuC z3fY;aTUaY3#1lizr?78`PNZcYqWcmEWz?TR{~VE9>(UXgF=Y?iFV74}YBf1b&1J$H zC&@TkjtHy`F~^DU{N9b9zBm+kfG%~8cEqK&WmvSwY9)c}`q>MybHz@acS8Pqg$|v#Y^uUP_>JlsQkR1&ef;K;yYax>XD-jQ$W~kFgZ^;j1^yH!t3PdZ-K9!c&p$GV_=n$-^HFaMlXdpdA$NV}>oKoew#`aD3zt z@qbP)s#~D{k>w>cmN!EkNgA~9wFx4{<6Lkk)j%Lmd%hy+$#ZuA-e!X?azLkh*Smd- zkRE?Q&51rK+g0&91o>KlY2x=ell#Wzti0zRjCg!@_gCc#8=x z`YU%2YY${1`g3&3Sy>0TJ1zmYf$a#3YmAJ9?G(J;KQ}iiq*z^WNT$NWwgtC;DSH`e zkgV#Wy$F?m-U<>~IBdcjKdyf2Wp^lwazBwB2)1f0qmUj9A$-l8< z*w_)7%fc{L<3ng)c|qDvu=iXUooC+a^{E$R!KTvNjdD`ifM|r#`F!(cOQ*3S5T23hbL>#G<7cXrUs&Bmv{?inu^KCn2?Y2mjWg+Z z!aw6bBJhJz_%t3r#C&!sv*XmiJkQJ;Q>IG~FRTs^{;9K|@(I~`58Pikg4K2Y=L9M9 zkE)vg7E%7w=;W_E$bTOXr83Y*r9LUrzRRb*li^_NOh-ivyi}1+LPaAmU&;eFvv$P| zP`^|&FB2^C!Do=rzc`07nxUEsksh4v_t(9r+V0QSF9ZespcEt~`$*yA=qoimtnzH~ zjPf!ALU4z6>xo)3#KzL8CrlH>*N5ooR;jjQ5uo8Ya=#c91g}9@QbuDWL5vqU{b;?Q zUV<0dvkTddcQ=;8KoZLu6G%b`G%5QPX;3uJmv3K&tMJYBzLRvnLfn&2wD!f^P(q5K zJ?2WXZROtb!}n({I1SzY)uPcDE<_9-9Qcy)c{B7TQy_C0*9q@!#e?hk5duT2mr(pF zoIY#dHb!Gb5Xa4RrcSLI=tnxJMDI(*kDWq@m{*HLqBU6KqXvAt2Xo%YCwn(bw%M$F zMf7ZBI=!*xZ6b>>okRI1-_wQ>7?j(#R=0twaQN&3osM22!8~7C5 z2oD{3`?E|`#(5rbZCQHyQpXiJ8V^uKu%mS_roUAWzXe1w@_H(J`sE8sjmC% z<`#bj|6dTbh;c@_+stA?+pvT021y2$BTb}c~IH_!ap^2jMImMxW4+Ks7{&e1zl>@^K*#+ky0 z{;a|Z-b=FNICP~3(-}eRtO;MY91(4Lr9mcCxp~nn5O1Jj15dCq2`*||B~uX>VQJ`M z3zP$&@SOu!U!lnzoN0T|%+DdvmTHHa3=+6#W#N?&9_0G%a3nyh^g1Fr(xgzJ4H(n{ zO^aqFY_mxEcV2z@$?k}-dVZ4ccA%xPUvp)=36fIfik1${NMk#+26b?I(P~04L(ghY z3szQAtz0Ma?7k(7=_Wh5S>EC;bmeTM`(0s7agX&VJce)O-BGHHoejB1`%HN;8yhd& zz4N~s8N!jqO7Ed*lqngKcn{FNZVGn#xq_l@e=9>^J`ICQ3uuXlv0$jGc|82kZ z4~SI$E28l~h&%dI1Ai&JCC3WJY@7d0+!6enxC0@0xXaiQGw!=thr}m|R}xtwpjMPYY9{rX1r76XaNlw;{)6@Gb#*H_f1JPl_1i2pRH%xn5Wnt#eR0dyQ0`)}&Si68X zS8t33LKUx>V~B-`naaS#9ju%^V(B^BYgl03D8aLt zvreS^;f218`N1o5uNfbxIApDiGo(lW9NFQ5l~HOfo$8HRVB(JB0~TD%L>nA1q;VZg z+>ydgn*0h%RcOP&;3!ljQKZ!6$Db))Eqjm6AYp4RcB-a~Zys~pS;LA?pL9<{+1biT z2qDaxd2A5Z0qHvb2=eT9Ln_r7otk(hQ77mlO~%IGI^=fBhLm1d#c(v73 z(O>*!(S8$m6#lIbu>J3|)1T+~e@*cJb$_BPtv>dyh$?a<%tS=mdifL5kb!LSh_a9o zENooE8Z{yV>!i!jmmWCOWKp!s-#uIB`z)%w-ZXDkb1?J=l=b7}zQy@Xg$4{0{-)xm zj5iH$_uumo2*dW9q9dm&-WVd25{o+u4nPbEPk^PwA{!g}m;m#sZrHg?nb5yT!57f_ z9Umot-~1>&w9}i4_7xfH9P^uEvOr}w&+TgXZ5MzRr3&`Y!R#!@Cc+*$L{X~<*Y`#m zrO$IGT4}a+UVfO=)Lrq?t7(8i*YB7BWnZ{7Z|Z5Tehp=sx;;cRLpP5^#aoa+1yi#2 zYKDr9q`tsxJ>PTfXa~1%ynDwAW$5V3utEBB$71Suy)8Y4?$x9sO}ihQ$gPqV2vz)A z)^AExH(-dG7D?rma);2;O(jO?$ark$X=&Uk)tKufs2#umy6Saa9DMDp+Hpv& zHbNs75Brry)gI+qC66UG3`lvy(1kfF@jhANB!y7sV4<0Yd@(>vZl`Ee(q5y~Mqm|@NdLSB{IJ-sU*)TN%Hr|pW z4wkEI{+G?{z#ni!E;@bK_-Pm*QAIE?5|{|d2v_yVu$4+G%p;4rEzA9|^iokyjOu>XGofS4o{4 z9E%dCr(57-q?`0U&(w{3S9S=^Vxb{K*FH;Kz8vGA`IMtu6&i51ct0)}?K7O2cRi}P z*3`cSi156~7$j;(Z$+*#98t4b(u&})R=ZSK#8ZlUDPV=NU5I)&r&XWA*MKAK9K>VI zc;U%XWe}Pt|J3~>aciI^R-I(nb903u=WrW-F7lu^{-^T{z{l5G8R`~FB$7_>(uV~t z*4%C;!Cv|^dM;u0ApWk_ntp2DqYpC--;>78Q~)cG-hBbi=4iP_E9N*yxxlssMC2sm zJx4RSfMZBB>F}D29sBCa02u7K4heLj#%T+|1+czSS7{TocZm^~3wmrCe`V7ZL|`MU z&CX-M{JxP3BC6h`6DxUhhwcl^J6wMlFbB}}h`7~fmsW=df9r@5S#WZ~+7NZZ?f=|6 zuA}KWo1)AssSb%%MiE-R*Uj-6)7Mrn3pKNM8}P)S2j5jSLPe_v7{F#RBAS}n*l)=1 znLH>KojQzQ1$Jm4i)%9%R%$TgnFCS#9YcFLK4Y2e5k}o0vZy9tJW?Rq_j@!1nWzHg z0Dh75z8lgsGLw+xePol6r8D}78Xqo@e1?$``Lg|V9)#kLaQ5&8_Ob>%tXEsbRlN@R zS*{?Tc_me{MtpHTd&Hf3ppn{lxP5~!PU6K+!t#6fyZ&M}VgGmuen%l-(z5@#1NaAT ziR-VoqZqA=n<$vf6 zgHwr?c2Z8PBqO8>H!9WzPL47iK@h&db^eI)81TY0NUA`VSZm-yDWjJ{^GhYO~+@=2_$nVF*g6{wDNFUFxcSPK;6YX zM^XW%OVSGDkDNo{o*7f@)v?dFKYOaAn{u0>FU3und~#Dbc%1KPVo)ohb?Q!>?5V`) zvYB!0JZ&^iosivJD0Y-|uULZ*u;bwQX#Y=A_S435tbb(=Z_)S-?x2G6uJ7|B8#VDQ zv5319hmYO|EXmo(lq_YGzAih`R*wTi&(oWa_`V)yxUqABSE^SvGNj3?$afJzdsnz_Q#!5^I`*k*>CVEZ%-N_T`ZzN%~7p zLX+O*Cxe%7ApQZUW4EfCPwI%sbhR)ivZN+?`NFs8_l{LibqBME;Sp%dTl~uv0duij zcWH2va_j_CpW!2igdL=VfYWzjYha-F*D{ZgD>2>~-_qp*x~4`+4CLG`Mc=I*B$o(* zc)S;UzVN&PV4r%SanDz-_P7T>n{;!E2K&;?O#wnKOiuti{QGTpsW*y;vSL{j#>yg7>4ln3uzfFVau=<=7$ODNlrnJRE$t# zNN|I3=uWGY;w?KKMBtGqz;b2}_SWL;e`I z+hRwAE^aLP6Nv(SicMAg^2dzWm{=Na=GGiR@Ff5s&%gkU!^nBA7wa0z&UiX6s3hV=%y^rP z#91dFls^Z|(TKD{N9O;YDMF^zG)+nnOlQGpv9~Zhbw-vXsQ*wnjXaMnbfKZX=Bc~i zC)ngh@cEnv3iKq+1L{qWi78(erToHQLcRq#WV^`}{=AcqcnQ^p;M=et{HZ4=)ZVJXEn zo5a%k;9|op3JDc@1E`#y*&s{C&%UOX@mO28g4G$zpJU zHag%QLcrz`uuE2S+royHOVo5IEWzye1O^{LaX-v;LSy3h-*WM?0oX41oBk7Tf48I> zBX{vmA7%9AA7zaHMKrVjyNoJd{1wf)q02MoY5lmE0EX(i*Ay&`H{Yb_q?S_{T}FG@?ln&<@u9Qmp7XyiC@*` zRJ6JA^lSX0)K-u4s^ds8?xQS$7;z;{)5301815+BMtQE9wFtsPYZJ~(EJ~Tepq~lJ zxkrK2LKG&IV;Czk~x-LYqv(6yA86P!z#)BZ^#xS zMlC@+ZleX&+kD{fNp?187v8Iqg1oW#{p{F>z{(pv&Q$>Fd!}w2Uk!FEzwPc|4hgqZ zP6R4x!!vw?a#QEm5`R}*rBgMY z(IslOX{&tM@h1k@qZPbz1|mU1Mzy!lJ_u5d4y()lO|Fv+8D@W%uC``a9R_L-Tcs& zEB4V^53%ORG*UTft914lExRV(dy`yJmX(K}NxrU&&M3K`op(ru_0pWL5w8F z+f=PgYFT?3dDp6cysTgNxt^%aJs-TkUAuo0e)Rox0k<^==0g@x19f@#sT;YM1L9Hb z(hls0W!&ll+o)2>NOPCB)N>a?<5i^Y$@YPx=MQ}HU9ckzP) zHL6-S?p_ic$`LH)losiBJu2DH6BQ+}TN1UovTj`at!M4zgfsmL&a!kzGC9U#C+kvO zOHDWnnCqIp5^$Ddo@9}R=d9wm_-d+$>QQ0R8J8*TRW(!!)Rd-G+a_36G*zO+*~NG? zlh=~4cQn`KHrb9(!xa$e{cwl2O0GK2aJ)5|8Oe6V`$Hf4GW;{>C?|1?$NT^QTRCZo z0K*JRhicZBM$KRXIQVj~LzBXricezxyRegmy#f~cY!imnR10seK{8y@qNa_IS1u=u z-`{mdNJWU!G&Q@j&s$W8bMJV?^G9=OXP4XpDXR`)GEyf$mhQ-;n6zj&BdH;@>O?zD zz9w%WiKnrJ!^DWfPs$e2x6`bI?9$$>Bc!-9q(%ER>Jzm{M$d#zj@0ic?!oDWsd?!n z;q}ewWQ_}W)gk8;*2<>i?KYW^UIO~9No-M_C@5OF8=&@LDV79&=_#zDIr9~rk{Sa{ z%6ugk8v^1ll=&6hbeU>)0cN5gN7>-yFw1%cmtD=_Y27HB>-|O+BlxON>XtDxH-5XC zmQx=aX7s>{%&6;arFWeUk_WeizoZMP>T1(t--~XC)1;H>x28n<6SbAJ z$vHRu66vRc1kBV#uNz5yWtvth5S=p3`T8aQ^og6WKkJXVx`Xl1L&xK$40j~_g}GEq z{D}^ItRnkj-P`h7RHceB0o}vzRryUZ{384!6)m6M^^pfO^BlWt{IS=Q{Dp4I_NC>S za)0HWYxFM@i_K;D7hmz-Fzg&M_h(FqLwsHYk3*7VNrxmT5U4u4d=+d4-GuMZ7D1`L zQ^(ZLUh0>4)G`vnYBc1*Hkb*{{eIHcNII~OX;51%z@J0;^+~!+7SX{0cB-hU4_(J7 z7<{7~{wg5=F)0_`lH{l*Z=yBlz`jw2Q+76gd@AmQRD8z6@!>ajasBw zg~$ipM_}3!(UZMBI=1nCf*57oVr~d4Ce{*Xs?c&&DyL{9$wV^2e0dx+M6lI60dbmp z^#^|2g@gyF6;>b8O{M@O<=M7u9b?m}vcjsd;v5|c4P#=bXU)21%`z)(4P&YBlxqNU zGegFq;G>ejo(Urqlx^q>KlEj(Di7)uw>JMF-mQ$*oqdKDYJc;Jytx0wvr{Py&qi-V zTIE_L;keio@kqIgxV<^JOJV~XzCtfJGy11Pv-DsS)!cjj8(FtE2ey%{sdzr%Y6gnO{TGtw(c^7)muhx*=xLTf{K?$7JhRAND^*r_O zL}Bk=saJ<-XvAiY%R0D^f5avqk4%Zbq7;ZM%BLcEAP|=c7---0s8gFa&=W7 zy?#uR7Lp4bJ$JYXb&&5Ka=t zvx&{xfh*__ZtNV=|51tk_h9rxk+%Me$;n~az`mXlw`jHCrx8>l=~y1Yukx8{F|`pW zM$120ZJfrPu4!go{9J*S92N9T{#ZEBVfn3C=`SW{*TFrp^rb`D=RKQmq^3_)+S_v;BaA z;j4U^*Zp6X5w*Y0@lEUEjI4bdO@G3%jbvYrW$?h4UNY6Q$s@i*BqQlh0E@e6FQz4f#;I>f*NmeY(h=; z&Z#4|s*O{(T@rfrO-#N@Mdf}!`yq}VOs!beP$b(=;oPSy2edki>Y#4sJv zCrM=;bZj#H!M;7kI_P$5Cq#0IWxA_w{mpO=F5ZlMeKlL=vHdq;TuHfw`!C3R*Z-9u z{hvz)>QDN(OUUoly{A@PSQ@>T(Ofog+FyeK%}HWzbHA|GAZl?LRa{qH$S^d#S5(z# zhFitG2#*pr9(?sJQQ45KEKuG>1ag}N9(pY2JmqOL1Hhf04Bc37d^giM?Dx;E?rmu2C7pAX*LxiTh47>8oZ?wCR*pS$`%u&p5)Vt`|napqGy9nHKeyjmh>R%43qR<=pv-OQp^qooHJ?ZVr2Cntc`S50g zA?cND3_N6K5bhO5%s z&@Z++u=x;7Ib1o?^Y;x>v^}C>=5Fsa==jKiFl!68X*3ou@i6rVZQ=EU3%5^3EFPgA z{7|{zH^YjzUoP2RKe@BM#(yW=wuEQspNk(>#(C@SW7w|#Y`PVDWJN)v9YaTiQKa&p$TW67C-_KsZ0w+AT(rAe5IHl7Z znQxNK@tBb`vkqo8)Tx20u_N2Teo(x&Yt6MOv0@fKzn5jokWN5%QQ4GL&!-B~!)>FR zGnf*db8n#9jFR`TWA89n=1LOcQ-{z1DM|TG-qM1a&##I$@l=}xt*bf*Eor3N&ZV}@ zA_tvzl`$Nz=gU8=;;J(yvz}C{P|hR1ZcD}N@qD|Ro;a1iG4oYwAc++p+~1{IA}c$g z)u!Q^+G<>aXOJ$PZ1L;H88Du}O2=`fKM=?rU*6|T5I@loC#qhAt|B=U%9gpy5et1Z zy4@F+ohmRlVcwr5n_^kCY-4`jvTC*90=~C~R7Z4W<@x9OB~5F`AdzVPScUINmSO`nCOFSlEKtT;R0%22wMyo+ zx$OEv)06G6#$IB= z&&8v&?Cwd(^OgBRGrbIw-os$|HV=M-v9%jveE$X0lGn1XATjN)|bHl1k3g5EWSYx>^zHy8Ou8!Vvt+|<~C6x^X{^u%MwyEgtQgsTx zsp1x+n`X6?yo>HJs-t7%qNL5zbTYu{(z$oirCDjJiZ6o*EX8qJq|`TtgU7`T?4IPY zX9BL$GG{KXySUSi9Uu~p03mhOPRAaxwfvmybx0eYL4RkPxH;gvT=|V)p}H;^O6)mX zD65h8svzkMiOcM24Zmqy|hB1YxU%CwD?$ zdi!G0n|>8)mSy%AOnZ=QwJ3g{#lrXhZG9| z>J7t<@v9c%z#M~se zNLF+2=IF1nbb>|PJF^7K2jDHkBECs~D>+sy4Af98OjvdACa8T3AbtnonWZ(c``c)@ z!a|G8NfAk$NJ?=!-GmG9p z=r`s{V!I}3gun<}pOaE8pgt*RPh?AAP%c@s;JJ^tfH+~B?llP>I?zZ56|EFfG&&mt zO*qg$1RnBj2ATZ_2im0vv!fZ@R4t1j_HZjX(r%DpbPQaW$CkkO4p~n%+SMYj7^e8L z1X$_~me#!XcaO@5(HG8S&X&k-Qn&_;#Zj;2I$kl1m2%?hT4&tWcut1asfLDuKmFv~ ziKi1#lb!U9+ff+h7QX0J9R)||vK1DxI=jY!aS1jBb)QNuMZe*MU5g!hX5@#zCLQT> zbP777zX&V>_|e*XN3qdqwA23oXqNAkrYB*Zjj-PI+c>dBtRP+N_A~8AW9NU8B5KPP!k=Iu^;It zXSaDPAbVxI*tUE42BU@JW{PGt>|B+$FnC?ioDuR@8zJD`=D_-|kjcTXQ zpkwE2r?GunX7@PXT%CHGHp^N7>xzsPv-JjZ4f{z7@6yMu^nr{?x*YwR3ZP=%bv-7p zI8}~rv{zu!4E7v*muA>y=gq9aw3Z7SL6)HeeR^}<&V?GlJw~0@=;4n!9sr-rv01;x zqsq)KElk@uV#(Lr1Sv(3imST<_j^fvbSiK4g@Ql~T0SN!_!j`OUX@mj#X<|fH=L-> z(&Of5`xmZ7|L^y2XTF0im8!#yN7QtuCt?e5Fy;R5hDyyIgSBO0dD~Y4kR`{$+WR@( zOmx4fs?0h`+WRM7RaQ3+mfWs$ceYb&Y}d{y83#`5+PAj4$=^P%0P*m*qZ|ye zVA~}vwXh^t?oNdEe(sWo1Tbq*)9Dd(oh$r+c!(#upwtvV5{p_4PFPbPNEP_Xqy{IxK$q!l{}?KZlEM2Qd=aI58 z|ARtfejbX1-VKZdnR1{>ByV~nf}-i(i+BAVRu_z{ge>y<97ah~88Lwy!A-Fa^^ZXo zqtu^IaIL~=qK9bq$l`PI1&AneutnsVlfN0~(+1F}LM_fFeT83;iT8v_1QXxT;uwKq0w$n{LoB)!+~gTw^kfmQ71U^S35;AId+BOYa7 zAnu4E84Iq#?+}1^LEs=15OeUTf>AA&O&BxC7%F^QI!rZ;0$>f$XY#=pg0T-l8a9Bj z#Y#l(U1bi!iYF3I$&W|~dN2t|K));rXfY9Slr%87TlUz-Zn4@oE#nPDj|r=r|jD>^cM`K z{9YslMoh7_EGrbbAo!D0RH_h)j88HO-c?8kgIMDT!lMw zR;Kl5T8=Ky@68Fd39zg5l+tcJTdX!wE?cNAO?DMjaeI{?Y)ZSqm>kW-dJlSMh zF=y&_mMv}Rh&XT4IZCVQ9QLLlyQoQ+->(TF7L&ENR5dEo**pcaDE+QA%FV@a>g8b* zL#IlTEjoh3IEUE7o1^5V!x#JH%qYJ#SDmAtWkHx(u1!14=tbvwM>BZ=L{UOCsjk*? zLU8aC6e5Rld_OCZ@_Ay<6i(<4t3%=yv6l|06n^1&xA}yZY3+?{OeK#QTar0pR}{0B zw+#+PW;j_315uKP?vvxoWX)ZNr)7+*Fj{mdZ1XiZT7`=jsFKb}vc1O_@C{R0fR-;$ zNv_Qy4dHRGUimxRS~Fcon%&rKU)t~WfM7Me;=@u$)fOe<@|Gz^0$w^O&p4wb*@>eT z7E+ATBHVWINXHiDx!4(NX}56K^d zPOiJvO!R5SNO(L(NZwS`jByXQnAr5bQ=W^nj_vx1fOwz5M_mDzhwO<~Mi8%W7zIzV zS<>-q*1U>?o?hgnLDb9wyE`|&aihL*R5@#X54@Uj-Llak7oES}z{j|AuJ3K5bkE9m zQfwKUl1hDAta-`SoHmAdDh|n3JH0ZTuhZ2#ejHZpOmIWt23uhWUU?~$4iqUzXCU<7 zNQ-)Pl9T3@M!~t-2tI83KipE^viIn&-^Ry(jt{C=6&wr~jvXj+84fv*<7BLs@2Tug`V(u?KVLxpBB zlMaU5mq;EMtaI2~sT8UllIU9-y38pTEjk&Z*1R7wuO#jJH@jpisVWHatB8+V%NdX;G)*M*K2TK2&6Z&`e=Bp^n z0HKJ+Cod3Y)zpnXSRjI l{?BB-vMg7(5OSL(^^OJctPk1#x-s55O;!6yzQcxXF=?3Sm+rqp)pNZ77sun`Zdqwk_f zVSNFNg7WCFqQV2)ld~mm()`CW2*;P@pJh-1Z^2;NE435K}D! zwhZxuNyl`exi7?Lk?qkbRDQl^n=|S4_{?a2-sWkC-uAF`Z44JLFTj_)*yIFVL&Dbl znKhO>iMz=PX4*gY5&72w`4i~*3DoM=WyGTIhFAsA28KQAXXc0CDu==5k38Up{zZn>d(P?5`#3hHf7GS^H%Ip$ zcKg4bC}jnV1R9%~gP@Vg!kdGb^k{<6yuPSad2AM~)|0K!WyX~CNC_hIK0>@I?vUSU z#D})nANEV5rwBG-`~ z)ZFp-T$QpBLM2D?*6GBh5lD@mF+9-)K&i4Q6E7d3lZW++lgwNHCUsW*)U&H#IIY5& z13e{T8Th+2WzV9ZIfG+)C`|BpzbSVrKe5x$^SLh z=pCYXiS5ltvY0PuCgG!{~?SQLnVk$zazzp9_M#7ID-!8?t7Ujk7@=(8h8G z9ORo7%TdiT_ISt!G@u->#375n_T-^~Q;gta%)~VKs7@^-2_L+>^OZxRCw*5Mwl#Qe;xu z?iXKzDFY2hJK?2eJ0z?ZLc??njp0&g%t^y^q9wpbO(4Ohnd@A=yEv5bME|=cU|o3I zfBFB`1boAbj=ySxc*1eEy1539O+-F(n!9Z!s_52r1&F-h~b1u4-Fd_LttpYL`NG_+;8FThJ?@zu_q+4;tza^ z5*IH@_&!$@p4n)Z*({mKN@i}K!ETF(BF))YH%DSOyH3!t{&KkSu+r7OVteS#LP8t( z>D^EC{yo!k)BD1Ev!h%7a(}g^^UJ5zD_P9fT)4MQNc#?h$aODN29r)@jTbH{Bx z%yZ{$B22e-hw0FkHpat#W%_wt&ZGWPoySHv7WypY%c6h>SdX573*^f#@NW6u2RIM4 zUPPG3fB?iVkAh$Vq+48I0<>G=pI^%Y5Mdvgzy#>FSit#dw#*@4vjTE4FX6!b6nhz9 zA5FnZKfgu=Ou;^?g7uJZwS4wb?Ue@C!?!I6n|NL4Vu!(x<3RVO2=nJ;#APn(3 z4X;gf7WTiW6sNMaS%3%WLkJe#5$fN4& zBG>3Y&yC>R`g*?CWKQ-UCv@K9fp7u#%&!646afG6OMPOO+V}h3C6Q&gIpR~} z$Um2fFwl=jUpp!LiTsX3qyed-UwYlK{RS@Oi9>f*iyiP^F+lb#udpC}#@Fo6Jp-;N zZU)%GY#^L4oG^HRDnRr6v~fQ#eTyzTEhs#&wMCW8VuW%)u|4E zI0??!Oj3YxTZp@Hc?j|vwISLn7C6d~LuQC0ZQ>;X8mUa4azAOal*Lzxw4DXHLg{|@ zx*%9u;3Ys{ef-kSMf%ZE?G9FlZW|=y{TUxXdM{~{c&SW#MG2I6#3~5MH4NtqtRVG4 zX_0v3^&)%aW|w$`Z+?Qr;E78?=^g>fHT+0TyD;@@@70>M*%YmezeJ}M`xHVvBMbBr zX5zzWLIP{~nrv%XQGq)@FJhsCtB6GH`;*VTqIBUKCk7|VViQ706Iao>1+OUp2Ua#_ zdg8}vbhX$pcy@b+3`!Gs+%Ey277S*L1W9pD?!|-#0~HqV;W#%2@;f9;VPNvSP`Su5 zC+cBzj74yr3h@9rJ8cGm!~j5x1MfRQtmp>^D$OdA3R}sQ?c2*z)#$gDd@>ahVBXWd z(2cQ{igbu@pd6bQCHkUxEU8iF&CgH|P=dsmLbxm4G^*S+kOO&1#Az7@Fl;22N0SkC zX*6)mmw!yf-nqQw(?5^|W9_rvMsOU9^DAvAtZFhh&3&DI(?^HY=F7f>Pf< z=$;Sx@Pi*e8j{ZSy*@gH?GfXG7B}UM(>}+g-Jh0ib5O<#NVf<>sULP)go7|fzk*E<}hxC9v_ zO8H*COm}43GnhOzgIA7|I>^g8(qd@N$amC8HeQ-}!;Mxa+l_OwX_u{x>8O;c!ePtl z!0P~;6$XQFU>~ouQ&$_kRIEsMv+E8mJZMeX7#i>yG^;!P3hf0kf2p;?EinAH*0<4F zo#hQ(^_VgWw6-~cv|T&Xrd>ykwKBUfq9NJ#Zb|^RO=a%v3OGf{&)uwfz%dyad{H;k z*7%C?UZG4gL^h|==hr%=7*FCzC_2t}R9KX5wDf40Or_qUFyVPeS zDey{!z9x#I@Ipgl!XW3kKLOrH?_k7u)5g@BEOY4aMeE5S8*iXt@Agg?^P}$zp^qZfbH+qG zXmuj^LQf0Q;H8AfP~}@H+203=BNoqodQp+!3YB^-wBl#a?#`I#z=eu~e!;XkNyv&= z+7{E}@yT+F9VeP6hGCR{*Z!WhJzYcX;l#P%q4Pa47R76NijhciR2EjLq-2OV1KZQ6 zxCpnzhU*8JYz3!vqKhHI-YxVmcS?-N%=_v|X@Q)k`#LMqtURne&-8hXd5s;wojx@Z zGbI<=ey7XqAMpjtVk5eQuOzU>u;lUzr;$4BKaQUn+rq38H}MPinaOx5_h~L-y_6a_Es30>nsE0UcO`PPO}qAV zD=g0(*;Yzrj-0 z;uLFXJK#=SrzclO#$&WJFUC8km&{@--vvk3p$+qfms`!mWF8xAbH$5~k;~AJ%7}AU z9Zb#Wsg^2;G$L~=IIAT&$?v=_5rnu(`wos;>0O_|>n6gjPaTb~q8zvcV!!Nsi16Dg zD8!m_FOiLH#HIBe3~>sX@XlIpnp`Il8Jb(Mv&}!bOI5z|6s(llMv@JITj`L=23{Vq z%uk|dZIy|oj#(Z{oVwY zMbdWC2=Y)WKz~Are`-m){k^U4k+Ey&{ZUUXXdyVLHJ~D1j%?AtUdA!PNkQ?y6+G<> z4bRxK;C)RIWqmF&bg;m%3VLH5;In3Nc%jAnVzyPDqq$6IGurzb;Pb|e$1mR*p&KHn zd}meG52I&p>Fn|i*5)&%SAhp1bu2JX=^E!WErcZ2*J;#r8CeC-(qq%KOg)R4uS*}< zq_mV3o+PQ(6QddWPkqB|I#d-K1mbu<>sm&bIrF97Ae*X-@)_xAO2dwwv`+Fm!3>&x z?ZA3$Wut|ZfUWd*Qa&aIT`Ngxr}AM-sZB1pj-WY*n|K{=hzHXxkj%S;LiuH@^eoaB zYSkJbFI>!=!!GS9d8yC5a(Y}5Wy&ldA(RuFs+b8(n$4U;WHX6Ry`PIe$m zs@e9Zr@Kg<`#d2zzkuvYYSo5X3QBd;tvSr?aZyINmxvb@%x$>WP7X?Sv#l%EHE(R3 z(r>rprpe&B3S(RpzpsH=GV!`uJ)&lB)CzK~3CztHpK;=5J;2%fK&<>ygZJR`#!Rev zxSbkcF`|e<$}`5bZHJC!gGAIpeq{mr{Z*8`v0cuLUkCzKzI+wF7Z1o@tVJ+Dkjk(8 z3c|xykYTwsn*1rqQ8_xcUrW6>E%qL;xW+BckP`Z|Z(&}Ms@R7&#lWDmHH_iHKqSF_ zmKCg>$7{}@esH2WFPR-C8rkF+tCjR}{OZO+OSERwQcO=-g7^utJE24V^fkUGw9xCr z)79?Trg>Mxj(OwLD@T=7YoIZxt6ZCrE3ARq5s0TN<}6U!{QK5pqQ52$(q6&M%)sYM zMl0jfQ`!#mXf^8^J1o8Y0ve}+n-NsM@0*%v-oB{mEsV1wnKE5$#^5WAD_N;bj4(X) z{M@;WFmsuNx^##hY-Lw-g$ z{Jtt|k5giwI+(Ijy$}W>8KE{Ad1aX7yMu;j$#r46H6Y$14s*&$DgDm_A9znF1H=!P z5Qz3I6udx=EwM)`Jf=VQoSX-gx{xekcWQvMttx#PI;TFfXO7_-xPz!FF0amvt$kL= zO&(|nv@d3bm^5IW`$?Z3v4iBR}g zK;Ff@8+;H`vq-S_ULmXi`JicTNbA$X7N;#pnoHlT{$$o&OU@>TQSk|~CBYdy)>?`) z7;g`MGo7cYfM)cERkeBNdSxO4#QPE=PFP|(c9GB-oYTU20fBiV^nJ1C`F*lgWtAWD z%4@m#=@jK%{L)o-l5?N5yb%@?{aBvOP9PeDJyrm1(qComUdh>4OV*4ZLd*m_zg?IH zmyzJfgCeOYv8kJNW!*#%bYo0}*nHW4k$X;bol+cwS=B@LLBGf-FV<2m02wA0I0y#x z70ju21jJUyH_g3w*!`i-uX{fK@sq!UJiPPP!OWYwxEKe1g*G@DpSB*%H}?y&@by&g zN>(>H+3{5G62nY??MeAM?6fb|5G( z(cI!=?;V?*&iuQ*^XjhO3O%ryl028U!U)Tbb132VR3UjVwyU4yp$q1QI?kBw3&XHq zmks%QuEb=O8DTMvnySego)!ZM@^vBw-jkq$$Po7lF-;1m5`Qy^^^9Ypm|R%a-s!wl zg6@}~5&F+>CA7mt>SA-h`PYp%*DwrY&}uxe7A9n}t%nnDO>fiktB`D9KCZ*%v)mB_ z)?;r6t#qg&FPr*%8J8P_$6iR;lUR2#uN38kWntqLwW;|1cRLxeZ=1d%=+@DqN4x1& zc@bg*9tN;12&v7)B=tJFJ*vcV^&-97XRVV&ju zxQlq5z@WoszH1Orz#0oAq8kd(EfmCe%v_bsU{uhj{easSFkXx1tJ&BqsNqCpwZ^Pk zBU2CD9wj4rJ3c{WG(Up3zCFa&Iy_Nj$nYbk%%qdF9z1vCGb};D79Yzn{OIuPFvQXX?><8f-Ww4u(!BI`N1#tP-F} z3t6@!6`-94=K#$CKF>6z@I`jN$dq#NnBl{O{LIT-AMjZ|RL)~bvpDGv?;T=2^4|1x z@x(T4!GGId7=UP%Z7ATx%RF=iU#MR}+R#r`2vV^4!Ge!abcR|>Q+X0zb*CeLlrTHS zXNa}RSVIarBX=5U3HiP$A+4l^sn);c zE^B7oR(`#oq)V~WqFvz5ZKHGRbwso`kWo2Y>(c!01}y0iv*f*v5`HZ!4GCzlFc3esyXkjHekmx z=O|a$?N>s=vc_V2hV=+p(|dUv6wTt}lIH+V=XA)4?Ew62 z(k|j%x9}6Ye1zE}(b0MhiG29XOshnz2t_(bU7a&afKv6%v-=4GRliS<0QA0L;V07O z7(I&kl;*sK9wk~EFt#_dd$;*lq-EJYzubRFr-uJ{vF;yi7XKSjPNvTGu1?0L3WhEg z|IM4qit=*`Xm9k!G!?4sNTO(hWy@en`$?nGuyPM7y_`hbSIs&HWM^ly8#s6BREQ)q z1DB_9%sB`_%Hkyq2fwp!?syJ(S`J>~KA1$jLhAv>1`E9zfvymU@HSWu@HRlE*m7p6 zGgy-+icd~8~xd(Fs zMDt85*J2fj69QL%A8V3>Kx!!B@L_v~8rY)g`+k%<@+BDxkfqI2wL2c-ulVl5)!gUR z{vwBBXBTLoiLbR)sO8)-S-sAa-c8I47b^CzyLrN^$vF~acgkT`Wk16FVsiHr#($$+K05!(E@ciq8Ad6At3uc+@pNl2>9foz=fK?K5a{O}IxI7Wq={Nj&C&g+9hsHUJiW~2=C_9={m?gpGwx%?!*_G6 zLJ)R^iX)*j+IsOJ6TW!h>&`E#<$IHja3 z{u^We%3A-PtHdbjO5=WHt)u~6-4-0dQUmCMmzLQz}0r)JS4nJbJu zG{-ec7U#IdWW#)ly+&%4o@yS* zIMMT0D!X}&mXG0Nga{l3q6;IeuxWa-aR@|q6wN476qPM-a?3h9g-h&hCCPqLg!S94 zp#gR~>bQYbDmT&R!l}82F8b7t@y!tVJ*KySVn1M(Sk|$^=_tVPN>03t9Q4Vy04{9j z2Daa&m0d6U&`S(QNSa`DJZEU^WQ}R!A%I&|tU0s?pH%E-`n325kJxK4`CCPsZ_ei- z#GU0w`A#nab(PYwIpU+|$FZN1I}7h@?P8tW$G2c#3`SU{@8O26Qh;X!VEdL@6;wU`R(&lFfwKI%K zSHjm08JwiQ0n?d8_z$@sF;V%ClbL_GLH^&PclgVD`9EaoP^EuCjWW44ZDbgz=#sT9 z83!e$WVaxZLsYRh-YTPq#+bQ&`XaLI z+T7`TR4N;`f_ztwW{b^n6EuFGyNr5-zUrIeQNAmxc-&Y}TiC8id+jGLk_D(pIj>MC zM#O4Vn+MK216sX!DL}~;LT%~z9?Tn~kc_l%rR>5_m;-hN{net9-F0^sOTIQtSgVQ{ zFHX993sD~q0(vZm%;<}B6^3kB`~DXGX|CMNz_UICEb`%0p=_wtHDDb|pcf0CLws}t zqbl^Q=1n3ihTpUE9^hUdO#=vXlpU(Zu#`Ae|14ie(q9KSK>+O`_o2^U4`Ri1-oDsP zf330nT@TB>xAx8CXa6nW>4?{qe%3nX4fCja@mQSF#wVcLNq*G_arcR6c_V0X_((YU z-tOLUAC)|=cM~N|EMKGG{~_(2qASt1ZsCfxV%ttCwr$(CZQHhO8xtW3~=3pPaW2YC1i{hqM<@4j~FP`ETth~_gg+LE?MADw*dkZL_H>Toq&OD$dAmn zY8fpl7^0|8b7s2I4}fbj&LBNqSzWU%X{c|$inESxf(a3Ky3BUcBRA{u-Tq`HHwrS$ zFbpXaY>;fQ4btxq4UtCUSk|Ez+NwBprZHi$qhd}B_0`9E159@6)pHChl3cWey(lE zL{u^h?bZc-qeg%n0=jsk2yTN#N+|cN z7rVVa`i41Ox3lB-g?(rn+Sa}O(qI(izJ6l}sg|W7`WNr%mCw&s&13zVkd0N#y|3%E zn}f80)Ad=|4Q(`u(lUhto+C^fsWWf-)}>2@K7HkTL`h;GgjwJ0|#nkZ$`5>Vhenl@76&q+5HrZaGr7}?+s^x+6LVrnwH5 zIPUwWZiRxEQ}WKn2XNgZDmDIxQm;;f!R?>1VdkTwXZX`z4*xbb{J+`EKWS1GHvSL= z;nA}C_&)uYi5vPuiZ zcTUIVbI^cRKU!lAZ3R5)$@4I+%Ch{)`w$hOm@|naE+Oa02wG!9D!o3y2o$A!Yb?q) z;DeM?Y()t8F>CJrcH&^)_zS@Bkh><7(GH81@+YmfYGvG*axR182fQC=M#%o3*`TcW zOtanR?Q;F??Na=oc!Yn#^AsmPi40MAkTcs^OKlYKNV%aaC_P$KSHTGj<|R`$MGH}u zjhK=vvNOi;)cVwb0t3|vmc3E-IUD4a0@bH}<$k(vE+^mLFP~b@Al8~!G}T(|b_Es% zCIwaogQ8$jtTf8F$?{J0VWbcyH0+=>UF8RrQC#XS4WW}?FZNoaSZmvlcR2@ZOsU0* z@tpYP9cYM%TW;K9#M|d2@(gUyzJ?7>UD2cY5-15(!%Qzbh2ERmPsz38JGmUf4;UFf zYWam>RDvl$9pLkBo&Ox)a%ymj797$~hRH`t2~(7~4L7ir>O}!eYH5B;6vI3r8#qdz zuE!83eP}YENHpuv4GlTz1l;e+U}5nsu0JWUa0AzT>rWcg-!QU=b50dD6gv``@MezO zVVs)WFTmJrGQm7UWUI6Ic@N1+om0Tdffp`(qu!G>rujaD{b4|o!RScwHfmsrgqM*c z9rNrgH+&4$lHhju1J`2#*CRsQ#hb`ch5Ey?Yb+1ULwk-xNf(}nQ5*B_mf5nSVyvK~ zgbJ%&Gy&VFH+3wM|J&9xP;2ia;w>F(XP&;_aETIoS^HD2yd%Lhs%C&q<}Y>18|-Ag z!X*ng-a%WxfL83Y{kaj&ep`%`IG41)xy}s z@h^a&ik8+V$-hpR6d7h{s8v;Js|Az|5(T9>DvWA}C5v{l6zHi5Bj$0RF_|nG!r8Fp zJM#M*46i)zq)3n4>zUk*z?K;!5Mx9#gsbd>hFOiv!}i|W{miA`m*Y_;KGXN~TO$E~ zA_Cez1byf+=v9Pz%6x*|1piUsT*xPZJ|!SN=qF15FSg*b;cXrmkh?gZAm)PH{-&Eq zdqQmRZ65A&!T#yuKCm1LtWgPdj{eI z+@kL3yL(JfJNg-6uiW0lgDXg?R}sM~Q{wLaq)=Avc1~R)bhv{fJ^G?pOSyjoC#s;js7TRg`5@+%fr^xC_ zhv7vRl?IlDaH|aI?Np^sEID(IEcup%<3Qvzj7;J=6T0Ug;vS`f-xfg1n+L!&xywm& zaU!$7$dxUR9q6OZkdBIUCUlpUsYE5$iBy_t5mm7^Fuj~dgu6`?+{l*YmgUzx)6_gx*vJUTw z%Mq#{IIHw5E!lF^jy1?px07#WGeQV|+aQDDNXeDUD8t38iImwe1sh`;29i1XWsNr1 ziZg+jDi`Tm*ZzyRD~c}gpC0u>X>%tk{aFS)6fSkwhpHMyZh5_SArw(LxXSZTSi zBWo3wMX0CdvDQ#-qSI-*DdKkXu@^rFI2(Qqaw*a6*LcTZg(x2*+?HxCZSn>w5(|r)$11 z&eR)+gEBX*8i|i~nvSkib-w`Uu^VHsap)*4TGflgN~M7X2hAAa5a6q;|n^ zFUS`~-`zu_JN0-CYc*;T5q<8SAoKll$_w~BnT{2#_vAo*UXBq9A%b0#?rLCMf`PE$ z_q3wlLt8I+x;tc`LPa2^%r)|fv5+nj3>G=X3c1W>E_P##tG&=yTpb+nSM&;e@zdZC zwKs*HzOY$dLA&U7(iUos7E3+CoQ{Lo?-XccuMca@FxW#{TqD2=J9U(}qN|x-N=m_k zeO*^dwlIJQU-VDxf;`_l&Esm1=Wg)xrx={}aVFJ6@QXRv<*o?e35??rCH4wLd_b8z zBQ##O0)Is(-i-F=44Aq}j-*^Uw&`@E_0g>)J4h$5(BpCQ5k=wfK2`+GlAFxQrr7$$ z?!tX1_n3Q}>zHnhlSYgCeU@Gc@rqrOoIX1GbrLqvfw*7&QL1^EQx|Cmk5kvZn2pl+ zm%Z;Z{vR%hbuLs+__OkQFvySizDV#e{m~|pxeZQ zZ?(2pbVh=(7j%)pvan1ik)ZbS&(<|SqR~77`6j#TRUZtrwI6i+#JlkF@$v<#4=4dZ zGn$%AjjJoihn5u(FYTCZl0ipI3ny6=Kt3yjr$>%^{21od$9`?b2MYa$Qt!R4$? z7#!|*YB=Ttv(c7Si=0H2$CZY!Q{kfVI1o-K*ER9|XJ$DK0pRvSqK|WnQN+wF9nq|q z0u0OuqhNyF#N%dvoTs=;o>QVwAFqQ~KL!$%q>N91_uODt8sA7q93JX~MB~~)-wng~ z5#>j3dD?iCgvcdP5uaiGEelZuc$bWFKq%SvpQLru#4PBRpTPw8ZxfII-O>DC!Q@}H zqmkWTU;VRuv{8_e0{&d^m|3iFn24L;EfGP|oHgDcqUcXC)^E0dH1%Fi`a||y{GrNH zX^u$qv8b>L4Yai*%<01Cr}o9`o2M6qeRN<53(PMxRvK%~)z*Ifjc`H};#e>UOm?^% zb?5pJ=0WWWZ>9>`&~J+0Cc`#i+dEybb=97Zin*y74y9^(UqY4xb|bOIl`4ukjKbAi zwCLGg@F+hn?00YdnTmfYMogCfjJV450)kzY!42stA7_xb^5w%wh{BNuGfO0F;VN0n z5D(oPTDOUmzv1VV)^RH}#GoYh8sK>ZCp+w^nENVfsbWwc${j9TG-&V4cNP81!e+Db z;=ToGLOaBhVuOeVtz*6txuWo6gGyCiAW&99tSD%dQKQ;0LOpf$t3foq%N5W=^dWV% zSRr6iIVo75xbhB+4<0(Wn5f|+@VU%SRBZ%v%;(QtoDtm;f7#C)`=i?b?{5v`f4?=G z&*1;p3p4q1a|6LAt62iMsK$opZdc$~z{|cuEh?>?K$!Z;VP~ktTBa%9dZ?Ea4;uRS z7r$h7Y)_}OjGWPKkHL++of*3?ejaX5Z<^x+(Q+1-_it~69T-f(Zk=D5JSu3q+ED5Oe-^4=d2}Xc7_8bAdz9X0)7u=X ziKeP@E6_2|f7HcMW*9o-Mkcg~Jm7*tQeqGZf_R=^_wLs2ePiou*r_MPVFu=>*C^t7 z=ATr=aHa5S?O#uJ%PKhkbB1J1Pq2pYd7=h?d#c#~eyV@0*jkucd=5bWkxuz2>o{#F zBk-)G(rhT4bIQzj+UAoIx|}iFVqvWppQxP%_E#{q&r;HfwALY`iZC`VN<5Q414)~v zbAJ)yE1lwh1qR`ZFrfD`8FsK%@aR@^do+JMTcduzzpT;&(jM?cK}Y%2I#TMV1#?67 zF5Wc)`+2RYUmM&+#Va5?T$XMMX=Ww`Fj`x?F*=V>rDt|(l6SG*+SE2kCvfYk z#nddAu+d?-qK;PxPdic78DG51Erf_)mg!{f+@NT zsM%W1;%wUh%x5m`0!|u_GVg0xCaq7izN+MF-s+Nt8f&mU^SE`5oWBy`#vJ*P?RMF$ zIN#ammPc-x)q3QyE}*C_Q@iofp<4`GSN>Rc@l``#i&ep``F-EHeA6_FXJc_*^R;f3 zc=YsiFyFFf`EH*`&r-KW=dMj^ec%Uml$1=Uxeim*PJ5<6jbnqNQ$?wX7s(4A*WEpj zm%4rBhc)w)?63>f^hT-`>-umGryZ05#rQ0gAv>?Tbhu#^*O*r81-FU#(?(%`TZhDT z@g+M3mBpSHtM&Gxo4Ma1|Lh4CS}x)3Cp$xj5ZGvT8SVBe22CaR+~=~oc=&aW>onye z%_QYr4ie3*72TW`9kHORa(DCHFa~NJLk+R`9@h5&gIw37W=72)n==^C0k#-l6Jy-J zV}pJ}f{cL>h+_XG#Kg zf=49sKu(Pj={(NBf^5Gab9tr}FBy1KS+IU79tMcLA^~AlPvPGrScsZg9dB+=lJ#pM z%9>k2IJ!JdQ88~;!k17MUuXR^Jf9#IAuLYZNFM0(QgewrqA&^ZLk=b#*=W4>j5Qwy zBAX#7yJ0le;V&QWWM;!b(NlcMy>rwM<=#O?I2XIlETlydo5$Z^ON5fb-GjL8U5{mP zva@JNI&+IoTsJu7OoRiBzkUFSJ37q5f9eukAH<^p@ZGba|G`4RjOuip`&l{-Da=xaBJe3xdRMA%G zAsErPban=T^UkA>SeKop6?%P$dMuA`1^x^E8obSAj<7Kl-i!tN+qTc+*86r^ckl1# zcla+{^eJ)jyaUhf3L{dCBPQ7i4yq&MjJzq=8PPK)-n0kUm^%|svLhUy
  • cvo@>>KRA_ewqv=Wf=+zw@*R)auUuj>~FxBG# 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≠mUT4^gVSLIYPY(10O20 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%0D^~N4=L&Csc`hjNM)gX(^N7l|9&I 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%0D_4 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%0Dc+*Iir|$5g)tjq9S^{e4KSx7O-rHkCbrk)FO{-} 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�f#)5F{Hxyrc!4$O&gkOL}qw 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%0A5i%qjRz7Z0tR;E0NETJwv(85V^qp;G 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≥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 diff --git a/play-framework/routing-in-play/project/build.properties b/play-framework/routing-in-play/project/build.properties index 6d22e3f2d1..c0bab04941 100644 --- a/play-framework/routing-in-play/project/build.properties +++ b/play-framework/routing-in-play/project/build.properties @@ -1,4 +1 @@ -#Activator-generated Properties -#Fri Sep 30 14:25:10 EAT 2016 -template.uuid=26c759a5-daf0-4e02-bcfa-ac69725267c0 -sbt.version=0.13.11 +sbt.version=1.2.8 diff --git a/play-framework/routing-in-play/project/plugins.sbt b/play-framework/routing-in-play/project/plugins.sbt index e8e7f602f7..1c8c62a0d5 100644 --- a/play-framework/routing-in-play/project/plugins.sbt +++ b/play-framework/routing-in-play/project/plugins.sbt @@ -1,21 +1,7 @@ // The Play plugin -addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.5.8") +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.7.3") -// Web plugins -addSbtPlugin("com.typesafe.sbt" % "sbt-coffeescript" % "1.0.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-less" % "1.1.0") -addSbtPlugin("com.typesafe.sbt" % "sbt-jshint" % "1.0.4") -addSbtPlugin("com.typesafe.sbt" % "sbt-rjs" % "1.0.8") -addSbtPlugin("com.typesafe.sbt" % "sbt-digest" % "1.1.1") -addSbtPlugin("com.typesafe.sbt" % "sbt-mocha" % "1.1.0") -addSbtPlugin("org.irundaia.sbt" % "sbt-sassify" % "1.4.6") - -// Play enhancer - this automatically generates getters/setters for public fields -// and rewrites accessors of these fields to use the getters/setters. Remove this -// plugin if you prefer not to have this feature, or disable on a per project -// basis using disablePlugins(PlayEnhancer) in your build.sbt -addSbtPlugin("com.typesafe.sbt" % "sbt-play-enhancer" % "1.1.0") - -// Play Ebean support, to enable, uncomment this line, and enable in your build.sbt using -// enablePlugins(PlayEbean). -// addSbtPlugin("com.typesafe.sbt" % "sbt-play-ebean" % "3.0.2") +// Defines scaffolding (found under .g8 folder) +// http://www.foundweekends.org/giter8/scaffolding.html +// sbt "g8Scaffold form" +addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.11.0") diff --git a/play-framework/routing-in-play/public/javascripts/hello.js b/play-framework/routing-in-play/public/javascripts/hello.js deleted file mode 100644 index 02ee13c7ca..0000000000 --- a/play-framework/routing-in-play/public/javascripts/hello.js +++ /dev/null @@ -1,3 +0,0 @@ -if (window.console) { - console.log("Welcome to your Play application's JavaScript!"); -} diff --git a/play-framework/routing-in-play/public/javascripts/main.js b/play-framework/routing-in-play/public/javascripts/main.js new file mode 100644 index 0000000000..e69de29bb2 diff --git a/play-framework/routing-in-play/test/ApplicationUnitTest.java b/play-framework/routing-in-play/test/ApplicationUnitTest.java deleted file mode 100644 index 572ce282bc..0000000000 --- a/play-framework/routing-in-play/test/ApplicationUnitTest.java +++ /dev/null @@ -1,45 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.fasterxml.jackson.databind.JsonNode; -import org.junit.*; - -import play.mvc.*; -import play.test.*; -import play.data.DynamicForm; -import play.data.validation.ValidationError; -import play.data.validation.Constraints.RequiredValidator; -import play.i18n.Lang; -import play.libs.F; -import play.libs.F.*; -import play.twirl.api.Content; - -import static play.test.Helpers.*; -import static org.junit.Assert.*; - - -/** - * - * Simple (JUnit) tests that can call all parts of a play app. - * If you are interested in mocking a whole application, see the wiki for more details. - * - */ -public class ApplicationUnitTest { - - @Test - public void simpleCheck() { - int a = 1 + 1; - assertEquals(2, a); - } - - @Test - public void renderTemplate() { - Content html = views.html.index.render("Your new application is ready."); - assertEquals("text/html", html.contentType()); - assertTrue(html.body().contains("Your new application is ready.")); - } - - -} diff --git a/play-framework/routing-in-play/test/IntegrationTest.java b/play-framework/routing-in-play/test/IntegrationTest.java deleted file mode 100644 index c53c71e124..0000000000 --- a/play-framework/routing-in-play/test/IntegrationTest.java +++ /dev/null @@ -1,25 +0,0 @@ -import org.junit.*; - -import play.mvc.*; -import play.test.*; - -import static play.test.Helpers.*; -import static org.junit.Assert.*; - -import static org.fluentlenium.core.filter.FilterConstructor.*; - -public class IntegrationTest { - - /** - * add your integration test here - * in this example we just check if the welcome page is being shown - */ - @Test - public void test() { - running(testServer(3333, fakeApplication(inMemoryDatabase())), HTMLUNIT, browser -> { - browser.goTo("http://localhost:3333"); - assertTrue(browser.pageSource().contains("Your new application is ready.")); - }); - } - -} diff --git a/play-framework/routing-in-play/test/controllers/HomeControllerUnitTest.java b/play-framework/routing-in-play/test/controllers/HomeControllerUnitTest.java new file mode 100644 index 0000000000..b911242ac7 --- /dev/null +++ b/play-framework/routing-in-play/test/controllers/HomeControllerUnitTest.java @@ -0,0 +1,36 @@ +package controllers; + +import org.junit.Test; +import play.Application; +import play.inject.guice.GuiceApplicationBuilder; +import play.mvc.Http; +import play.mvc.Result; +import play.test.WithApplication; +import play.twirl.api.Html; + +import java.util.Optional; +import java.util.concurrent.CompletionStage; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static play.mvc.Http.Status.*; +import static play.test.Helpers.GET; +import static play.test.Helpers.route; + +public class HomeControllerUnitTest extends WithApplication { + + @Override + protected Application provideApplication() { + return new GuiceApplicationBuilder().build(); + } + + @Test + public void givenRequest_whenRootPath_ThenStatusOkay() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + } +} diff --git a/play-framework/routing-in-play/.gitignore b/play-framework/student-api/.gitignore similarity index 94% rename from play-framework/routing-in-play/.gitignore rename to play-framework/student-api/.gitignore index eb372fc719..e497f3fc67 100644 --- a/play-framework/routing-in-play/.gitignore +++ b/play-framework/student-api/.gitignore @@ -1,6 +1,7 @@ logs target /.idea +/.g8 /.idea_modules /.classpath /.project diff --git a/play-framework/student-api/app/controllers/StudentController.java b/play-framework/student-api/app/controllers/StudentController.java new file mode 100644 index 0000000000..5373511560 --- /dev/null +++ b/play-framework/student-api/app/controllers/StudentController.java @@ -0,0 +1,91 @@ +package controllers; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import model.Student; +import play.libs.Json; +import play.libs.concurrent.HttpExecutionContext; +import play.mvc.Controller; +import play.mvc.Http; +import play.mvc.Result; +import store.StudentStore; +import utils.Util; + +import javax.inject.Inject; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.CompletionStage; + +import static java.util.concurrent.CompletableFuture.supplyAsync; + +public class StudentController extends Controller { + private HttpExecutionContext ec; + private StudentStore studentStore; + + @Inject + public StudentController(HttpExecutionContext ec, StudentStore studentStore) { + this.studentStore = studentStore; + this.ec = ec; + } + + public CompletionStage create(Http.Request request) { + JsonNode json = request.body().asJson(); + return supplyAsync(() -> { + if (json == null) { + return badRequest(Util.createResponse("Expecting Json data", false)); + } + + Optional studentOptional = studentStore.addStudent(Json.fromJson(json, Student.class)); + return studentOptional.map(student -> { + JsonNode jsonObject = Json.toJson(student); + return created(Util.createResponse(jsonObject, true)); + }).orElse(internalServerError(Util.createResponse("Could not create data.", false))); + }, ec.current()); + } + + public CompletionStage listStudents() { + return supplyAsync(() -> { + Set result = studentStore.getAllStudents(); + ObjectMapper mapper = new ObjectMapper(); + JsonNode jsonData = mapper.convertValue(result, JsonNode.class); + return ok(Util.createResponse(jsonData, true)); + }, ec.current()); + } + + public CompletionStage retrieve(int id) { + return supplyAsync(() -> { + final Optional studentOptional = studentStore.getStudent(id); + return studentOptional.map(student -> { + JsonNode jsonObjects = Json.toJson(student); + return ok(Util.createResponse(jsonObjects, true)); + }).orElse(notFound(Util.createResponse("Student with id:" + id + " not found", false))); + }, ec.current()); + } + + public CompletionStage update(Http.Request request) { + JsonNode json = request.body().asJson(); + return supplyAsync(() -> { + if (json == null) { + return badRequest(Util.createResponse("Expecting Json data", false)); + } + Optional studentOptional = studentStore.updateStudent(Json.fromJson(json, Student.class)); + return studentOptional.map(student -> { + if (student == null) { + return notFound(Util.createResponse("Student not found", false)); + } + JsonNode jsonObject = Json.toJson(student); + return ok(Util.createResponse(jsonObject, true)); + }).orElse(internalServerError(Util.createResponse("Could not create data.", false))); + }, ec.current()); + } + + public CompletionStage delete(int id) { + return supplyAsync(() -> { + boolean status = studentStore.deleteStudent(id); + if (!status) { + return notFound(Util.createResponse("Student with id:" + id + " not found", false)); + } + return ok(Util.createResponse("Student with id:" + id + " deleted", true)); + }, ec.current()); + } +} diff --git a/play-framework/introduction/app/models/Student.java b/play-framework/student-api/app/model/Student.java similarity index 84% rename from play-framework/introduction/app/models/Student.java rename to play-framework/student-api/app/model/Student.java index dc539767bd..39cbfe0040 100644 --- a/play-framework/introduction/app/models/Student.java +++ b/play-framework/student-api/app/model/Student.java @@ -1,15 +1,19 @@ -package models; +package model; + public class Student { private String firstName; private String lastName; private int age; private int id; - public Student(){} - public Student(String firstName, String lastName, int age) { - super(); + + public Student() { + } + + public Student(String firstName, String lastName, int age, int id) { this.firstName = firstName; this.lastName = lastName; this.age = age; + this.id = id; } public String getFirstName() { @@ -43,5 +47,4 @@ public class Student { public void setId(int id) { this.id = id; } - } diff --git a/play-framework/student-api/app/store/StudentStore.java b/play-framework/student-api/app/store/StudentStore.java new file mode 100644 index 0000000000..315db5b916 --- /dev/null +++ b/play-framework/student-api/app/store/StudentStore.java @@ -0,0 +1,37 @@ +package store; + +import model.Student; + +import java.util.*; + +public class StudentStore { + private Map students = new HashMap<>(); + + public Optional addStudent(Student student) { + int id = students.size(); + student.setId(id); + students.put(id, student); + return Optional.ofNullable(student); + } + + public Optional getStudent(int id) { + return Optional.ofNullable(students.get(id)); + } + + public Set getAllStudents() { + return new HashSet<>(students.values()); + } + + public Optional updateStudent(Student student) { + int id = student.getId(); + if (students.containsKey(id)) { + students.put(id, student); + return Optional.ofNullable(student); + } + return Optional.empty(); + } + + public boolean deleteStudent(int id) { + return students.remove(id) != null; + } +} diff --git a/play-framework/introduction/app/util/Util.java b/play-framework/student-api/app/utils/Util.java similarity index 60% rename from play-framework/introduction/app/util/Util.java rename to play-framework/student-api/app/utils/Util.java index a853a4cb43..3fb9833ada 100644 --- a/play-framework/introduction/app/util/Util.java +++ b/play-framework/student-api/app/utils/Util.java @@ -1,17 +1,17 @@ -package util; +package utils; -import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.node.ObjectNode; import play.libs.Json; public class Util { public static ObjectNode createResponse(Object response, boolean ok) { ObjectNode result = Json.newObject(); - result.put("isSuccessfull", ok); - if (response instanceof String) + result.put("isSuccessful", ok); + if (response instanceof String) { result.put("body", (String) response); - else result.put("body", (JsonNode) response); - + } else { + result.putPOJO("body", response); + } return result; } -} \ No newline at end of file +} diff --git a/play-framework/student-api/build.sbt b/play-framework/student-api/build.sbt new file mode 100644 index 0000000000..13d3fe96cd --- /dev/null +++ b/play-framework/student-api/build.sbt @@ -0,0 +1,10 @@ +name := """student-api""" +organization := "com.baeldung" + +version := "1.0-SNAPSHOT" + +lazy val root = (project in file(".")).enablePlugins(PlayJava) + +scalaVersion := "2.13.0" + +libraryDependencies += guice diff --git a/play-framework/student-api/conf/application.conf b/play-framework/student-api/conf/application.conf new file mode 100644 index 0000000000..85c184dcb1 --- /dev/null +++ b/play-framework/student-api/conf/application.conf @@ -0,0 +1,2 @@ +# This is the main configuration file for the application. +# https://www.playframework.com/documentation/latest/ConfigFile diff --git a/play-framework/student-api/conf/logback.xml b/play-framework/student-api/conf/logback.xml new file mode 100644 index 0000000000..e8c982543f --- /dev/null +++ b/play-framework/student-api/conf/logback.xml @@ -0,0 +1,35 @@ + + + + + + + ${application.home:-.}/logs/application.log + + %date [%level] from %logger in %thread - %message%n%xException + + + + + + %coloredLevel %logger{15} - %message%n%xException{10} + + + + + + + + + + + + + + + + + + + + diff --git a/play-framework/student-api/conf/routes b/play-framework/student-api/conf/routes new file mode 100644 index 0000000000..f89b866953 --- /dev/null +++ b/play-framework/student-api/conf/routes @@ -0,0 +1,12 @@ +# Routes +# This file defines all application routes (Higher priority routes first) +# ~~~~ + +GET / controllers.StudentController.listStudents() +GET /:id controllers.StudentController.retrieve(id:Int) +POST / controllers.StudentController.create(request: Request) +PUT / controllers.StudentController.update(request: Request) +DELETE /:id controllers.StudentController.delete(id:Int) + +# Map static resources from the /public folder to the /assets URL path +GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset) diff --git a/play-framework/student-api/project/build.properties b/play-framework/student-api/project/build.properties new file mode 100644 index 0000000000..c0bab04941 --- /dev/null +++ b/play-framework/student-api/project/build.properties @@ -0,0 +1 @@ +sbt.version=1.2.8 diff --git a/play-framework/student-api/project/plugins.sbt b/play-framework/student-api/project/plugins.sbt new file mode 100644 index 0000000000..1c8c62a0d5 --- /dev/null +++ b/play-framework/student-api/project/plugins.sbt @@ -0,0 +1,7 @@ +// The Play plugin +addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.7.3") + +// Defines scaffolding (found under .g8 folder) +// http://www.foundweekends.org/giter8/scaffolding.html +// sbt "g8Scaffold form" +addSbtPlugin("org.foundweekends.giter8" % "sbt-giter8-scaffold" % "0.11.0") diff --git a/play-framework/student-api/test/ApplicationLiveTest.java b/play-framework/student-api/test/ApplicationLiveTest.java deleted file mode 100644 index beeef1a602..0000000000 --- a/play-framework/student-api/test/ApplicationLiveTest.java +++ /dev/null @@ -1,172 +0,0 @@ - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.util.Arrays; - -import org.json.JSONArray; -import org.json.JSONObject; -import org.junit.Before; -import org.junit.Test; -import model.Student; -import play.test.*; -import static play.test.Helpers.*; - -public class ApplicationLiveTest{ - private static final String BASE_URL = "http://localhost:9000"; - - @Test -public void testInServer() throws Exception { - TestServer server = testServer(3333); - running(server, () -> { - try { - WSClient ws = play.libs.ws.WS.newClient(3333); - CompletionStage completionStage = ws.url("/").get(); - WSResponse response = completionStage.toCompletableFuture().get(); - ws.close(); - assertEquals(OK, response.getStatus()); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - }); -} - @Test - public void whenCreatesRecord_thenCorrect() { - Student student = new Student("jody", "west", 50); - JSONObject obj = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))); - assertTrue(obj.getBoolean("isSuccessfull")); - JSONObject body = obj.getJSONObject("body"); - assertEquals(student.getAge(), body.getInt("age")); - assertEquals(student.getFirstName(), body.getString("firstName")); - assertEquals(student.getLastName(), body.getString("lastName")); - } - - @Test - public void whenDeletesCreatedRecord_thenCorrect() { - Student student = new Student("Usain", "Bolt", 25); - JSONObject ob1 = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))).getJSONObject("body"); - int id = ob1.getInt("id"); - JSONObject obj1 = new JSONObject(makeRequest(BASE_URL + "/" + id, "POST", new JSONObject())); - assertTrue(obj1.getBoolean("isSuccessfull")); - makeRequest(BASE_URL + "/" + id, "DELETE", null); - JSONObject obj2 = new JSONObject(makeRequest(BASE_URL + "/" + id, "POST", new JSONObject())); - assertFalse(obj2.getBoolean("isSuccessfull")); - } - - @Test - public void whenUpdatesCreatedRecord_thenCorrect() { - Student student = new Student("john", "doe", 50); - JSONObject body1 = new JSONObject(makeRequest(BASE_URL, "POST", new JSONObject(student))).getJSONObject("body"); - assertEquals(student.getAge(), body1.getInt("age")); - int newAge = 60; - body1.put("age", newAge); - JSONObject body2 = new JSONObject(makeRequest(BASE_URL, "PUT", body1)).getJSONObject("body"); - assertFalse(student.getAge() == body2.getInt("age")); - assertTrue(newAge == body2.getInt("age")); - } - - @Test - public void whenGetsAllRecords_thenCorrect() { - Student student1 = new Student("jane", "daisy", 50); - Student student2 = new Student("john", "daniel", 60); - Student student3 = new Student("don", "mason", 55); - Student student4 = new Student("scarlet", "ohara", 90); - - makeRequest(BASE_URL, "POST", new JSONObject(student1)); - makeRequest(BASE_URL, "POST", new JSONObject(student2)); - makeRequest(BASE_URL, "POST", new JSONObject(student3)); - makeRequest(BASE_URL, "POST", new JSONObject(student4)); - - JSONObject objects = new JSONObject(makeRequest(BASE_URL, "GET", null)); - assertTrue(objects.getBoolean("isSuccessfull")); - JSONArray array = objects.getJSONArray("body"); - assertTrue(array.length() >= 4); - } - - public static String makeRequest(String myUrl, String httpMethod, JSONObject parameters) { - - URL url = null; - try { - url = new URL(myUrl); - } catch (MalformedURLException e) { - e.printStackTrace(); - } - HttpURLConnection conn = null; - try { - - conn = (HttpURLConnection) url.openConnection(); - } catch (IOException e) { - e.printStackTrace(); - } - conn.setDoInput(true); - - conn.setReadTimeout(10000); - - conn.setRequestProperty("Content-Type", "application/json"); - DataOutputStream dos = null; - int respCode = 0; - String inputString = null; - try { - conn.setRequestMethod(httpMethod); - - if (Arrays.asList("POST", "PUT").contains(httpMethod)) { - String params = parameters.toString(); - - conn.setDoOutput(true); - - dos = new DataOutputStream(conn.getOutputStream()); - dos.writeBytes(params); - dos.flush(); - dos.close(); - } - respCode = conn.getResponseCode(); - if (respCode != 200 && respCode != 201) { - String error = inputStreamToString(conn.getErrorStream()); - return error; - } - inputString = inputStreamToString(conn.getInputStream()); - - } catch (IOException e) { - - e.printStackTrace(); - } - return inputString; - } - - public static String inputStreamToString(InputStream is) { - BufferedReader br = null; - StringBuilder sb = new StringBuilder(); - - String line; - try { - - br = new BufferedReader(new InputStreamReader(is)); - while ((line = br.readLine()) != null) { - sb.append(line); - } - - } catch (IOException e) { - e.printStackTrace(); - } finally { - if (br != null) { - try { - br.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - - return sb.toString(); - - } -} diff --git a/play-framework/student-api/test/controllers/StudentControllerUnitTest.java b/play-framework/student-api/test/controllers/StudentControllerUnitTest.java new file mode 100644 index 0000000000..bf645b72f9 --- /dev/null +++ b/play-framework/student-api/test/controllers/StudentControllerUnitTest.java @@ -0,0 +1,95 @@ +package controllers; + +import com.fasterxml.jackson.databind.node.ObjectNode; +import org.junit.Test; +import play.Application; +import play.inject.guice.GuiceApplicationBuilder; +import play.libs.Json; +import play.mvc.Http; +import play.mvc.Result; +import play.test.WithApplication; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static play.mvc.Http.Status.OK; +import static play.test.Helpers.*; + +public class StudentControllerUnitTest extends WithApplication { + + @Override + protected Application provideApplication() { + return new GuiceApplicationBuilder().build(); + } + + @Test + public void givenStudentPostData_whenCreatingStudent_ThenShouldReturnCreatedStudent() { + final ObjectNode jsonNode = Json.newObject(); + jsonNode.put("firstName", "John"); + jsonNode.put("lastName", "Baeldung"); + jsonNode.put("age", 25); + + Http.RequestBuilder request = new Http.RequestBuilder() + .method(POST) + .bodyJson(jsonNode) + .uri("/"); + + Result result = route(app, request); + assertEquals(CREATED, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } + + @Test + public void givenUrlToListStudents_whenListingStudents_ThenShouldReturnStudentList() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/"); + + Result result = route(app, request); + assertEquals(OK, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } + + @Test + public void givenUrlToRetrieveSingleStudent_whenRetrievingStudent_ThenShouldReturn404NotFound() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(GET) + .uri("/1"); + + Result result = route(app, request); + assertEquals(NOT_FOUND, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } + + @Test + public void givenUrlToUpdateStudent_whenaUpdatingStudent_ThenShouldFail() { + final ObjectNode jsonNode = Json.newObject(); + jsonNode.put("firstName", "John"); + jsonNode.put("lastName", "Baeldung"); + jsonNode.put("age", 25); + + Http.RequestBuilder request = new Http.RequestBuilder() + .method(PUT) + .bodyJson(jsonNode) + .uri("/"); + + Result result = route(app, request); + assertEquals(INTERNAL_SERVER_ERROR, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } + + @Test + public void givenIdToDeleteStudent_whenDeletingStudent_ThenShouldFail() { + Http.RequestBuilder request = new Http.RequestBuilder() + .method(DELETE) + .uri("/1"); + + Result result = route(app, request); + assertEquals(NOT_FOUND, result.status()); + assertTrue(result.contentType().isPresent()); + assertEquals("application/json", result.contentType().get()); + } +} From 0e904f738a176c34bb930ffa4553dca6446bfb33 Mon Sep 17 00:00:00 2001 From: Michael Sievers Date: Fri, 6 Sep 2019 21:03:49 +0200 Subject: [PATCH 131/396] [BAEL-3077] Add examples for mapstruct with multiple source objects (#7724) * [BAEL-3077] Add examples for mapstruct with multiple source objects * [BAEL-3077] Add unit tests for mappers added by examples --- .../java/com/baeldung/dto/CustomerDto.java | 25 ++++++++ .../java/com/baeldung/entity/Address.java | 35 ++++++++++ .../java/com/baeldung/entity/Customer.java | 25 ++++++++ .../com/baeldung/entity/DeliveryAddress.java | 55 ++++++++++++++++ .../baeldung/mapper/CustomerDtoMapper.java | 15 +++++ .../mapper/DeliveryAddressMapper.java | 24 +++++++ .../mapper/CustomerDtoMapperUnitTest.java | 29 +++++++++ .../mapper/DeliveryAddressMapperUnitTest.java | 64 +++++++++++++++++++ 8 files changed, 272 insertions(+) create mode 100644 mapstruct/src/main/java/com/baeldung/dto/CustomerDto.java create mode 100644 mapstruct/src/main/java/com/baeldung/entity/Address.java create mode 100644 mapstruct/src/main/java/com/baeldung/entity/Customer.java create mode 100644 mapstruct/src/main/java/com/baeldung/entity/DeliveryAddress.java create mode 100644 mapstruct/src/main/java/com/baeldung/mapper/CustomerDtoMapper.java create mode 100644 mapstruct/src/main/java/com/baeldung/mapper/DeliveryAddressMapper.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/CustomerDtoMapperUnitTest.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java diff --git a/mapstruct/src/main/java/com/baeldung/dto/CustomerDto.java b/mapstruct/src/main/java/com/baeldung/dto/CustomerDto.java new file mode 100644 index 0000000000..617f2c6e0c --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/dto/CustomerDto.java @@ -0,0 +1,25 @@ +package com.baeldung.dto; + +public class CustomerDto { + + private String forename; + private String surname; + + public String getForename() { + return forename; + } + + public CustomerDto setForename(String forename) { + this.forename = forename; + return this; + } + + public String getSurname() { + return surname; + } + + public CustomerDto setSurname(String surname) { + this.surname = surname; + return this; + } +} diff --git a/mapstruct/src/main/java/com/baeldung/entity/Address.java b/mapstruct/src/main/java/com/baeldung/entity/Address.java new file mode 100644 index 0000000000..4a6edbd75d --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/entity/Address.java @@ -0,0 +1,35 @@ +package com.baeldung.entity; + +public class Address { + + private String street; + private String postalcode; + private String county; + + public String getStreet() { + return street; + } + + public Address setStreet(String street) { + this.street = street; + return this; + } + + public String getPostalcode() { + return postalcode; + } + + public Address setPostalcode(String postalcode) { + this.postalcode = postalcode; + return this; + } + + public String getCounty() { + return county; + } + + public Address setCounty(String county) { + this.county = county; + return this; + } +} diff --git a/mapstruct/src/main/java/com/baeldung/entity/Customer.java b/mapstruct/src/main/java/com/baeldung/entity/Customer.java new file mode 100644 index 0000000000..cdde6b542a --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/entity/Customer.java @@ -0,0 +1,25 @@ +package com.baeldung.entity; + +public class Customer { + + private String firstName; + private String lastName; + + public String getFirstName() { + return firstName; + } + + public Customer setFirstName(String firstName) { + this.firstName = firstName; + return this; + } + + public String getLastName() { + return lastName; + } + + public Customer setLastName(String lastName) { + this.lastName = lastName; + return this; + } +} diff --git a/mapstruct/src/main/java/com/baeldung/entity/DeliveryAddress.java b/mapstruct/src/main/java/com/baeldung/entity/DeliveryAddress.java new file mode 100644 index 0000000000..084c5f86ef --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/entity/DeliveryAddress.java @@ -0,0 +1,55 @@ +package com.baeldung.entity; + +public class DeliveryAddress { + + private String forename; + private String surname; + private String street; + private String postalcode; + private String county; + + public String getForename() { + return forename; + } + + public DeliveryAddress setForename(String forename) { + this.forename = forename; + return this; + } + + public String getSurname() { + return surname; + } + + public DeliveryAddress setSurname(String surname) { + this.surname = surname; + return this; + } + + public String getStreet() { + return street; + } + + public DeliveryAddress setStreet(String street) { + this.street = street; + return this; + } + + public String getPostalcode() { + return postalcode; + } + + public DeliveryAddress setPostalcode(String postalcode) { + this.postalcode = postalcode; + return this; + } + + public String getCounty() { + return county; + } + + public DeliveryAddress setCounty(String county) { + this.county = county; + return this; + } +} diff --git a/mapstruct/src/main/java/com/baeldung/mapper/CustomerDtoMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/CustomerDtoMapper.java new file mode 100644 index 0000000000..2c84f80167 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/mapper/CustomerDtoMapper.java @@ -0,0 +1,15 @@ +package com.baeldung.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; + +import com.baeldung.dto.CustomerDto; +import com.baeldung.entity.Customer; + +@Mapper +public interface CustomerDtoMapper { + + @Mapping(source = "firstName", target = "forename") + @Mapping(source = "lastName", target = "surname") + CustomerDto from(Customer customer); +} diff --git a/mapstruct/src/main/java/com/baeldung/mapper/DeliveryAddressMapper.java b/mapstruct/src/main/java/com/baeldung/mapper/DeliveryAddressMapper.java new file mode 100644 index 0000000000..6a337fbb9e --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/mapper/DeliveryAddressMapper.java @@ -0,0 +1,24 @@ +package com.baeldung.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; + +import com.baeldung.entity.Address; +import com.baeldung.entity.Customer; +import com.baeldung.entity.DeliveryAddress; + +@Mapper +public interface DeliveryAddressMapper { + + @Mapping(source = "customer.firstName", target = "forename") + @Mapping(source = "customer.lastName", target = "surname") + @Mapping(source = "address.street", target = "street") + @Mapping(source = "address.postalcode", target = "postalcode") + @Mapping(source = "address.county", target = "county") + DeliveryAddress from(Customer customer, Address address); + + @Mapping(source = "address.postalcode", target = "postalcode") + @Mapping(source = "address.county", target = "county") + DeliveryAddress updateAddress(@MappingTarget DeliveryAddress deliveryAddress, Address address); +} diff --git a/mapstruct/src/test/java/com/baeldung/mapper/CustomerDtoMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/CustomerDtoMapperUnitTest.java new file mode 100644 index 0000000000..cded90138b --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/CustomerDtoMapperUnitTest.java @@ -0,0 +1,29 @@ +package com.baeldung.mapper; + +import static org.junit.Assert.assertEquals; + +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +import com.baeldung.dto.CustomerDto; +import com.baeldung.entity.Customer; + +public class CustomerDtoMapperUnitTest { + + private CustomerDtoMapper customerDtoMapper = Mappers.getMapper(CustomerDtoMapper.class); + + @Test + void testGivenCustomer_mapsToCustomerDto() { + + // given + Customer customer = new Customer().setFirstName("Max") + .setLastName("Powers"); + + // when + CustomerDto customerDto = customerDtoMapper.from(customer); + + // then + assertEquals(customerDto.getForename(), customer.getFirstName()); + assertEquals(customerDto.getSurname(), customer.getLastName()); + } +} diff --git a/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java new file mode 100644 index 0000000000..e2c12fcba3 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java @@ -0,0 +1,64 @@ +package com.baeldung.mapper; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertSame; + +import org.junit.Test; +import org.mapstruct.factory.Mappers; + +import com.baeldung.entity.Address; +import com.baeldung.entity.Customer; +import com.baeldung.entity.DeliveryAddress; + +public class DeliveryAddressMapperUnitTest { + + private DeliveryAddressMapper deliveryAddressMapper = Mappers.getMapper(DeliveryAddressMapper.class); + + @Test + public void testGivenCustomerAndAddress_mapsToDeliveryAddress() { + + // given + Customer customer = new Customer().setFirstName("Max") + .setLastName("Powers"); + + Address homeAddress = new Address().setStreet("123 Some Street") + .setCounty("Nevada") + .setPostalcode("89123"); + + // when + DeliveryAddress deliveryAddress = deliveryAddressMapper.from(customer, homeAddress); + + // then + assertEquals(deliveryAddress.getForename(), customer.getFirstName()); + assertEquals(deliveryAddress.getSurname(), customer.getLastName()); + assertEquals(deliveryAddress.getStreet(), homeAddress.getStreet()); + assertEquals(deliveryAddress.getCounty(), homeAddress.getCounty()); + assertEquals(deliveryAddress.getPostalcode(), homeAddress.getPostalcode()); + } + + @Test + public void testGivenDeliveryAddressAndSomeOtherAddress_updatesDeliveryAddress() { + + // given + Customer customer = new Customer().setFirstName("Max") + .setLastName("Powers"); + + DeliveryAddress deliveryAddress = new DeliveryAddress().setStreet("123 Some Street") + .setCounty("Nevada") + .setPostalcode("89123"); + + Address otherAddress = new Address().setStreet("456 Some other street") + .setCounty("Arizona") + .setPostalcode("12345"); + + // when + DeliveryAddress updatedDeliveryAddress = deliveryAddressMapper.updateAddress(deliveryAddress, otherAddress); + + // then + assertSame(deliveryAddress, updatedDeliveryAddress); + + assertEquals(deliveryAddress.getStreet(), otherAddress.getStreet()); + assertEquals(deliveryAddress.getCounty(), otherAddress.getCounty()); + assertEquals(deliveryAddress.getPostalcode(), otherAddress.getPostalcode()); + } +} From d147cabfd8dc2285498d8e734447bd3ad7e21a7e Mon Sep 17 00:00:00 2001 From: psevestre Date: Fri, 6 Sep 2019 16:10:48 -0300 Subject: [PATCH 132/396] [BAEL-3164] Add spring-boot-jdbi module (#7710) --- persistence-modules/pom.xml | 1 + .../spring-boot-jdbi/.gitignore | 31 ++ .../.mvn/wrapper/MavenWrapperDownloader.java | 114 +++++++ .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 48337 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + persistence-modules/spring-boot-jdbi/mvnw | 286 ++++++++++++++++++ persistence-modules/spring-boot-jdbi/mvnw.cmd | 161 ++++++++++ persistence-modules/spring-boot-jdbi/pom.xml | 107 +++++++ .../baeldung/boot/jdbi/JdbiConfiguration.java | 57 ++++ .../boot/jdbi/SpringBootJdbiApplication.java | 15 + .../baeldung/boot/jdbi/dao/CarMakerDao.java | 35 +++ .../baeldung/boot/jdbi/dao/CarModelDao.java | 28 ++ .../baeldung/boot/jdbi/domain/CarMaker.java | 14 + .../baeldung/boot/jdbi/domain/CarModel.java | 14 + .../boot/jdbi/mapper/CarMakerMapper.java | 27 ++ .../boot/jdbi/mapper/CarModelMapper.java | 25 ++ .../boot/jdbi/service/CarMakerService.java | 48 +++ .../src/main/resources/application.yml | 1 + .../boot/jdbi/dao/CarMakerDao/findById.sql | 11 + .../boot/jdbi/dao/CarMakerDao/insert.sql | 4 + .../dao/CarModelDao/findByMakerIdAndSku.sql | 10 + .../boot/jdbi/dao/CarModelDao/insert.sql | 8 + .../SpringBootJdbiApplicationUnitTest.java | 121 ++++++++ .../src/test/resources/data.sql | 12 + .../src/test/resources/schema.sql | 24 ++ 25 files changed, 1155 insertions(+) create mode 100644 persistence-modules/spring-boot-jdbi/.gitignore create mode 100644 persistence-modules/spring-boot-jdbi/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 persistence-modules/spring-boot-jdbi/.mvn/wrapper/maven-wrapper.jar create mode 100644 persistence-modules/spring-boot-jdbi/.mvn/wrapper/maven-wrapper.properties create mode 100644 persistence-modules/spring-boot-jdbi/mvnw create mode 100644 persistence-modules/spring-boot-jdbi/mvnw.cmd create mode 100644 persistence-modules/spring-boot-jdbi/pom.xml create mode 100644 persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java create mode 100644 persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/SpringBootJdbiApplication.java create mode 100644 persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarMakerDao.java create mode 100644 persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarModelDao.java create mode 100644 persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarMaker.java create mode 100644 persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java create mode 100644 persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarMakerMapper.java create mode 100644 persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java create mode 100644 persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/service/CarMakerService.java create mode 100644 persistence-modules/spring-boot-jdbi/src/main/resources/application.yml create mode 100644 persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/findById.sql create mode 100644 persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql create mode 100644 persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/findByMakerIdAndSku.sql create mode 100644 persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql create mode 100644 persistence-modules/spring-boot-jdbi/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java create mode 100644 persistence-modules/spring-boot-jdbi/src/test/resources/data.sql create mode 100644 persistence-modules/spring-boot-jdbi/src/test/resources/schema.sql diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 4f52a2ff68..9ae24efcc1 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -60,5 +60,6 @@ spring-persistence-simple jpa-hibernate-cascade-type r2dbc + spring-boot-jdbi diff --git a/persistence-modules/spring-boot-jdbi/.gitignore b/persistence-modules/spring-boot-jdbi/.gitignore new file mode 100644 index 0000000000..a2a3040aa8 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/.gitignore @@ -0,0 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/persistence-modules/spring-boot-jdbi/.mvn/wrapper/MavenWrapperDownloader.java b/persistence-modules/spring-boot-jdbi/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000000..72308aa479 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,114 @@ +/* +Licensed to the Apache Software Foundation (ASF) under one +or more contributor license agreements. See the NOTICE file +distributed with this work for additional information +regarding copyright ownership. The ASF licenses this file +to you under the Apache License, Version 2.0 (the +"License"); you may not use this file except in compliance +with the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, +software distributed under the License is distributed on an +"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +KIND, either express or implied. See the License for the +specific language governing permissions and limitations +under the License. +*/ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.channels.Channels; +import java.nio.channels.ReadableByteChannel; +import java.util.Properties; + +public class MavenWrapperDownloader { + + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = + "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: : " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/persistence-modules/spring-boot-jdbi/.mvn/wrapper/maven-wrapper.jar b/persistence-modules/spring-boot-jdbi/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..01e67997377a393fd672c7dcde9dccbedf0cb1e9 GIT binary patch literal 48337 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 \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" + # TODO classpath? +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + wget "$jarUrl" -O "$wrapperJarPath" + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + curl -o "$wrapperJarPath" "$jarUrl" + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/persistence-modules/spring-boot-jdbi/mvnw.cmd b/persistence-modules/spring-boot-jdbi/mvnw.cmd new file mode 100644 index 0000000000..fef5a8f7f9 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/mvnw.cmd @@ -0,0 +1,161 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven2 Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" +FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + echo Found %WRAPPER_JAR% +) else ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" + echo Finished downloading %WRAPPER_JAR% +) +@REM End of extension + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/persistence-modules/spring-boot-jdbi/pom.xml b/persistence-modules/spring-boot-jdbi/pom.xml new file mode 100644 index 0000000000..26a0b94275 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/pom.xml @@ -0,0 +1,107 @@ + + + 4.0.0 + com.baeldung.boot.jdbi + spring-boot-jdbi + 0.0.1-SNAPSHOT + spring-boot-jdbi + Sample SpringBoot JDBI Project + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + ../../pom.xml + + + + + 1.8 + 3.9.1 + + + + + + org.springframework.boot + spring-boot-dependencies + 2.1.7.RELEASE + pom + import + + + + org.jdbi + jdbi3-spring4 + ${jdbi.version} + + + + org.jdbi + jdbi3-sqlobject + ${jdbi.version} + + + + + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + org.jdbi + jdbi3-spring4 + + + + org.jdbi + jdbi3-sqlobject + + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-configuration-processor + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java new file mode 100644 index 0000000000..ddbe6cc118 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/JdbiConfiguration.java @@ -0,0 +1,57 @@ +package com.baeldung.boot.jdbi; + +import java.util.List; + +import javax.sql.DataSource; + +import org.jdbi.v3.core.Jdbi; +import org.jdbi.v3.core.mapper.RowMapper; +import org.jdbi.v3.core.spi.JdbiPlugin; +import org.jdbi.v3.sqlobject.SqlObjectPlugin; +import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; +import org.springframework.transaction.PlatformTransactionManager; + +import com.baeldung.boot.jdbi.dao.CarMakerDao; +import com.baeldung.boot.jdbi.dao.CarModelDao; + +import lombok.extern.slf4j.Slf4j; + +@Configuration +@Slf4j +public class JdbiConfiguration { + @Bean + public Jdbi jdbi(DataSource ds,List jdbiPlugins, List> rowMappers) { + TransactionAwareDataSourceProxy proxy = new TransactionAwareDataSourceProxy(ds); + Jdbi jdbi = Jdbi.create(proxy); + + // Register all available plugins + log.info("[I27] Installing plugins... ({} found)", jdbiPlugins.size()); + jdbiPlugins.forEach(plugin -> jdbi.installPlugin(plugin)); + + // Register all available rowMappers + log.info("[I31] Installing rowMappers... ({} found)", rowMappers.size()); + rowMappers.forEach(mapper -> jdbi.registerRowMapper(mapper)); + + return jdbi; + } + + @Bean + public JdbiPlugin sqlObjectPlugin() { + return new SqlObjectPlugin(); + } + + @Bean + public CarMakerDao carMakerDao(Jdbi jdbi) { + return jdbi.onDemand(CarMakerDao.class); + } + + @Bean + public CarModelDao carModelDao(Jdbi jdbi) { + return jdbi.onDemand(CarModelDao.class); + } +} diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/SpringBootJdbiApplication.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/SpringBootJdbiApplication.java new file mode 100644 index 0000000000..63afe3a3bf --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/SpringBootJdbiApplication.java @@ -0,0 +1,15 @@ +package com.baeldung.boot.jdbi; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +@SpringBootApplication +@EnableTransactionManagement +public class SpringBootJdbiApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringBootJdbiApplication.class, args); + } + +} diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarMakerDao.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarMakerDao.java new file mode 100644 index 0000000000..6cc7268144 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarMakerDao.java @@ -0,0 +1,35 @@ +/** + * + */ +package com.baeldung.boot.jdbi.dao; + +import java.util.List; + +import org.jdbi.v3.sqlobject.customizer.Bind; +import org.jdbi.v3.sqlobject.customizer.BindBean; +import org.jdbi.v3.sqlobject.locator.UseClasspathSqlLocator; +import org.jdbi.v3.sqlobject.statement.GetGeneratedKeys; +import org.jdbi.v3.sqlobject.statement.SqlBatch; +import org.jdbi.v3.sqlobject.statement.SqlQuery; +import org.jdbi.v3.sqlobject.statement.SqlUpdate; + +import com.baeldung.boot.jdbi.domain.CarMaker; + +/** + * @author Philippe + * + */ +@UseClasspathSqlLocator +public interface CarMakerDao { + + @SqlUpdate + @GetGeneratedKeys + Long insert(@BindBean CarMaker carMaker); + + @SqlBatch("insert") + @GetGeneratedKeys + List bulkInsert(@BindBean List carMakers); + + @SqlQuery + CarMaker findById(@Bind("id") Long id); +} diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarModelDao.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarModelDao.java new file mode 100644 index 0000000000..18a05c6108 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/dao/CarModelDao.java @@ -0,0 +1,28 @@ +package com.baeldung.boot.jdbi.dao; + +import java.util.List; + +import org.jdbi.v3.sqlobject.customizer.Bind; +import org.jdbi.v3.sqlobject.customizer.BindBean; +import org.jdbi.v3.sqlobject.locator.UseClasspathSqlLocator; +import org.jdbi.v3.sqlobject.statement.GetGeneratedKeys; +import org.jdbi.v3.sqlobject.statement.SqlBatch; +import org.jdbi.v3.sqlobject.statement.SqlQuery; +import org.jdbi.v3.sqlobject.statement.SqlUpdate; + +import com.baeldung.boot.jdbi.domain.CarModel; + +@UseClasspathSqlLocator +public interface CarModelDao { + + @SqlUpdate("insert") + @GetGeneratedKeys + Long insert(@BindBean CarModel carModel); + + @SqlBatch("insert") + @GetGeneratedKeys + List bulkInsert(@BindBean List models); + + @SqlQuery + CarModel findByMakerIdAndSku(@Bind("makerId") Long makerId, @Bind("sku") String sku ); +} diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarMaker.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarMaker.java new file mode 100644 index 0000000000..c32b0c30db --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarMaker.java @@ -0,0 +1,14 @@ +package com.baeldung.boot.jdbi.domain; + +import java.util.List; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CarMaker { + private Long id; + private String name; + private List models; +} diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java new file mode 100644 index 0000000000..80b615801b --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/domain/CarModel.java @@ -0,0 +1,14 @@ +package com.baeldung.boot.jdbi.domain; + +import lombok.Builder; +import lombok.Data; + +@Builder +@Data +public class CarModel { + private Long id; + private String name; + private Integer year; + private String sku; + private Long makerId; +} diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarMakerMapper.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarMakerMapper.java new file mode 100644 index 0000000000..54fc80d4ab --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarMakerMapper.java @@ -0,0 +1,27 @@ +package com.baeldung.boot.jdbi.mapper; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; + +import org.jdbi.v3.core.mapper.RowMapper; +import org.jdbi.v3.core.statement.StatementContext; +import org.springframework.stereotype.Component; + +import com.baeldung.boot.jdbi.domain.CarMaker; +import com.baeldung.boot.jdbi.domain.CarModel; + +@Component +public class CarMakerMapper implements RowMapper { + + @Override + public CarMaker map(ResultSet rs, StatementContext ctx) throws SQLException { + CarMaker maker = CarMaker.builder() + .id(rs.getLong("id")) + .name(rs.getString("name")) + .models(new ArrayList()) + .build(); + + return maker; + } +} diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java new file mode 100644 index 0000000000..eeceafd649 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/mapper/CarModelMapper.java @@ -0,0 +1,25 @@ +package com.baeldung.boot.jdbi.mapper; + +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.jdbi.v3.core.mapper.RowMapper; +import org.jdbi.v3.core.statement.StatementContext; +import org.springframework.stereotype.Component; + +import com.baeldung.boot.jdbi.domain.CarModel; + +@Component +public class CarModelMapper implements RowMapper{ + + @Override + public CarModel map(ResultSet rs, StatementContext ctx) throws SQLException { + return CarModel.builder() + .id(rs.getLong("id")) + .name(rs.getString("name")) + .sku(rs.getString("sku")) + .year(rs.getInt("year")) + .build(); + } + +} diff --git a/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/service/CarMakerService.java b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/service/CarMakerService.java new file mode 100644 index 0000000000..a058130563 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/java/com/baeldung/boot/jdbi/service/CarMakerService.java @@ -0,0 +1,48 @@ +/** + * + */ +package com.baeldung.boot.jdbi.service; + +import java.util.List; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.boot.jdbi.dao.CarMakerDao; +import com.baeldung.boot.jdbi.dao.CarModelDao; +import com.baeldung.boot.jdbi.domain.CarMaker; +import com.baeldung.boot.jdbi.domain.CarModel; + +/** + * @author Philippe + * + */ +@Service +public class CarMakerService { + + private CarMakerDao carMakerDao; + private CarModelDao carModelDao; + + public CarMakerService(CarMakerDao carMakerDao,CarModelDao carModelDao) { + + this.carMakerDao = carMakerDao; + this.carModelDao = carModelDao; + } + + @Transactional + public int bulkInsert(CarMaker carMaker) { + Long carMakerId; + if (carMaker.getId() == null ) { + carMakerId = carMakerDao.insert(carMaker); + carMaker.setId(carMakerId); + } + + // Make sure all models belong to the same maker + carMaker.getModels().forEach(m -> { + m.setMakerId(carMaker.getId()); + carModelDao.insert(m); + }); + + return carMaker.getModels().size(); + } +} diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/application.yml b/persistence-modules/spring-boot-jdbi/src/main/resources/application.yml new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/resources/application.yml @@ -0,0 +1 @@ + diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/findById.sql b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/findById.sql new file mode 100644 index 0000000000..b36659110a --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/findById.sql @@ -0,0 +1,11 @@ +-- +-- findById +-- +select + id, + name +from + car_maker +where + id = :id +; diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql new file mode 100644 index 0000000000..0e045d7274 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarMakerDao/insert.sql @@ -0,0 +1,4 @@ +-- +-- Insert +-- +insert into car_maker(id,name) values (:id,:name); diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/findByMakerIdAndSku.sql b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/findByMakerIdAndSku.sql new file mode 100644 index 0000000000..270d9baaa8 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/findByMakerIdAndSku.sql @@ -0,0 +1,10 @@ +-- +-- Insert +-- +select * +from + car_model +where + maker_fk = :makerId and + sku = :sku +; \ No newline at end of file diff --git a/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql new file mode 100644 index 0000000000..b277213584 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/main/resources/com/baeldung/boot/jdbi/dao/CarModelDao/insert.sql @@ -0,0 +1,8 @@ +-- +-- Insert +-- +insert into car_model(maker_fk,name,sku,year) values ( + :makerId, + :name, + :sku, + :year ); diff --git a/persistence-modules/spring-boot-jdbi/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java b/persistence-modules/spring-boot-jdbi/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java new file mode 100644 index 0000000000..e4b623ee2b --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/test/java/com/baeldung/boot/jdbi/SpringBootJdbiApplicationUnitTest.java @@ -0,0 +1,121 @@ +package com.baeldung.boot.jdbi; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.jdbi.v3.core.Jdbi; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.boot.jdbi.dao.CarMakerDao; +import com.baeldung.boot.jdbi.dao.CarModelDao; +import com.baeldung.boot.jdbi.domain.CarMaker; +import com.baeldung.boot.jdbi.domain.CarModel; +import com.baeldung.boot.jdbi.service.CarMakerService; + +import lombok.extern.slf4j.Slf4j; + +@RunWith(SpringRunner.class) +@SpringBootTest +@Slf4j +public class SpringBootJdbiApplicationUnitTest { + + + @Autowired + private CarMakerDao carMakerDao; + + @Autowired + private CarModelDao carModelDao; + + @Autowired + private CarMakerService carMakerService; + + @Test + public void givenNewCarMaker_whenInsertNewCarMaker_thenSuccess() { + + assertNotNull(carMakerDao); + + CarMaker carMaker = CarMaker.builder() + .name("Diamond Motors") + .build(); + + Long generatedId = carMakerDao.insert(carMaker); + log.info("[I37] generatedId = {}", generatedId); + assertThat(generatedId).isGreaterThan(0); + } + + @Test + public void givenNewCarMakers_whenInsertNewCarMakers_thenSuccess() { + + assertNotNull(carMakerDao); + + CarMaker carMaker1 = CarMaker.builder() + .name("maker1") + .build(); + + CarMaker carMaker2 = CarMaker.builder() + .name("maker2") + .build(); + + List makers = new ArrayList<>(); + makers.add(carMaker1); + makers.add(carMaker2); + + List generatedIds = carMakerDao.bulkInsert(makers); + log.info("[I37] generatedIds = {}", generatedIds); + assertThat(generatedIds).size().isEqualTo(makers.size()); + } + + + @Test + public void givenExistingCarMaker_whenFindById_thenReturnExistingCarMaker() { + + CarMaker maker = carMakerDao.findById(1l); + assertThat(maker).isNotNull(); + assertThat(maker.getId()).isEqualTo(1); + + } + + @Test + public void givenExistingCarMaker_whenBulkInsertFails_thenRollback() { + + CarMaker maker = carMakerDao.findById(1l); + CarModel m1 = CarModel.builder() + .makerId(maker.getId()) + .name("Model X1") + .sku("1-M1") + .year(2019) + .build(); + maker.getModels().add(m1); + + CarModel m2 = CarModel.builder() + .makerId(maker.getId()) + .name("Model X1") + .sku("1-M1") + .year(2019) + .build(); + maker.getModels().add(m2); + + // This insert fails because we have the same SKU + try { + carMakerService.bulkInsert(maker); + assertTrue("Insert must fail", true); + } + catch(Exception ex) { + log.info("[I113] Exception: {}", ex.getMessage()); + } + + CarModel m = carModelDao.findByMakerIdAndSku(maker.getId(), "1-M1"); + assertThat(m).isNull(); + + } + +} diff --git a/persistence-modules/spring-boot-jdbi/src/test/resources/data.sql b/persistence-modules/spring-boot-jdbi/src/test/resources/data.sql new file mode 100644 index 0000000000..e3e1f4ae32 --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/test/resources/data.sql @@ -0,0 +1,12 @@ + +insert into car_maker(id,name) values (1,'Special Motors'); +insert into car_maker(id,name) values (2,'BWM'); +insert into car_maker(id,name) values (3,'Dolores'); + +insert into car_model(id,maker_fk,name,sku,year) values(1,1,'Muze','SM001',2018); +insert into car_model(id,maker_fk,name,sku,year) values(2,1,'Empada','SM002',2008); + +insert into car_model(id,maker_fk,name,sku,year) values(4,2,'BWM-100','BWM100',2008); +insert into car_model(id,maker_fk,name,sku,year) values(5,2,'BWM-200','BWM200',2009); +insert into car_model(id,maker_fk,name,sku,year) values(6,2,'BWM-300','BWM300',2008); + diff --git a/persistence-modules/spring-boot-jdbi/src/test/resources/schema.sql b/persistence-modules/spring-boot-jdbi/src/test/resources/schema.sql new file mode 100644 index 0000000000..a0d0eaf62e --- /dev/null +++ b/persistence-modules/spring-boot-jdbi/src/test/resources/schema.sql @@ -0,0 +1,24 @@ +-- +-- Car makers table +-- +create table car_maker( + id identity, + name varchar(128) not null +); + +create unique index ui_car_maker_01 on car_maker(name); + +-- +-- Car models table +-- +create table car_model( + id identity, + maker_fk int not null, + name varchar(128) not null, + sku varchar(128) not null, + year int not null +); + +create unique index ui_car_model_01 on car_model(maker_fk,sku); +create unique index ui_car_model_02 on car_model(maker_fk,name,year); + From 1fc511ba7aeff244b85359a6ad7afe0c1a0c39c1 Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Sat, 7 Sep 2019 00:43:24 +0530 Subject: [PATCH 133/396] BAEL-3215: Use try-with-resource in FileReader demo (#7732) - To simplify the demo, change is required in the unit-tests that currently uses close() method instead of try-with-resource --- .../filereader/FileReaderExampleUnitTest.java | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java index 968c041115..4f893fb327 100644 --- a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filereader/FileReaderExampleUnitTest.java @@ -17,15 +17,9 @@ public class FileReaderExampleUnitTest { public void givenFileReader_whenReadAllCharacters_thenReturnsContent() throws IOException { String expectedText = "Hello, World!"; File file = new File(FILE_PATH); - FileReader fileReader = null; - try { - fileReader = new FileReader(file); + try (FileReader fileReader = new FileReader(file)) { String content = FileReaderExample.readAllCharactersOneByOne(fileReader); Assert.assertEquals(expectedText, content); - } finally { - if (fileReader != null) { - fileReader.close(); - } } } @@ -33,15 +27,9 @@ public class FileReaderExampleUnitTest { public void givenFileReader_whenReadMultipleCharacters_thenReturnsContent() throws IOException { String expectedText = "Hello"; File file = new File(FILE_PATH); - FileReader fileReader = null; - try { - fileReader = new FileReader(file); + try (FileReader fileReader = new FileReader(file)) { String content = FileReaderExample.readMultipleCharacters(fileReader, 5); Assert.assertEquals(expectedText, content); - } finally { - if (fileReader != null) { - fileReader.close(); - } } } From bd1ed1a3eef7aa87d28bf1234a38ff25822a5d74 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Fri, 6 Sep 2019 21:16:05 +0200 Subject: [PATCH 134/396] Code for BAEL-3189 (custom Apache Shiro permission implementation) --- apache-shiro/pom.xml | 13 +--- .../controllers/ShiroSpringController.java | 7 +- .../shiro/permissions/custom/Main.java | 68 +++++++++++++++++++ .../permissions/custom/PathPermission.java | 22 ++++++ .../custom/PathPermissionResolver.java | 13 ++++ .../shiro/permissions/custom/shiro.ini | 10 +++ 6 files changed, 115 insertions(+), 18 deletions(-) create mode 100644 apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java create mode 100644 apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java create mode 100644 apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java create mode 100644 apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml index 644d70b30a..7f0d07589c 100644 --- a/apache-shiro/pom.xml +++ b/apache-shiro/pom.xml @@ -38,17 +38,6 @@ jcl-over-slf4j runtime - - org.slf4j - slf4j-log4j12 - runtime - - - log4j - log4j - ${log4j-version} - runtime - @@ -56,4 +45,4 @@ 1.2.17 - \ No newline at end of file + diff --git a/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java b/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java index e6e72b2579..2713786d71 100644 --- a/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java +++ b/apache-shiro/src/main/java/com/baeldung/controllers/ShiroSpringController.java @@ -18,22 +18,17 @@ import javax.servlet.http.HttpServletRequest; @Controller public class ShiroSpringController { - - @GetMapping("/") public String index() { return "index"; } - @RequestMapping( value = "/login", method = {RequestMethod.GET, RequestMethod.POST}) public String login(HttpServletRequest req, UserCredentials cred, RedirectAttributes attr) { if(req.getMethod().equals(RequestMethod.GET.toString())) { return "login"; - } - else { - + } else { Subject subject = SecurityUtils.getSubject(); if(!subject.isAuthenticated()) { diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java new file mode 100644 index 0000000000..a373122d6c --- /dev/null +++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/Main.java @@ -0,0 +1,68 @@ +package com.baeldung.shiro.permissions.custom; + +import com.baeldung.MyCustomRealm; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.*; +import org.apache.shiro.config.Ini; +import org.apache.shiro.mgt.DefaultSecurityManager; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.realm.Realm; +import org.apache.shiro.realm.text.IniRealm; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +public class Main { + + private static final transient Logger log = LoggerFactory.getLogger(Main.class); + + public static void main(String[] args) { + + IniRealm realm = new IniRealm(); + Ini ini = Ini.fromResourcePath(Main.class.getResource("/com/baeldung/shiro/permissions/custom/shiro.ini").getPath()); + realm.setIni(ini); + realm.setPermissionResolver(new PathPermissionResolver()); + realm.init(); + SecurityManager securityManager = new DefaultSecurityManager(realm); + + SecurityUtils.setSecurityManager(securityManager); + Subject currentUser = SecurityUtils.getSubject(); + + if (!currentUser.isAuthenticated()) { + UsernamePasswordToken token = new UsernamePasswordToken("paul.reader", "password4"); + token.setRememberMe(true); + try { + currentUser.login(token); + } catch (UnknownAccountException uae) { + log.error("Username Not Found!", uae); + } catch (IncorrectCredentialsException ice) { + log.error("Invalid Credentials!", ice); + } catch (LockedAccountException lae) { + log.error("Your Account is Locked!", lae); + } catch (AuthenticationException ae) { + log.error("Unexpected Error!", ae); + } + } + + log.info("User [" + currentUser.getPrincipal() + "] logged in successfully."); + + if (currentUser.hasRole("admin")) { + log.info("Welcome Admin"); + } else if(currentUser.hasRole("editor")) { + log.info("Welcome, Editor!"); + } else if(currentUser.hasRole("author")) { + log.info("Welcome, Author"); + } else { + log.info("Welcome, Guest"); + } + + if(currentUser.isPermitted("/articles/drafts/new-article")) { + log.info("You can access articles"); + } else { + log.info("You cannot access articles!"); + } + currentUser.logout(); + } + +} diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java new file mode 100644 index 0000000000..f7dfbda06a --- /dev/null +++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermission.java @@ -0,0 +1,22 @@ +package com.baeldung.shiro.permissions.custom; + +import org.apache.shiro.authz.Permission; + +import java.nio.file.Path; + +public class PathPermission implements Permission { + + private final Path path; + + public PathPermission(Path path) { + this.path = path; + } + + @Override + public boolean implies(Permission p) { + if(p instanceof PathPermission) { + return ((PathPermission) p).path.startsWith(path); + } + return false; + } +} diff --git a/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java new file mode 100644 index 0000000000..4b60d2fbd4 --- /dev/null +++ b/apache-shiro/src/main/java/com/baeldung/shiro/permissions/custom/PathPermissionResolver.java @@ -0,0 +1,13 @@ +package com.baeldung.shiro.permissions.custom; + +import org.apache.shiro.authz.Permission; +import org.apache.shiro.authz.permission.PermissionResolver; + +import java.nio.file.Paths; + +public class PathPermissionResolver implements PermissionResolver { + @Override + public Permission resolvePermission(String permissionString) { + return new PathPermission(Paths.get(permissionString)); + } +} diff --git a/apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini b/apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini new file mode 100644 index 0000000000..732ff8b60d --- /dev/null +++ b/apache-shiro/src/main/resources/com/baeldung/shiro/permissions/custom/shiro.ini @@ -0,0 +1,10 @@ +[users] +jane.admin = password, admin +john.editor = password2, editor +zoe.author = password3, author +paul.reader = password4 + +[roles] +admin = / +editor = /articles +author = /articles/drafts From 49606337a5a30edeafbc25b80f01cfa5aa9b6b4a Mon Sep 17 00:00:00 2001 From: Kevin Kraus Date: Fri, 6 Sep 2019 22:20:33 -0500 Subject: [PATCH 135/396] BAEL-3227 --- .../com/baeldung/files/CreatingFilesTest.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesTest.java diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesTest.java new file mode 100644 index 0000000000..1380846e24 --- /dev/null +++ b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesTest.java @@ -0,0 +1,29 @@ +import com.google.common.io.Files; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; + +public class CreateFilesTest { + @Test(expected = IOException.class) + public void whenCreatingAFileWithAbsolutePath_thenExceptionIsThrown() throws IOException { + File fileWithAbsolutePath = new File("/myDirectory/testFile.txt"); + + Files.touch(fileWithAbsolutePath); + } + + @Test(expected = IOException.class) + public void givenAnExistingDirectory_whenCreatingANewDirectoryAndFile_thenExceptionIsThrown() throws IOException { + File tempDirectory = new File(System.getProperty("java.io.tmpdir")); + File fileWithRelativePath = new File(tempDirectory, "myDirectory/newFile.txt"); + + Files.touch(fileWithRelativePath); + } + + @Test(expected = IOException.class) + public void whenCreatingAFileWithFileSeparator_thenPathIsCreated() throws IOException { + File newFile = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "newFile.txt"); + + Files.touch(newFile); + } +} From ed459a57863d0261cb724fdc1da6fd0c09af37a3 Mon Sep 17 00:00:00 2001 From: Kevin Kraus Date: Fri, 6 Sep 2019 22:40:06 -0500 Subject: [PATCH 136/396] BAEL-3227 renamed test --- .../{CreatingFilesTest.java => CreatingFilesUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java-modules/core-java/src/test/java/com/baeldung/files/{CreatingFilesTest.java => CreatingFilesUnitTest.java} (96%) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java similarity index 96% rename from core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesTest.java rename to core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java index 1380846e24..1f2c1ec505 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java @@ -4,7 +4,7 @@ import org.junit.Test; import java.io.File; import java.io.IOException; -public class CreateFilesTest { +public class CreateFilesUnitTest { @Test(expected = IOException.class) public void whenCreatingAFileWithAbsolutePath_thenExceptionIsThrown() throws IOException { File fileWithAbsolutePath = new File("/myDirectory/testFile.txt"); From ed7b67f19c3d4a464b5b7e3a1ab97bf57220f0e2 Mon Sep 17 00:00:00 2001 From: Kevin Kraus Date: Fri, 6 Sep 2019 22:44:56 -0500 Subject: [PATCH 137/396] BAEL-3227 fixed tests --- .../baeldung/files/CreatingFilesUnitTest.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java index 1f2c1ec505..175a0001f1 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java @@ -4,6 +4,8 @@ import org.junit.Test; import java.io.File; import java.io.IOException; +import static org.junit.Assert.assertTrue; + public class CreateFilesUnitTest { @Test(expected = IOException.class) public void whenCreatingAFileWithAbsolutePath_thenExceptionIsThrown() throws IOException { @@ -12,18 +14,24 @@ public class CreateFilesUnitTest { Files.touch(fileWithAbsolutePath); } - @Test(expected = IOException.class) - public void givenAnExistingDirectory_whenCreatingANewDirectoryAndFile_thenExceptionIsThrown() throws IOException { + @Test + public void givenAnExistingDirectory_whenCreatingANewDirectoryAndFile_thenFileIsCreated() throws IOException { File tempDirectory = new File(System.getProperty("java.io.tmpdir")); File fileWithRelativePath = new File(tempDirectory, "myDirectory/newFile.txt"); + fileWithRelativePath.mkdirs(); Files.touch(fileWithRelativePath); + + assertTrue(fileWithRelativePath.exists()); } - @Test(expected = IOException.class) - public void whenCreatingAFileWithFileSeparator_thenPathIsCreated() throws IOException { + @Test + public void whenCreatingAFileWithFileSeparator_thenFileIsCreated() throws IOException { File newFile = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "newFile.txt"); + newFile.mkdirs(); Files.touch(newFile); + + assertTrue(newFile.exists()); } } From 648ef77f5da06dd7f9bcd9a770fe100aec646664 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Sat, 7 Sep 2019 05:31:51 +0100 Subject: [PATCH 138/396] [BAEL-3193] Bucket Sort In Java Code (#7731) --- .../bucketsort/IntegerBucketSorter.java | 70 +++++++++++++++++++ .../algorithms/bucketsort/Sorter.java | 8 +++ .../IntegerBucketSorterUnitTest.java | 33 +++++++++ 3 files changed, 111 insertions(+) create mode 100644 algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java create mode 100644 algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java create mode 100644 algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java new file mode 100644 index 0000000000..4d885a6b3a --- /dev/null +++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java @@ -0,0 +1,70 @@ +package com.baeldung.bucketsort; + +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + +public class IntegerBucketSorter implements Sorter { + + private final Comparator comparator; + + public IntegerBucketSorter(Comparator comparator) { + this.comparator = comparator; + } + + public IntegerBucketSorter() { + comparator = Comparator.naturalOrder(); + } + + public List sort(List arrayToSort) { + + List> buckets = splitIntoUnsortedBuckets(arrayToSort); + + for(List bucket : buckets){ + bucket.sort(comparator); + } + + return concatenateSortedBuckets(buckets); + } + + private List concatenateSortedBuckets(List> buckets){ + List sortedArray = new ArrayList<>(); + int index = 0; + for(List bucket : buckets){ + for(int number : bucket){ + sortedArray.add(index++, number); + } + } + return sortedArray; + } + + private List> splitIntoUnsortedBuckets(List initialList){ + + final int[] codes = createHashes(initialList); + + List> buckets = new ArrayList<>(codes[1]); + for(int i = 0; i < codes[1]; i++) buckets.add(new ArrayList<>()); + + //distribute the data + for (int i : initialList) { + buckets.get(hash(i, codes)).add(i); + } + return buckets; + + } + + private int[] createHashes(List input){ + int m = input.get(0); + for (int i = 1; i < input.size(); i++) { + if (m < input.get(i)) { + m = input.get(i); + } + } + return new int[]{m, (int) Math.sqrt(input.size())}; + } + + private static int hash(int i, int[] code) { + return (int) ((double) i / code[0] * (code[1] - 1)); + } + +} diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java new file mode 100644 index 0000000000..b86f60324f --- /dev/null +++ b/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java @@ -0,0 +1,8 @@ +package com.baeldung.bucketsort; + +import java.util.List; + +public interface Sorter { + + List sort(List arrayToSort); +} diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java new file mode 100644 index 0000000000..2773d8a68f --- /dev/null +++ b/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.bucketsort; + +import com.baeldung.bucketsort.IntegerBucketSorter; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class IntegerBucketSorterUnitTest { + + private IntegerBucketSorter sorter; + + @Before + public void setUp() throws Exception { + sorter = new IntegerBucketSorter(); + } + + @Test + public void givenUnsortedList_whenSortedUsingBucketSorter_checkSortingCorrect() { + + List unsorted = Arrays.asList(80,50,60,30,20,10,70,0,40,500,600,602,200,15); + List expected = Arrays.asList(0,10,15,20,30,40,50,60,70,80,200,500,600,602); + + List actual = sorter.sort(unsorted); + + assertEquals(expected, actual); + + + } +} \ No newline at end of file From f24fef9ec61cb6a1ee4e354980333396a9dcdd80 Mon Sep 17 00:00:00 2001 From: wugangca Date: Sat, 7 Sep 2019 03:17:33 -0600 Subject: [PATCH 139/396] [BAEL-3210] - Java Copy Constructor (#7706) * [BAEL-3210] - Copy constructors in Java * [BAEL-3210] - Copy constructors in Java * Change indentation space based on code style instructions. --- .../baeldung/copyconstructor/Employee.java | 30 +++++++++ .../com/baeldung/copyconstructor/Manager.java | 31 +++++++++ .../copyconstructor/EmployeeUnitTest.java | 36 ++++++++++ .../copyconstructor/ManagerUnitTest.java | 67 +++++++++++++++++++ 4 files changed, 164 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java create mode 100644 core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java create mode 100644 core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java new file mode 100644 index 0000000000..7ad445e8ee --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Employee.java @@ -0,0 +1,30 @@ +package com.baeldung.copyconstructor; + +import java.util.Date; + +public class Employee { + + protected int id; + protected String name; + protected Date startDate; + + public Employee(int id, String name, Date startDate) { + this.id = id; + this.name = name; + this.startDate = startDate; + } + + public Employee(Employee employee) { + this.id = employee.id; + this.name = employee.name; + this.startDate = new Date(employee.startDate.getTime()); + } + + Date getStartDate() { + return startDate; + } + + public Employee copy() { + return new Employee(this); + } +} diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java new file mode 100644 index 0000000000..97b8580b8e --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/copyconstructor/Manager.java @@ -0,0 +1,31 @@ +package com.baeldung.copyconstructor; + +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +public class Manager extends Employee { + + private List directReports; + + public Manager(int id, String name, Date startDate, List directReports) { + super(id, name, startDate); + this.directReports = directReports; + } + + public Manager(Manager manager) { + super(manager.id, manager.name, manager.startDate); + this.directReports = manager.directReports.stream() + .collect(Collectors.toList()); + } + + @Override + public Employee copy() { + return new Manager(this); + } + + List getDirectReport() { + return this.directReports; + } + +} diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java new file mode 100644 index 0000000000..19a4001b62 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/EmployeeUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.copyconstructor; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; + +import java.util.Date; + +import org.junit.Test; + +public class EmployeeUnitTest { + @Test + public void givenCopyConstructor_whenDeepCopy_thenDistinct() { + Date d1 = new Date(123); + Employee e1 = new Employee(1, "Baeldung", d1); + Employee e2 = new Employee(e1); + assertEquals(d1, e1.getStartDate()); + assertEquals(d1, e2.getStartDate()); + + d1.setTime(456); + assertEquals(d1, e1.getStartDate()); + assertNotEquals(d1, e2.getStartDate()); + } + + @Test + public void givenCopyMethod_whenCopy_thenDistinct() { + Date d1 = new Date(123); + Employee e1 = new Employee(1, "Baeldung", d1); + Employee e2 = e1.copy(); + assertEquals(d1, e1.getStartDate()); + assertEquals(d1, e2.getStartDate()); + + d1.setTime(456); + assertEquals(d1, e1.getStartDate()); + assertNotEquals(d1, e2.getStartDate()); + } +} diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java new file mode 100644 index 0000000000..ef9f261360 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/copyconstructor/ManagerUnitTest.java @@ -0,0 +1,67 @@ +package com.baeldung.copyconstructor; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import org.junit.Test; + +public class ManagerUnitTest { + @Test + public void givenCopyConstructor_whenDeepCopy_thenDistinct() { + Date startDate = new Date(123); + Employee e1 = new Employee(1, "Baeldung", startDate); + Employee e2 = new Employee(e1); + List directReports = new ArrayList(); + directReports.add(e1); + directReports.add(e2); + + Manager m1 = new Manager(1, "Baeldung Manager", startDate, directReports); + Manager m2 = new Manager(m1); + List directReports1 = m1.getDirectReport(); + List directReports2 = m2.getDirectReport(); + assertEquals(directReports1.size(), directReports2.size()); + assertArrayEquals(directReports1.toArray(), directReports2.toArray()); + + // clear m1's direct reports list. m2's list should not be affected + directReports.clear(); + directReports1 = m1.getDirectReport(); + directReports2 = m2.getDirectReport(); + assertEquals(0, directReports1.size()); + assertEquals(2, directReports2.size()); + + } + + @Test + public void givenCopyMethod_whenCopy_thenDistinct() { + Date startDate = new Date(123); + Employee e1 = new Employee(1, "Baeldung", startDate); + Employee e2 = new Employee(e1); + List directReports = new ArrayList(); + directReports.add(e1); + directReports.add(e2); + + // a Manager object whose declaration type is Employee. + Employee source = new Manager(1, "Baeldung Manager", startDate, directReports); + Employee clone = source.copy(); + + // after copy, clone should be still a Manager object. + assertTrue(clone instanceof Manager); + List directReports1 = ((Manager) source).getDirectReport(); + List directReports2 = ((Manager) clone).getDirectReport(); + assertEquals(directReports1.size(), directReports2.size()); + assertArrayEquals(directReports1.toArray(), directReports2.toArray()); + + // clear source's direct reports list. clone's list should not be affected + directReports.clear(); + directReports1 = ((Manager) source).getDirectReport(); + directReports2 = ((Manager) clone).getDirectReport(); + assertEquals(0, directReports1.size()); + assertEquals(2, directReports2.size()); + + } +} From 9f88a0ff9d706e633a12ffd106c038b050d7c3da Mon Sep 17 00:00:00 2001 From: "anilkivilcim.eray" Date: Sat, 7 Sep 2019 12:42:40 +0300 Subject: [PATCH 140/396] BAEL-3097 mapstruct version change from beta2 to final --- mapstruct/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml index 0493775f85..2613dcf083 100644 --- a/mapstruct/pom.xml +++ b/mapstruct/pom.xml @@ -65,7 +65,7 @@ - 1.3.0.Beta2 + 1.3.0.Final 4.3.4.RELEASE 1.8 1.8 From b3323d5f22f83e7ebd4ec4abd3e211a73cc5f4bc Mon Sep 17 00:00:00 2001 From: Eugen Date: Sat, 7 Sep 2019 14:50:34 +0300 Subject: [PATCH 141/396] Update README.md --- javaxval/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/javaxval/README.md b/javaxval/README.md index 3a975022ad..fadd174166 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -2,9 +2,6 @@ ## Java Bean Validation Examples -###The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring - ### Relevant Articles: - [Java Bean Validation Basics](http://www.baeldung.com/javax-validation) - [Validating Container Elements with Bean Validation 2.0](http://www.baeldung.com/bean-validation-container-elements) From cfa1b4dfc4104ec8fe70d965c8b51e1ccd1ac485 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 7 Sep 2019 19:51:25 +0530 Subject: [PATCH 142/396] [BAEL-16767] - Renamed RestartApplicationIntegrationTest to RestartApplicationManualTest --- .../RestartApplicationIntegrationTest.java | 44 ------------------- .../restart/RestartApplicationManualTest.java | 38 ++++++++++++++++ 2 files changed, 38 insertions(+), 44 deletions(-) delete mode 100644 spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java create mode 100644 spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java diff --git a/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java deleted file mode 100644 index 48c876de87..0000000000 --- a/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.restart; - -import static org.junit.Assert.assertEquals; - -import java.io.IOException; -import java.net.ServerSocket; - -import org.junit.Test; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; - -public class RestartApplicationIntegrationTest { - - private TestRestTemplate restTemplate = new TestRestTemplate(); - - @Test - public void givenBootApp_whenRestart_thenOk() throws Exception { - Integer port = findRandomOpenPortOnAllLocalInterfaces(); - Application.main(new String[] { String.format("--server.port=%d", port) }); - - ResponseEntity response = restTemplate.exchange(String.format("http://localhost:%d/restart", port), - HttpMethod.POST, null, Object.class); - - assertEquals(200, response.getStatusCode().value()); - } - - @Test - public void givenBootApp_whenRestartUsingActuator_thenOk() throws Exception { - Integer port = findRandomOpenPortOnAllLocalInterfaces(); - Application.main(new String[] { String.format("--server.port=%d", port) }); - - ResponseEntity response = restTemplate.exchange(String.format("http://localhost:%d/restartApp", port), - HttpMethod.POST, null, Object.class); - - assertEquals(200, response.getStatusCode().value()); - } - - private Integer findRandomOpenPortOnAllLocalInterfaces() throws IOException { - try (ServerSocket socket = new ServerSocket(0);) { - return socket.getLocalPort(); - } - } -} \ No newline at end of file diff --git a/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java new file mode 100644 index 0000000000..35b488f9d8 --- /dev/null +++ b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java @@ -0,0 +1,38 @@ +package com.baeldung.restart; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; +import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.http.HttpMethod; +import org.springframework.http.ResponseEntity; + +/** + * We have to make sure that while running this test, 8080 and 8090 ports are free. + * Otherwise it will fail. + */ +public class RestartApplicationManualTest { + + private TestRestTemplate restTemplate = new TestRestTemplate(); + + @Test + public void givenBootApp_whenRestart_thenOk() throws Exception { + Application.main(new String[0]); + + ResponseEntity response = restTemplate.exchange("http://localhost:8080/restart", + HttpMethod.POST, null, Object.class); + + assertEquals(200, response.getStatusCode().value()); + } + + @Test + public void givenBootApp_whenRestartUsingActuator_thenOk() throws Exception { + Application.main(new String[] { "--server.port=8090" }); + + ResponseEntity response = restTemplate.exchange("http://localhost:8090/restartApp", + HttpMethod.POST, null, Object.class); + + assertEquals(200, response.getStatusCode().value()); + } + +} \ No newline at end of file From f53e9e55eb3c946eb78464b493a03a530ad24dcb Mon Sep 17 00:00:00 2001 From: Vivek Date: Sun, 8 Sep 2019 01:04:17 +0530 Subject: [PATCH 143/396] BAEL-3194 Radix Sort in Java (#7700) --- .../algorithms/radixsort/RadixSort.java | 53 +++++++++++++++++++ .../radixsort/RadixSortUnitTest.java | 16 ++++++ 2 files changed, 69 insertions(+) create mode 100644 algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java create mode 100644 algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java new file mode 100644 index 0000000000..26c5c9a486 --- /dev/null +++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java @@ -0,0 +1,53 @@ +package com.baeldung.algorithms.radixsort; + +import java.util.Arrays; + +public class RadixSort { + + public static void sort(int numbers[]) { + int maximumNumber = findMaximumNumberIn(numbers); + + int numberOfDigits = calculateNumberOfDigitsIn(maximumNumber); + + int placeValue = 1; + + while (numberOfDigits-- > 0) { + applyCountingSortOn(numbers, placeValue); + placeValue *= 10; + } + } + + private static void applyCountingSortOn(int[] numbers, int placeValue) { + int range = 10; // radix or the base + + int length = numbers.length; + int[] frequency = new int[range]; + int[] sortedValues = new int[length]; + + for (int i = 0; i < length; i++) { + int digit = (numbers[i] / placeValue) % range; + frequency[digit]++; + } + + for (int i = 1; i < 10; i++) { + frequency[i] += frequency[i - 1]; + } + + for (int i = length - 1; i >= 0; i--) { + int digit = (numbers[i] / placeValue) % range; + sortedValues[frequency[digit] - 1] = numbers[i]; + frequency[digit]--; + } + + System.arraycopy(sortedValues, 0, numbers, 0, length); + } + + private static int calculateNumberOfDigitsIn(int number) { + return (int) Math.log10(number) + 1; // valid only if number > 0 + } + + private static int findMaximumNumberIn(int[] arr) { + return Arrays.stream(arr).max().getAsInt(); + } + +} diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java new file mode 100644 index 0000000000..f1b50f5c99 --- /dev/null +++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java @@ -0,0 +1,16 @@ +package com.baeldung.algorithms.radixsort; + +import static org.junit.Assert.assertArrayEquals; + +import org.junit.Test; + +public class RadixSortUnitTest { + + @Test + public void givenUnsortedArrayWhenRadixSortThenArraySorted() { + int[] numbers = { 387, 468, 134, 123, 68, 221, 769, 37, 7 }; + RadixSort.sort(numbers); + int[] numbersSorted = { 7, 37, 68, 123, 134, 221, 387, 468, 769 }; + assertArrayEquals(numbersSorted, numbers); + } +} From 41ca87136da1d70de0b814def471412d2d925d66 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 8 Sep 2019 01:14:46 +0530 Subject: [PATCH 144/396] [BAEL-15393] - Fixed tomcat deployment --- spring-mvc-java/pom.xml | 5 +++ .../com/baeldung/SpringMVCApplication.java | 3 +- .../com/baeldung/config/AppInitializer.java | 33 ------------------- 3 files changed, 7 insertions(+), 34 deletions(-) delete mode 100644 spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java diff --git a/spring-mvc-java/pom.xml b/spring-mvc-java/pom.xml index 87d2f612af..ea0acdcb00 100644 --- a/spring-mvc-java/pom.xml +++ b/spring-mvc-java/pom.xml @@ -19,6 +19,10 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-tomcat + javax.servlet javax.servlet-api @@ -280,6 +284,7 @@ 3.16-beta1 3.0.1-b09 + com.baeldung.SpringMVCApplication diff --git a/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java b/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java index ee263aaab2..a456dc125e 100644 --- a/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java +++ b/spring-mvc-java/src/main/java/com/baeldung/SpringMVCApplication.java @@ -2,9 +2,10 @@ package com.baeldung; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication -public class SpringMVCApplication { +public class SpringMVCApplication extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(SpringMVCApplication.class, args); } diff --git a/spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java b/spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java deleted file mode 100644 index eec12f466f..0000000000 --- a/spring-mvc-java/src/main/java/com/baeldung/config/AppInitializer.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.config; - -import org.springframework.web.WebApplicationInitializer; -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; - -public class AppInitializer implements WebApplicationInitializer { - - @Override - public void onStartup(ServletContext container) throws ServletException { - AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); - - context.scan("com.baeldung"); - - container.addListener(new ContextLoaderListener(context)); - - ServletRegistration.Dynamic dispatcher = container.addServlet("mvc", new DispatcherServlet(context)); - dispatcher.setLoadOnStartup(1); - dispatcher.addMapping("/"); - - // final MultipartConfigElement multipartConfigElement = new - // MultipartConfigElement(TMP_FOLDER, MAX_UPLOAD_SIZE, - // MAX_UPLOAD_SIZE * 2, MAX_UPLOAD_SIZE / 2); - // - // appServlet.setMultipartConfig(multipartConfigElement); - } - -} From d1eebc8bef10b841e73b7e8ed1577c4aafd48a28 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 8 Sep 2019 01:54:03 +0530 Subject: [PATCH 145/396] [BAEL-15393] - Fixed tests --- .../com/baeldung/SpringContextIntegrationTest.java | 11 ++++------- .../src/test/java/com/baeldung/SpringContextTest.java | 11 ++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/spring-mvc-java/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-mvc-java/src/test/java/com/baeldung/SpringContextIntegrationTest.java index 4c06917325..ae91d4dc1e 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -3,15 +3,12 @@ package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.config.AppInitializer; +import com.baeldung.config.TestConfig; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { AppInitializer.class }, loader = AnnotationConfigContextLoader.class) -@WebAppConfiguration +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {TestConfig.class}) public class SpringContextIntegrationTest { @Test diff --git a/spring-mvc-java/src/test/java/com/baeldung/SpringContextTest.java b/spring-mvc-java/src/test/java/com/baeldung/SpringContextTest.java index 9777addb61..8943ecb548 100644 --- a/spring-mvc-java/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-mvc-java/src/test/java/com/baeldung/SpringContextTest.java @@ -3,15 +3,12 @@ package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.config.AppInitializer; +import com.baeldung.config.TestConfig; -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { AppInitializer.class }, loader = AnnotationConfigContextLoader.class) -@WebAppConfiguration +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {TestConfig.class}) public class SpringContextTest { @Test From 4cf99eb77ca08fde9eff3479a34a31b61d62d410 Mon Sep 17 00:00:00 2001 From: hugogiordano <36562956+hugogiordano@users.noreply.github.com> Date: Sun, 8 Sep 2019 15:08:40 +1000 Subject: [PATCH 146/396] BAEL-3188 How to compress requests using the Spring RestTemplate. Updated GzipUtils code following editor review. (#7746) --- .../org/baeldung/spring/rest/compress/GzipUtils.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java index f3cb8bd631..75420ca6d8 100644 --- a/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java +++ b/spring-rest-compress/src/main/java/org/baeldung/spring/rest/compress/GzipUtils.java @@ -30,15 +30,11 @@ public class GzipUtils { * @throws IOException */ public static byte[] compress(byte[] body) throws IOException { - ByteArrayOutputStream output = new ByteArrayOutputStream(); - try { - try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(output)) { - gzipOutputStream.write(body); - } - } finally { - output.close(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (GZIPOutputStream gzipOutputStream = new GZIPOutputStream(baos)) { + gzipOutputStream.write(body); } - return output.toByteArray(); + return baos.toByteArray(); } /** From 35116b0e6984332e5b663b2d062b08988498f27e Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 8 Sep 2019 15:30:03 +0300 Subject: [PATCH 147/396] re-organize testing modules --- pom.xml | 2 - testing-modules-2/README.md | 5 - testing-modules/README.md | 3 +- testing-modules/assertion-libraries/README.md | 13 + testing-modules/assertion-libraries/pom.xml | 81 +++ .../main/java/com/baeldung/assertj/Dog.java | 19 + .../java/com/baeldung/assertj/Member.java | 19 + .../java/com/baeldung/assertj/Person.java | 19 + .../com/baeldung/assertj/custom/Person.java | 32 + .../main/java/com/baeldung/jspec/Animal.java | 41 ++ .../main/java/com/baeldung/jspec/Cage.java | 48 ++ .../src/main/java/com/baeldung/jspec/Cat.java | 14 + .../src/main/java/com/baeldung/jspec/Dog.java | 14 + .../main/java/com/baeldung/truth/User.java | 57 ++ .../java/com/baeldung/truth/UserSubject.java | 46 ++ .../assertj/AssertJConditionUnitTest.java | 72 +++ .../baeldung/assertj/AssertJCoreUnitTest.java | 117 ++++ .../assertj/AssertJGuavaUnitTest.java | 96 +++ .../assertj/AssertJJava8UnitTest.java | 108 ++++ .../AssertJCustomAssertionsUnitTest.java | 44 ++ .../baeldung/assertj/custom/Assertions.java | 9 + .../baeldung/assertj/custom/PersonAssert.java | 38 ++ .../exceptions/Java7StyleAssertions.java | 24 + .../exceptions/Java8StyleAssertions.java | 66 +++ .../jgotesting/JGoTestingUnitTest.java | 93 +++ .../java/com/baeldung/jspec/CageUnitTest.java | 126 ++++ .../com/baeldung/jspec/JSpecUnitTest.java | 57 ++ .../com/baeldung/junit/AdditionUnitTest.java | 14 + .../baeldung/junit/AssertionsUnitTest.java | 101 ++++ .../baeldung/junit/BlockingTestRunner.java | 18 + .../baeldung/junit/CalculatorUnitTest.java | 17 + .../baeldung/junit/SubstractionUnitTest.java | 14 + .../com/baeldung/junit/SuiteUnitTest.java | 12 + .../java/com/baeldung/junit/TestRunner.java | 41 ++ .../baeldung/truth/GoogleTruthUnitTest.java | 561 ++++++++++++++++++ testing-modules/junit-4/README.md | 2 + .../java/com/baeldung/junit/Calculator.java | 11 + .../com/baeldung/junit/AdditionUnitTest.java | 14 + .../baeldung/junit/AssertionsUnitTest.java | 101 ++++ .../baeldung/junit/BlockingTestRunner.java | 18 + .../baeldung/junit/CalculatorUnitTest.java | 17 + .../baeldung/junit/SubstractionUnitTest.java | 14 + .../com/baeldung/junit/SuiteUnitTest.java | 12 + .../java/com/baeldung/junit/TestRunner.java | 41 ++ testing-modules/mocks/README.md | 7 + testing-modules/mocks/javafaker/pom.xml | 26 - testing-modules/mocks/jmockit/README.md | 9 - testing-modules/mocks/jmockit/pom.xml | 37 -- testing-modules/mocks/jukito/pom.xml | 27 - .../mocks/mock-comparisons/README.md | 8 - .../mocks/mock-comparisons/pom.xml | 54 -- .../src/main/resources/logback.xml | 13 - testing-modules/mocks/pom.xml | 44 +- .../com/baeldung/easymock/ArticleReader.java | 0 .../baeldung/easymock/BaeldungArticle.java | 0 .../com/baeldung/easymock/BaeldungReader.java | 0 .../com/baeldung/easymock/IArticleWriter.java | 0 .../com/baeldung/easymock/IUserService.java | 0 .../main/java/com/baeldung/easymock/User.java | 0 .../introductionjukito/Calculator.java | 0 .../ScientificCalculator.java | 0 .../introductionjukito/SimpleCalculator.java | 0 .../baeldung/mocks/jmockit/AppManager.java | 0 .../mocks/jmockit/AdvancedCollaborator.java | 0 .../baeldung/mocks/jmockit/Collaborator.java | 0 .../jmockit/ExpectationsCollaborator.java | 0 .../org/baeldung/mocks/jmockit/Model.java | 0 .../org/baeldung/mocks/jmockit/Performer.java | 0 .../mocks/testCase/LoginController.java | 0 .../org/baeldung/mocks/testCase/LoginDao.java | 0 .../baeldung/mocks/testCase/LoginService.java | 0 .../org/baeldung/mocks/testCase/UserForm.java | 0 .../src/main/resources/logback.xml | 0 .../easymock/ArgumentMatchersUnitTest.java | 0 .../BaeldungReaderAnnotatedUnitTest.java | 0 ...eldungReaderAnnotatedWithRuleUnitTest.java | 0 .../BaeldungReaderMockDelegationUnitTest.java | 0 .../BaeldungReaderMockSupportUnitTest.java | 0 .../easymock/BaeldungReaderUnitTest.java | 0 .../CalculatorUnitTest.java | 0 .../baeldung/javafaker/JavaFakerUnitTest.java | 0 .../mocks/jmockit/AppManagerUnitTest.java | 0 .../LoginControllerIntegrationTest.java | 0 .../AdvancedCollaboratorIntegrationTest.java | 0 .../jmockit/ExpectationsIntegrationTest.java | 0 .../LoginControllerIntegrationTest.java | 0 .../jmockit/PerformerIntegrationTest.java | 0 .../mocks/jmockit/ReusingIntegrationTest.java | 0 .../LoginControllerIntegrationTest.java | 0 testing-modules/pom.xml | 6 +- testing-modules/testing-libraries/README.md | 10 + .../testing-libraries}/pom.xml | 4 +- .../com/baeldung/cucumber/Calculator.java | 0 .../com/baeldung/lambdabehave/Calculator.java | 0 .../com/baeldung/mutation/Palindrome.java | 0 .../calculator/CalculatorIntegrationTest.java | 0 .../calculator/CalculatorRunSteps.java | 0 .../lambdabehave/CalculatorUnitTest.java | 0 .../baeldung/mutation/PalindromeUnitTest.java | 0 .../shopping/ShoppingIntegrationTest.java | 0 .../baeldung/shopping/ShoppingStepsDef.java | 0 .../calculator-scenario-outline.feature | 0 .../resources/features/calculator.feature | 0 .../test/resources/features/shopping.feature | 0 104 files changed, 2325 insertions(+), 191 deletions(-) delete mode 100644 testing-modules-2/README.md create mode 100644 testing-modules/assertion-libraries/README.md create mode 100644 testing-modules/assertion-libraries/pom.xml create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/User.java create mode 100644 testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java create mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java create mode 100644 testing-modules/junit-4/src/main/java/com/baeldung/junit/Calculator.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/junit/AdditionUnitTest.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/junit/AssertionsUnitTest.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/junit/BlockingTestRunner.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/junit/CalculatorUnitTest.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/junit/SubstractionUnitTest.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/junit/SuiteUnitTest.java create mode 100644 testing-modules/junit-4/src/test/java/com/baeldung/junit/TestRunner.java delete mode 100644 testing-modules/mocks/javafaker/pom.xml delete mode 100644 testing-modules/mocks/jmockit/README.md delete mode 100644 testing-modules/mocks/jmockit/pom.xml delete mode 100644 testing-modules/mocks/jukito/pom.xml delete mode 100644 testing-modules/mocks/mock-comparisons/README.md delete mode 100644 testing-modules/mocks/mock-comparisons/pom.xml delete mode 100644 testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml rename testing-modules/mocks/{mock-comparisons => }/src/main/java/com/baeldung/easymock/ArticleReader.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/main/java/com/baeldung/easymock/BaeldungArticle.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/main/java/com/baeldung/easymock/BaeldungReader.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/main/java/com/baeldung/easymock/IArticleWriter.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/main/java/com/baeldung/easymock/IUserService.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/main/java/com/baeldung/easymock/User.java (100%) rename testing-modules/mocks/{jukito => }/src/main/java/com/baeldung/introductionjukito/Calculator.java (100%) rename testing-modules/mocks/{jukito => }/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java (100%) rename testing-modules/mocks/{jukito => }/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java (100%) rename testing-modules/mocks/{jmockit => }/src/main/java/com/baeldung/mocks/jmockit/AppManager.java (100%) rename testing-modules/mocks/{jmockit => }/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java (100%) rename testing-modules/mocks/{jmockit => }/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java (100%) rename testing-modules/mocks/{jmockit => }/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java (100%) rename testing-modules/mocks/{jmockit => }/src/main/java/org/baeldung/mocks/jmockit/Model.java (100%) rename testing-modules/mocks/{jmockit => }/src/main/java/org/baeldung/mocks/jmockit/Performer.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/main/java/org/baeldung/mocks/testCase/LoginController.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/main/java/org/baeldung/mocks/testCase/LoginDao.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/main/java/org/baeldung/mocks/testCase/LoginService.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/main/java/org/baeldung/mocks/testCase/UserForm.java (100%) rename testing-modules/mocks/{jmockit => }/src/main/resources/logback.xml (100%) rename testing-modules/mocks/{mock-comparisons => }/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java (100%) rename testing-modules/mocks/{jukito => }/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java (100%) rename testing-modules/mocks/{javafaker => }/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java (100%) rename testing-modules/mocks/{jmockit => }/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java (100%) rename testing-modules/mocks/{jmockit => }/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java (100%) rename testing-modules/mocks/{jmockit => }/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java (100%) rename testing-modules/mocks/{jmockit => }/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java (100%) rename testing-modules/mocks/{jmockit => }/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java (100%) rename testing-modules/mocks/{mock-comparisons => }/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java (100%) create mode 100644 testing-modules/testing-libraries/README.md rename {testing-modules-2 => testing-modules/testing-libraries}/pom.xml (95%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/main/java/com/baeldung/cucumber/Calculator.java (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/main/java/com/baeldung/lambdabehave/Calculator.java (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/main/java/com/baeldung/mutation/Palindrome.java (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/test/resources/features/calculator-scenario-outline.feature (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/test/resources/features/calculator.feature (100%) rename {testing-modules-2 => testing-modules/testing-libraries}/src/test/resources/features/shopping.feature (100%) diff --git a/pom.xml b/pom.xml index d7485e1653..a783412bbf 100644 --- a/pom.xml +++ b/pom.xml @@ -798,7 +798,6 @@ assertion-libraries testing-modules - testing-modules-2 twilio twitter4j @@ -1494,7 +1493,6 @@ assertion-libraries testing-modules - testing-modules-2 twilio twitter4j diff --git a/testing-modules-2/README.md b/testing-modules-2/README.md deleted file mode 100644 index 949ae7f760..0000000000 --- a/testing-modules-2/README.md +++ /dev/null @@ -1,5 +0,0 @@ - -## Testing Modules - -This is a aggregator module containing several modules focused on testing libraries 2. - diff --git a/testing-modules/README.md b/testing-modules/README.md index d534e5cea6..21fc87a67f 100644 --- a/testing-modules/README.md +++ b/testing-modules/README.md @@ -1,5 +1,4 @@ ## Testing Modules -This is a aggregator module containing several modules focused on testing libraries. - +This is a aggregator module containing several modules focused on testing libraries. diff --git a/testing-modules/assertion-libraries/README.md b/testing-modules/assertion-libraries/README.md new file mode 100644 index 0000000000..d69457fdeb --- /dev/null +++ b/testing-modules/assertion-libraries/README.md @@ -0,0 +1,13 @@ + +## Relevant Articles + +- [AssertJ’s Java 8 Features](http://www.baeldung.com/assertJ-java-8-features) +- [AssertJ for Guava](http://www.baeldung.com/assertJ-for-guava) +- [Introduction to AssertJ](http://www.baeldung.com/introduction-to-assertj) +- [Testing with Google Truth](http://www.baeldung.com/google-truth) +- [Testing with JGoTesting](http://www.baeldung.com/jgotesting) +- [Guide to JSpec](http://www.baeldung.com/jspec) +- [Custom Assertions with AssertJ](http://www.baeldung.com/assertj-custom-assertion) +- [Using Conditions with AssertJ Assertions](http://www.baeldung.com/assertj-conditions) +- [AssertJ Exception Assertions](http://www.baeldung.com/assertj-exception-assertion) + diff --git a/testing-modules/assertion-libraries/pom.xml b/testing-modules/assertion-libraries/pom.xml new file mode 100644 index 0000000000..274806d336 --- /dev/null +++ b/testing-modules/assertion-libraries/pom.xml @@ -0,0 +1,81 @@ + + 4.0.0 + com.baeldung + assertion-libraries + 0.1-SNAPSHOT + assertion-libraries + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + com.google.truth + truth + ${truth.version} + + + com.google.truth.extensions + truth-java8-extension + ${truth.version} + test + + + org.assertj + assertj-guava + ${assertj-guava.version} + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + org.javalite + javalite-common + ${javalite.version} + + + org.jgotesting + jgotesting + ${jgotesting.version} + test + + + + + + + + org.assertj + assertj-assertions-generator-maven-plugin + ${assertj-generator.version} + + + com.baeldung.testing.assertj.custom.Person + + + + + + + + 0.32 + 3.1.0 + 3.9.0 + 2.1.0 + 1.4.13 + 0.12 + + + + + + + diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java new file mode 100644 index 0000000000..6c049e1a10 --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java @@ -0,0 +1,19 @@ +package com.baeldung.assertj; + +public class Dog { + private String name; + private Float weight; + + public Dog(String name, Float weight) { + this.name = name; + this.weight = weight; + } + + public String getName() { + return name; + } + + public Float getWeight() { + return weight; + } +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java new file mode 100644 index 0000000000..baf3c2df52 --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java @@ -0,0 +1,19 @@ +package com.baeldung.assertj; + +public class Member { + private String name; + private int age; + + public Member(String name, int age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public int getAge() { + return age; + } +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java new file mode 100644 index 0000000000..09b16b4f5b --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java @@ -0,0 +1,19 @@ +package com.baeldung.assertj; + +public class Person { + private String name; + private Integer age; + + public Person(String name, Integer age) { + this.name = name; + this.age = age; + } + + public String getName() { + return name; + } + + public Integer getAge() { + return age; + } +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java new file mode 100644 index 0000000000..5506a56b51 --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java @@ -0,0 +1,32 @@ +package com.baeldung.assertj.custom; + +import java.util.ArrayList; +import java.util.List; + +public class Person { + private String fullName; + private int age; + private List nicknames; + + public Person(String fullName, int age) { + this.fullName = fullName; + this.age = age; + this.nicknames = new ArrayList<>(); + } + + public void addNickname(String nickname) { + nicknames.add(nickname); + } + + public String getFullName() { + return fullName; + } + + public int getAge() { + return age; + } + + public List getNicknames() { + return nicknames; + } +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java new file mode 100644 index 0000000000..efb4c62bde --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java @@ -0,0 +1,41 @@ +package com.baeldung.jspec; + +public abstract class Animal { + + protected String name; + + public Animal(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Animal other = (Animal) obj; + if (name == null) { + if (other.name != null) + return false; + } else if (!name.equals(other.name)) + return false; + return true; + } + + +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java new file mode 100644 index 0000000000..73ea343600 --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java @@ -0,0 +1,48 @@ +package com.baeldung.jspec; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +public class Cage { + + private Set animals = new HashSet<>(); + + public void put(Animal animal) { + animals.add(animal); + } + + public void put(Animal... animals) { + this.animals.addAll(Arrays.asList(animals)); + } + + public Animal release(Animal animal) { + return animals.remove(animal) ? animal : null; + } + + public void open() { + animals.clear(); + } + + public boolean hasAnimals() { + return animals.size() > 0; + } + + public boolean isEmpty() { + return animals.isEmpty(); + } + + public Set getAnimals() { + return this.animals; + } + + public int size() { + return animals.size(); + } + + @Override + public String toString() { + return "Cage [animals=" + animals + "]"; + } + +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java new file mode 100644 index 0000000000..5021a1481c --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java @@ -0,0 +1,14 @@ +package com.baeldung.jspec; + +public class Cat extends Animal { + + public Cat(String name) { + super(name); + } + + @Override + public String toString() { + return "Cat [name=" + name + "]"; + } + +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java new file mode 100644 index 0000000000..43626941e3 --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java @@ -0,0 +1,14 @@ +package com.baeldung.jspec; + +public class Dog extends Animal { + + public Dog(String name) { + super(name); + } + + @Override + public String toString() { + return "Dog [name=" + name + "]"; + } + +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/User.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/User.java new file mode 100644 index 0000000000..2b5ffde19f --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/User.java @@ -0,0 +1,57 @@ +package com.baeldung.truth; + +import java.util.Arrays; +import java.util.List; +import java.util.Objects; + +public class User implements Comparable { + private String name = "John Doe"; + private List emails = Arrays.asList("contact@baeldung.com", "staff@baeldung.com"); + + public User() { + } + + public User(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getEmails() { + return emails; + } + + public void setEmails(List emails) { + this.emails = emails; + } + + @Override + public int hashCode() { + int hash = 5; + hash = 37 * hash + Objects.hashCode(this.name); + return hash; + } + + @Override + public boolean equals(Object obj) { + if (obj == null || getClass() != obj.getClass()) { + return false; + } + + final User other = (User) obj; + return Objects.equals(this.name, other.name); + } + + @Override + public int compareTo(User o) { + return this.getName() + .compareToIgnoreCase(o.getName()); + } + +} diff --git a/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java b/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java new file mode 100644 index 0000000000..b478043ad8 --- /dev/null +++ b/testing-modules/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java @@ -0,0 +1,46 @@ +package com.baeldung.truth; + +import com.google.common.truth.ComparableSubject; +import com.google.common.truth.FailureStrategy; +import com.google.common.truth.IterableSubject; +import com.google.common.truth.SubjectFactory; +import com.google.common.truth.Truth; + +public class UserSubject extends ComparableSubject { + + private UserSubject(FailureStrategy failureStrategy, User target) { + super(failureStrategy, target); + } + + private static final SubjectFactory USER_SUBJECT_FACTORY = new SubjectFactory() { + @Override + public UserSubject getSubject(FailureStrategy failureStrategy, User target) { + return new UserSubject(failureStrategy, target); + } + }; + + public static UserSubject assertThat(User user) { + return Truth.assertAbout(USER_SUBJECT_FACTORY) + .that(user); + } + + // Our API begins here + public void hasName(String name) { + if (!actual().getName() + .equals(name)) { + fail("has name", name); + } + } + + public void hasNameIgnoringCase(String name) { + if (!actual().getName() + .equalsIgnoreCase(name)) { + fail("has name ignoring case", name); + } + } + + public IterableSubject emails() { + return Truth.assertThat(actual().getEmails()); + } + +} \ No newline at end of file diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java new file mode 100644 index 0000000000..ec2d93500f --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.assertj; + +import static org.assertj.core.api.Assertions.allOf; +import static org.assertj.core.api.Assertions.anyOf; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.not; +import static org.junit.Assert.fail; + +import java.util.ArrayList; +import java.util.List; + +import org.assertj.core.api.Condition; +import org.junit.Test; + +public class AssertJConditionUnitTest { + private Condition senior = new Condition<>(m -> m.getAge() >= 60, "senior"); + private Condition nameJohn = new Condition<>(m -> m.getName().equalsIgnoreCase("John"), "name John"); + + @Test + public void whenUsingMemberAgeCondition_thenCorrect() { + Member member = new Member("John", 65); + assertThat(member).is(senior); + + try { + assertThat(member).isNot(senior); + fail(); + } catch (AssertionError e) { + assertThat(e).hasMessageContaining("not to be "); + } + } + + @Test + public void whenUsingMemberNameCondition_thenCorrect() { + Member member = new Member("Jane", 60); + assertThat(member).doesNotHave(nameJohn); + + try { + assertThat(member).has(nameJohn); + fail(); + } catch (AssertionError e) { + assertThat(e).hasMessageContaining(""); + } + } + + @Test + public void whenCollectionConditionsAreSatisfied_thenCorrect() { + List members = new ArrayList<>(); + members.add(new Member("Alice", 50)); + members.add(new Member("Bob", 60)); + + assertThat(members).haveExactly(1, senior); + assertThat(members).doNotHave(nameJohn); + } + + @Test + public void whenCombiningAllOfConditions_thenCorrect() { + Member john = new Member("John", 60); + Member jane = new Member("Jane", 50); + + assertThat(john).is(allOf(senior, nameJohn)); + assertThat(jane).is(allOf(not(nameJohn), not(senior))); + } + + @Test + public void whenCombiningAnyOfConditions_thenCorrect() { + Member john = new Member("John", 50); + Member jane = new Member("Jane", 60); + + assertThat(john).is(anyOf(senior, nameJohn)); + assertThat(jane).is(anyOf(nameJohn, senior)); + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java new file mode 100644 index 0000000000..73b9b373a1 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java @@ -0,0 +1,117 @@ +package com.baeldung.assertj; + +import org.assertj.core.util.Maps; +import org.junit.Ignore; +import org.junit.Test; + +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.InputStream; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.NoSuchElementException; + +import static org.assertj.core.api.Assertions.*; + +public class AssertJCoreUnitTest { + + @Test + public void whenComparingReferences_thenNotEqual() throws Exception { + Dog fido = new Dog("Fido", 5.15f); + Dog fidosClone = new Dog("Fido", 5.15f); + + assertThat(fido).isNotEqualTo(fidosClone); + } + + @Test + public void whenComparingFields_thenEqual() throws Exception { + Dog fido = new Dog("Fido", 5.15f); + Dog fidosClone = new Dog("Fido", 5.15f); + + assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone); + } + + @Test + public void whenCheckingForElement_thenContains() throws Exception { + List list = Arrays.asList("1", "2", "3"); + + assertThat(list).contains("1"); + } + + @Test + public void whenCheckingForElement_thenMultipleAssertions() throws Exception { + List list = Arrays.asList("1", "2", "3"); + + assertThat(list).isNotEmpty(); + assertThat(list).startsWith("1"); + assertThat(list).doesNotContainNull(); + + assertThat(list).isNotEmpty().contains("1").startsWith("1").doesNotContainNull().containsSequence("2", "3"); + } + + @Test + public void whenCheckingRunnable_thenIsInterface() throws Exception { + assertThat(Runnable.class).isInterface(); + } + + @Test + public void whenCheckingCharacter_thenIsUnicode() throws Exception { + char someCharacter = 'c'; + + assertThat(someCharacter).isNotEqualTo('a').inUnicode().isGreaterThanOrEqualTo('b').isLowerCase(); + } + + @Test + public void whenAssigningNSEExToException_thenIsAssignable() throws Exception { + assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class); + } + + @Test + public void whenComparingWithOffset_thenEquals() throws Exception { + assertThat(5.1).isEqualTo(5, withPrecision(1d)); + } + + @Test + public void whenCheckingString_then() throws Exception { + assertThat("".isEmpty()).isTrue(); + } + + @Test + public void whenCheckingFile_then() throws Exception { + final File someFile = File.createTempFile("aaa", "bbb"); + someFile.deleteOnExit(); + + assertThat(someFile).exists().isFile().canRead().canWrite(); + } + + @Test + public void whenCheckingIS_then() throws Exception { + InputStream given = new ByteArrayInputStream("foo".getBytes()); + InputStream expected = new ByteArrayInputStream("foo".getBytes()); + + assertThat(given).hasSameContentAs(expected); + } + + @Test + public void whenGivenMap_then() throws Exception { + Map map = Maps.newHashMap(2, "a"); + + assertThat(map).isNotEmpty().containsKey(2).doesNotContainKeys(10).contains(entry(2, "a")); + } + + @Test + public void whenGivenException_then() throws Exception { + Exception ex = new Exception("abc"); + + assertThat(ex).hasNoCause().hasMessageEndingWith("c"); + } + + @Ignore // IN ORDER TO TEST, REMOVE THIS LINE + @Test + public void whenRunningAssertion_thenDescribed() throws Exception { + Person person = new Person("Alex", 34); + + assertThat(person.getAge()).as("%s's age should be equal to 100").isEqualTo(100); + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java new file mode 100644 index 0000000000..6a552aee78 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java @@ -0,0 +1,96 @@ +package com.baeldung.assertj; + +import com.google.common.base.Optional; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.HashBasedTable; +import com.google.common.collect.Multimap; +import com.google.common.collect.Multimaps; +import com.google.common.collect.Range; +import com.google.common.collect.Table; +import com.google.common.collect.TreeRangeMap; +import com.google.common.io.Files; +import org.assertj.guava.data.MapEntry; +import org.junit.Test; + +import java.io.File; +import java.util.HashMap; +import java.util.HashSet; + +import static org.assertj.guava.api.Assertions.assertThat; +import static org.assertj.guava.api.Assertions.entry; + +public class AssertJGuavaUnitTest { + + @Test + public void givenTwoEmptyFiles_whenComparingContent_thenEqual() throws Exception { + final File temp1 = File.createTempFile("bael", "dung1"); + final File temp2 = File.createTempFile("bael", "dung2"); + + assertThat(Files.asByteSource(temp1)).hasSize(0).hasSameContentAs(Files.asByteSource(temp2)); + } + + @Test + public void givenMultimap_whenVerifying_thenCorrect() throws Exception { + final Multimap mmap = ArrayListMultimap.create(); + mmap.put(1, "one"); + mmap.put(1, "1"); + + assertThat(mmap).hasSize(2).containsKeys(1).contains(entry(1, "one")).contains(entry(1, "1")); + } + + @Test + public void givenMultimaps_whenVerifyingContent_thenCorrect() throws Exception { + final Multimap mmap1 = ArrayListMultimap.create(); + mmap1.put(1, "one"); + mmap1.put(1, "1"); + mmap1.put(2, "two"); + mmap1.put(2, "2"); + + final Multimap mmap1_clone = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new); + mmap1_clone.put(1, "one"); + mmap1_clone.put(1, "1"); + mmap1_clone.put(2, "two"); + mmap1_clone.put(2, "2"); + + final Multimap mmap2 = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new); + mmap2.put(1, "one"); + mmap2.put(1, "1"); + + assertThat(mmap1).containsAllEntriesOf(mmap2).containsAllEntriesOf(mmap1_clone).hasSameEntriesAs(mmap1_clone); + } + + @Test + public void givenOptional_whenVerifyingContent_thenShouldBeEqual() throws Exception { + final Optional something = Optional.of("something"); + + assertThat(something).isPresent().extractingValue().isEqualTo("something"); + } + + @Test + public void givenRange_whenVerifying_thenShouldBeCorrect() throws Exception { + final Range range = Range.openClosed("a", "g"); + + assertThat(range).hasOpenedLowerBound().isNotEmpty().hasClosedUpperBound().contains("b"); + } + + @Test + public void givenRangeMap_whenVerifying_thenShouldBeCorrect() throws Exception { + final TreeRangeMap map = TreeRangeMap.create(); + + map.put(Range.closed(0, 60), "F"); + map.put(Range.closed(61, 70), "D"); + + assertThat(map).isNotEmpty().containsKeys(0).contains(MapEntry.entry(34, "F")); + } + + @Test + public void givenTable_whenVerifying_thenShouldBeCorrect() throws Exception { + final Table table = HashBasedTable.create(2, 2); + + table.put(1, "A", "PRESENT"); + table.put(1, "B", "ABSENT"); + + assertThat(table).hasRowCount(1).containsValues("ABSENT").containsCell(1, "B", "ABSENT"); + } + +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java new file mode 100644 index 0000000000..a2f58d677d --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java @@ -0,0 +1,108 @@ +package com.baeldung.assertj; + +import org.junit.Test; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.function.Predicate; + +import static java.time.LocalDate.ofYearDay; +import static java.util.Arrays.asList; +import static org.assertj.core.api.Assertions.assertThat; + +public class AssertJJava8UnitTest { + + @Test + public void givenOptional_shouldAssert() throws Exception { + final Optional givenOptional = Optional.of("something"); + + assertThat(givenOptional).isPresent().hasValue("something"); + } + + @Test + public void givenPredicate_shouldAssert() throws Exception { + final Predicate predicate = s -> s.length() > 4; + + assertThat(predicate).accepts("aaaaa", "bbbbb").rejects("a", "b").acceptsAll(asList("aaaaa", "bbbbb")).rejectsAll(asList("a", "b")); + } + + @Test + public void givenLocalDate_shouldAssert() throws Exception { + final LocalDate givenLocalDate = LocalDate.of(2016, 7, 8); + final LocalDate todayDate = LocalDate.now(); + + assertThat(givenLocalDate).isBefore(LocalDate.of(2020, 7, 8)).isAfterOrEqualTo(LocalDate.of(1989, 7, 8)); + + assertThat(todayDate).isAfter(LocalDate.of(1989, 7, 8)).isToday(); + } + + @Test + public void givenLocalDateTime_shouldAssert() throws Exception { + final LocalDateTime givenLocalDate = LocalDateTime.of(2016, 7, 8, 12, 0); + + assertThat(givenLocalDate).isBefore(LocalDateTime.of(2020, 7, 8, 11, 2)); + } + + @Test + public void givenLocalTime_shouldAssert() throws Exception { + final LocalTime givenLocalTime = LocalTime.of(12, 15); + + assertThat(givenLocalTime).isAfter(LocalTime.of(1, 0)).hasSameHourAs(LocalTime.of(12, 0)); + } + + @Test + public void givenList_shouldAssertFlatExtracting() throws Exception { + final List givenList = asList(ofYearDay(2016, 5), ofYearDay(2015, 6)); + + assertThat(givenList).flatExtracting(LocalDate::getYear).contains(2015); + } + + @Test + public void givenList_shouldAssertFlatExtractingLeapYear() throws Exception { + final List givenList = asList(ofYearDay(2016, 5), ofYearDay(2015, 6)); + + assertThat(givenList).flatExtracting(LocalDate::isLeapYear).contains(true); + } + + @Test + public void givenList_shouldAssertFlatExtractingClass() throws Exception { + final List givenList = asList(ofYearDay(2016, 5), ofYearDay(2015, 6)); + + assertThat(givenList).flatExtracting(Object::getClass).contains(LocalDate.class); + } + + @Test + public void givenList_shouldAssertMultipleFlatExtracting() throws Exception { + final List givenList = asList(ofYearDay(2016, 5), ofYearDay(2015, 6)); + + assertThat(givenList).flatExtracting(LocalDate::getYear, LocalDate::getDayOfMonth).contains(2015, 6); + } + + @Test + public void givenString_shouldSatisfy() throws Exception { + final String givenString = "someString"; + + assertThat(givenString).satisfies(s -> { + assertThat(s).isNotEmpty(); + assertThat(s).hasSize(10); + }); + } + + @Test + public void givenString_shouldMatch() throws Exception { + final String emptyString = ""; + + assertThat(emptyString).matches(String::isEmpty); + } + + @Test + public void givenList_shouldHasOnlyOneElementSatisfying() throws Exception { + final List givenList = Arrays.asList(""); + + assertThat(givenList).hasOnlyOneElementSatisfying(s -> assertThat(s).isEmpty()); + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java new file mode 100644 index 0000000000..98f50568a8 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java @@ -0,0 +1,44 @@ +package com.baeldung.assertj.custom; + +import static com.baeldung.assertj.custom.Assertions.assertThat; +import static org.junit.Assert.fail; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; + +public class AssertJCustomAssertionsUnitTest { + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void whenPersonNameMatches_thenCorrect() { + Person person = new Person("John Doe", 20); + assertThat(person).hasFullName("John Doe"); + } + + @Test + public void whenPersonAgeLessThanEighteen_thenNotAdult() { + Person person = new Person("Jane Roe", 16); + + try { + assertThat(person).isAdult(); + fail(); + } catch (AssertionError e) { + org.assertj.core.api.Assertions.assertThat(e).hasMessage("Expected person to be adult"); + } + } + + @Test + public void whenPersonDoesNotHaveAMatchingNickname_thenIncorrect() { + Person person = new Person("John Doe", 20); + person.addNickname("Nick"); + + try { + assertThat(person).hasNickname("John"); + fail(); + } catch (AssertionError e) { + org.assertj.core.api.Assertions.assertThat(e).hasMessage("Expected person to have nickname John"); + } + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java new file mode 100644 index 0000000000..3e1021851e --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java @@ -0,0 +1,9 @@ +package com.baeldung.assertj.custom; + +public class Assertions { + public static PersonAssert assertThat(Person actual) { + return new PersonAssert(actual); + } + + // static factory methods of other assertion classes +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java new file mode 100644 index 0000000000..5be093644a --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java @@ -0,0 +1,38 @@ +package com.baeldung.assertj.custom; + +import org.assertj.core.api.AbstractAssert; + +public class PersonAssert extends AbstractAssert { + + public PersonAssert(Person actual) { + super(actual, PersonAssert.class); + } + + public static PersonAssert assertThat(Person actual) { + return new PersonAssert(actual); + } + + public PersonAssert hasFullName(String fullName) { + isNotNull(); + if (!actual.getFullName().equals(fullName)) { + failWithMessage("Expected person to have full name %s but was %s", fullName, actual.getFullName()); + } + return this; + } + + public PersonAssert isAdult() { + isNotNull(); + if (actual.getAge() < 18) { + failWithMessage("Expected person to be adult"); + } + return this; + } + + public PersonAssert hasNickname(String nickName) { + isNotNull(); + if (!actual.getNicknames().contains(nickName)) { + failWithMessage("Expected person to have nickname %s", nickName); + } + return this; + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java new file mode 100644 index 0000000000..ab93f8eac7 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java @@ -0,0 +1,24 @@ +package com.baeldung.assertj.exceptions; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.fail; +import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; + +import org.junit.Test; + +public class Java7StyleAssertions { + + @Test + public void whenDividingByZero_thenArithmeticException() { + try { + int numerator = 10; + int denominator = 0; + int quotient = numerator / denominator; + fail("ArithmeticException expected because dividing by zero yields an ArithmeticException."); + failBecauseExceptionWasNotThrown(ArithmeticException.class); + } catch (Exception e) { + assertThat(e).hasMessage("/ by zero"); + assertThat(e).isInstanceOf(ArithmeticException.class); + } + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java new file mode 100644 index 0000000000..4d4e2aedfc --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java @@ -0,0 +1,66 @@ +package com.baeldung.assertj.exceptions; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.Assertions.catchThrowable; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import org.junit.Test; + +public class Java8StyleAssertions { + + @Test + public void whenGettingOutOfBoundsItem_thenIndexOutOfBoundsException() { + assertThatThrownBy(() -> { + ArrayList myStringList = new ArrayList(Arrays.asList("Strine one", "String two")); + myStringList.get(2); + }).isInstanceOf(IndexOutOfBoundsException.class) + .hasMessageStartingWith("Index: 2") + .hasMessageContaining("2") + .hasMessageEndingWith("Size: 2") + .hasMessageContaining("Index: 2, Size: 2") + .hasMessage("Index: %s, Size: %s", 2, 2) + .hasMessageMatching("Index: \\d+, Size: \\d+") + .hasNoCause(); + } + + @Test + public void whenWrappingException_thenCauseInstanceOfWrappedExceptionType() { + assertThatThrownBy(() -> { + try { + throw new IOException(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }).isInstanceOf(RuntimeException.class) + .hasCauseInstanceOf(IOException.class) + .hasStackTraceContaining("IOException"); + } + + @Test + public void whenDividingByZero_thenArithmeticException() { + assertThatExceptionOfType(ArithmeticException.class).isThrownBy(() -> { + int numerator = 10; + int denominator = 0; + int quotient = numerator / denominator; + }) + .withMessageContaining("/ by zero"); + + // Alternatively: + + // when + Throwable thrown = catchThrowable(() -> { + int numerator = 10; + int denominator = 0; + int quotient = numerator / denominator; + }); + + // then + assertThat(thrown).isInstanceOf(ArithmeticException.class) + .hasMessageContaining("/ by zero"); + + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java new file mode 100644 index 0000000000..650fb3e5c5 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java @@ -0,0 +1,93 @@ +package com.baeldung.testing.jgotesting; + +import java.io.File; +import static org.hamcrest.Matchers.equalToIgnoringCase; +import static org.hamcrest.Matchers.is; +import org.jgotesting.rule.JGoTestRule; +import static org.jgotesting.Assert.*; // same methods as org.junit.Assert.* +import static org.jgotesting.Check.*; // ditto, with different names +import static org.jgotesting.Testing.*; +import org.jgotesting.Checker; +import org.junit.Ignore; +import org.junit.Rule; +import org.junit.Test; + +public class JGoTestingUnitTest { + @Rule + public final JGoTestRule test = new JGoTestRule(); + + @Test + public void whenComparingIntegers_thenEqual() { + int anInt = 10; + + assertEquals(anInt, 10); + checkEquals(anInt, 10); + } + + @Ignore + @Test + public void whenComparingNumbers_thenLoggedMessage() { + log("There was something wrong when comparing numbers"); + + int anInt = 10; + int anotherInt = 10; + + checkEquals(anInt, 10); + checkTrue("First number should be bigger", 10 > anotherInt); + checkSame(anInt, anotherInt); + } + + @Ignore + @Test + public void whenComparingNumbers_thenFormattedMessage() { + int anInt = 10; + int anotherInt = 10; + + logf("There was something wrong when comparing numbers %d and %d", anInt, anotherInt); + + checkEquals(anInt, 10); + checkTrue("First number should be bigger", 10 > anotherInt); + checkSame(anInt, anotherInt); + } + + @Test + public void whenComparingStrings_thenMultipleAssertions() { + String aString = "This is a string"; + String anotherString = "This Is A String"; + + test.check(aString, equalToIgnoringCase(anotherString)) + .check(aString.length() == 16) + .check(aString.startsWith("This")); + } + + @Ignore + @Test + public void whenComparingStrings_thenMultipleFailingAssertions() { + String aString = "the test string"; + String anotherString = "The Test String"; + + checkEquals("Strings are not equal!", aString, anotherString); + checkTrue("String is longer than one character", aString.length() == 1); + checkSame("Strings are not the same", aString, anotherString); + } + + @Ignore + @Test + public void givenFile_whenDoesnotExists_thenTerminated() throws Exception { + File aFile = new File("a_dummy_file.txt"); + terminateIf(aFile.exists(), is(false)); + + // This doesn't get executed + checkEquals(aFile.getName(), "a_dummy_file.txt"); + } + + @Test + public void givenChecker_whenComparingStrings_thenEqual() throws Exception { + Checker aChecker = s -> s.matches("\\d+"); + + String aString = "1235"; + test.check(aString, aChecker); + } + +} + diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java new file mode 100644 index 0000000000..33ef986588 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java @@ -0,0 +1,126 @@ +package com.baeldung.jspec; + +import static org.javalite.test.jspec.JSpec.$; +import static org.javalite.test.jspec.JSpec.expect; +import static org.javalite.test.jspec.JSpec.the; + +import java.util.Set; + +import org.javalite.test.jspec.DifferenceExpectation; +import org.junit.Test; + +public class CageUnitTest { + + Cat tomCat = new Cat("Tom"); + Cat felixCat = new Cat("Felix"); + Dog boltDog = new Dog("Bolt"); + Cage cage = new Cage(); + + + @Test + public void puttingAnimals_shouldIncreaseCageSize() { + // When + cage.put(tomCat, boltDog); + + // Then + the(cage.size()).shouldEqual(2); + } + + @Test + public void releasingAnimals_shouldDecreaseCageSize() { + // When + cage.put(tomCat, boltDog); + cage.release(tomCat); + + // Then + the(cage.size()).shouldEqual(1); + } + + @Test + public void puttingAnimals_shouldLeaveThemInsideTheCage() { + // When + cage.put(tomCat, boltDog); + + // Then + the(cage).shouldHave("animals"); + } + + @Test + public void openingTheCage_shouldReleaseAllAnimals() { + // When + cage.put(tomCat, boltDog); + + // Then + the(cage).shouldNotBe("empty"); + + // When + cage.open(); + + // Then + the(cage).shouldBe("empty"); + the(cage.isEmpty()).shouldBeTrue(); + } + + @Test + public void comparingTwoDogs() { + // When + Dog firstDog = new Dog("Rex"); + Dog secondDog = new Dog("Rex"); + + // Then + $(firstDog).shouldEqual(secondDog); + $(firstDog).shouldNotBeTheSameAs(secondDog); + } + + @Test + public void puttingCatsOnly_shouldLetCageAnimalsToContainCats() { + // When + cage.put(tomCat, felixCat); + + // Then + Set animals = cage.getAnimals(); + the(animals).shouldContain(tomCat); + the(animals).shouldContain(felixCat); + the(animals).shouldNotContain(boltDog); + } + + @Test + public void puttingCatsOnly_shouldLetCageToContainCats() { + // When + cage.put(tomCat, felixCat); + + // Then + // Check with toString of the tested objects + the(cage).shouldContain(tomCat); + the(cage).shouldContain(felixCat); + the(cage).shouldNotContain(boltDog); + } + + @Test + public void puttingMoreAnimals_shouldChangeSize() { + // When + cage.put(tomCat, boltDog); + + // Then + expect( new DifferenceExpectation(cage.size()) { + + @Override + public Integer exec() { + cage.release(tomCat); + return cage.size(); + } + } ); + } + + + @Test + public void releasingTheDog_shouldReleaseAnAnimalOfDogType() { + // When + cage.put(boltDog); + Animal releasedAnimal = cage.release(boltDog); + + // Then + the(releasedAnimal).shouldNotBeNull(); + the(releasedAnimal).shouldBeA(Dog.class); + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java new file mode 100644 index 0000000000..0e35e26728 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.jspec; + +import static org.javalite.test.jspec.JSpec.$; +import static org.javalite.test.jspec.JSpec.a; +import static org.javalite.test.jspec.JSpec.expect; +import static org.javalite.test.jspec.JSpec.it; +import static org.javalite.test.jspec.JSpec.the; + +import java.util.Arrays; +import java.util.List; + +import org.javalite.test.jspec.ExceptionExpectation; +import org.junit.Test; + +public class JSpecUnitTest { + + @Test + public void onePlusTwo_shouldEqualThree() { + $(1 + 2).shouldEqual(3); + a(1 + 2).shouldEqual(3); + the(1 + 2).shouldEqual(3); + it(1 + 2).shouldEqual(3); + } + + @Test + public void messageShouldContainJSpec() { + String message = "Welcome to JSpec demo"; + // The message should not be empty + the(message).shouldNotBe("empty"); + // The message should contain JSpec + the(message).shouldContain("JSpec"); + } + + public void colorsListShouldContainRed() { + List colorsList = Arrays.asList("red", "green", "blue"); + $(colorsList).shouldContain("red"); + } + + public void guessedNumberShouldEqualHiddenNumber() { + Integer guessedNumber = 11; + Integer hiddenNumber = 11; + + $(guessedNumber).shouldEqual(hiddenNumber); + $(guessedNumber).shouldNotBeTheSameAs(hiddenNumber); + } + + @Test + public void dividingByThero_shouldThrowArithmeticException() { + expect(new ExceptionExpectation(ArithmeticException.class) { + @Override + public void exec() throws ArithmeticException { + System.out.println(1 / 0); + } + } ); + } + +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java new file mode 100644 index 0000000000..ae6fa355fa --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.junit; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class AdditionUnitTest { + Calculator calculator = new Calculator(); + + @Test + public void testAddition() { + assertEquals("addition", 8, calculator.add(5, 3)); + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java new file mode 100644 index 0000000000..b0209b01aa --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java @@ -0,0 +1,101 @@ +package com.baeldung.junit; + +import org.junit.Test; + +import java.util.Arrays; + +import static org.hamcrest.core.IsCollectionContaining.hasItems; +import static org.junit.Assert.*; + +/** + * Unit test that demonstrate the different assertions available within JUnit 4 + */ +public class AssertionsUnitTest { + + @Test + public void whenAssertingEquality_thenEqual() { + String expected = "Baeldung"; + String actual = "Baeldung"; + + assertEquals(expected, actual); + } + + @Test + public void whenAssertingEqualityWithMessage_thenEqual() { + String expected = "Baeldung"; + String actual = "Baeldung"; + + assertEquals("failure - strings are not equal", expected, actual); + } + + @Test + public void whenAssertingArraysEquality_thenEqual() { + char[] expected = { 'J', 'u', 'n', 'i', 't' }; + char[] actual = "Junit".toCharArray(); + + assertArrayEquals(expected, actual); + } + + @Test + public void givenNullArrays_whenAssertingArraysEquality_thenEqual() { + int[] expected = null; + int[] actual = null; + + assertArrayEquals(expected, actual); + } + + @Test + public void whenAssertingNull_thenTrue() { + Object car = null; + + assertNull("The car should be null", car); + } + + @Test + public void whenAssertingNotNull_thenTrue() { + Object car = new Object(); + + assertNotNull("The car should not be null", car); + } + + @Test + public void whenAssertingNotSameObject_thenDifferent() { + Object cat = new Object(); + Object dog = new Object(); + + assertNotSame(cat, dog); + } + + @Test + public void whenAssertingSameObject_thenSame() { + Object cat = new Object(); + + assertSame(cat, cat); + } + + @Test + public void whenAssertingConditions_thenVerified() { + assertTrue("5 is greater then 4", 5 > 4); + assertFalse("5 is not greater then 6", 5 > 6); + } + + @Test + public void when_thenNotFailed() { + try { + methodThatShouldThrowException(); + fail("Exception not thrown"); + } catch (UnsupportedOperationException e) { + assertEquals("Operation Not Supported", e.getMessage()); + } + } + + private void methodThatShouldThrowException() { + throw new UnsupportedOperationException("Operation Not Supported"); + } + + @Test + public void testAssertThatHasItems() { + assertThat(Arrays.asList("Java", "Kotlin", "Scala"), hasItems("Java", "Kotlin")); + } + +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java new file mode 100644 index 0000000000..432d5cda83 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java @@ -0,0 +1,18 @@ +package com.baeldung.junit; + +import org.junit.runners.BlockJUnit4ClassRunner; +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.InitializationError; +import org.junit.runners.model.Statement; + +public class BlockingTestRunner extends BlockJUnit4ClassRunner { + public BlockingTestRunner(Class klass) throws InitializationError { + super(klass); + } + + @Override + protected Statement methodInvoker(FrameworkMethod method, Object test) { + System.out.println("invoking: " + method.getName()); + return super.methodInvoker(method, test); + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java new file mode 100644 index 0000000000..d5ca847106 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.junit; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import static org.junit.Assert.assertEquals; + +@RunWith(JUnit4.class) +public class CalculatorUnitTest { + Calculator calculator = new Calculator(); + + @Test + public void testAddition() { + assertEquals("addition", 8, calculator.add(5, 3)); + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java new file mode 100644 index 0000000000..fd98395ebc --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.junit; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SubstractionUnitTest { + Calculator calculator = new Calculator(); + + @Test + public void substraction() { + assertEquals("substraction", 2, calculator.sub(5, 3)); + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java new file mode 100644 index 0000000000..76d19f84b2 --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java @@ -0,0 +1,12 @@ +package com.baeldung.junit; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ + AdditionUnitTest.class, + SubstractionUnitTest.class}) +public class SuiteUnitTest { +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java new file mode 100644 index 0000000000..9eb4b3141b --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java @@ -0,0 +1,41 @@ +package com.baeldung.junit; + +import org.junit.Test; +import org.junit.runner.Description; +import org.junit.runner.Runner; +import org.junit.runner.notification.RunNotifier; + +import java.lang.reflect.Method; + +public class TestRunner extends Runner { + + private Class testClass; + public TestRunner(Class testClass) { + super(); + this.testClass = testClass; + } + + @Override + public Description getDescription() { + return Description.createTestDescription(testClass, "My runner description"); + } + + @Override + public void run(RunNotifier notifier) { + System.out.println("running the tests from MyRunner: " + testClass); + try { + Object testObject = testClass.newInstance(); + for (Method method : testClass.getMethods()) { + if (method.isAnnotationPresent(Test.class)) { + notifier.fireTestStarted(Description + .createTestDescription(testClass, method.getName())); + method.invoke(testObject); + notifier.fireTestFinished(Description + .createTestDescription(testClass, method.getName())); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java new file mode 100644 index 0000000000..b7919a29ca --- /dev/null +++ b/testing-modules/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java @@ -0,0 +1,561 @@ +package com.baeldung.truth; + +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.Range; +import com.google.common.collect.Table; +import com.google.common.collect.TreeBasedTable; +import com.google.common.collect.TreeMultiset; +import static com.baeldung.truth.UserSubject.*; +import static com.google.common.truth.Truth.*; +import static com.google.common.truth.Truth8.*; +import java.math.BigDecimal; +import java.util.Arrays; +import java.util.Comparator; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.IntStream; +import java.util.stream.Stream; +import org.junit.Ignore; +import org.junit.Test; + +public class GoogleTruthUnitTest { + + @Test + public void whenComparingInteger_thenEqual() { + int anInt = 10; + + assertThat(anInt).isEqualTo(10); + } + + @Test + public void whenComparingFloat_thenIsBigger() { + float aFloat = 10.0f; + + assertThat(aFloat).isGreaterThan(1.0f); + } + + @Test + public void whenComparingDouble_thenIsSmaller() { + double aDouble = 10.0f; + + assertThat(aDouble).isLessThan(20.0); + } + + @Test + public void whenComparingFloat_thenWithinPrecision() { + float aFloat = 23.04f; + + assertThat(aFloat).isWithin(1.3f) + .of(23.3f); + } + + @Test + public void whenComparingFloat_thenNotWithinPrecision() { + float aFloat = 23.04f; + + assertThat(aFloat).isNotWithin(1.3f) + .of(100f); + } + + @Test + public void whenComparingDouble_thenWithinPrecision() { + double aDouble = 22.18; + + assertThat(aDouble).isWithin(2) + .of(23d); + } + + @Test + public void whenComparingDouble_thenNotWithinPrecision() { + double aDouble = 22.08; + + assertThat(aDouble).isNotWithin(2) + .of(100); + } + + @Test + public void whenComparingBigDecimal_thenEqualIgnoringScale() { + BigDecimal aBigDecimal = BigDecimal.valueOf(1000, 3); + + assertThat(aBigDecimal).isEqualToIgnoringScale(new BigDecimal(1.0)); + } + + @Test + public void whenCheckingBoolean_thenTrue() { + boolean aBoolean = true; + + assertThat(aBoolean).isTrue(); + } + + @Test + public void whenCheckingBoolean_thenFalse() { + boolean aBoolean = false; + + assertThat(aBoolean).isFalse(); + } + + @Test + public void whenComparingArrays_thenEqual() { + String[] firstArrayOfStrings = { "one", "two", "three" }; + String[] secondArrayOfStrings = { "one", "two", "three" }; + + assertThat(firstArrayOfStrings).isEqualTo(secondArrayOfStrings); + } + + @Test + public void whenComparingArrays_thenNotEqual() { + String[] firstArrayOfStrings = { "one", "two", "three" }; + String[] secondArrayOfStrings = { "three", "two", "one" }; + + assertThat(firstArrayOfStrings).isNotEqualTo(secondArrayOfStrings); + } + + @Test + public void whenCheckingArray_thenEmpty() { + Object[] anArray = {}; + + assertThat(anArray).isEmpty(); + } + + @Test + public void whenCheckingArray_thenNotEmpty() { + String[] arrayOfStrings = { "One String " }; + + assertThat(arrayOfStrings).isNotEmpty(); + } + + @Test + public void whenCheckingArrayOfDoubles_thenWithinPrecision() { + double[] arrayOfDoubles = { 1, 2, 3, 4, 5 }; + + assertThat(arrayOfDoubles).hasValuesWithin(5) + .of(6, 7, 8, 9, 10); + } + + @Test + public void whenComparingUsers_thenEqual() { + User aUser = new User("John Doe"); + User anotherUser = new User("John Doe"); + + assertThat(aUser).isEqualTo(anotherUser); + } + + @Test + public void whenComparingUser_thenIsNull() { + User aUser = null; + + assertThat(aUser).isNull(); + } + + @Test + public void whenComparingUser_thenNotNull() { + User aUser = new User(); + + assertThat(aUser).isNotNull(); + } + + @Test + public void whenComparingUser_thenInstanceOf() { + User aUser = new User(); + + assertThat(aUser).isInstanceOf(User.class); + } + + @Test + public void whenComparingUser_thenInList() { + User aUser = new User(); + + assertThat(aUser).isIn(Arrays.asList(1, 3, aUser, null)); + } + + @Test + public void whenComparingUser_thenNotInList() { + User aUser = new User(); + + assertThat(aUser).isNotIn(Arrays.asList(1, 3, "Three")); + } + + @Test + public void whenComparingNullUser_thenInList() { + User aUser = null; + User anotherUser = new User(); + + assertThat(aUser).isIn(Arrays.asList(1, 3, anotherUser, null)); + } + + @Test + public void whenCheckingString_thenStartsWithString() { + String aString = "This is a string"; + + assertThat(aString).startsWith("This"); + } + + @Test + public void whenCheckingString_thenContainsString() { + String aString = "This is a string"; + + assertThat(aString).contains("is a"); + } + + @Test + public void whenCheckingString_thenEndsWithString() { + String aString = "This is a string"; + + assertThat(aString).endsWith("string"); + } + + @Test + public void whenCheckingString_thenExpectedLength() { + String aString = "This is a string"; + + assertThat(aString).hasLength(16); + } + + @Test + public void whenCheckingString_thenEmpty() { + String aString = ""; + + assertThat(aString).isEmpty(); + } + + @Test + public void whenCheckingString_thenMatches() { + String aString = "The string to match"; + + assertThat(aString).matches(Pattern.compile("[a-zA-Z\\s]+")); + } + + @Test + public void whenCheckingComparable_thenAtLeast() { + Comparable aComparable = 5; + + assertThat(aComparable).isAtLeast(1); + } + + @Test + public void whenCheckingComparable_thenAtMost() { + Comparable aComparable = 5; + + assertThat(aComparable).isAtMost(10); + } + + @Test + public void whenCheckingComparable_thenInList() { + Comparable aComparable = 5; + + assertThat(aComparable).isIn(Arrays.asList(4, 5, 6)); + } + + @Test + public void whenCheckingComparable_thenInRange() { + Comparable aComparable = 5; + + assertThat(aComparable).isIn(Range.closed(1, 10)); + } + + @Test + public void whenCheckingComparable_thenNotInRange() { + Comparable aComparable = 5; + + assertThat(aComparable).isNotIn(Range.closed(10, 15)); + } + + @Test + public void whenComparingUsers_thenEquivalent() { + User aUser = new User(); + aUser.setName("John Doe"); + + User anotherUser = new User(); + anotherUser.setName("john doe"); + + assertThat(aUser).isEquivalentAccordingToCompareTo(anotherUser); + } + + @Test + public void whenCheckingIterable_thenContains() { + List aList = Arrays.asList(4, 5, 6); + + assertThat(aList).contains(5); + } + + @Test + public void whenCheckingIterable_thenDoesNotContains() { + List aList = Arrays.asList(4, 5, 6); + + assertThat(aList).doesNotContain(9); + } + + @Test + public void whenCheckingIterable_thenContainsAny() { + List aList = Arrays.asList(4, 5, 6); + + assertThat(aList).containsAnyOf(0, 5, 10); + } + + @Test + public void whenCheckingIterable_thenContainsAnyInList() { + List aList = Arrays.asList(1, 2, 3); + + assertThat(aList).containsAnyIn(Arrays.asList(1, 5, 10)); + } + + @Test + public void whenCheckingIterable_thenNoDuplicates() { + List aList = Arrays.asList(-2, -1, 0, 1, 2); + + assertThat(aList).containsNoDuplicates(); + } + + @Test + public void whenCheckingIterable_thenContainsNoneOf() { + List aList = Arrays.asList(4, 5, 6); + + assertThat(aList).containsNoneOf(9, 8, 7); + } + + @Test + public void whenCheckingIterable_thenContainsNoneIn() { + List aList = Arrays.asList(4, 5, 6); + + assertThat(aList).containsNoneIn(Arrays.asList(9, 10, 11)); + } + + @Test + public void whenCheckingIterable_thenContainsExactElements() { + List aList = Arrays.asList("10", "20", "30"); + List anotherList = Arrays.asList("10", "20", "30"); + + assertThat(aList).containsExactlyElementsIn(anotherList) + .inOrder(); + } + + @Test + public void whenCheckingIterable_thenOrdered() { + Set aSet = new LinkedHashSet<>(Arrays.asList("one", "three", "two")); + + assertThat(aSet).isOrdered(); + } + + @Test + public void givenComparator_whenCheckingIterable_thenOrdered() { + Comparator aComparator = (a, b) -> new Float(a).compareTo(new Float(b)); + + List aList = Arrays.asList("1", "012", "0020", "100"); + + assertThat(aList).isOrdered(aComparator); + } + + @Test + public void whenCheckingMap_thenContainsEntry() { + Map aMap = new HashMap<>(); + aMap.put("one", 1L); + + assertThat(aMap).containsEntry("one", 1L); + } + + @Test + public void whenCheckingMap_thenContainsKey() { + Map map = new HashMap<>(); + map.put("one", 1L); + + assertThat(map).containsKey("one"); + } + + @Test + public void whenCheckingMap_thenContainsEntries() { + Map aMap = new HashMap<>(); + aMap.put("first", 1L); + aMap.put("second", 2.0); + aMap.put("third", 3f); + + Map anotherMap = new HashMap<>(aMap); + + assertThat(aMap).containsExactlyEntriesIn(anotherMap); + } + + @Test + public void whenCheckingException_thenInstanceOf() { + Exception anException = new IllegalArgumentException(new NumberFormatException()); + + assertThat(anException).hasCauseThat() + .isInstanceOf(NumberFormatException.class); + } + + @Test + public void whenCheckingException_thenCauseMessageIsKnown() { + Exception anException = new IllegalArgumentException("Bad value"); + + assertThat(anException).hasMessageThat() + .startsWith("Bad"); + } + + @Test + public void whenCheckingClass_thenIsAssignable() { + Class aClass = Double.class; + + assertThat(aClass).isAssignableTo(Number.class); + } + + // Java 8 Tests + @Test + public void whenCheckingJavaOptional_thenHasValue() { + Optional anOptional = Optional.of(1); + + assertThat(anOptional).hasValue(1); + } + + @Test + public void whenCheckingJavaOptional_thenPresent() { + Optional anOptional = Optional.of("Baeldung"); + + assertThat(anOptional).isPresent(); + } + + @Test + public void whenCheckingJavaOptional_thenEmpty() { + Optional anOptional = Optional.empty(); + + assertThat(anOptional).isEmpty(); + } + + @Test + public void whenCheckingStream_thenContainsInOrder() { + Stream anStream = Stream.of(1, 2, 3); + + assertThat(anStream).containsAllOf(1, 2, 3) + .inOrder(); + } + + @Test + public void whenCheckingStream_thenDoesNotContain() { + Stream anStream = IntStream.range(1, 100) + .boxed(); + + assertThat(anStream).doesNotContain(0); + } + + // Guava Tests + @Test + public void whenCheckingGuavaOptional_thenIsAbsent() { + com.google.common.base.Optional anOptional = com.google.common.base.Optional.absent(); + + assertThat(anOptional).isAbsent(); + } + + @Test + public void whenCheckingGuavaMultimap_thenExpectedSize() { + Multimap aMultimap = ArrayListMultimap.create(); + aMultimap.put("one", 1L); + aMultimap.put("one", 2.0); + + assertThat(aMultimap).valuesForKey("one") + .hasSize(2); + } + + @Test + public void whenCheckingGuavaMultiset_thenExpectedCount() { + TreeMultiset aMultiset = TreeMultiset.create(); + aMultiset.add("baeldung", 10); + + assertThat(aMultiset).hasCount("baeldung", 10); + } + + @Test + public void whenCheckingGuavaTable_thenContains() { + Table aTable = getDummyGuavaTable(); + + assertThat(aTable).contains("firstRow", "firstColumn"); + } + + @Test + public void whenCheckingGuavaTable_thenContainsCell() { + Table aTable = getDummyGuavaTable(); + + assertThat(aTable).containsCell("firstRow", "firstColumn", "baeldung"); + } + + @Test + public void whenCheckingGuavaTable_thenContainsRow() { + Table aTable = getDummyGuavaTable(); + + assertThat(aTable).containsRow("firstRow"); + } + + @Test + public void whenCheckingGuavaTable_thenContainsColumn() { + Table aTable = getDummyGuavaTable(); + + assertThat(aTable).containsColumn("firstColumn"); + } + + @Test + public void whenCheckingGuavaTable_thenContainsValue() { + Table aTable = getDummyGuavaTable(); + + assertThat(aTable).containsValue("baeldung"); + } + + @Ignore + @Test + public void whenFailingAssertion_thenMessagePrefix() { + User aUser = new User(); + + assertThat(aUser).named("User [%s]", aUser.getName()) + .isNull(); + } + + @Ignore + @Test + public void whenFailingAssertion_thenCustomMessage() { + User aUser = new User(); + + assertWithMessage("TEST-985: Secret user subject was NOT null!").that(aUser) + .isNull(); + } + + @Ignore + @Test + public void whenFailingAssertion_thenCustomMessageAndPrefix() { + User aUser = new User(); + + assertWithMessage("TEST-985: Secret user subject was NOT null!").that(aUser) + .named("User [%s]", aUser.getName()) + .isNull(); + } + + private Table getDummyGuavaTable() { + Table aTable = TreeBasedTable.create(); + aTable.put("firstRow", "firstColumn", "baeldung"); + return aTable; + } + + // Custom User type + @Test + public void whenCheckingUser_thenHasName() { + User aUser = new User(); + + assertThat(aUser).hasName("John Doe"); + } + + @Test + public void whenCheckingUser_thenHasNameIgnoringCase() { + User aUser = new User(); + + assertThat(aUser).hasNameIgnoringCase("john doe"); + } + + @Test + public void givenUser_whenCheckingEmails_thenExpectedSize() { + User aUser = new User(); + + assertThat(aUser).emails() + .hasSize(2); + } + +} diff --git a/testing-modules/junit-4/README.md b/testing-modules/junit-4/README.md index 4d4588912b..dd975daf58 100644 --- a/testing-modules/junit-4/README.md +++ b/testing-modules/junit-4/README.md @@ -1,3 +1,5 @@ ### Relevant Articles - [Guide to JUnit 4 Rules](https://www.baeldung.com/junit-4-rules) +- [Custom JUnit 4 Test Runners](http://www.baeldung.com/junit-4-custom-runners) +- [Introduction to JUnitParams](http://www.baeldung.com/junit-params) diff --git a/testing-modules/junit-4/src/main/java/com/baeldung/junit/Calculator.java b/testing-modules/junit-4/src/main/java/com/baeldung/junit/Calculator.java new file mode 100644 index 0000000000..8ea7b3ed1f --- /dev/null +++ b/testing-modules/junit-4/src/main/java/com/baeldung/junit/Calculator.java @@ -0,0 +1,11 @@ +package com.baeldung.junit; + +public class Calculator { + public int add(int a, int b) { + return a + b; + } + + public int sub(int a, int b) { + return a - b; + } +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/junit/AdditionUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/AdditionUnitTest.java new file mode 100644 index 0000000000..ae6fa355fa --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/AdditionUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.junit; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class AdditionUnitTest { + Calculator calculator = new Calculator(); + + @Test + public void testAddition() { + assertEquals("addition", 8, calculator.add(5, 3)); + } +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/junit/AssertionsUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/AssertionsUnitTest.java new file mode 100644 index 0000000000..b0209b01aa --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/AssertionsUnitTest.java @@ -0,0 +1,101 @@ +package com.baeldung.junit; + +import org.junit.Test; + +import java.util.Arrays; + +import static org.hamcrest.core.IsCollectionContaining.hasItems; +import static org.junit.Assert.*; + +/** + * Unit test that demonstrate the different assertions available within JUnit 4 + */ +public class AssertionsUnitTest { + + @Test + public void whenAssertingEquality_thenEqual() { + String expected = "Baeldung"; + String actual = "Baeldung"; + + assertEquals(expected, actual); + } + + @Test + public void whenAssertingEqualityWithMessage_thenEqual() { + String expected = "Baeldung"; + String actual = "Baeldung"; + + assertEquals("failure - strings are not equal", expected, actual); + } + + @Test + public void whenAssertingArraysEquality_thenEqual() { + char[] expected = { 'J', 'u', 'n', 'i', 't' }; + char[] actual = "Junit".toCharArray(); + + assertArrayEquals(expected, actual); + } + + @Test + public void givenNullArrays_whenAssertingArraysEquality_thenEqual() { + int[] expected = null; + int[] actual = null; + + assertArrayEquals(expected, actual); + } + + @Test + public void whenAssertingNull_thenTrue() { + Object car = null; + + assertNull("The car should be null", car); + } + + @Test + public void whenAssertingNotNull_thenTrue() { + Object car = new Object(); + + assertNotNull("The car should not be null", car); + } + + @Test + public void whenAssertingNotSameObject_thenDifferent() { + Object cat = new Object(); + Object dog = new Object(); + + assertNotSame(cat, dog); + } + + @Test + public void whenAssertingSameObject_thenSame() { + Object cat = new Object(); + + assertSame(cat, cat); + } + + @Test + public void whenAssertingConditions_thenVerified() { + assertTrue("5 is greater then 4", 5 > 4); + assertFalse("5 is not greater then 6", 5 > 6); + } + + @Test + public void when_thenNotFailed() { + try { + methodThatShouldThrowException(); + fail("Exception not thrown"); + } catch (UnsupportedOperationException e) { + assertEquals("Operation Not Supported", e.getMessage()); + } + } + + private void methodThatShouldThrowException() { + throw new UnsupportedOperationException("Operation Not Supported"); + } + + @Test + public void testAssertThatHasItems() { + assertThat(Arrays.asList("Java", "Kotlin", "Scala"), hasItems("Java", "Kotlin")); + } + +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/junit/BlockingTestRunner.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/BlockingTestRunner.java new file mode 100644 index 0000000000..432d5cda83 --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/BlockingTestRunner.java @@ -0,0 +1,18 @@ +package com.baeldung.junit; + +import org.junit.runners.BlockJUnit4ClassRunner; +import org.junit.runners.model.FrameworkMethod; +import org.junit.runners.model.InitializationError; +import org.junit.runners.model.Statement; + +public class BlockingTestRunner extends BlockJUnit4ClassRunner { + public BlockingTestRunner(Class klass) throws InitializationError { + super(klass); + } + + @Override + protected Statement methodInvoker(FrameworkMethod method, Object test) { + System.out.println("invoking: " + method.getName()); + return super.methodInvoker(method, test); + } +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/junit/CalculatorUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/CalculatorUnitTest.java new file mode 100644 index 0000000000..d5ca847106 --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/CalculatorUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.junit; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import static org.junit.Assert.assertEquals; + +@RunWith(JUnit4.class) +public class CalculatorUnitTest { + Calculator calculator = new Calculator(); + + @Test + public void testAddition() { + assertEquals("addition", 8, calculator.add(5, 3)); + } +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/junit/SubstractionUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/SubstractionUnitTest.java new file mode 100644 index 0000000000..fd98395ebc --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/SubstractionUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.junit; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class SubstractionUnitTest { + Calculator calculator = new Calculator(); + + @Test + public void substraction() { + assertEquals("substraction", 2, calculator.sub(5, 3)); + } +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/junit/SuiteUnitTest.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/SuiteUnitTest.java new file mode 100644 index 0000000000..76d19f84b2 --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/SuiteUnitTest.java @@ -0,0 +1,12 @@ +package com.baeldung.junit; + +import org.junit.runner.RunWith; +import org.junit.runners.Suite; +import org.junit.runners.Suite.SuiteClasses; + +@RunWith(Suite.class) +@SuiteClasses({ + AdditionUnitTest.class, + SubstractionUnitTest.class}) +public class SuiteUnitTest { +} diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/junit/TestRunner.java b/testing-modules/junit-4/src/test/java/com/baeldung/junit/TestRunner.java new file mode 100644 index 0000000000..9eb4b3141b --- /dev/null +++ b/testing-modules/junit-4/src/test/java/com/baeldung/junit/TestRunner.java @@ -0,0 +1,41 @@ +package com.baeldung.junit; + +import org.junit.Test; +import org.junit.runner.Description; +import org.junit.runner.Runner; +import org.junit.runner.notification.RunNotifier; + +import java.lang.reflect.Method; + +public class TestRunner extends Runner { + + private Class testClass; + public TestRunner(Class testClass) { + super(); + this.testClass = testClass; + } + + @Override + public Description getDescription() { + return Description.createTestDescription(testClass, "My runner description"); + } + + @Override + public void run(RunNotifier notifier) { + System.out.println("running the tests from MyRunner: " + testClass); + try { + Object testObject = testClass.newInstance(); + for (Method method : testClass.getMethods()) { + if (method.isAnnotationPresent(Test.class)) { + notifier.fireTestStarted(Description + .createTestDescription(testClass, method.getName())); + method.invoke(testObject); + notifier.fireTestFinished(Description + .createTestDescription(testClass, method.getName())); + } + } + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/testing-modules/mocks/README.md b/testing-modules/mocks/README.md index 3cb20dcf92..3baefe072b 100644 --- a/testing-modules/mocks/README.md +++ b/testing-modules/mocks/README.md @@ -2,3 +2,10 @@ - [EasyMock Argument Matchers](http://www.baeldung.com/easymock-argument-matchers) - [Mock Static Method using JMockit](https://www.baeldung.com/jmockit-static-method) +- [Mockito vs EasyMock vs JMockit](http://www.baeldung.com/mockito-vs-easymock-vs-jmockit) +- [Introduction to EasyMock](http://www.baeldung.com/easymock) +- [JMockit 101](http://www.baeldung.com/jmockit-101) +- [A Guide to JMockit Expectations](http://www.baeldung.com/jmockit-expectations) +- [JMockit Advanced Usage](http://www.baeldung.com/jmockit-advanced-usage) +- [Introduction to Jukito](http://www.baeldung.com/jukito) +- [A Guide to JavaFaker](https://www.baeldung.com/java-faker) diff --git a/testing-modules/mocks/javafaker/pom.xml b/testing-modules/mocks/javafaker/pom.xml deleted file mode 100644 index 8c1f8c080e..0000000000 --- a/testing-modules/mocks/javafaker/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - 4.0.0 - javafaker - javafaker - - - com.baeldung - mocks - 1.0.0-SNAPSHOT - ../ - - - - - com.github.javafaker - javafaker - ${javafaker.version} - - - - - 0.15 - - - diff --git a/testing-modules/mocks/jmockit/README.md b/testing-modules/mocks/jmockit/README.md deleted file mode 100644 index 0e44b93d6e..0000000000 --- a/testing-modules/mocks/jmockit/README.md +++ /dev/null @@ -1,9 +0,0 @@ -========= - -## JMockit related tutorials - - -### Relevant Articles: -- [JMockit 101](http://www.baeldung.com/jmockit-101) -- [A Guide to JMockit Expectations](http://www.baeldung.com/jmockit-expectations) -- [JMockit Advanced Usage](http://www.baeldung.com/jmockit-advanced-usage) diff --git a/testing-modules/mocks/jmockit/pom.xml b/testing-modules/mocks/jmockit/pom.xml deleted file mode 100644 index 12bbe6b60d..0000000000 --- a/testing-modules/mocks/jmockit/pom.xml +++ /dev/null @@ -1,37 +0,0 @@ - - 4.0.0 - jmockit - jmockit - - - com.baeldung - mocks - 1.0.0-SNAPSHOT - ../ - - - - - org.jmockit - jmockit - ${jmockit.version} - test - - - - - jmockit - - - src/main/resources - true - - - - - - 1.24 - - - \ No newline at end of file diff --git a/testing-modules/mocks/jukito/pom.xml b/testing-modules/mocks/jukito/pom.xml deleted file mode 100644 index 752f097482..0000000000 --- a/testing-modules/mocks/jukito/pom.xml +++ /dev/null @@ -1,27 +0,0 @@ - - 4.0.0 - jukito - jukito - - - com.baeldung - mocks - 1.0.0-SNAPSHOT - ../ - - - - - org.jukito - jukito - ${jukito.version} - test - - - - - 1.5 - - - diff --git a/testing-modules/mocks/mock-comparisons/README.md b/testing-modules/mocks/mock-comparisons/README.md deleted file mode 100644 index 20c13ecd72..0000000000 --- a/testing-modules/mocks/mock-comparisons/README.md +++ /dev/null @@ -1,8 +0,0 @@ -========= - -## Mock comparison realated tutorials - - -### Relevant Articles: -- [Mockito vs EasyMock vs JMockit](http://www.baeldung.com/mockito-vs-easymock-vs-jmockit) -- [Introduction to EasyMock](http://www.baeldung.com/easymock) diff --git a/testing-modules/mocks/mock-comparisons/pom.xml b/testing-modules/mocks/mock-comparisons/pom.xml deleted file mode 100644 index e454f124ce..0000000000 --- a/testing-modules/mocks/mock-comparisons/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - 4.0.0 - mock-comparisons - mock-comparisons - - - com.baeldung - mocks - 1.0.0-SNAPSHOT - ../ - - - - - org.mockito - mockito-core - ${mockito.version} - test - - - - org.easymock - easymock - ${easymock.version} - test - - - - org.jmockit - jmockit - ${jmockit.version} - test - - - - - - mock-comparisons - - - src/main/resources - true - - - - - - 2.21.0 - 3.5.1 - 1.41 - - - diff --git a/testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml b/testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/testing-modules/mocks/mock-comparisons/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/testing-modules/mocks/pom.xml b/testing-modules/mocks/pom.xml index ecc8b61a6d..342191c206 100644 --- a/testing-modules/mocks/pom.xml +++ b/testing-modules/mocks/pom.xml @@ -12,9 +12,45 @@ ../../ - - mock-comparisons - jmockit - + + + com.github.javafaker + javafaker + ${javafaker.version} + + + org.jmockit + jmockit + ${jmockit.version} + test + + + org.jukito + jukito + ${jukito.version} + test + + + org.mockito + mockito-core + ${mockito.version} + test + + + + org.easymock + easymock + ${easymock.version} + test + + + + + 0.15 + 1.5 +2.21.0 + 3.5.1 + 1.41 + diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/ArticleReader.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/ArticleReader.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/ArticleReader.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungArticle.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungArticle.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungArticle.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungReader.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/BaeldungReader.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/BaeldungReader.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/IArticleWriter.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IArticleWriter.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/IArticleWriter.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/IUserService.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/IUserService.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/IUserService.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java b/testing-modules/mocks/src/main/java/com/baeldung/easymock/User.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/com/baeldung/easymock/User.java rename to testing-modules/mocks/src/main/java/com/baeldung/easymock/User.java diff --git a/testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/Calculator.java b/testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/Calculator.java similarity index 100% rename from testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/Calculator.java rename to testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/Calculator.java diff --git a/testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java b/testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java similarity index 100% rename from testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java rename to testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/ScientificCalculator.java diff --git a/testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java b/testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java similarity index 100% rename from testing-modules/mocks/jukito/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java rename to testing-modules/mocks/src/main/java/com/baeldung/introductionjukito/SimpleCalculator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java b/testing-modules/mocks/src/main/java/com/baeldung/mocks/jmockit/AppManager.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/com/baeldung/mocks/jmockit/AppManager.java rename to testing-modules/mocks/src/main/java/com/baeldung/mocks/jmockit/AppManager.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/AdvancedCollaborator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Collaborator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/ExpectationsCollaborator.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Model.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Model.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Model.java diff --git a/testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Performer.java similarity index 100% rename from testing-modules/mocks/jmockit/src/main/java/org/baeldung/mocks/jmockit/Performer.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/jmockit/Performer.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginController.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginController.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginController.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginDao.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginDao.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginDao.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginService.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/LoginService.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/LoginService.java diff --git a/testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java b/testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/UserForm.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/main/java/org/baeldung/mocks/testCase/UserForm.java rename to testing-modules/mocks/src/main/java/org/baeldung/mocks/testCase/UserForm.java diff --git a/testing-modules/mocks/jmockit/src/main/resources/logback.xml b/testing-modules/mocks/src/main/resources/logback.xml similarity index 100% rename from testing-modules/mocks/jmockit/src/main/resources/logback.xml rename to testing-modules/mocks/src/main/resources/logback.xml diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/ArgumentMatchersUnitTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedUnitTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderAnnotatedWithRuleUnitTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockDelegationUnitTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderMockSupportUnitTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/easymock/BaeldungReaderUnitTest.java diff --git a/testing-modules/mocks/jukito/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java similarity index 100% rename from testing-modules/mocks/jukito/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/introductionjukito/CalculatorUnitTest.java diff --git a/testing-modules/mocks/javafaker/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java similarity index 100% rename from testing-modules/mocks/javafaker/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/javafaker/JavaFakerUnitTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java rename to testing-modules/mocks/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/easymock/LoginControllerIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/LoginControllerIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/PerformerIntegrationTest.java diff --git a/testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java similarity index 100% rename from testing-modules/mocks/jmockit/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ReusingIntegrationTest.java diff --git a/testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java similarity index 100% rename from testing-modules/mocks/mock-comparisons/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java rename to testing-modules/mocks/src/test/java/org/baeldung/mocks/mockito/LoginControllerIntegrationTest.java diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index 5102e09349..c0eb59f15e 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - testing-libraries - testing-libraries + testing-modules + testing-modules pom @@ -14,6 +14,7 @@ + assertion-libraries easy-random gatling groovy-spock @@ -37,5 +38,6 @@ junit-5-advanced xmlunit-2 junit-4 + testing-libraries diff --git a/testing-modules/testing-libraries/README.md b/testing-modules/testing-libraries/README.md new file mode 100644 index 0000000000..0cd9ca7f2e --- /dev/null +++ b/testing-modules/testing-libraries/README.md @@ -0,0 +1,10 @@ + +## Relevant Articles + +- [Mutation Testing with PITest](http://www.baeldung.com/java-mutation-testing-with-pitest) +- [Intro to JaCoCo](http://www.baeldung.com/jacoco) +- [Cucumber and Scenario Outline](http://www.baeldung.com/cucumber-scenario-outline) +- [Cucumber Java 8 Support](http://www.baeldung.com/cucumber-java-8-support) +- [Introduction to Lambda Behave](http://www.baeldung.com/lambda-behave) +- [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) + diff --git a/testing-modules-2/pom.xml b/testing-modules/testing-libraries/pom.xml similarity index 95% rename from testing-modules-2/pom.xml rename to testing-modules/testing-libraries/pom.xml index c919dbe90a..ab028cee24 100644 --- a/testing-modules-2/pom.xml +++ b/testing-modules/testing-libraries/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - testing-modules-2 - testing-modules-2 + testing-libraries + testing-libraries pom diff --git a/testing-modules-2/src/main/java/com/baeldung/cucumber/Calculator.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/cucumber/Calculator.java similarity index 100% rename from testing-modules-2/src/main/java/com/baeldung/cucumber/Calculator.java rename to testing-modules/testing-libraries/src/main/java/com/baeldung/cucumber/Calculator.java diff --git a/testing-modules-2/src/main/java/com/baeldung/lambdabehave/Calculator.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/lambdabehave/Calculator.java similarity index 100% rename from testing-modules-2/src/main/java/com/baeldung/lambdabehave/Calculator.java rename to testing-modules/testing-libraries/src/main/java/com/baeldung/lambdabehave/Calculator.java diff --git a/testing-modules-2/src/main/java/com/baeldung/mutation/Palindrome.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/mutation/Palindrome.java similarity index 100% rename from testing-modules-2/src/main/java/com/baeldung/mutation/Palindrome.java rename to testing-modules/testing-libraries/src/main/java/com/baeldung/mutation/Palindrome.java diff --git a/testing-modules-2/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java similarity index 100% rename from testing-modules-2/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorIntegrationTest.java diff --git a/testing-modules-2/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java similarity index 100% rename from testing-modules-2/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/calculator/CalculatorRunSteps.java diff --git a/testing-modules-2/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java similarity index 100% rename from testing-modules-2/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/lambdabehave/CalculatorUnitTest.java diff --git a/testing-modules-2/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java similarity index 100% rename from testing-modules-2/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/mutation/PalindromeUnitTest.java diff --git a/testing-modules-2/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java similarity index 100% rename from testing-modules-2/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingIntegrationTest.java diff --git a/testing-modules-2/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java b/testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java similarity index 100% rename from testing-modules-2/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java rename to testing-modules/testing-libraries/src/test/java/com/baeldung/shopping/ShoppingStepsDef.java diff --git a/testing-modules-2/src/test/resources/features/calculator-scenario-outline.feature b/testing-modules/testing-libraries/src/test/resources/features/calculator-scenario-outline.feature similarity index 100% rename from testing-modules-2/src/test/resources/features/calculator-scenario-outline.feature rename to testing-modules/testing-libraries/src/test/resources/features/calculator-scenario-outline.feature diff --git a/testing-modules-2/src/test/resources/features/calculator.feature b/testing-modules/testing-libraries/src/test/resources/features/calculator.feature similarity index 100% rename from testing-modules-2/src/test/resources/features/calculator.feature rename to testing-modules/testing-libraries/src/test/resources/features/calculator.feature diff --git a/testing-modules-2/src/test/resources/features/shopping.feature b/testing-modules/testing-libraries/src/test/resources/features/shopping.feature similarity index 100% rename from testing-modules-2/src/test/resources/features/shopping.feature rename to testing-modules/testing-libraries/src/test/resources/features/shopping.feature From 25cff41d789b2cab7e630d0e79ab61e52e0e99a0 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 8 Sep 2019 15:32:07 +0300 Subject: [PATCH 148/396] move assertion-libraries module --- assertion-libraries/pom.xml | 81 --- .../main/java/com/baeldung/assertj/Dog.java | 19 - .../java/com/baeldung/assertj/Member.java | 19 - .../java/com/baeldung/assertj/Person.java | 19 - .../com/baeldung/assertj/custom/Person.java | 32 - .../main/java/com/baeldung/jspec/Animal.java | 41 -- .../main/java/com/baeldung/jspec/Cage.java | 48 -- .../src/main/java/com/baeldung/jspec/Cat.java | 14 - .../src/main/java/com/baeldung/jspec/Dog.java | 14 - .../java/com/baeldung/junit/Calculator.java | 11 - .../main/java/com/baeldung/truth/User.java | 57 -- .../java/com/baeldung/truth/UserSubject.java | 46 -- .../assertj/AssertJConditionUnitTest.java | 72 --- .../baeldung/assertj/AssertJCoreUnitTest.java | 117 ---- .../assertj/AssertJGuavaUnitTest.java | 96 --- .../assertj/AssertJJava8UnitTest.java | 108 ---- .../AssertJCustomAssertionsUnitTest.java | 44 -- .../baeldung/assertj/custom/Assertions.java | 9 - .../baeldung/assertj/custom/PersonAssert.java | 38 -- .../exceptions/Java7StyleAssertions.java | 24 - .../exceptions/Java8StyleAssertions.java | 66 --- .../jgotesting/JGoTestingUnitTest.java | 93 --- .../java/com/baeldung/jspec/CageUnitTest.java | 126 ---- .../com/baeldung/jspec/JSpecUnitTest.java | 57 -- .../com/baeldung/junit/AdditionUnitTest.java | 14 - .../baeldung/junit/AssertionsUnitTest.java | 101 ---- .../baeldung/junit/BlockingTestRunner.java | 18 - .../baeldung/junit/CalculatorUnitTest.java | 17 - .../baeldung/junit/SubstractionUnitTest.java | 14 - .../com/baeldung/junit/SuiteUnitTest.java | 12 - .../java/com/baeldung/junit/TestRunner.java | 41 -- .../baeldung/truth/GoogleTruthUnitTest.java | 561 ------------------ 32 files changed, 2029 deletions(-) delete mode 100644 assertion-libraries/pom.xml delete mode 100644 assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/assertj/Member.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/assertj/Person.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/junit/Calculator.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/truth/User.java delete mode 100644 assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java delete mode 100644 assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java diff --git a/assertion-libraries/pom.xml b/assertion-libraries/pom.xml deleted file mode 100644 index 274806d336..0000000000 --- a/assertion-libraries/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - 4.0.0 - com.baeldung - assertion-libraries - 0.1-SNAPSHOT - assertion-libraries - - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - - - - com.google.truth - truth - ${truth.version} - - - com.google.truth.extensions - truth-java8-extension - ${truth.version} - test - - - org.assertj - assertj-guava - ${assertj-guava.version} - - - org.assertj - assertj-core - ${assertj-core.version} - test - - - org.javalite - javalite-common - ${javalite.version} - - - org.jgotesting - jgotesting - ${jgotesting.version} - test - - - - - - - - org.assertj - assertj-assertions-generator-maven-plugin - ${assertj-generator.version} - - - com.baeldung.testing.assertj.custom.Person - - - - - - - - 0.32 - 3.1.0 - 3.9.0 - 2.1.0 - 1.4.13 - 0.12 - - - - - - - diff --git a/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java b/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java deleted file mode 100644 index 6c049e1a10..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/assertj/Dog.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.assertj; - -public class Dog { - private String name; - private Float weight; - - public Dog(String name, Float weight) { - this.name = name; - this.weight = weight; - } - - public String getName() { - return name; - } - - public Float getWeight() { - return weight; - } -} diff --git a/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java b/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java deleted file mode 100644 index baf3c2df52..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/assertj/Member.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.assertj; - -public class Member { - private String name; - private int age; - - public Member(String name, int age) { - this.name = name; - this.age = age; - } - - public String getName() { - return name; - } - - public int getAge() { - return age; - } -} diff --git a/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java b/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java deleted file mode 100644 index 09b16b4f5b..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/assertj/Person.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.assertj; - -public class Person { - private String name; - private Integer age; - - public Person(String name, Integer age) { - this.name = name; - this.age = age; - } - - public String getName() { - return name; - } - - public Integer getAge() { - return age; - } -} diff --git a/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java b/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java deleted file mode 100644 index 5506a56b51..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/assertj/custom/Person.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.assertj.custom; - -import java.util.ArrayList; -import java.util.List; - -public class Person { - private String fullName; - private int age; - private List nicknames; - - public Person(String fullName, int age) { - this.fullName = fullName; - this.age = age; - this.nicknames = new ArrayList<>(); - } - - public void addNickname(String nickname) { - nicknames.add(nickname); - } - - public String getFullName() { - return fullName; - } - - public int getAge() { - return age; - } - - public List getNicknames() { - return nicknames; - } -} diff --git a/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java b/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java deleted file mode 100644 index efb4c62bde..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/jspec/Animal.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.jspec; - -public abstract class Animal { - - protected String name; - - public Animal(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Animal other = (Animal) obj; - if (name == null) { - if (other.name != null) - return false; - } else if (!name.equals(other.name)) - return false; - return true; - } - - -} diff --git a/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java b/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java deleted file mode 100644 index 73ea343600..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/jspec/Cage.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.jspec; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -public class Cage { - - private Set animals = new HashSet<>(); - - public void put(Animal animal) { - animals.add(animal); - } - - public void put(Animal... animals) { - this.animals.addAll(Arrays.asList(animals)); - } - - public Animal release(Animal animal) { - return animals.remove(animal) ? animal : null; - } - - public void open() { - animals.clear(); - } - - public boolean hasAnimals() { - return animals.size() > 0; - } - - public boolean isEmpty() { - return animals.isEmpty(); - } - - public Set getAnimals() { - return this.animals; - } - - public int size() { - return animals.size(); - } - - @Override - public String toString() { - return "Cage [animals=" + animals + "]"; - } - -} diff --git a/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java b/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java deleted file mode 100644 index 5021a1481c..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/jspec/Cat.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.jspec; - -public class Cat extends Animal { - - public Cat(String name) { - super(name); - } - - @Override - public String toString() { - return "Cat [name=" + name + "]"; - } - -} diff --git a/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java b/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java deleted file mode 100644 index 43626941e3..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/jspec/Dog.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.jspec; - -public class Dog extends Animal { - - public Dog(String name) { - super(name); - } - - @Override - public String toString() { - return "Dog [name=" + name + "]"; - } - -} diff --git a/assertion-libraries/src/main/java/com/baeldung/junit/Calculator.java b/assertion-libraries/src/main/java/com/baeldung/junit/Calculator.java deleted file mode 100644 index 8ea7b3ed1f..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/junit/Calculator.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung.junit; - -public class Calculator { - public int add(int a, int b) { - return a + b; - } - - public int sub(int a, int b) { - return a - b; - } -} diff --git a/assertion-libraries/src/main/java/com/baeldung/truth/User.java b/assertion-libraries/src/main/java/com/baeldung/truth/User.java deleted file mode 100644 index 2b5ffde19f..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/truth/User.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.truth; - -import java.util.Arrays; -import java.util.List; -import java.util.Objects; - -public class User implements Comparable { - private String name = "John Doe"; - private List emails = Arrays.asList("contact@baeldung.com", "staff@baeldung.com"); - - public User() { - } - - public User(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getEmails() { - return emails; - } - - public void setEmails(List emails) { - this.emails = emails; - } - - @Override - public int hashCode() { - int hash = 5; - hash = 37 * hash + Objects.hashCode(this.name); - return hash; - } - - @Override - public boolean equals(Object obj) { - if (obj == null || getClass() != obj.getClass()) { - return false; - } - - final User other = (User) obj; - return Objects.equals(this.name, other.name); - } - - @Override - public int compareTo(User o) { - return this.getName() - .compareToIgnoreCase(o.getName()); - } - -} diff --git a/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java b/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java deleted file mode 100644 index b478043ad8..0000000000 --- a/assertion-libraries/src/main/java/com/baeldung/truth/UserSubject.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung.truth; - -import com.google.common.truth.ComparableSubject; -import com.google.common.truth.FailureStrategy; -import com.google.common.truth.IterableSubject; -import com.google.common.truth.SubjectFactory; -import com.google.common.truth.Truth; - -public class UserSubject extends ComparableSubject { - - private UserSubject(FailureStrategy failureStrategy, User target) { - super(failureStrategy, target); - } - - private static final SubjectFactory USER_SUBJECT_FACTORY = new SubjectFactory() { - @Override - public UserSubject getSubject(FailureStrategy failureStrategy, User target) { - return new UserSubject(failureStrategy, target); - } - }; - - public static UserSubject assertThat(User user) { - return Truth.assertAbout(USER_SUBJECT_FACTORY) - .that(user); - } - - // Our API begins here - public void hasName(String name) { - if (!actual().getName() - .equals(name)) { - fail("has name", name); - } - } - - public void hasNameIgnoringCase(String name) { - if (!actual().getName() - .equalsIgnoreCase(name)) { - fail("has name ignoring case", name); - } - } - - public IterableSubject emails() { - return Truth.assertThat(actual().getEmails()); - } - -} \ No newline at end of file diff --git a/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java deleted file mode 100644 index ec2d93500f..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJConditionUnitTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.baeldung.assertj; - -import static org.assertj.core.api.Assertions.allOf; -import static org.assertj.core.api.Assertions.anyOf; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.not; -import static org.junit.Assert.fail; - -import java.util.ArrayList; -import java.util.List; - -import org.assertj.core.api.Condition; -import org.junit.Test; - -public class AssertJConditionUnitTest { - private Condition senior = new Condition<>(m -> m.getAge() >= 60, "senior"); - private Condition nameJohn = new Condition<>(m -> m.getName().equalsIgnoreCase("John"), "name John"); - - @Test - public void whenUsingMemberAgeCondition_thenCorrect() { - Member member = new Member("John", 65); - assertThat(member).is(senior); - - try { - assertThat(member).isNot(senior); - fail(); - } catch (AssertionError e) { - assertThat(e).hasMessageContaining("not to be "); - } - } - - @Test - public void whenUsingMemberNameCondition_thenCorrect() { - Member member = new Member("Jane", 60); - assertThat(member).doesNotHave(nameJohn); - - try { - assertThat(member).has(nameJohn); - fail(); - } catch (AssertionError e) { - assertThat(e).hasMessageContaining(""); - } - } - - @Test - public void whenCollectionConditionsAreSatisfied_thenCorrect() { - List members = new ArrayList<>(); - members.add(new Member("Alice", 50)); - members.add(new Member("Bob", 60)); - - assertThat(members).haveExactly(1, senior); - assertThat(members).doNotHave(nameJohn); - } - - @Test - public void whenCombiningAllOfConditions_thenCorrect() { - Member john = new Member("John", 60); - Member jane = new Member("Jane", 50); - - assertThat(john).is(allOf(senior, nameJohn)); - assertThat(jane).is(allOf(not(nameJohn), not(senior))); - } - - @Test - public void whenCombiningAnyOfConditions_thenCorrect() { - Member john = new Member("John", 50); - Member jane = new Member("Jane", 60); - - assertThat(john).is(anyOf(senior, nameJohn)); - assertThat(jane).is(anyOf(nameJohn, senior)); - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java deleted file mode 100644 index 73b9b373a1..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJCoreUnitTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.baeldung.assertj; - -import org.assertj.core.util.Maps; -import org.junit.Ignore; -import org.junit.Test; - -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.InputStream; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; - -import static org.assertj.core.api.Assertions.*; - -public class AssertJCoreUnitTest { - - @Test - public void whenComparingReferences_thenNotEqual() throws Exception { - Dog fido = new Dog("Fido", 5.15f); - Dog fidosClone = new Dog("Fido", 5.15f); - - assertThat(fido).isNotEqualTo(fidosClone); - } - - @Test - public void whenComparingFields_thenEqual() throws Exception { - Dog fido = new Dog("Fido", 5.15f); - Dog fidosClone = new Dog("Fido", 5.15f); - - assertThat(fido).isEqualToComparingFieldByFieldRecursively(fidosClone); - } - - @Test - public void whenCheckingForElement_thenContains() throws Exception { - List list = Arrays.asList("1", "2", "3"); - - assertThat(list).contains("1"); - } - - @Test - public void whenCheckingForElement_thenMultipleAssertions() throws Exception { - List list = Arrays.asList("1", "2", "3"); - - assertThat(list).isNotEmpty(); - assertThat(list).startsWith("1"); - assertThat(list).doesNotContainNull(); - - assertThat(list).isNotEmpty().contains("1").startsWith("1").doesNotContainNull().containsSequence("2", "3"); - } - - @Test - public void whenCheckingRunnable_thenIsInterface() throws Exception { - assertThat(Runnable.class).isInterface(); - } - - @Test - public void whenCheckingCharacter_thenIsUnicode() throws Exception { - char someCharacter = 'c'; - - assertThat(someCharacter).isNotEqualTo('a').inUnicode().isGreaterThanOrEqualTo('b').isLowerCase(); - } - - @Test - public void whenAssigningNSEExToException_thenIsAssignable() throws Exception { - assertThat(Exception.class).isAssignableFrom(NoSuchElementException.class); - } - - @Test - public void whenComparingWithOffset_thenEquals() throws Exception { - assertThat(5.1).isEqualTo(5, withPrecision(1d)); - } - - @Test - public void whenCheckingString_then() throws Exception { - assertThat("".isEmpty()).isTrue(); - } - - @Test - public void whenCheckingFile_then() throws Exception { - final File someFile = File.createTempFile("aaa", "bbb"); - someFile.deleteOnExit(); - - assertThat(someFile).exists().isFile().canRead().canWrite(); - } - - @Test - public void whenCheckingIS_then() throws Exception { - InputStream given = new ByteArrayInputStream("foo".getBytes()); - InputStream expected = new ByteArrayInputStream("foo".getBytes()); - - assertThat(given).hasSameContentAs(expected); - } - - @Test - public void whenGivenMap_then() throws Exception { - Map map = Maps.newHashMap(2, "a"); - - assertThat(map).isNotEmpty().containsKey(2).doesNotContainKeys(10).contains(entry(2, "a")); - } - - @Test - public void whenGivenException_then() throws Exception { - Exception ex = new Exception("abc"); - - assertThat(ex).hasNoCause().hasMessageEndingWith("c"); - } - - @Ignore // IN ORDER TO TEST, REMOVE THIS LINE - @Test - public void whenRunningAssertion_thenDescribed() throws Exception { - Person person = new Person("Alex", 34); - - assertThat(person.getAge()).as("%s's age should be equal to 100").isEqualTo(100); - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java deleted file mode 100644 index 6a552aee78..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJGuavaUnitTest.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.baeldung.assertj; - -import com.google.common.base.Optional; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.Multimap; -import com.google.common.collect.Multimaps; -import com.google.common.collect.Range; -import com.google.common.collect.Table; -import com.google.common.collect.TreeRangeMap; -import com.google.common.io.Files; -import org.assertj.guava.data.MapEntry; -import org.junit.Test; - -import java.io.File; -import java.util.HashMap; -import java.util.HashSet; - -import static org.assertj.guava.api.Assertions.assertThat; -import static org.assertj.guava.api.Assertions.entry; - -public class AssertJGuavaUnitTest { - - @Test - public void givenTwoEmptyFiles_whenComparingContent_thenEqual() throws Exception { - final File temp1 = File.createTempFile("bael", "dung1"); - final File temp2 = File.createTempFile("bael", "dung2"); - - assertThat(Files.asByteSource(temp1)).hasSize(0).hasSameContentAs(Files.asByteSource(temp2)); - } - - @Test - public void givenMultimap_whenVerifying_thenCorrect() throws Exception { - final Multimap mmap = ArrayListMultimap.create(); - mmap.put(1, "one"); - mmap.put(1, "1"); - - assertThat(mmap).hasSize(2).containsKeys(1).contains(entry(1, "one")).contains(entry(1, "1")); - } - - @Test - public void givenMultimaps_whenVerifyingContent_thenCorrect() throws Exception { - final Multimap mmap1 = ArrayListMultimap.create(); - mmap1.put(1, "one"); - mmap1.put(1, "1"); - mmap1.put(2, "two"); - mmap1.put(2, "2"); - - final Multimap mmap1_clone = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new); - mmap1_clone.put(1, "one"); - mmap1_clone.put(1, "1"); - mmap1_clone.put(2, "two"); - mmap1_clone.put(2, "2"); - - final Multimap mmap2 = Multimaps.newSetMultimap(new HashMap<>(), HashSet::new); - mmap2.put(1, "one"); - mmap2.put(1, "1"); - - assertThat(mmap1).containsAllEntriesOf(mmap2).containsAllEntriesOf(mmap1_clone).hasSameEntriesAs(mmap1_clone); - } - - @Test - public void givenOptional_whenVerifyingContent_thenShouldBeEqual() throws Exception { - final Optional something = Optional.of("something"); - - assertThat(something).isPresent().extractingValue().isEqualTo("something"); - } - - @Test - public void givenRange_whenVerifying_thenShouldBeCorrect() throws Exception { - final Range range = Range.openClosed("a", "g"); - - assertThat(range).hasOpenedLowerBound().isNotEmpty().hasClosedUpperBound().contains("b"); - } - - @Test - public void givenRangeMap_whenVerifying_thenShouldBeCorrect() throws Exception { - final TreeRangeMap map = TreeRangeMap.create(); - - map.put(Range.closed(0, 60), "F"); - map.put(Range.closed(61, 70), "D"); - - assertThat(map).isNotEmpty().containsKeys(0).contains(MapEntry.entry(34, "F")); - } - - @Test - public void givenTable_whenVerifying_thenShouldBeCorrect() throws Exception { - final Table table = HashBasedTable.create(2, 2); - - table.put(1, "A", "PRESENT"); - table.put(1, "B", "ABSENT"); - - assertThat(table).hasRowCount(1).containsValues("ABSENT").containsCell(1, "B", "ABSENT"); - } - -} diff --git a/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java deleted file mode 100644 index a2f58d677d..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/assertj/AssertJJava8UnitTest.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.baeldung.assertj; - -import org.junit.Test; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.Arrays; -import java.util.List; -import java.util.Optional; -import java.util.function.Predicate; - -import static java.time.LocalDate.ofYearDay; -import static java.util.Arrays.asList; -import static org.assertj.core.api.Assertions.assertThat; - -public class AssertJJava8UnitTest { - - @Test - public void givenOptional_shouldAssert() throws Exception { - final Optional givenOptional = Optional.of("something"); - - assertThat(givenOptional).isPresent().hasValue("something"); - } - - @Test - public void givenPredicate_shouldAssert() throws Exception { - final Predicate predicate = s -> s.length() > 4; - - assertThat(predicate).accepts("aaaaa", "bbbbb").rejects("a", "b").acceptsAll(asList("aaaaa", "bbbbb")).rejectsAll(asList("a", "b")); - } - - @Test - public void givenLocalDate_shouldAssert() throws Exception { - final LocalDate givenLocalDate = LocalDate.of(2016, 7, 8); - final LocalDate todayDate = LocalDate.now(); - - assertThat(givenLocalDate).isBefore(LocalDate.of(2020, 7, 8)).isAfterOrEqualTo(LocalDate.of(1989, 7, 8)); - - assertThat(todayDate).isAfter(LocalDate.of(1989, 7, 8)).isToday(); - } - - @Test - public void givenLocalDateTime_shouldAssert() throws Exception { - final LocalDateTime givenLocalDate = LocalDateTime.of(2016, 7, 8, 12, 0); - - assertThat(givenLocalDate).isBefore(LocalDateTime.of(2020, 7, 8, 11, 2)); - } - - @Test - public void givenLocalTime_shouldAssert() throws Exception { - final LocalTime givenLocalTime = LocalTime.of(12, 15); - - assertThat(givenLocalTime).isAfter(LocalTime.of(1, 0)).hasSameHourAs(LocalTime.of(12, 0)); - } - - @Test - public void givenList_shouldAssertFlatExtracting() throws Exception { - final List givenList = asList(ofYearDay(2016, 5), ofYearDay(2015, 6)); - - assertThat(givenList).flatExtracting(LocalDate::getYear).contains(2015); - } - - @Test - public void givenList_shouldAssertFlatExtractingLeapYear() throws Exception { - final List givenList = asList(ofYearDay(2016, 5), ofYearDay(2015, 6)); - - assertThat(givenList).flatExtracting(LocalDate::isLeapYear).contains(true); - } - - @Test - public void givenList_shouldAssertFlatExtractingClass() throws Exception { - final List givenList = asList(ofYearDay(2016, 5), ofYearDay(2015, 6)); - - assertThat(givenList).flatExtracting(Object::getClass).contains(LocalDate.class); - } - - @Test - public void givenList_shouldAssertMultipleFlatExtracting() throws Exception { - final List givenList = asList(ofYearDay(2016, 5), ofYearDay(2015, 6)); - - assertThat(givenList).flatExtracting(LocalDate::getYear, LocalDate::getDayOfMonth).contains(2015, 6); - } - - @Test - public void givenString_shouldSatisfy() throws Exception { - final String givenString = "someString"; - - assertThat(givenString).satisfies(s -> { - assertThat(s).isNotEmpty(); - assertThat(s).hasSize(10); - }); - } - - @Test - public void givenString_shouldMatch() throws Exception { - final String emptyString = ""; - - assertThat(emptyString).matches(String::isEmpty); - } - - @Test - public void givenList_shouldHasOnlyOneElementSatisfying() throws Exception { - final List givenList = Arrays.asList(""); - - assertThat(givenList).hasOnlyOneElementSatisfying(s -> assertThat(s).isEmpty()); - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java deleted file mode 100644 index 98f50568a8..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/assertj/custom/AssertJCustomAssertionsUnitTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.assertj.custom; - -import static com.baeldung.assertj.custom.Assertions.assertThat; -import static org.junit.Assert.fail; - -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.ExpectedException; - -public class AssertJCustomAssertionsUnitTest { - @Rule - public ExpectedException thrown = ExpectedException.none(); - - @Test - public void whenPersonNameMatches_thenCorrect() { - Person person = new Person("John Doe", 20); - assertThat(person).hasFullName("John Doe"); - } - - @Test - public void whenPersonAgeLessThanEighteen_thenNotAdult() { - Person person = new Person("Jane Roe", 16); - - try { - assertThat(person).isAdult(); - fail(); - } catch (AssertionError e) { - org.assertj.core.api.Assertions.assertThat(e).hasMessage("Expected person to be adult"); - } - } - - @Test - public void whenPersonDoesNotHaveAMatchingNickname_thenIncorrect() { - Person person = new Person("John Doe", 20); - person.addNickname("Nick"); - - try { - assertThat(person).hasNickname("John"); - fail(); - } catch (AssertionError e) { - org.assertj.core.api.Assertions.assertThat(e).hasMessage("Expected person to have nickname John"); - } - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java b/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java deleted file mode 100644 index 3e1021851e..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/assertj/custom/Assertions.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.assertj.custom; - -public class Assertions { - public static PersonAssert assertThat(Person actual) { - return new PersonAssert(actual); - } - - // static factory methods of other assertion classes -} diff --git a/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java b/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java deleted file mode 100644 index 5be093644a..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/assertj/custom/PersonAssert.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.assertj.custom; - -import org.assertj.core.api.AbstractAssert; - -public class PersonAssert extends AbstractAssert { - - public PersonAssert(Person actual) { - super(actual, PersonAssert.class); - } - - public static PersonAssert assertThat(Person actual) { - return new PersonAssert(actual); - } - - public PersonAssert hasFullName(String fullName) { - isNotNull(); - if (!actual.getFullName().equals(fullName)) { - failWithMessage("Expected person to have full name %s but was %s", fullName, actual.getFullName()); - } - return this; - } - - public PersonAssert isAdult() { - isNotNull(); - if (actual.getAge() < 18) { - failWithMessage("Expected person to be adult"); - } - return this; - } - - public PersonAssert hasNickname(String nickName) { - isNotNull(); - if (!actual.getNicknames().contains(nickName)) { - failWithMessage("Expected person to have nickname %s", nickName); - } - return this; - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java b/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java deleted file mode 100644 index ab93f8eac7..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java7StyleAssertions.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.assertj.exceptions; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.fail; -import static org.assertj.core.api.Assertions.failBecauseExceptionWasNotThrown; - -import org.junit.Test; - -public class Java7StyleAssertions { - - @Test - public void whenDividingByZero_thenArithmeticException() { - try { - int numerator = 10; - int denominator = 0; - int quotient = numerator / denominator; - fail("ArithmeticException expected because dividing by zero yields an ArithmeticException."); - failBecauseExceptionWasNotThrown(ArithmeticException.class); - } catch (Exception e) { - assertThat(e).hasMessage("/ by zero"); - assertThat(e).isInstanceOf(ArithmeticException.class); - } - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java b/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java deleted file mode 100644 index 4d4e2aedfc..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/assertj/exceptions/Java8StyleAssertions.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.baeldung.assertj.exceptions; - -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatExceptionOfType; -import static org.assertj.core.api.Assertions.catchThrowable; - -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import org.junit.Test; - -public class Java8StyleAssertions { - - @Test - public void whenGettingOutOfBoundsItem_thenIndexOutOfBoundsException() { - assertThatThrownBy(() -> { - ArrayList myStringList = new ArrayList(Arrays.asList("Strine one", "String two")); - myStringList.get(2); - }).isInstanceOf(IndexOutOfBoundsException.class) - .hasMessageStartingWith("Index: 2") - .hasMessageContaining("2") - .hasMessageEndingWith("Size: 2") - .hasMessageContaining("Index: 2, Size: 2") - .hasMessage("Index: %s, Size: %s", 2, 2) - .hasMessageMatching("Index: \\d+, Size: \\d+") - .hasNoCause(); - } - - @Test - public void whenWrappingException_thenCauseInstanceOfWrappedExceptionType() { - assertThatThrownBy(() -> { - try { - throw new IOException(); - } catch (IOException e) { - throw new RuntimeException(e); - } - }).isInstanceOf(RuntimeException.class) - .hasCauseInstanceOf(IOException.class) - .hasStackTraceContaining("IOException"); - } - - @Test - public void whenDividingByZero_thenArithmeticException() { - assertThatExceptionOfType(ArithmeticException.class).isThrownBy(() -> { - int numerator = 10; - int denominator = 0; - int quotient = numerator / denominator; - }) - .withMessageContaining("/ by zero"); - - // Alternatively: - - // when - Throwable thrown = catchThrowable(() -> { - int numerator = 10; - int denominator = 0; - int quotient = numerator / denominator; - }); - - // then - assertThat(thrown).isInstanceOf(ArithmeticException.class) - .hasMessageContaining("/ by zero"); - - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java deleted file mode 100644 index 650fb3e5c5..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/jgotesting/JGoTestingUnitTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.baeldung.testing.jgotesting; - -import java.io.File; -import static org.hamcrest.Matchers.equalToIgnoringCase; -import static org.hamcrest.Matchers.is; -import org.jgotesting.rule.JGoTestRule; -import static org.jgotesting.Assert.*; // same methods as org.junit.Assert.* -import static org.jgotesting.Check.*; // ditto, with different names -import static org.jgotesting.Testing.*; -import org.jgotesting.Checker; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; - -public class JGoTestingUnitTest { - @Rule - public final JGoTestRule test = new JGoTestRule(); - - @Test - public void whenComparingIntegers_thenEqual() { - int anInt = 10; - - assertEquals(anInt, 10); - checkEquals(anInt, 10); - } - - @Ignore - @Test - public void whenComparingNumbers_thenLoggedMessage() { - log("There was something wrong when comparing numbers"); - - int anInt = 10; - int anotherInt = 10; - - checkEquals(anInt, 10); - checkTrue("First number should be bigger", 10 > anotherInt); - checkSame(anInt, anotherInt); - } - - @Ignore - @Test - public void whenComparingNumbers_thenFormattedMessage() { - int anInt = 10; - int anotherInt = 10; - - logf("There was something wrong when comparing numbers %d and %d", anInt, anotherInt); - - checkEquals(anInt, 10); - checkTrue("First number should be bigger", 10 > anotherInt); - checkSame(anInt, anotherInt); - } - - @Test - public void whenComparingStrings_thenMultipleAssertions() { - String aString = "This is a string"; - String anotherString = "This Is A String"; - - test.check(aString, equalToIgnoringCase(anotherString)) - .check(aString.length() == 16) - .check(aString.startsWith("This")); - } - - @Ignore - @Test - public void whenComparingStrings_thenMultipleFailingAssertions() { - String aString = "the test string"; - String anotherString = "The Test String"; - - checkEquals("Strings are not equal!", aString, anotherString); - checkTrue("String is longer than one character", aString.length() == 1); - checkSame("Strings are not the same", aString, anotherString); - } - - @Ignore - @Test - public void givenFile_whenDoesnotExists_thenTerminated() throws Exception { - File aFile = new File("a_dummy_file.txt"); - terminateIf(aFile.exists(), is(false)); - - // This doesn't get executed - checkEquals(aFile.getName(), "a_dummy_file.txt"); - } - - @Test - public void givenChecker_whenComparingStrings_thenEqual() throws Exception { - Checker aChecker = s -> s.matches("\\d+"); - - String aString = "1235"; - test.check(aString, aChecker); - } - -} - diff --git a/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java deleted file mode 100644 index 33ef986588..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/jspec/CageUnitTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.baeldung.jspec; - -import static org.javalite.test.jspec.JSpec.$; -import static org.javalite.test.jspec.JSpec.expect; -import static org.javalite.test.jspec.JSpec.the; - -import java.util.Set; - -import org.javalite.test.jspec.DifferenceExpectation; -import org.junit.Test; - -public class CageUnitTest { - - Cat tomCat = new Cat("Tom"); - Cat felixCat = new Cat("Felix"); - Dog boltDog = new Dog("Bolt"); - Cage cage = new Cage(); - - - @Test - public void puttingAnimals_shouldIncreaseCageSize() { - // When - cage.put(tomCat, boltDog); - - // Then - the(cage.size()).shouldEqual(2); - } - - @Test - public void releasingAnimals_shouldDecreaseCageSize() { - // When - cage.put(tomCat, boltDog); - cage.release(tomCat); - - // Then - the(cage.size()).shouldEqual(1); - } - - @Test - public void puttingAnimals_shouldLeaveThemInsideTheCage() { - // When - cage.put(tomCat, boltDog); - - // Then - the(cage).shouldHave("animals"); - } - - @Test - public void openingTheCage_shouldReleaseAllAnimals() { - // When - cage.put(tomCat, boltDog); - - // Then - the(cage).shouldNotBe("empty"); - - // When - cage.open(); - - // Then - the(cage).shouldBe("empty"); - the(cage.isEmpty()).shouldBeTrue(); - } - - @Test - public void comparingTwoDogs() { - // When - Dog firstDog = new Dog("Rex"); - Dog secondDog = new Dog("Rex"); - - // Then - $(firstDog).shouldEqual(secondDog); - $(firstDog).shouldNotBeTheSameAs(secondDog); - } - - @Test - public void puttingCatsOnly_shouldLetCageAnimalsToContainCats() { - // When - cage.put(tomCat, felixCat); - - // Then - Set animals = cage.getAnimals(); - the(animals).shouldContain(tomCat); - the(animals).shouldContain(felixCat); - the(animals).shouldNotContain(boltDog); - } - - @Test - public void puttingCatsOnly_shouldLetCageToContainCats() { - // When - cage.put(tomCat, felixCat); - - // Then - // Check with toString of the tested objects - the(cage).shouldContain(tomCat); - the(cage).shouldContain(felixCat); - the(cage).shouldNotContain(boltDog); - } - - @Test - public void puttingMoreAnimals_shouldChangeSize() { - // When - cage.put(tomCat, boltDog); - - // Then - expect( new DifferenceExpectation(cage.size()) { - - @Override - public Integer exec() { - cage.release(tomCat); - return cage.size(); - } - } ); - } - - - @Test - public void releasingTheDog_shouldReleaseAnAnimalOfDogType() { - // When - cage.put(boltDog); - Animal releasedAnimal = cage.release(boltDog); - - // Then - the(releasedAnimal).shouldNotBeNull(); - the(releasedAnimal).shouldBeA(Dog.class); - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java deleted file mode 100644 index 0e35e26728..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/jspec/JSpecUnitTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.baeldung.jspec; - -import static org.javalite.test.jspec.JSpec.$; -import static org.javalite.test.jspec.JSpec.a; -import static org.javalite.test.jspec.JSpec.expect; -import static org.javalite.test.jspec.JSpec.it; -import static org.javalite.test.jspec.JSpec.the; - -import java.util.Arrays; -import java.util.List; - -import org.javalite.test.jspec.ExceptionExpectation; -import org.junit.Test; - -public class JSpecUnitTest { - - @Test - public void onePlusTwo_shouldEqualThree() { - $(1 + 2).shouldEqual(3); - a(1 + 2).shouldEqual(3); - the(1 + 2).shouldEqual(3); - it(1 + 2).shouldEqual(3); - } - - @Test - public void messageShouldContainJSpec() { - String message = "Welcome to JSpec demo"; - // The message should not be empty - the(message).shouldNotBe("empty"); - // The message should contain JSpec - the(message).shouldContain("JSpec"); - } - - public void colorsListShouldContainRed() { - List colorsList = Arrays.asList("red", "green", "blue"); - $(colorsList).shouldContain("red"); - } - - public void guessedNumberShouldEqualHiddenNumber() { - Integer guessedNumber = 11; - Integer hiddenNumber = 11; - - $(guessedNumber).shouldEqual(hiddenNumber); - $(guessedNumber).shouldNotBeTheSameAs(hiddenNumber); - } - - @Test - public void dividingByThero_shouldThrowArithmeticException() { - expect(new ExceptionExpectation(ArithmeticException.class) { - @Override - public void exec() throws ArithmeticException { - System.out.println(1 / 0); - } - } ); - } - -} diff --git a/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java deleted file mode 100644 index ae6fa355fa..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class AdditionUnitTest { - Calculator calculator = new Calculator(); - - @Test - public void testAddition() { - assertEquals("addition", 8, calculator.add(5, 3)); - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java deleted file mode 100644 index b0209b01aa..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; - -import java.util.Arrays; - -import static org.hamcrest.core.IsCollectionContaining.hasItems; -import static org.junit.Assert.*; - -/** - * Unit test that demonstrate the different assertions available within JUnit 4 - */ -public class AssertionsUnitTest { - - @Test - public void whenAssertingEquality_thenEqual() { - String expected = "Baeldung"; - String actual = "Baeldung"; - - assertEquals(expected, actual); - } - - @Test - public void whenAssertingEqualityWithMessage_thenEqual() { - String expected = "Baeldung"; - String actual = "Baeldung"; - - assertEquals("failure - strings are not equal", expected, actual); - } - - @Test - public void whenAssertingArraysEquality_thenEqual() { - char[] expected = { 'J', 'u', 'n', 'i', 't' }; - char[] actual = "Junit".toCharArray(); - - assertArrayEquals(expected, actual); - } - - @Test - public void givenNullArrays_whenAssertingArraysEquality_thenEqual() { - int[] expected = null; - int[] actual = null; - - assertArrayEquals(expected, actual); - } - - @Test - public void whenAssertingNull_thenTrue() { - Object car = null; - - assertNull("The car should be null", car); - } - - @Test - public void whenAssertingNotNull_thenTrue() { - Object car = new Object(); - - assertNotNull("The car should not be null", car); - } - - @Test - public void whenAssertingNotSameObject_thenDifferent() { - Object cat = new Object(); - Object dog = new Object(); - - assertNotSame(cat, dog); - } - - @Test - public void whenAssertingSameObject_thenSame() { - Object cat = new Object(); - - assertSame(cat, cat); - } - - @Test - public void whenAssertingConditions_thenVerified() { - assertTrue("5 is greater then 4", 5 > 4); - assertFalse("5 is not greater then 6", 5 > 6); - } - - @Test - public void when_thenNotFailed() { - try { - methodThatShouldThrowException(); - fail("Exception not thrown"); - } catch (UnsupportedOperationException e) { - assertEquals("Operation Not Supported", e.getMessage()); - } - } - - private void methodThatShouldThrowException() { - throw new UnsupportedOperationException("Operation Not Supported"); - } - - @Test - public void testAssertThatHasItems() { - assertThat(Arrays.asList("Java", "Kotlin", "Scala"), hasItems("Java", "Kotlin")); - } - -} diff --git a/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java b/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java deleted file mode 100644 index 432d5cda83..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.junit; - -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.InitializationError; -import org.junit.runners.model.Statement; - -public class BlockingTestRunner extends BlockJUnit4ClassRunner { - public BlockingTestRunner(Class klass) throws InitializationError { - super(klass); - } - - @Override - protected Statement methodInvoker(FrameworkMethod method, Object test) { - System.out.println("invoking: " + method.getName()); - return super.methodInvoker(method, test); - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java deleted file mode 100644 index d5ca847106..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import static org.junit.Assert.assertEquals; - -@RunWith(JUnit4.class) -public class CalculatorUnitTest { - Calculator calculator = new Calculator(); - - @Test - public void testAddition() { - assertEquals("addition", 8, calculator.add(5, 3)); - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java deleted file mode 100644 index fd98395ebc..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class SubstractionUnitTest { - Calculator calculator = new Calculator(); - - @Test - public void substraction() { - assertEquals("substraction", 2, calculator.sub(5, 3)); - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java deleted file mode 100644 index 76d19f84b2..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.junit; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ - AdditionUnitTest.class, - SubstractionUnitTest.class}) -public class SuiteUnitTest { -} diff --git a/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java b/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java deleted file mode 100644 index 9eb4b3141b..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; -import org.junit.runner.Description; -import org.junit.runner.Runner; -import org.junit.runner.notification.RunNotifier; - -import java.lang.reflect.Method; - -public class TestRunner extends Runner { - - private Class testClass; - public TestRunner(Class testClass) { - super(); - this.testClass = testClass; - } - - @Override - public Description getDescription() { - return Description.createTestDescription(testClass, "My runner description"); - } - - @Override - public void run(RunNotifier notifier) { - System.out.println("running the tests from MyRunner: " + testClass); - try { - Object testObject = testClass.newInstance(); - for (Method method : testClass.getMethods()) { - if (method.isAnnotationPresent(Test.class)) { - notifier.fireTestStarted(Description - .createTestDescription(testClass, method.getName())); - method.invoke(testObject); - notifier.fireTestFinished(Description - .createTestDescription(testClass, method.getName())); - } - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java b/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java deleted file mode 100644 index b7919a29ca..0000000000 --- a/assertion-libraries/src/test/java/com/baeldung/truth/GoogleTruthUnitTest.java +++ /dev/null @@ -1,561 +0,0 @@ -package com.baeldung.truth; - -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.Range; -import com.google.common.collect.Table; -import com.google.common.collect.TreeBasedTable; -import com.google.common.collect.TreeMultiset; -import static com.baeldung.truth.UserSubject.*; -import static com.google.common.truth.Truth.*; -import static com.google.common.truth.Truth8.*; -import java.math.BigDecimal; -import java.util.Arrays; -import java.util.Comparator; -import java.util.HashMap; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; -import java.util.regex.Pattern; -import java.util.stream.IntStream; -import java.util.stream.Stream; -import org.junit.Ignore; -import org.junit.Test; - -public class GoogleTruthUnitTest { - - @Test - public void whenComparingInteger_thenEqual() { - int anInt = 10; - - assertThat(anInt).isEqualTo(10); - } - - @Test - public void whenComparingFloat_thenIsBigger() { - float aFloat = 10.0f; - - assertThat(aFloat).isGreaterThan(1.0f); - } - - @Test - public void whenComparingDouble_thenIsSmaller() { - double aDouble = 10.0f; - - assertThat(aDouble).isLessThan(20.0); - } - - @Test - public void whenComparingFloat_thenWithinPrecision() { - float aFloat = 23.04f; - - assertThat(aFloat).isWithin(1.3f) - .of(23.3f); - } - - @Test - public void whenComparingFloat_thenNotWithinPrecision() { - float aFloat = 23.04f; - - assertThat(aFloat).isNotWithin(1.3f) - .of(100f); - } - - @Test - public void whenComparingDouble_thenWithinPrecision() { - double aDouble = 22.18; - - assertThat(aDouble).isWithin(2) - .of(23d); - } - - @Test - public void whenComparingDouble_thenNotWithinPrecision() { - double aDouble = 22.08; - - assertThat(aDouble).isNotWithin(2) - .of(100); - } - - @Test - public void whenComparingBigDecimal_thenEqualIgnoringScale() { - BigDecimal aBigDecimal = BigDecimal.valueOf(1000, 3); - - assertThat(aBigDecimal).isEqualToIgnoringScale(new BigDecimal(1.0)); - } - - @Test - public void whenCheckingBoolean_thenTrue() { - boolean aBoolean = true; - - assertThat(aBoolean).isTrue(); - } - - @Test - public void whenCheckingBoolean_thenFalse() { - boolean aBoolean = false; - - assertThat(aBoolean).isFalse(); - } - - @Test - public void whenComparingArrays_thenEqual() { - String[] firstArrayOfStrings = { "one", "two", "three" }; - String[] secondArrayOfStrings = { "one", "two", "three" }; - - assertThat(firstArrayOfStrings).isEqualTo(secondArrayOfStrings); - } - - @Test - public void whenComparingArrays_thenNotEqual() { - String[] firstArrayOfStrings = { "one", "two", "three" }; - String[] secondArrayOfStrings = { "three", "two", "one" }; - - assertThat(firstArrayOfStrings).isNotEqualTo(secondArrayOfStrings); - } - - @Test - public void whenCheckingArray_thenEmpty() { - Object[] anArray = {}; - - assertThat(anArray).isEmpty(); - } - - @Test - public void whenCheckingArray_thenNotEmpty() { - String[] arrayOfStrings = { "One String " }; - - assertThat(arrayOfStrings).isNotEmpty(); - } - - @Test - public void whenCheckingArrayOfDoubles_thenWithinPrecision() { - double[] arrayOfDoubles = { 1, 2, 3, 4, 5 }; - - assertThat(arrayOfDoubles).hasValuesWithin(5) - .of(6, 7, 8, 9, 10); - } - - @Test - public void whenComparingUsers_thenEqual() { - User aUser = new User("John Doe"); - User anotherUser = new User("John Doe"); - - assertThat(aUser).isEqualTo(anotherUser); - } - - @Test - public void whenComparingUser_thenIsNull() { - User aUser = null; - - assertThat(aUser).isNull(); - } - - @Test - public void whenComparingUser_thenNotNull() { - User aUser = new User(); - - assertThat(aUser).isNotNull(); - } - - @Test - public void whenComparingUser_thenInstanceOf() { - User aUser = new User(); - - assertThat(aUser).isInstanceOf(User.class); - } - - @Test - public void whenComparingUser_thenInList() { - User aUser = new User(); - - assertThat(aUser).isIn(Arrays.asList(1, 3, aUser, null)); - } - - @Test - public void whenComparingUser_thenNotInList() { - User aUser = new User(); - - assertThat(aUser).isNotIn(Arrays.asList(1, 3, "Three")); - } - - @Test - public void whenComparingNullUser_thenInList() { - User aUser = null; - User anotherUser = new User(); - - assertThat(aUser).isIn(Arrays.asList(1, 3, anotherUser, null)); - } - - @Test - public void whenCheckingString_thenStartsWithString() { - String aString = "This is a string"; - - assertThat(aString).startsWith("This"); - } - - @Test - public void whenCheckingString_thenContainsString() { - String aString = "This is a string"; - - assertThat(aString).contains("is a"); - } - - @Test - public void whenCheckingString_thenEndsWithString() { - String aString = "This is a string"; - - assertThat(aString).endsWith("string"); - } - - @Test - public void whenCheckingString_thenExpectedLength() { - String aString = "This is a string"; - - assertThat(aString).hasLength(16); - } - - @Test - public void whenCheckingString_thenEmpty() { - String aString = ""; - - assertThat(aString).isEmpty(); - } - - @Test - public void whenCheckingString_thenMatches() { - String aString = "The string to match"; - - assertThat(aString).matches(Pattern.compile("[a-zA-Z\\s]+")); - } - - @Test - public void whenCheckingComparable_thenAtLeast() { - Comparable aComparable = 5; - - assertThat(aComparable).isAtLeast(1); - } - - @Test - public void whenCheckingComparable_thenAtMost() { - Comparable aComparable = 5; - - assertThat(aComparable).isAtMost(10); - } - - @Test - public void whenCheckingComparable_thenInList() { - Comparable aComparable = 5; - - assertThat(aComparable).isIn(Arrays.asList(4, 5, 6)); - } - - @Test - public void whenCheckingComparable_thenInRange() { - Comparable aComparable = 5; - - assertThat(aComparable).isIn(Range.closed(1, 10)); - } - - @Test - public void whenCheckingComparable_thenNotInRange() { - Comparable aComparable = 5; - - assertThat(aComparable).isNotIn(Range.closed(10, 15)); - } - - @Test - public void whenComparingUsers_thenEquivalent() { - User aUser = new User(); - aUser.setName("John Doe"); - - User anotherUser = new User(); - anotherUser.setName("john doe"); - - assertThat(aUser).isEquivalentAccordingToCompareTo(anotherUser); - } - - @Test - public void whenCheckingIterable_thenContains() { - List aList = Arrays.asList(4, 5, 6); - - assertThat(aList).contains(5); - } - - @Test - public void whenCheckingIterable_thenDoesNotContains() { - List aList = Arrays.asList(4, 5, 6); - - assertThat(aList).doesNotContain(9); - } - - @Test - public void whenCheckingIterable_thenContainsAny() { - List aList = Arrays.asList(4, 5, 6); - - assertThat(aList).containsAnyOf(0, 5, 10); - } - - @Test - public void whenCheckingIterable_thenContainsAnyInList() { - List aList = Arrays.asList(1, 2, 3); - - assertThat(aList).containsAnyIn(Arrays.asList(1, 5, 10)); - } - - @Test - public void whenCheckingIterable_thenNoDuplicates() { - List aList = Arrays.asList(-2, -1, 0, 1, 2); - - assertThat(aList).containsNoDuplicates(); - } - - @Test - public void whenCheckingIterable_thenContainsNoneOf() { - List aList = Arrays.asList(4, 5, 6); - - assertThat(aList).containsNoneOf(9, 8, 7); - } - - @Test - public void whenCheckingIterable_thenContainsNoneIn() { - List aList = Arrays.asList(4, 5, 6); - - assertThat(aList).containsNoneIn(Arrays.asList(9, 10, 11)); - } - - @Test - public void whenCheckingIterable_thenContainsExactElements() { - List aList = Arrays.asList("10", "20", "30"); - List anotherList = Arrays.asList("10", "20", "30"); - - assertThat(aList).containsExactlyElementsIn(anotherList) - .inOrder(); - } - - @Test - public void whenCheckingIterable_thenOrdered() { - Set aSet = new LinkedHashSet<>(Arrays.asList("one", "three", "two")); - - assertThat(aSet).isOrdered(); - } - - @Test - public void givenComparator_whenCheckingIterable_thenOrdered() { - Comparator aComparator = (a, b) -> new Float(a).compareTo(new Float(b)); - - List aList = Arrays.asList("1", "012", "0020", "100"); - - assertThat(aList).isOrdered(aComparator); - } - - @Test - public void whenCheckingMap_thenContainsEntry() { - Map aMap = new HashMap<>(); - aMap.put("one", 1L); - - assertThat(aMap).containsEntry("one", 1L); - } - - @Test - public void whenCheckingMap_thenContainsKey() { - Map map = new HashMap<>(); - map.put("one", 1L); - - assertThat(map).containsKey("one"); - } - - @Test - public void whenCheckingMap_thenContainsEntries() { - Map aMap = new HashMap<>(); - aMap.put("first", 1L); - aMap.put("second", 2.0); - aMap.put("third", 3f); - - Map anotherMap = new HashMap<>(aMap); - - assertThat(aMap).containsExactlyEntriesIn(anotherMap); - } - - @Test - public void whenCheckingException_thenInstanceOf() { - Exception anException = new IllegalArgumentException(new NumberFormatException()); - - assertThat(anException).hasCauseThat() - .isInstanceOf(NumberFormatException.class); - } - - @Test - public void whenCheckingException_thenCauseMessageIsKnown() { - Exception anException = new IllegalArgumentException("Bad value"); - - assertThat(anException).hasMessageThat() - .startsWith("Bad"); - } - - @Test - public void whenCheckingClass_thenIsAssignable() { - Class aClass = Double.class; - - assertThat(aClass).isAssignableTo(Number.class); - } - - // Java 8 Tests - @Test - public void whenCheckingJavaOptional_thenHasValue() { - Optional anOptional = Optional.of(1); - - assertThat(anOptional).hasValue(1); - } - - @Test - public void whenCheckingJavaOptional_thenPresent() { - Optional anOptional = Optional.of("Baeldung"); - - assertThat(anOptional).isPresent(); - } - - @Test - public void whenCheckingJavaOptional_thenEmpty() { - Optional anOptional = Optional.empty(); - - assertThat(anOptional).isEmpty(); - } - - @Test - public void whenCheckingStream_thenContainsInOrder() { - Stream anStream = Stream.of(1, 2, 3); - - assertThat(anStream).containsAllOf(1, 2, 3) - .inOrder(); - } - - @Test - public void whenCheckingStream_thenDoesNotContain() { - Stream anStream = IntStream.range(1, 100) - .boxed(); - - assertThat(anStream).doesNotContain(0); - } - - // Guava Tests - @Test - public void whenCheckingGuavaOptional_thenIsAbsent() { - com.google.common.base.Optional anOptional = com.google.common.base.Optional.absent(); - - assertThat(anOptional).isAbsent(); - } - - @Test - public void whenCheckingGuavaMultimap_thenExpectedSize() { - Multimap aMultimap = ArrayListMultimap.create(); - aMultimap.put("one", 1L); - aMultimap.put("one", 2.0); - - assertThat(aMultimap).valuesForKey("one") - .hasSize(2); - } - - @Test - public void whenCheckingGuavaMultiset_thenExpectedCount() { - TreeMultiset aMultiset = TreeMultiset.create(); - aMultiset.add("baeldung", 10); - - assertThat(aMultiset).hasCount("baeldung", 10); - } - - @Test - public void whenCheckingGuavaTable_thenContains() { - Table aTable = getDummyGuavaTable(); - - assertThat(aTable).contains("firstRow", "firstColumn"); - } - - @Test - public void whenCheckingGuavaTable_thenContainsCell() { - Table aTable = getDummyGuavaTable(); - - assertThat(aTable).containsCell("firstRow", "firstColumn", "baeldung"); - } - - @Test - public void whenCheckingGuavaTable_thenContainsRow() { - Table aTable = getDummyGuavaTable(); - - assertThat(aTable).containsRow("firstRow"); - } - - @Test - public void whenCheckingGuavaTable_thenContainsColumn() { - Table aTable = getDummyGuavaTable(); - - assertThat(aTable).containsColumn("firstColumn"); - } - - @Test - public void whenCheckingGuavaTable_thenContainsValue() { - Table aTable = getDummyGuavaTable(); - - assertThat(aTable).containsValue("baeldung"); - } - - @Ignore - @Test - public void whenFailingAssertion_thenMessagePrefix() { - User aUser = new User(); - - assertThat(aUser).named("User [%s]", aUser.getName()) - .isNull(); - } - - @Ignore - @Test - public void whenFailingAssertion_thenCustomMessage() { - User aUser = new User(); - - assertWithMessage("TEST-985: Secret user subject was NOT null!").that(aUser) - .isNull(); - } - - @Ignore - @Test - public void whenFailingAssertion_thenCustomMessageAndPrefix() { - User aUser = new User(); - - assertWithMessage("TEST-985: Secret user subject was NOT null!").that(aUser) - .named("User [%s]", aUser.getName()) - .isNull(); - } - - private Table getDummyGuavaTable() { - Table aTable = TreeBasedTable.create(); - aTable.put("firstRow", "firstColumn", "baeldung"); - return aTable; - } - - // Custom User type - @Test - public void whenCheckingUser_thenHasName() { - User aUser = new User(); - - assertThat(aUser).hasName("John Doe"); - } - - @Test - public void whenCheckingUser_thenHasNameIgnoringCase() { - User aUser = new User(); - - assertThat(aUser).hasNameIgnoringCase("john doe"); - } - - @Test - public void givenUser_whenCheckingEmails_thenExpectedSize() { - User aUser = new User(); - - assertThat(aUser).emails() - .hasSize(2); - } - -} From b6960a762ff46cfb5304b1326a96397676001164 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 8 Sep 2019 15:33:34 +0300 Subject: [PATCH 149/396] remove duplicate module --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index a783412bbf..2f27bdf6fd 100644 --- a/pom.xml +++ b/pom.xml @@ -796,7 +796,6 @@ structurizr struts-2 - assertion-libraries testing-modules twilio @@ -1491,7 +1490,6 @@ structurizr struts-2 - assertion-libraries testing-modules twilio From 1342f75609dd891010a7acd4df36e276c1bd865b Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 8 Sep 2019 15:52:17 +0300 Subject: [PATCH 150/396] small fixes --- testing-modules/assertion-libraries/pom.xml | 10 +- .../com/baeldung/junit/AdditionUnitTest.java | 14 --- .../baeldung/junit/AssertionsUnitTest.java | 101 ------------------ .../baeldung/junit/BlockingTestRunner.java | 18 ---- .../baeldung/junit/CalculatorUnitTest.java | 17 --- .../baeldung/junit/SubstractionUnitTest.java | 14 --- .../com/baeldung/junit/SuiteUnitTest.java | 12 --- .../java/com/baeldung/junit/TestRunner.java | 41 ------- testing-modules/mocks/pom.xml | 1 - .../mocks/jmockit/AppManagerUnitTest.java | 13 --- .../AdvancedCollaboratorIntegrationTest.java | 20 ---- .../jmockit/ExpectationsIntegrationTest.java | 3 +- testing-modules/testing-libraries/pom.xml | 4 +- .../com/baeldung/mutation/Palindrome.java | 2 +- 14 files changed, 5 insertions(+), 265 deletions(-) delete mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java delete mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java delete mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java delete mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java delete mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java delete mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java delete mode 100644 testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java diff --git a/testing-modules/assertion-libraries/pom.xml b/testing-modules/assertion-libraries/pom.xml index 274806d336..9d60d42533 100644 --- a/testing-modules/assertion-libraries/pom.xml +++ b/testing-modules/assertion-libraries/pom.xml @@ -8,9 +8,8 @@ com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java + testing-modules + 1.0.0-SNAPSHOT @@ -47,7 +46,6 @@ ${jgotesting.version} test - @@ -74,8 +72,4 @@ 0.12 - - - - diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java deleted file mode 100644 index ae6fa355fa..0000000000 --- a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AdditionUnitTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class AdditionUnitTest { - Calculator calculator = new Calculator(); - - @Test - public void testAddition() { - assertEquals("addition", 8, calculator.add(5, 3)); - } -} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java deleted file mode 100644 index b0209b01aa..0000000000 --- a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/AssertionsUnitTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; - -import java.util.Arrays; - -import static org.hamcrest.core.IsCollectionContaining.hasItems; -import static org.junit.Assert.*; - -/** - * Unit test that demonstrate the different assertions available within JUnit 4 - */ -public class AssertionsUnitTest { - - @Test - public void whenAssertingEquality_thenEqual() { - String expected = "Baeldung"; - String actual = "Baeldung"; - - assertEquals(expected, actual); - } - - @Test - public void whenAssertingEqualityWithMessage_thenEqual() { - String expected = "Baeldung"; - String actual = "Baeldung"; - - assertEquals("failure - strings are not equal", expected, actual); - } - - @Test - public void whenAssertingArraysEquality_thenEqual() { - char[] expected = { 'J', 'u', 'n', 'i', 't' }; - char[] actual = "Junit".toCharArray(); - - assertArrayEquals(expected, actual); - } - - @Test - public void givenNullArrays_whenAssertingArraysEquality_thenEqual() { - int[] expected = null; - int[] actual = null; - - assertArrayEquals(expected, actual); - } - - @Test - public void whenAssertingNull_thenTrue() { - Object car = null; - - assertNull("The car should be null", car); - } - - @Test - public void whenAssertingNotNull_thenTrue() { - Object car = new Object(); - - assertNotNull("The car should not be null", car); - } - - @Test - public void whenAssertingNotSameObject_thenDifferent() { - Object cat = new Object(); - Object dog = new Object(); - - assertNotSame(cat, dog); - } - - @Test - public void whenAssertingSameObject_thenSame() { - Object cat = new Object(); - - assertSame(cat, cat); - } - - @Test - public void whenAssertingConditions_thenVerified() { - assertTrue("5 is greater then 4", 5 > 4); - assertFalse("5 is not greater then 6", 5 > 6); - } - - @Test - public void when_thenNotFailed() { - try { - methodThatShouldThrowException(); - fail("Exception not thrown"); - } catch (UnsupportedOperationException e) { - assertEquals("Operation Not Supported", e.getMessage()); - } - } - - private void methodThatShouldThrowException() { - throw new UnsupportedOperationException("Operation Not Supported"); - } - - @Test - public void testAssertThatHasItems() { - assertThat(Arrays.asList("Java", "Kotlin", "Scala"), hasItems("Java", "Kotlin")); - } - -} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java deleted file mode 100644 index 432d5cda83..0000000000 --- a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/BlockingTestRunner.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.junit; - -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.model.FrameworkMethod; -import org.junit.runners.model.InitializationError; -import org.junit.runners.model.Statement; - -public class BlockingTestRunner extends BlockJUnit4ClassRunner { - public BlockingTestRunner(Class klass) throws InitializationError { - super(klass); - } - - @Override - protected Statement methodInvoker(FrameworkMethod method, Object test) { - System.out.println("invoking: " + method.getName()); - return super.methodInvoker(method, test); - } -} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java deleted file mode 100644 index d5ca847106..0000000000 --- a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/CalculatorUnitTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -import static org.junit.Assert.assertEquals; - -@RunWith(JUnit4.class) -public class CalculatorUnitTest { - Calculator calculator = new Calculator(); - - @Test - public void testAddition() { - assertEquals("addition", 8, calculator.add(5, 3)); - } -} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java deleted file mode 100644 index fd98395ebc..0000000000 --- a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SubstractionUnitTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class SubstractionUnitTest { - Calculator calculator = new Calculator(); - - @Test - public void substraction() { - assertEquals("substraction", 2, calculator.sub(5, 3)); - } -} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java deleted file mode 100644 index 76d19f84b2..0000000000 --- a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/SuiteUnitTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.junit; - -import org.junit.runner.RunWith; -import org.junit.runners.Suite; -import org.junit.runners.Suite.SuiteClasses; - -@RunWith(Suite.class) -@SuiteClasses({ - AdditionUnitTest.class, - SubstractionUnitTest.class}) -public class SuiteUnitTest { -} diff --git a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java b/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java deleted file mode 100644 index 9eb4b3141b..0000000000 --- a/testing-modules/assertion-libraries/src/test/java/com/baeldung/junit/TestRunner.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.junit; - -import org.junit.Test; -import org.junit.runner.Description; -import org.junit.runner.Runner; -import org.junit.runner.notification.RunNotifier; - -import java.lang.reflect.Method; - -public class TestRunner extends Runner { - - private Class testClass; - public TestRunner(Class testClass) { - super(); - this.testClass = testClass; - } - - @Override - public Description getDescription() { - return Description.createTestDescription(testClass, "My runner description"); - } - - @Override - public void run(RunNotifier notifier) { - System.out.println("running the tests from MyRunner: " + testClass); - try { - Object testObject = testClass.newInstance(); - for (Method method : testClass.getMethods()) { - if (method.isAnnotationPresent(Test.class)) { - notifier.fireTestStarted(Description - .createTestDescription(testClass, method.getName())); - method.invoke(testObject); - notifier.fireTestFinished(Description - .createTestDescription(testClass, method.getName())); - } - } - } catch (Exception e) { - throw new RuntimeException(e); - } - } -} diff --git a/testing-modules/mocks/pom.xml b/testing-modules/mocks/pom.xml index 342191c206..bf75cfc3a2 100644 --- a/testing-modules/mocks/pom.xml +++ b/testing-modules/mocks/pom.xml @@ -3,7 +3,6 @@ 4.0.0 mocks mocks - pom com.baeldung diff --git a/testing-modules/mocks/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java b/testing-modules/mocks/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java index 2c5aa2a3ed..ecdc6e441e 100644 --- a/testing-modules/mocks/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java +++ b/testing-modules/mocks/src/test/java/com/baeldung/mocks/jmockit/AppManagerUnitTest.java @@ -28,17 +28,4 @@ public class AppManagerUnitTest { Assertions.assertFalse(appManager.managerResponse("Why are you coming late?")); } - - @Test - public void givenAppManager_whenPrivateStaticMethod_thenValidateExpectedResponse() { - final int response = Deencapsulation.invoke(AppManager.class, "stringToInteger", "110"); - Assertions.assertEquals(110, response); - } - - @Test - public void givenAppManager_whenPrivateStaticMethod_thenExpectException() { - Assertions.assertThrows(IllegalArgumentException.class, () -> { - Deencapsulation.invoke(AppManager.class, "stringToInteger", "11r"); - }); - } } diff --git a/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java index 5cde912277..3a30342eb9 100644 --- a/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/AdvancedCollaboratorIntegrationTest.java @@ -1,12 +1,10 @@ package org.baeldung.mocks.jmockit; import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; import java.util.ArrayList; import java.util.List; -import org.baeldung.mocks.jmockit.AdvancedCollaborator.InnerAdvancedCollaborator; import org.junit.Test; import org.junit.runner.RunWith; @@ -52,12 +50,6 @@ public class AdvancedCollaboratorIntegrationTest assertEquals(1, coll.i); } - @Test - public void testToCallPrivateMethodsDirectly() { - Object value = Deencapsulation.invoke(mock, "privateMethod"); - assertEquals("default:", value); - } - @Test public void testToSetPrivateFieldDirectly() { Deencapsulation.setField(mock, "privateField", 10); @@ -70,18 +62,6 @@ public class AdvancedCollaboratorIntegrationTest assertEquals(5, value); } - @Test - public void testToCreateNewInstanceDirectly() { - AdvancedCollaborator coll = Deencapsulation.newInstance(AdvancedCollaborator.class, "foo"); - assertEquals(3, coll.i); - } - - @Test - public void testToCreateNewInnerClassInstanceDirectly() { - InnerAdvancedCollaborator innerCollaborator = Deencapsulation.newInnerInstance(InnerAdvancedCollaborator.class, mock); - assertNotNull(innerCollaborator); - } - @Test @SuppressWarnings("unchecked") public void testMultipleInterfacesWholeTest() { diff --git a/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java index c176cdc182..8b85af6243 100644 --- a/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java +++ b/testing-modules/mocks/src/test/java/org/baeldung/mocks/jmockit/ExpectationsIntegrationTest.java @@ -3,7 +3,6 @@ package org.baeldung.mocks.jmockit; import mockit.Delegate; import mockit.Expectations; import mockit.Mocked; -import mockit.StrictExpectations; import mockit.Verifications; import mockit.integration.junit4.JMockit; import org.hamcrest.BaseMatcher; @@ -106,7 +105,7 @@ public class ExpectationsIntegrationTest { @Test public void testResultAndReturns(@Mocked ExpectationsCollaborator mock) { - new StrictExpectations() {{ + new Expectations() {{ mock.methodReturnsString(); result = "foo"; result = new Exception(); diff --git a/testing-modules/testing-libraries/pom.xml b/testing-modules/testing-libraries/pom.xml index ab028cee24..7891ebbf6d 100644 --- a/testing-modules/testing-libraries/pom.xml +++ b/testing-modules/testing-libraries/pom.xml @@ -4,13 +4,11 @@ 4.0.0 testing-libraries testing-libraries - pom com.baeldung - parent-modules + testing-modules 1.0.0-SNAPSHOT - .. diff --git a/testing-modules/testing-libraries/src/main/java/com/baeldung/mutation/Palindrome.java b/testing-modules/testing-libraries/src/main/java/com/baeldung/mutation/Palindrome.java index e264a4c759..5e6fb7e4da 100644 --- a/testing-modules/testing-libraries/src/main/java/com/baeldung/mutation/Palindrome.java +++ b/testing-modules/testing-libraries/src/main/java/com/baeldung/mutation/Palindrome.java @@ -1,4 +1,4 @@ -package com.baeldung.testing.mutation; +package com.baeldung.mutation; public class Palindrome { From 88a20dc6a2dce528d9c107da4f337fa39705e54e Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sun, 8 Sep 2019 14:35:08 +0100 Subject: [PATCH 151/396] moved some classes back to core-java-8 --- .../src/main/java/com/baeldung/optional/Modem.java | 0 .../src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java | 0 .../com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java | 0 .../src/main/java/com/baeldung/optional/Person.java | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename core-java-modules/{core-java-exceptions => core-java-8}/src/main/java/com/baeldung/optional/Modem.java (100%) rename core-java-modules/{core-java-exceptions => core-java-8}/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java (100%) rename core-java-modules/{core-java-exceptions => core-java-8}/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java (100%) rename core-java-modules/{core-java-exceptions => core-java-8}/src/main/java/com/baeldung/optional/Person.java (100%) diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/Modem.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java similarity index 100% rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/Modem.java rename to core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java similarity index 100% rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java rename to core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java similarity index 100% rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java rename to core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/Person.java b/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java similarity index 100% rename from core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/Person.java rename to core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java From f66e0d8053988a6436a6346c6a8edd06f435f33a Mon Sep 17 00:00:00 2001 From: Nikunj Gandhi Date: Sun, 8 Sep 2019 16:27:20 -0400 Subject: [PATCH 152/396] BAEL-3214 | Unit tests for class FileWriter --- .../filewriter/FileWriterExampleTest.java | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java new file mode 100644 index 0000000000..521a6dd477 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java @@ -0,0 +1,123 @@ +package com.baeldung.filewriter; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.charset.Charset; +import java.nio.file.Files; +import java.nio.file.Path; + +import org.junit.After; +import org.junit.Test; + +public class FileWriterExampleTest { + + @After + public void tearDown() throws IOException { + Files.delete(Path.of("src/test/resources/FileWriterTest.txt")); + } + + @Test + public void testFileWriter_Constructor_With_FileName() throws IOException { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { + fileWriter.write("Hello Folks!"); + } + + assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testFileWriter_Constructor_With_FileName_And_Charset() throws IOException { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", Charset.forName("US-ASCII"))) { + fileWriter.write("Hello Folks! Let us learn the Façade design pattern"); + } + + System.out.println(new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + assertEquals("Hello Folks! Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testFileWriter_Constructor_With_FileName_And_AppendFlag() throws IOException { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { + fileWriter.write("Hello Folks!"); + } + + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", true)) { + fileWriter.write("Let us learn the Façade design pattern"); + } + + assertEquals("Hello Folks!Let us learn the Façade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testFileWriter_Constructor_With_FileName_And_Charset_And_AppendFlag() throws IOException { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", Charset.forName("US-ASCII"))) { + fileWriter.write("Hello Folks!"); + } + + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", Charset.forName("US-ASCII"), true)) { + fileWriter.write("Let us learn the Façade design pattern"); + } + + assertEquals("Hello Folks!Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testFileWriter_Constructor_With_File() throws IOException { + try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"))) { + fileWriter.write("Hello Folks!"); + } + + assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testFileWriter_Constructor_With_File_And_Charset() throws IOException { + try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), Charset.forName("US-ASCII"))) { + fileWriter.write("Hello Folks!Let us learn the Façade design pattern"); + } + + assertEquals("Hello Folks!Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testFileWriter_Constructor_With_File_And_AppendFlag() throws IOException { + try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"))) { + fileWriter.write("Hello Folks!"); + } + + try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), true)) { + fileWriter.write("Let us learn the Façade design pattern"); + } + + assertEquals("Hello Folks!Let us learn the Façade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testFileWriter_Constructor_With_File_And_Charset_And_AppendFlag() throws IOException { + try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), Charset.forName("US-ASCII"))) { + fileWriter.write("Hello Folks!"); + } + + try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), Charset.forName("US-ASCII"), true)) { + fileWriter.write("Let us learn the Façade design pattern"); + } + + assertEquals("Hello Folks!Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + + @Test + public void testFileWriter_Constructor_With_FileDescriptor() throws FileNotFoundException, IOException { + try(FileOutputStream fos = new FileOutputStream(new File("src/test/resources/FileWriterTest.txt")); + FileWriter fileWriter = new FileWriter(fos.getFD())){ + fileWriter.write("Hello Folks!"); + } + + assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + } + +} From 827c97e47b3baed17ed061834b7ef36fa84a6af7 Mon Sep 17 00:00:00 2001 From: Nikunj Gandhi Date: Sun, 8 Sep 2019 16:42:03 -0400 Subject: [PATCH 153/396] Code formatted --- .../filewriter/FileWriterExampleTest.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java index 521a6dd477..2147bd5ef2 100644 --- a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java @@ -35,9 +35,9 @@ public class FileWriterExampleTest { try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", Charset.forName("US-ASCII"))) { fileWriter.write("Hello Folks! Let us learn the Façade design pattern"); } - + System.out.println(new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - assertEquals("Hello Folks! Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); + assertEquals("Hello Folks! Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); } @Test @@ -62,7 +62,7 @@ public class FileWriterExampleTest { try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", Charset.forName("US-ASCII"), true)) { fileWriter.write("Let us learn the Façade design pattern"); } - + assertEquals("Hello Folks!Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); } @@ -80,7 +80,7 @@ public class FileWriterExampleTest { try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), Charset.forName("US-ASCII"))) { fileWriter.write("Hello Folks!Let us learn the Façade design pattern"); } - + assertEquals("Hello Folks!Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); } @@ -106,17 +106,16 @@ public class FileWriterExampleTest { try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), Charset.forName("US-ASCII"), true)) { fileWriter.write("Let us learn the Façade design pattern"); } - + assertEquals("Hello Folks!Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); } - + @Test public void testFileWriter_Constructor_With_FileDescriptor() throws FileNotFoundException, IOException { - try(FileOutputStream fos = new FileOutputStream(new File("src/test/resources/FileWriterTest.txt")); - FileWriter fileWriter = new FileWriter(fos.getFD())){ - fileWriter.write("Hello Folks!"); + try (FileOutputStream fos = new FileOutputStream(new File("src/test/resources/FileWriterTest.txt")); FileWriter fileWriter = new FileWriter(fos.getFD())) { + fileWriter.write("Hello Folks!"); } - + assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); } From 0eac69ca794063ed0d18d39e4b42c515a757d45c Mon Sep 17 00:00:00 2001 From: Kevin Kraus Date: Sun, 8 Sep 2019 21:51:37 -0500 Subject: [PATCH 154/396] fix package name --- .../src/test/java/com/baeldung/files/CreatingFilesUnitTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java index 175a0001f1..031d641ffc 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java @@ -1,3 +1,5 @@ +package com.baeldung.files; + import com.google.common.io.Files; import org.junit.Test; From 2a7f9f6edef83a6f979085e4917299e61d757de4 Mon Sep 17 00:00:00 2001 From: Kevin Kraus Date: Sun, 8 Sep 2019 22:00:47 -0500 Subject: [PATCH 155/396] improving absolute path test --- .../com/baeldung/files/CreatingFilesUnitTest.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java index 031d641ffc..f2216f58c7 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java @@ -9,15 +9,19 @@ import java.io.IOException; import static org.junit.Assert.assertTrue; public class CreateFilesUnitTest { - @Test(expected = IOException.class) - public void whenCreatingAFileWithAbsolutePath_thenExceptionIsThrown() throws IOException { - File fileWithAbsolutePath = new File("/myDirectory/testFile.txt"); + @Test + public void givenAnExistingDirectory_whenCreatingAFileWithAbsolutePath_thenFileIsCreated() throws IOException { + File tempDirectory = new File(System.getProperty("java.io.tmpdir")); + File fileWithAbsolutePath = new File(tempDirectory.getAbsolutePath() + "/myDirectory/testFile.txt"); + fileWithAbsolutePath.mkdirs(); Files.touch(fileWithAbsolutePath); + + assertTrue(fileWithAbsolutePath.exists()); } @Test - public void givenAnExistingDirectory_whenCreatingANewDirectoryAndFile_thenFileIsCreated() throws IOException { + public void givenAnExistingDirectory_whenCreatingANewDirectoryAndFileWithRelativePath_thenFileIsCreated() throws IOException { File tempDirectory = new File(System.getProperty("java.io.tmpdir")); File fileWithRelativePath = new File(tempDirectory, "myDirectory/newFile.txt"); From 9f2a9a9c361385cb93eb79cc85750c02c9ef39cd Mon Sep 17 00:00:00 2001 From: Kevin Kraus Date: Sun, 8 Sep 2019 22:14:40 -0500 Subject: [PATCH 156/396] renaming test --- .../{CreatingFilesUnitTest.java => CreateFilesUnitTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core-java-modules/core-java/src/test/java/com/baeldung/files/{CreatingFilesUnitTest.java => CreateFilesUnitTest.java} (100%) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/files/CreateFilesUnitTest.java similarity index 100% rename from core-java-modules/core-java/src/test/java/com/baeldung/files/CreatingFilesUnitTest.java rename to core-java-modules/core-java/src/test/java/com/baeldung/files/CreateFilesUnitTest.java From a76bf62420d2a818b8ba9d8ea2e505a3c08308ac Mon Sep 17 00:00:00 2001 From: Alex Tighe Date: Sun, 8 Sep 2019 23:45:01 -0400 Subject: [PATCH 157/396] [BAEL-2076] - Moving example to new core-java-io-files module --- .../core-java-io-files/.gitignore | 5 + .../core-java-io-files/README.md | 6 + core-java-modules/core-java-io-files/pom.xml | 296 ++++++++++++++++++ .../baeldung/resource/MyResourceLoader.java | 0 .../src/main/resources/input.txt | 45 +++ .../src/test/resources/.gitignore | 13 + core-java-modules/core-java-io/pom.xml | 15 - pom.xml | 2 + 8 files changed, 367 insertions(+), 15 deletions(-) create mode 100644 core-java-modules/core-java-io-files/.gitignore create mode 100644 core-java-modules/core-java-io-files/README.md create mode 100644 core-java-modules/core-java-io-files/pom.xml rename core-java-modules/{core-java-io => core-java-io-files}/src/main/java/com/baeldung/resource/MyResourceLoader.java (100%) create mode 100644 core-java-modules/core-java-io-files/src/main/resources/input.txt create mode 100644 core-java-modules/core-java-io-files/src/test/resources/.gitignore diff --git a/core-java-modules/core-java-io-files/.gitignore b/core-java-modules/core-java-io-files/.gitignore new file mode 100644 index 0000000000..c61d35324d --- /dev/null +++ b/core-java-modules/core-java-io-files/.gitignore @@ -0,0 +1,5 @@ +0.* + +# Files generated by integration tests +# *.txt +/temp \ No newline at end of file diff --git a/core-java-modules/core-java-io-files/README.md b/core-java-modules/core-java-io-files/README.md new file mode 100644 index 0000000000..80c0dc941e --- /dev/null +++ b/core-java-modules/core-java-io-files/README.md @@ -0,0 +1,6 @@ +========= + +## Core Java IO Files Cookbooks and Examples + +### Relevant Articles: +- [How to Avoid the Java FileNotFoundException When Loading Resources](https://www.baeldung.com/java-classpath-resource-cannot-be-opened) \ No newline at end of file diff --git a/core-java-modules/core-java-io-files/pom.xml b/core-java-modules/core-java-io-files/pom.xml new file mode 100644 index 0000000000..0f4b5eea1d --- /dev/null +++ b/core-java-modules/core-java-io-files/pom.xml @@ -0,0 +1,296 @@ + + 4.0.0 + core-java-io-files + 0.1.0-SNAPSHOT + core-java-io-files + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + net.sourceforge.collections + collections-generic + ${collections-generic.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + commons-io + commons-io + ${commons-io.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.apache.commons + commons-math3 + ${commons-math3.version} + + + org.decimal4j + decimal4j + ${decimal4j.version} + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + org.unix4j + unix4j-command + ${unix4j.version} + + + com.googlecode.grep4j + grep4j + ${grep4j.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj.version} + test + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.javamoney + moneta + ${moneta.version} + + + org.owasp.esapi + esapi + ${esapi.version} + + + com.sun.messaging.mq + fscontext + ${fscontext.version} + + + com.codepoetics + protonpack + ${protonpack.version} + + + one.util + streamex + ${streamex.version} + + + io.vavr + vavr + ${vavr.version} + + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator-annprocess.version} + + + org.hsqldb + hsqldb + ${hsqldb.version} + runtime + + + + org.asynchttpclient + async-http-client + ${async-http-client.version} + + + com.opencsv + opencsv + ${opencsv.version} + test + + + + org.apache.tika + tika-core + ${tika.version} + + + net.sf.jmimemagic + jmimemagic + ${jmime-magic.version} + + + + + core-java-io-files + + + src/main/resources + true + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + java + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + -Xmx300m + -XX:+UseParallelGC + -classpath + + com.baeldung.outofmemoryerror.OutOfMemoryGCLimitExceed + + + + + org.apache.maven.plugins + maven-javadoc-plugin + ${maven-javadoc-plugin.version} + + ${maven.compiler.source} + ${maven.compiler.target} + + + + + + org.apache.maven.plugins + maven-jar-plugin + ${maven-jar-plugin.version} + + + + true + com.baeldung.resource.MyResourceLoader + + + + + + + + + + integration + + + + org.codehaus.mojo + exec-maven-plugin + + + + run-benchmarks + + none + + exec + + + test + java + + -classpath + + org.openjdk.jmh.Main + .* + + + + + + + + + + + + + + 1.55 + 1.10 + 3.6.1 + 1.0.3 + 4.1 + 4.01 + 0.4 + 1.8.7 + 4.6-b01 + 1.13 + 0.6.5 + 0.9.0 + 4.1 + + 3.6.1 + 1.7.0 + + + 3.0.0-M1 + 2.4.0 + 2.1.0.1 + 1.19 + 2.4.5 + + 1.18 + 0.1.5 + 3.1.0 + + + + diff --git a/core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java b/core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java similarity index 100% rename from core-java-modules/core-java-io/src/main/java/com/baeldung/resource/MyResourceLoader.java rename to core-java-modules/core-java-io-files/src/main/java/com/baeldung/resource/MyResourceLoader.java diff --git a/core-java-modules/core-java-io-files/src/main/resources/input.txt b/core-java-modules/core-java-io-files/src/main/resources/input.txt new file mode 100644 index 0000000000..650da894e8 --- /dev/null +++ b/core-java-modules/core-java-io-files/src/main/resources/input.txt @@ -0,0 +1,45 @@ +Lorem ipsum dolor sit amet, consectetur adipiscing elit. In lacus enim, scelerisque id sapien ut, semper euismod quam. Nunc ullamcorper semper blandit. Praesent quis quam mollis, iaculis lectus a, fringilla leo. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis vitae auctor mauris. Pellentesque eu pellentesque lorem, vel ultricies libero. Pellentesque vestibulum sagittis eros. In vestibulum lacus elit. Interdum et malesuada fames ac ante ipsum primis in faucibus. + +Vivamus pharetra lacus fringilla nisl molestie eleifend. Donec et dolor non quam mattis mattis. Proin malesuada maximus elit id semper. Donec facilisis dolor ut feugiat auctor. Proin accumsan semper consectetur. Vivamus facilisis odio vel bibendum imperdiet. Sed rutrum nisi nec nisi interdum fringilla. Aliquam laoreet velit ullamcorper egestas ultrices. Aliquam ultricies sem sed orci interdum, eu porta purus malesuada. Sed accumsan, nunc ut maximus rhoncus, arcu ante pretium ex, non ultrices magna nisi et velit. Pellentesque tempor mi quis lacus consectetur, quis imperdiet enim efficitur. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. + +Nunc sed maximus erat. Aenean imperdiet finibus massa ac aliquam. Interdum et malesuada fames ac ante ipsum primis in faucibus. Duis dignissim cursus purus, eu tempus urna. Nunc sed mauris scelerisque, luctus eros ut, viverra nisi. Maecenas congue sed ligula in eleifend. Praesent nec dignissim enim, dictum efficitur massa. Nullam eros dui, rutrum quis aliquam accumsan, sollicitudin cursus eros. Phasellus euismod, lorem vitae vehicula ullamcorper, leo lorem vestibulum magna, vitae malesuada libero ipsum id lorem. Aenean finibus turpis facilisis tortor bibendum, vitae dignissim dolor dictum. Ut quis ornare nisi, non rutrum sapien. + +Etiam placerat, est eget placerat imperdiet, neque urna tristique est, a dictum nisl dolor vitae leo. Vivamus porttitor mi vitae volutpat ultrices. Quisque at ante porta mauris ultricies iaculis. Phasellus iaculis sollicitudin urna nec facilisis. Suspendisse dapibus vulputate scelerisque. Fusce felis diam, eleifend in tristique in, malesuada a purus. Suspendisse euismod ipsum sed urna imperdiet, quis venenatis lacus dapibus. Maecenas vitae est vel sem fringilla ornare at ut mi. Quisque porta, nulla at rutrum fringilla, mi ligula egestas libero, ac convallis elit diam et sapien. Vestibulum purus tortor, ornare ut enim sed, mattis lobortis erat. Maecenas ac ante tincidunt, euismod mauris a, fermentum diam. Nullam arcu est, consequat sed enim in, bibendum aliquet velit. Donec bibendum magna ac augue sagittis vehicula. Curabitur nec mauris eu augue bibendum volutpat. Fusce fringilla varius fringilla. + +Aliquam faucibus massa non orci accumsan, porta consectetur diam vulputate. Nullam nec erat mollis, imperdiet libero nec, tincidunt neque. Aenean varius purus nec est auctor, sed vulputate libero varius. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent vel neque elit. Donec vulputate fermentum nulla, ut aliquam neque tempor in. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec vel venenatis est. Suspendisse luctus elit quis dui dapibus, id sodales dolor cursus. Curabitur ut vehicula dui. Fusce aliquet est et ante feugiat, et tempus ex congue. Nunc eget dapibus leo. Nunc eu accumsan diam. Suspendisse risus eros, rutrum et volutpat in, consequat in nulla. Suspendisse id felis a orci accumsan iaculis. + +Duis tincidunt diam eget tortor aliquet sodales. Etiam sodales purus ac urna mollis, et cursus enim porttitor. Nulla viverra ligula nunc, ornare condimentum felis posuere sed. Fusce aliquet pretium sagittis. Sed ac mi elementum massa dictum ornare. Integer quis dapibus lectus. Curabitur in rhoncus justo, et vulputate justo. Integer eget efficitur felis. + +Sed finibus vel tortor ac egestas. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas vestibulum nulla mi, blandit efficitur sapien fermentum eu. Integer sed turpis eros. Phasellus sed aliquam ligula. Etiam dictum quam in dapibus mattis. Donec et tristique quam. Pellentesque gravida luctus dolor, eu ornare sapien. Donec justo ante, lacinia non sem et, ultricies dignissim nibh. Vivamus eu nisl et magna pulvinar efficitur. Sed at vehicula lectus, sit amet luctus sem. Morbi vehicula sapien nisi, nec sagittis orci vestibulum et. + +Praesent non finibus diam. Quisque sit amet nisl vitae augue lobortis commodo. Morbi ullamcorper, tortor id ornare maximus, erat ipsum ullamcorper ipsum, in imperdiet diam sem vel erat. Sed pellentesque quis ex sed volutpat. Vestibulum volutpat diam ac dignissim sollicitudin. Praesent at luctus ex, at volutpat dui. Nunc nulla dui, lobortis et pharetra quis, efficitur in turpis. Donec sodales auctor purus id mollis. Sed auctor eu erat eget bibendum. Mauris tincidunt ornare neque id consequat. Suspendisse non massa ante. Quisque velit enim, rhoncus at erat eget, scelerisque placerat elit. Donec finibus luctus dolor. In sed eleifend lorem. Sed tempor ullamcorper lorem nec tristique. Fusce nec volutpat neque, id elementum est. + +Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum mattis elementum tellus, vitae maximus nulla eleifend ut. Vestibulum eu nibh vulputate, posuere felis eget, aliquet ex. Nullam leo ex, lacinia a ante ac, accumsan efficitur ligula. Vestibulum ornare gravida tempus. Proin rhoncus felis sit amet dolor commodo facilisis. Integer aliquet, diam sed pharetra feugiat, sem massa mollis orci, eget pretium libero nunc at quam. Ut rhoncus quam vitae massa hendrerit, ornare condimentum odio varius. Donec odio sapien, tristique eget libero ac, interdum facilisis odio. Phasellus nec mauris vel dolor semper mattis et quis ligula. Donec nec porttitor nunc. Integer maximus quam vitae sem gravida, ut commodo ex porttitor. + +Sed cursus nisi turpis, vel laoreet massa blandit ut. Cras posuere velit nulla, nec pellentesque ipsum dignissim eget. Donec pharetra, ex et commodo viverra, leo dolor dapibus tellus, vel dignissim est sem ac lectus. Quisque a arcu dapibus, aliquet magna sed, rhoncus neque. Integer suscipit, nulla ac varius lacinia, orci metus scelerisque neque, a laoreet nibh risus vitae dolor. Pellentesque felis metus, pulvinar vel cursus id, ultrices non purus. Donec mi lectus, faucibus sit amet nunc at, sagittis pretium lectus. Fusce nec purus arcu. Mauris neque neque, blandit eget mi at, auctor tempus orci. Mauris sapien lorem, luctus nec tellus non, porttitor aliquam dui. + +Mauris non ex risus. Aliquam imperdiet in eros eget placerat. Sed congue sed sapien porta sollicitudin. Phasellus tempor hendrerit metus vitae tincidunt. Suspendisse congue nisi sed augue dapibus, at pretium ante mollis. Cras non posuere nulla. Proin malesuada finibus magna vel iaculis. Cras in dapibus lorem. Pellentesque volutpat dolor sit amet magna tincidunt mollis. Nunc et lectus sodales, accumsan est vitae, ornare augue. Maecenas malesuada arcu leo, eget blandit lectus porttitor et. Nam aliquam sapien sit amet purus consequat lobortis. Aenean varius, augue porta dignissim efficitur, felis velit dapibus leo, tincidunt ultricies magna felis id ligula. Duis hendrerit, lectus eu elementum euismod, elit lectus consequat mi, sit amet egestas justo massa ut urna. Proin eleifend interdum ultrices. + +Donec lacinia orci pharetra ornare tincidunt. Nulla facilisi. Maecenas malesuada dui ac elit sagittis tincidunt id dictum dolor. Quisque lobortis purus ac metus volutpat viverra. Proin finibus sapien ut odio semper consectetur. Sed gravida luctus egestas. Mauris pretium volutpat elit, at commodo arcu sagittis nec. Ut condimentum fringilla urna ac dignissim. Cras aliquam metus pulvinar, pulvinar nibh at, placerat arcu. Nulla ornare tortor sed lectus mollis, vitae fringilla tellus egestas. Vivamus efficitur tincidunt sapien, sed finibus mi congue eu. Nullam magna velit, lacinia vitae ligula eget, molestie consectetur felis. Suspendisse varius turpis orci, ac laoreet arcu accumsan sed. Fusce quis fermentum lacus, nec varius libero. Pellentesque ac odio ut justo lobortis elementum sit amet vehicula lorem. Nulla interdum nulla eget mi tristique, vitae egestas nunc egestas. + +Curabitur commodo libero eu elit tincidunt, quis placerat risus vehicula. Vestibulum vehicula id nunc iaculis fermentum. Aenean semper, tellus ac semper rutrum, justo lorem feugiat leo, quis vulputate neque dui non ligula. Etiam egestas, enim eget tempor porta, nunc est tristique ante, vel suscipit massa lorem vel diam. Donec faucibus ante id turpis rhoncus congue. Nullam laoreet, diam efficitur scelerisque consequat, ligula leo ultrices est, non fermentum elit mauris ut dolor. Morbi non porttitor lorem. Sed volutpat sapien et lorem porttitor, ultricies ultricies tellus congue. Mauris sodales, tortor nec sagittis finibus, dui odio aliquet nibh, in luctus sapien massa eu risus. Nulla in est sed ante molestie vehicula vel nec lectus. Fusce maximus a quam eget aliquam. Vivamus pulvinar quis nisi a maximus. Proin cursus lacus sapien, et hendrerit elit pretium a. Donec tellus lectus, consectetur id dolor a, luctus rutrum libero. Suspendisse auctor scelerisque dui, nec pellentesque felis viverra nec. Cras elit ex, varius sed pulvinar sed, suscipit ultrices lacus. + +Vivamus eu luctus lectus. Maecenas congue magna orci, quis semper nulla blandit vel. Phasellus dignissim risus placerat lacinia sagittis. Praesent at gravida nisi, at pulvinar diam. Nulla egestas lectus sed felis facilisis egestas. Curabitur posuere gravida urna eu vestibulum. Pellentesque at dolor gravida, placerat quam sit amet, fermentum ligula. Morbi fringilla, mi eget mollis dictum, neque dolor ullamcorper leo, a rutrum libero ipsum eget orci. Curabitur consectetur iaculis vestibulum. Suspendisse ultricies ligula et neque lacinia luctus. Sed dignissim neque id eros sollicitudin pellentesque. + +Donec et magna quis lectus pharetra finibus a fringilla sapien. Phasellus accumsan, erat eu sodales cursus, tortor elit dapibus risus, ut ornare neque arcu in tellus. Nam ac vehicula diam, at aliquam nisl. Cras in sem eget nisi ultrices rutrum sit amet eu velit. Sed molestie tellus eget ante scelerisque, sit amet pulvinar neque fringilla. Nunc volutpat facilisis egestas. Cras sodales dui ac massa egestas, in mattis leo rhoncus. Pellentesque vitae urna vehicula ipsum sodales suscipit. Sed commodo tempus fringilla. + +Etiam egestas elit vitae mi maximus fringilla quis eget libero. Fusce finibus ultrices tellus at molestie. Pellentesque posuere blandit elementum. Etiam eu erat eu urna hendrerit euismod. Nulla quis lectus rhoncus, ultricies urna eget, pretium neque. Cras sit amet ipsum sit amet purus rutrum ultricies nec vitae tortor. Sed tempor dapibus augue in pulvinar. Ut pretium sapien in malesuada accumsan. Donec eget ultrices erat, ut efficitur ligula. Sed posuere mauris est, nec convallis ipsum tempus non. + +Duis a ullamcorper ante. Quisque eu ultricies metus, at aliquet odio. Nullam tempus molestie augue ut varius. Fusce purus eros, dictum nec finibus sed, sodales et diam. Suspendisse sed mi purus. Donec eleifend ipsum diam, nec fringilla enim laoreet non. Phasellus condimentum, magna sit amet porttitor suscipit, arcu risus lobortis dolor, ac fringilla nibh nisl vel purus. Phasellus facilisis posuere orci sit amet tempus. Nam nec enim maximus, rhoncus felis a, rutrum diam. + +Suspendisse potenti. Donec vel tempor neque. In aliquet nulla in eleifend bibendum. Sed sapien sem, finibus in sodales vitae, euismod in sem. Phasellus nec elit a erat pulvinar semper. Aliquam luctus nisl in libero molestie aliquam. Nunc ac ornare felis. Ut non mauris ut ipsum rhoncus pretium. Curabitur tristique lacus a sagittis aliquam. Morbi vel volutpat tellus. Maecenas volutpat, lacus sed tempus imperdiet, eros tellus volutpat nisi, a egestas augue nulla quis arcu. In sollicitudin imperdiet efficitur. Suspendisse viverra aliquet nisi, congue ultrices arcu hendrerit in. + +Maecenas vitae vestibulum nunc. Nullam semper faucibus tincidunt. Etiam sed hendrerit risus. Proin gravida, urna nec tincidunt tempus, nulla sapien porttitor nibh, porttitor lobortis nunc quam et tortor. Praesent ut varius lacus, ut hendrerit enim. Ut nec turpis ac felis imperdiet bibendum. Phasellus porttitor enim odio, et vehicula mi convallis vel. Quisque porta scelerisque sagittis. Praesent dignissim sagittis vulputate. Aenean non justo ac est volutpat bibendum. Aliquam mattis, sapien dapibus pellentesque semper, velit urna malesuada diam, nec varius nibh eros at erat. Proin leo ante, ultricies id velit ut, faucibus porta nibh. Sed nec fermentum urna, sed mollis leo. Aliquam erat volutpat. + +Donec condimentum, urna sed hendrerit vestibulum, ante nibh lacinia dui, in tincidunt odio sem eget orci. In hac habitasse platea dictumst. Mauris id ex id ante tempus finibus eu sagittis erat. Quisque interdum urna risus, vel varius nibh euismod non. Nulla eget pellentesque quam. Aliquam vestibulum ac tortor non lobortis. Sed vitae erat sed libero dignissim dictum nec in turpis. Vivamus id ornare elit, ut facilisis lectus. Morbi dictum purus eget ipsum dignissim porttitor. Sed at vehicula purus, nec rhoncus quam. Nunc a nisl quis arcu blandit fermentum vel quis odio. Vivamus rhoncus, sapien sed lacinia hendrerit, velit urna fermentum dolor, id feugiat magna ligula sed urna. Proin euismod efficitur libero, eget porttitor lacus tempus quis. Duis tincidunt quis est a laoreet. Nam sit amet tristique nisl, sit amet mattis mi. + +Aenean id dictum nulla, sed laoreet magna. Morbi consectetur in turpis at aliquam. Maecenas rutrum feugiat metus, at ullamcorper augue fermentum ut. Vivamus in magna pretium nibh dictum rhoncus luctus at orci. In hac habitasse platea dictumst. Fusce convallis, nulla nec hendrerit suscipit, ipsum diam lobortis sem, vitae elementum lectus erat sit amet magna. Quisque sollicitudin fringilla purus, ac molestie justo congue vitae. Nulla sapien leo, ullamcorper ac tellus in, cursus rhoncus enim. Suspendisse rutrum magna non ex elementum elementum id vitae enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Suspendisse ornare libero eu molestie pulvinar. Phasellus faucibus, magna eget rutrum porta, lorem turpis blandit lectus, eu viverra massa risus et ex. + +Ut consectetur eros lacus, ac ullamcorper lacus mattis a. Cras congue justo ut erat interdum, et scelerisque nisi malesuada. Quisque sed sapien sollicitudin purus tincidunt finibus vestibulum vel dolor. Cras iaculis bibendum erat, a dictum urna viverra et. Integer non neque vulputate, tincidunt purus nec, rutrum arcu. Aliquam nec magna non sem semper laoreet quis at quam. Mauris dui lectus, convallis eu efficitur at, facilisis nec lorem. Cras felis sem, egestas ac rutrum vel, mollis et ex. Aenean semper egestas libero, nec commodo mi blandit efficitur. Duis nec quam in massa dignissim sagittis vel vitae leo. Nam molestie hendrerit auctor. + +Sed suscipit egestas tellus sed cursus. Donec vel massa sit amet dui condimentum accumsan. Phasellus libero eros, lobortis a nisi id, porttitor maximus lectus. Praesent consectetur diam urna, id viverra turpis elementum in. Vivamus vitae pretium justo, nec tempor felis. Vivamus volutpat ultricies magna. Suspendisse vulputate lectus ac orci volutpat ullamcorper. Nulla eu leo pretium, commodo arcu accumsan, tempor nisl. Fusce sit amet tellus a ipsum vehicula laoreet sed vitae mauris. Duis porttitor massa mattis nibh placerat consequat. Fusce rutrum commodo tortor eget pellentesque. Suspendisse tempor enim libero, consequat dictum nibh dictum varius. Pellentesque feugiat sit amet urna sed facilisis. Curabitur a sagittis augue. \ No newline at end of file diff --git a/core-java-modules/core-java-io-files/src/test/resources/.gitignore b/core-java-modules/core-java-io-files/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-io-files/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-io/pom.xml b/core-java-modules/core-java-io/pom.xml index 84bf3baeed..949dec7e39 100644 --- a/core-java-modules/core-java-io/pom.xml +++ b/core-java-modules/core-java-io/pom.xml @@ -207,21 +207,6 @@ ${maven.compiler.target} - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - true - com.baeldung.resource.MyResourceLoader - - - - diff --git a/pom.xml b/pom.xml index 3fd1bcf5fb..4cda39705a 100644 --- a/pom.xml +++ b/pom.xml @@ -396,6 +396,7 @@ core-java-modules/core-java-concurrency-basic core-java-modules/core-java-concurrency-collections core-java-modules/core-java-io + core-java-modules/core-java-io-files core-java-modules/core-java-nio core-java-modules/core-java-security core-java-modules/core-java-lang-syntax @@ -1080,6 +1081,7 @@ core-java-modules/core-java-concurrency-basic core-java-modules/core-java-concurrency-collections core-java-modules/core-java-io + core-java-modules/core-java-io-files core-java-modules/core-java-nio core-java-modules/core-java-security core-java-modules/core-java-lang-syntax From a1dcb5c5ea404f1cc7ac6f7d4c6df7f67595b9d9 Mon Sep 17 00:00:00 2001 From: mikr Date: Mon, 9 Sep 2019 11:10:18 +0200 Subject: [PATCH 158/396] BAEL-3131 Guide to Java HashMap --- java-collections-maps-2/README.md | 1 + .../main/java/com/baeldung/map/Product.java | 133 ++++++++++++++++++ .../com/baeldung/map/ProductUnitTest.java | 124 ++++++++++++++++ 3 files changed, 258 insertions(+) create mode 100644 java-collections-maps-2/src/main/java/com/baeldung/map/Product.java create mode 100644 java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java diff --git a/java-collections-maps-2/README.md b/java-collections-maps-2/README.md index ff84e93ce4..3740639339 100644 --- a/java-collections-maps-2/README.md +++ b/java-collections-maps-2/README.md @@ -1,3 +1,4 @@ ## Relevant Articles: - [Map of Primitives in Java](https://www.baeldung.com/java-map-primitives) - [Copying a HashMap in Java](https://www.baeldung.com/java-copy-hashmap) +- [Guide to Java HashMap]() diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java b/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java new file mode 100644 index 0000000000..5559895730 --- /dev/null +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/Product.java @@ -0,0 +1,133 @@ +package com.baeldung.map; + +import java.util.*; + +public class Product { + + private String name; + private String description; + private List tags; + + public Product(String name, String description) { + this.name = name; + this.description = description; + this.tags = new ArrayList<>(); + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + + public List getTags() { + return tags; + } + + public Product addTagsOfOtherProdcut(Product product) { + this.tags.addAll(product.getTags()); + return this; + } + + @Override + public boolean equals(Object o) { + + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + Product product = (Product) o; + return Objects.equals(name, product.name) && + Objects.equals(description, product.description); + } + + @Override + public int hashCode() { + return Objects.hash(name, description); + } + + public static void forEach() { + + HashMap productsByName = new HashMap<>(); + productsByName.forEach( (key, product) + -> System.out.println("Key: " + key + " Product:" + product.getDescription()) + //do something with the key and value + ); + + //Prior to Java 8: + for(Map.Entry entry : productsByName.entrySet()) { + Product product = entry.getValue(); + String key = entry.getKey(); + //do something with the key and value + } + } + + public static void getOrDefault() { + + HashMap productsByName = new HashMap<>(); + Product chocolate = new Product("chocolate", "something sweet"); + Product defaultProduct = productsByName.getOrDefault("horse carriage", chocolate); + Product bike = productsByName.getOrDefault("E-Bike", chocolate); + + //Prior to Java 8: + Product bike2 = productsByName.containsKey("E-Bike") + ? productsByName.get("E-Bike") + : chocolate; + Product defaultProduct2 = productsByName.containsKey("horse carriage") + ? productsByName.get("horse carriage") + : chocolate; + } + + public static void putIfAbsent() { + + HashMap productsByName = new HashMap<>(); + Product chocolate = new Product("chocolate", "something sweet"); + productsByName.putIfAbsent("E-Bike", chocolate); + + //Prior to Java 8: + if(productsByName.containsKey("E-Bike")) { + productsByName.put("E-Bike", chocolate); + } + } + + public static void merge() { + + HashMap productsByName = new HashMap<>(); + Product eBike2 = new Product("E-Bike", "A bike with a battery"); + eBike2.getTags().add("sport"); + productsByName.merge("E-Bike", eBike2, Product::addTagsOfOtherProdcut); + + //Prior to Java 8: + if(productsByName.containsKey("E-Bike")) { + productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2); + } else { + productsByName.put("E-Bike", eBike2); + } + } + + public static void compute() { + + HashMap productsByName = new HashMap<>(); + Product eBike2 = new Product("E-Bike", "A bike with a battery"); + + productsByName.compute("E-Bike", (k,v) -> { + if(v != null) { + return v.addTagsOfOtherProdcut(eBike2); + } else { + return eBike2; + } + }); + + //Prior to Java 8: + if(productsByName.containsKey("E-Bike")) { + productsByName.get("E-Bike").addTagsOfOtherProdcut(eBike2); + } else { + productsByName.put("E-Bike", eBike2); + } + } +} diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java new file mode 100644 index 0000000000..28ac06e166 --- /dev/null +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java @@ -0,0 +1,124 @@ +package com.baeldung.map; + +import org.junit.jupiter.api.Test; + +import java.util.HashMap; + +import static org.junit.jupiter.api.Assertions.*; + +class ProductUnitTest { + + + @Test + public void getExistingValue() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + Product roadBike = new Product("Road bike", "A bike for competition"); + + productsByName.put(eBike.getName(), eBike); + productsByName.put(roadBike.getName(), roadBike); + + Product nextPurchase = productsByName.get("E-Bike"); + + assertEquals("A bike with a battery", nextPurchase.getDescription()); + } + + @Test + public void getNonExistingValue() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + Product roadBike = new Product("Road bike", "A bike for competition"); + + productsByName.put(eBike.getName(), eBike); + productsByName.put(roadBike.getName(), roadBike); + + Product nextPurchase = productsByName.get("Car"); + + assertEquals(null, nextPurchase); + } + + @Test + public void getExistingValueAfterSameKeyInsertedTwice() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + Product roadBike = new Product("Road bike", "A bike for competition"); + Product newEBike = new Product("E-Bike", "A bike with a better battery"); + + productsByName.put(eBike.getName(), eBike); + productsByName.put(roadBike.getName(), roadBike); + productsByName.put(newEBike.getName(), newEBike); + + Product nextPurchase = productsByName.get("E-Bike"); + + assertEquals("A bike with a better battery", nextPurchase.getDescription()); + } + + @Test + public void getExistingValueWithNullKey() { + HashMap productsByName = new HashMap<>(); + + Product defaultProduct = new Product("Chocolate", "At least buy chocolate"); + + productsByName.put(null, defaultProduct); + productsByName.put(defaultProduct.getName(), defaultProduct); + + Product nextPurchase = productsByName.get(null); + assertEquals("At least buy chocolate", nextPurchase.getDescription()); + + nextPurchase = productsByName.get("Chocolate"); + assertEquals("At least buy chocolate", nextPurchase.getDescription()); + } + + @Test + public void insertSameObjectWithDifferentKey() { + HashMap productsByName = new HashMap<>(); + + Product defaultProduct = new Product("Chocolate", "At least buy chocolate"); + + productsByName.put(null, defaultProduct); + productsByName.put(defaultProduct.getName(), defaultProduct); + + assertSame(productsByName.get(null), productsByName.get("Chocolate")); + } + + @Test + public void checkIfKeyExists() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + + productsByName.put(eBike.getName(), eBike); + + assertTrue(productsByName.containsKey("E-Bike")); + } + + @Test + public void checkIfValueExists() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + + productsByName.put(eBike.getName(), eBike); + + assertTrue(productsByName.containsValue(eBike)); + } + + @Test + public void removeExistingKey() { + HashMap productsByName = new HashMap<>(); + + Product eBike = new Product("E-Bike", "A bike with a battery"); + Product roadBike = new Product("Road bike", "A bike for competition"); + + productsByName.put(eBike.getName(), eBike); + productsByName.put(roadBike.getName(), roadBike); + + productsByName.remove("E-Bike"); + + assertNull(productsByName.get("E-Bike")); + } + +} \ No newline at end of file From b6183e931519750033d28297113aecf2f564216c Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Mon, 9 Sep 2019 08:16:40 -0300 Subject: [PATCH 159/396] [BAEL-9498] Fix failing context tests - part 2 (#7738) * fixed Spring Context Test in spring-data-rest-querydsl module * fixed spring-ejb/spring-ejb-client Context tests, removed ContextIntegrationTest and added a note to the ContextLiveTest. Plus, redefined spring-ejb-remote url in pom, it was not working properly' * Fixed Context test in spring-remoting/remoting-jms/remoting-jms-server, added notes for Live Test * Fixed Context test in spring-remoting/remoting-rmi\remoting-rmi-server, added notes for Live Test * Fixed Context test in spring-rest-query-language, added note for ContextTest and deleter ContextIntegrationTest * renamed SpringContextIntegrationTest to SpringContextTest, as per comment in BAEL-14304 --- spring-data-rest-querydsl/pom.xml | 8 ++++++- .../main/java/com/baeldung/Application.java | 3 +++ .../baeldung/SpringContextTest.java} | 8 +++++-- .../org/baeldung/SpringContextLiveTest.java | 17 -------------- .../src/test/resources/application.yml | 11 +++++++++ .../baeldung/SpringContextLiveTest.java | 7 +++++- .../SpringContextIntegrationTest.java | 17 -------------- spring-ejb/spring-ejb-remote/pom.xml | 9 ++++---- .../com/baeldung/SpringContextLiveTest.java | 23 +++++++++++++++++++ .../org/baeldung/SpringContextManualTest.java | 17 -------------- .../baeldung/SpringContextLiveTest.java | 8 ++++++- .../SpringContextIntegrationTest.java | 17 -------------- .../java/com/baeldung/SpringContextTest.java | 4 ++++ 13 files changed, 72 insertions(+), 77 deletions(-) rename spring-data-rest-querydsl/src/test/java/{org/baeldung/SpringContextIntegrationTest.java => com/baeldung/SpringContextTest.java} (60%) delete mode 100644 spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextLiveTest.java create mode 100644 spring-data-rest-querydsl/src/test/resources/application.yml rename spring-ejb/spring-ejb-client/src/test/java/{org => com}/baeldung/SpringContextLiveTest.java (71%) delete mode 100644 spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java create mode 100644 spring-remoting/remoting-jms/remoting-jms-server/src/test/java/com/baeldung/SpringContextLiveTest.java delete mode 100644 spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java rename spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/{org => com}/baeldung/SpringContextLiveTest.java (56%) delete mode 100644 spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java diff --git a/spring-data-rest-querydsl/pom.xml b/spring-data-rest-querydsl/pom.xml index 55ff78f0cb..2c75990c65 100644 --- a/spring-data-rest-querydsl/pom.xml +++ b/spring-data-rest-querydsl/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 com.baeldung @@ -44,6 +45,11 @@ spring-boot-starter-test test + + com.h2database + h2 + test + diff --git a/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java b/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java index 28d084a4dc..4b2f567090 100644 --- a/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java +++ b/spring-data-rest-querydsl/src/main/java/com/baeldung/Application.java @@ -13,6 +13,9 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import javax.annotation.PostConstruct; +/** + * Note: In the IDE, remember to generate query type classes before running the Integration Test (e.g. in Eclipse right-click on the project > Run As > Maven generate sources) + */ @SpringBootApplication @EntityScan("com.baeldung.entity") @EnableJpaRepositories("com.baeldung.controller.repository") diff --git a/spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java similarity index 60% rename from spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java index 7f906bdbcd..48c4630fa5 100644 --- a/spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-data-rest-querydsl/src/test/java/com/baeldung/SpringContextTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; @@ -7,9 +7,13 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.Application; +/** + * Note: In the IDE, remember to generate query type classes before running the Integration Test (e.g. in Eclipse right-click on the project > Run As > Maven generate sources) + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) -public class SpringContextIntegrationTest { +public class SpringContextTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextLiveTest.java deleted file mode 100644 index 5cb0a8167e..0000000000 --- a/spring-data-rest-querydsl/src/test/java/org/baeldung/SpringContextLiveTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.Application; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class SpringContextLiveTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-data-rest-querydsl/src/test/resources/application.yml b/spring-data-rest-querydsl/src/test/resources/application.yml new file mode 100644 index 0000000000..33b7231838 --- /dev/null +++ b/spring-data-rest-querydsl/src/test/resources/application.yml @@ -0,0 +1,11 @@ +spring: + datasource: + url: jdbc:h2:mem:springcloud + username: sa + password: + jpa: + hibernate: + ddl-auto: create-drop + properties: + hibernate: + dialect: org.hibernate.dialect.H2Dialect \ No newline at end of file diff --git a/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-ejb/spring-ejb-client/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 71% rename from spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-ejb/spring-ejb-client/src/test/java/com/baeldung/SpringContextLiveTest.java index bbd3b6c2ba..4d6724f10f 100644 --- a/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-ejb/spring-ejb-client/src/test/java/com/baeldung/SpringContextLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; @@ -7,6 +7,11 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.springejbclient.SpringEjbClientApplication; +/** + * This Live Test requires: + * * run the `spring-ejb-remote` module with the following command: `mvn clean package cargo:run -Pwildfly-standalone` + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringEjbClientApplication.class) public class SpringContextLiveTest { diff --git a/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 4d2d83646d..0000000000 --- a/spring-ejb/spring-ejb-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.springejbclient.SpringEjbClientApplication; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringEjbClientApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-ejb/spring-ejb-remote/pom.xml b/spring-ejb/spring-ejb-remote/pom.xml index 4f4ddb0b54..4a365180f2 100644 --- a/spring-ejb/spring-ejb-remote/pom.xml +++ b/spring-ejb/spring-ejb-remote/pom.xml @@ -1,11 +1,12 @@ - 4.0.0 spring-ejb-remote - spring-ejb-remote + spring-ejb-remote ejb - + com.baeldung.spring.ejb spring-ejb @@ -46,7 +47,7 @@ wildfly10x - http://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.zip + https://download.jboss.org/wildfly/12.0.0.Final/wildfly-12.0.0.Final.zip diff --git a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/com/baeldung/SpringContextLiveTest.java b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/com/baeldung/SpringContextLiveTest.java new file mode 100644 index 0000000000..4904873be2 --- /dev/null +++ b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/com/baeldung/SpringContextLiveTest.java @@ -0,0 +1,23 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.server.JmsServer; + +/** + * This Live Test requires: + * * the `com.baeldung:remoting-http-api:jar:1.0-SNAPSHOT` artifact accessible. For that we can run `mvn clean install` in the 'spring-remoting/remoting-http/remoting-http-api' module. + * * an ActiveMQ instance running (e.g. `docker run -p 61616:61616 -p 8161:8161 --name bael-activemq rmohr/activemq`) + * + */ +@SpringBootTest(classes = JmsServer.class) +@RunWith(SpringRunner.class) +public class SpringContextLiveTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java deleted file mode 100644 index b806f21c27..0000000000 --- a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.server.JmsServer; - -@SpringBootTest(classes = JmsServer.class) -@RunWith(SpringRunner.class) -public class SpringContextManualTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/com/baeldung/SpringContextLiveTest.java similarity index 56% rename from spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/com/baeldung/SpringContextLiveTest.java index 3bace4cd1e..73f7592dcc 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/com/baeldung/SpringContextLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; @@ -7,6 +7,12 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.client.RmiClient; +/** + * This Live Test requires: + * * the `com.baeldung:remoting-http-api:jar:1.0-SNAPSHOT` artifact accessible. For that we can run `mvn clean install` in the 'spring-remoting/remoting-http/remoting-http-api' module. + * * the 'spring-remoting\remoting-rmi\remoting-rmi-server' service running + * + */ @SpringBootTest(classes = RmiClient.class) @RunWith(SpringRunner.class) public class SpringContextLiveTest { diff --git a/spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 18fabce5ca..0000000000 --- a/spring-rest-query-language/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.spring.Application; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java b/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java index 57886a232a..de83fb663a 100644 --- a/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-rest-query-language/src/test/java/com/baeldung/SpringContextTest.java @@ -7,6 +7,10 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.spring.Application; +/** + * Note: In the IDE, remember to generate query type classes before running the Integration Test (e.g. in Eclipse right-click on the project > Run As > Maven generate sources) + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class SpringContextTest { From 7d412feca534a00077fa2c98d647ddb6088523fc Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 9 Sep 2019 18:08:25 +0530 Subject: [PATCH 160/396] BAEL-17397 Slice 15 | The top 100 articles should have their own package in the module (#7742) --- .../com/baeldung/{custom => changeport}/CustomApplication.java | 2 +- .../baeldung/{custom => changeport}/ServerPortCustomizer.java | 2 +- .../test/java/com/baeldung/SpringContextIntegrationTest.java | 2 +- spring-rest/src/test/java/com/baeldung/SpringContextTest.java | 2 +- .../com/baeldung/{ => session}/SpringSessionApplication.java | 2 +- .../baeldung/{security => session/filter}/SessionFilter.java | 2 +- .../{spring => session/security/config}/SecSecurityConfig.java | 2 +- .../com/baeldung/{ => session}/web/SessionRestController.java | 2 +- .../com/baeldung/{spring => session/web/config}/MvcConfig.java | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) rename spring-rest/src/main/java/com/baeldung/{custom => changeport}/CustomApplication.java (93%) rename spring-rest/src/main/java/com/baeldung/{custom => changeport}/ServerPortCustomizer.java (92%) rename spring-security-mvc/src/main/java/com/baeldung/{ => session}/SpringSessionApplication.java (91%) rename spring-security-mvc/src/main/java/com/baeldung/{security => session/filter}/SessionFilter.java (97%) rename spring-security-mvc/src/main/java/com/baeldung/{spring => session/security/config}/SecSecurityConfig.java (98%) rename spring-security-mvc/src/main/java/com/baeldung/{ => session}/web/SessionRestController.java (93%) rename spring-security-mvc/src/main/java/com/baeldung/{spring => session/web/config}/MvcConfig.java (96%) diff --git a/spring-rest/src/main/java/com/baeldung/custom/CustomApplication.java b/spring-rest/src/main/java/com/baeldung/changeport/CustomApplication.java similarity index 93% rename from spring-rest/src/main/java/com/baeldung/custom/CustomApplication.java rename to spring-rest/src/main/java/com/baeldung/changeport/CustomApplication.java index 75f4d714e2..3fce0f1289 100644 --- a/spring-rest/src/main/java/com/baeldung/custom/CustomApplication.java +++ b/spring-rest/src/main/java/com/baeldung/changeport/CustomApplication.java @@ -1,4 +1,4 @@ -package com.baeldung.custom; +package com.baeldung.changeport; import java.util.Collections; diff --git a/spring-rest/src/main/java/com/baeldung/custom/ServerPortCustomizer.java b/spring-rest/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java similarity index 92% rename from spring-rest/src/main/java/com/baeldung/custom/ServerPortCustomizer.java rename to spring-rest/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java index 978e7c8a82..f3610aeac6 100644 --- a/spring-rest/src/main/java/com/baeldung/custom/ServerPortCustomizer.java +++ b/spring-rest/src/main/java/com/baeldung/changeport/ServerPortCustomizer.java @@ -1,4 +1,4 @@ -package com.baeldung.custom; +package com.baeldung.changeport; import org.springframework.boot.web.server.ConfigurableWebServerFactory; import org.springframework.boot.web.server.WebServerFactoryCustomizer; diff --git a/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java index f04106c1e1..3c2cde4268 100644 --- a/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -5,7 +5,7 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.custom.CustomApplication; +import com.baeldung.changeport.CustomApplication; import com.baeldung.produceimage.ImageApplication; import com.baeldung.propertyeditor.PropertyEditorApplication; import com.baeldung.responseheaders.ResponseHeadersApplication; diff --git a/spring-rest/src/test/java/com/baeldung/SpringContextTest.java b/spring-rest/src/test/java/com/baeldung/SpringContextTest.java index 4b2024e207..0f39fc3983 100644 --- a/spring-rest/src/test/java/com/baeldung/SpringContextTest.java +++ b/spring-rest/src/test/java/com/baeldung/SpringContextTest.java @@ -5,7 +5,7 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; -import com.baeldung.custom.CustomApplication; +import com.baeldung.changeport.CustomApplication; import com.baeldung.produceimage.ImageApplication; import com.baeldung.propertyeditor.PropertyEditorApplication; import com.baeldung.responseheaders.ResponseHeadersApplication; diff --git a/spring-security-mvc/src/main/java/com/baeldung/SpringSessionApplication.java b/spring-security-mvc/src/main/java/com/baeldung/session/SpringSessionApplication.java similarity index 91% rename from spring-security-mvc/src/main/java/com/baeldung/SpringSessionApplication.java rename to spring-security-mvc/src/main/java/com/baeldung/session/SpringSessionApplication.java index c2a4b35df0..ec1ba8dcd9 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/SpringSessionApplication.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/SpringSessionApplication.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.session; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-security-mvc/src/main/java/com/baeldung/security/SessionFilter.java b/spring-security-mvc/src/main/java/com/baeldung/session/filter/SessionFilter.java similarity index 97% rename from spring-security-mvc/src/main/java/com/baeldung/security/SessionFilter.java rename to spring-security-mvc/src/main/java/com/baeldung/session/filter/SessionFilter.java index f4f876af9c..c30bfa5506 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/security/SessionFilter.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/filter/SessionFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.security; +package com.baeldung.session.filter; import java.io.IOException; import java.util.Arrays; diff --git a/spring-security-mvc/src/main/java/com/baeldung/spring/SecSecurityConfig.java b/spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java similarity index 98% rename from spring-security-mvc/src/main/java/com/baeldung/spring/SecSecurityConfig.java rename to spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java index a922ba6f7f..35b53a0e7f 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/spring/SecSecurityConfig.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/security/config/SecSecurityConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring; +package com.baeldung.session.security.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/spring-security-mvc/src/main/java/com/baeldung/web/SessionRestController.java b/spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java similarity index 93% rename from spring-security-mvc/src/main/java/com/baeldung/web/SessionRestController.java rename to spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java index 1353ee25d0..82199a9e4e 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/web/SessionRestController.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/web/SessionRestController.java @@ -1,4 +1,4 @@ -package com.baeldung.web; +package com.baeldung.session.web; import javax.servlet.http.HttpSession; diff --git a/spring-security-mvc/src/main/java/com/baeldung/spring/MvcConfig.java b/spring-security-mvc/src/main/java/com/baeldung/session/web/config/MvcConfig.java similarity index 96% rename from spring-security-mvc/src/main/java/com/baeldung/spring/MvcConfig.java rename to spring-security-mvc/src/main/java/com/baeldung/session/web/config/MvcConfig.java index 38a4f3f81b..4db6d07872 100644 --- a/spring-security-mvc/src/main/java/com/baeldung/spring/MvcConfig.java +++ b/spring-security-mvc/src/main/java/com/baeldung/session/web/config/MvcConfig.java @@ -1,4 +1,4 @@ -package com.baeldung.spring; +package com.baeldung.session.web.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; From ba001ed4a2076714a9f3389c99a562e923211625 Mon Sep 17 00:00:00 2001 From: Nick Date: Mon, 9 Sep 2019 13:57:25 +0100 Subject: [PATCH 161/396] Examples for 'Finding the difference between two strings in Java' (#7625) * initial commit * Reformatting and addressing review comments * Examples for 'Finding the difference between two strings in Java' * Removing evaluation article code * Adding benchmarks * Removing performance tests from unit test class * upgrading diff-match-patch version * making benchmark methods return a value * Moving code to java-strings-3 * Moving stuff around * New unit test format --- java-strings-3/pom.xml | 6 ++ .../StringDiffBenchmarkUnitTest.java | 73 +++++++++++++++++++ .../stringdiff/StringDiffUnitTest.java | 39 ++++++++++ 3 files changed, 118 insertions(+) create mode 100644 java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java create mode 100644 java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java diff --git a/java-strings-3/pom.xml b/java-strings-3/pom.xml index 1e5f757943..4589780c15 100644 --- a/java-strings-3/pom.xml +++ b/java-strings-3/pom.xml @@ -68,6 +68,12 @@ ${assertj.version} test + + org.bitbucket.cowwoc + diff-match-patch + 1.2 + test + diff --git a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java new file mode 100644 index 0000000000..20e87a1f4e --- /dev/null +++ b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffBenchmarkUnitTest.java @@ -0,0 +1,73 @@ +package com.baeldung.stringdiff; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +@State(Scope.Benchmark) +public class StringDiffBenchmarkUnitTest { + + private DiffMatchPatch diffMatchPatch = new DiffMatchPatch(); + + private List inputs = randomizeInputs(10000); + + public static void main(String[] args) throws RunnerException { + Options opts = new OptionsBuilder().include(".*") + .warmupIterations(1) + .measurementIterations(50) + .jvmArgs("-Xms2g", "-Xmx2g") + .shouldDoGC(true) + .forks(1) + .build(); + + new Runner(opts).run(); + } + + @Benchmark + public int diffMatchPatch() { + for (int i = 0; i < inputs.size() - 1; i++) { + diffMatchPatch.diffMain(inputs.get(i), inputs.get(i + 1), false); + } + return inputs.size(); + } + + @Benchmark + public int stringUtils() { + for (int i = 0; i < inputs.size() - 1; i++) { + StringUtils.difference(inputs.get(i), inputs.get(i + 1)); + } + return inputs.size(); + } + + /** + * Creates a list of a given size, containing 30 character long strings, + * each starting with a static prefix of 10 characters and followed by + * a random 20 character suffix + * + * @return a {@link List} of randomised strings + */ + private List randomizeInputs(int size) { + String staticPart = "ABCDEF1234"; + List inputs = new ArrayList<>(); + for (int i = 0; i < size; i++) { + inputs.add(staticPart + RandomStringUtils.randomAlphabetic(20)); + } + return inputs; + } +} diff --git a/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java new file mode 100644 index 0000000000..94b7deb64d --- /dev/null +++ b/java-strings-3/src/test/java/com/baeldung/stringdiff/StringDiffUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.stringdiff; + +import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; + +import org.apache.commons.lang3.StringUtils; +import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch; +import org.bitbucket.cowwoc.diffmatchpatch.DiffMatchPatch.Operation; +import org.junit.Test; + +public class StringDiffUnitTest { + + private DiffMatchPatch diffMatchPatch = new DiffMatchPatch(); + + // Test samples + private final String text1 = "ABCDELMN"; + private final String text2 = "ABCFGLMN"; + + @Test + public void givenTwoStrings_whenDiffMatchPatch_thenReturnCorrectDiff() { + assertThat(diffMatchPatch.diffMain(text1, text2, false), containsInAnyOrder( + new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"), + new DiffMatchPatch.Diff(Operation.DELETE, "DE"), + new DiffMatchPatch.Diff(Operation.INSERT, "FG"), + new DiffMatchPatch.Diff(Operation.EQUAL, "LMN"))); + assertThat(diffMatchPatch.diffMain(text2, text1, false), containsInAnyOrder( + new DiffMatchPatch.Diff(Operation.EQUAL, "ABC"), + new DiffMatchPatch.Diff(Operation.INSERT, "DE"), + new DiffMatchPatch.Diff(Operation.DELETE, "FG"), + new DiffMatchPatch.Diff(Operation.EQUAL, "LMN"))); + } + + @Test + public void givenTwoStrings_whenStringUtilsDifference_thenReturnCorrectDiff() { + assertThat(StringUtils.difference(text1, text2), is("FGLMN")); + assertThat(StringUtils.difference(text2, text1), is("DELMN")); + } +} From 284448b8c98ec270f6d94f395e77c4c7929a3f0f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 9 Sep 2019 18:50:01 +0530 Subject: [PATCH 162/396] BAEL-17438 Slice 17 | The top 100 articles should have their own package in the module (#7748) --- .../baeldung/{file => readfile}/FileOperationsManualTest.java | 2 +- .../java/com/baeldung/lombok/{getter => intro}/GetterLazy.java | 2 +- .../resttemplate/{ => postjson}/PersonAPILiveTest.java | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) rename core-java-modules/core-java-io/src/test/java/com/baeldung/{file => readfile}/FileOperationsManualTest.java (99%) rename lombok/src/main/java/com/baeldung/lombok/{getter => intro}/GetterLazy.java (96%) rename spring-resttemplate/src/test/java/org/baeldung/resttemplate/{ => postjson}/PersonAPILiveTest.java (96%) diff --git a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java b/core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/FileOperationsManualTest.java similarity index 99% rename from core-java-modules/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java rename to core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/FileOperationsManualTest.java index e781489808..b837c6b4dd 100644 --- a/core-java-modules/core-java-io/src/test/java/com/baeldung/file/FileOperationsManualTest.java +++ b/core-java-modules/core-java-io/src/test/java/com/baeldung/readfile/FileOperationsManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.file; +package com.baeldung.readfile; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; diff --git a/lombok/src/main/java/com/baeldung/lombok/getter/GetterLazy.java b/lombok/src/main/java/com/baeldung/lombok/intro/GetterLazy.java similarity index 96% rename from lombok/src/main/java/com/baeldung/lombok/getter/GetterLazy.java rename to lombok/src/main/java/com/baeldung/lombok/intro/GetterLazy.java index 604c45be3b..8397aeb759 100644 --- a/lombok/src/main/java/com/baeldung/lombok/getter/GetterLazy.java +++ b/lombok/src/main/java/com/baeldung/lombok/intro/GetterLazy.java @@ -1,4 +1,4 @@ -package com.baeldung.lombok.getter; +package com.baeldung.lombok.intro; import java.util.HashMap; import java.util.List; diff --git a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/PersonAPILiveTest.java b/spring-resttemplate/src/test/java/org/baeldung/resttemplate/postjson/PersonAPILiveTest.java similarity index 96% rename from spring-resttemplate/src/test/java/org/baeldung/resttemplate/PersonAPILiveTest.java rename to spring-resttemplate/src/test/java/org/baeldung/resttemplate/postjson/PersonAPILiveTest.java index de18f6db09..1347cb0c7a 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/resttemplate/PersonAPILiveTest.java +++ b/spring-resttemplate/src/test/java/org/baeldung/resttemplate/postjson/PersonAPILiveTest.java @@ -1,10 +1,11 @@ -package org.baeldung.resttemplate; +package org.baeldung.resttemplate.postjson; import static org.junit.Assert.assertNotNull; import java.io.IOException; import java.net.URI; +import org.baeldung.resttemplate.RestTemplateConfigurationApplication; import org.baeldung.resttemplate.web.dto.Person; import org.json.JSONException; import org.json.JSONObject; From 2f5dcfaa650894bce6bc6e11882c8acac8d696dd Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 9 Sep 2019 19:01:22 +0530 Subject: [PATCH 163/396] BAEL-17393 Slice 14 | The top 100 articles should have their own package in the module (#7729) -Moved code snippets to proper packages --- .../jackson/{ => exception}/test/JacksonExceptionsUnitTest.java | 2 +- .../ApplicationWithHikariConnectionPool.java | 2 +- .../{connectionpool => hikari}/HikariIntegrationTest.java | 2 +- .../ApplicationWithHikariConnectionPool.java | 2 +- .../{connectionpool => hikari}/HikariIntegrationTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename jackson/src/test/java/com/baeldung/jackson/{ => exception}/test/JacksonExceptionsUnitTest.java (99%) rename spring-4/src/test/java/com/baeldung/{connectionpool => hikari}/ApplicationWithHikariConnectionPool.java (89%) rename spring-4/src/test/java/com/baeldung/{connectionpool => hikari}/HikariIntegrationTest.java (95%) rename spring-5/src/test/java/com/baeldung/{connectionpool => hikari}/ApplicationWithHikariConnectionPool.java (89%) rename spring-5/src/test/java/com/baeldung/{connectionpool => hikari}/HikariIntegrationTest.java (94%) diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/exception/test/JacksonExceptionsUnitTest.java similarity index 99% rename from jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsUnitTest.java rename to jackson/src/test/java/com/baeldung/jackson/exception/test/JacksonExceptionsUnitTest.java index cd2c2925d6..dd0fe8dc56 100644 --- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonExceptionsUnitTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/exception/test/JacksonExceptionsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.jackson.test; +package com.baeldung.jackson.exception.test; import static org.hamcrest.Matchers.containsString; import static org.junit.Assert.assertEquals; diff --git a/spring-4/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java b/spring-4/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java similarity index 89% rename from spring-4/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java rename to spring-4/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java index 0bd8637681..7f8736ae87 100644 --- a/spring-4/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java +++ b/spring-4/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java @@ -1,4 +1,4 @@ -package com.baeldung.connectionpool; +package com.baeldung.hikari; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-4/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java b/spring-4/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java similarity index 95% rename from spring-4/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java rename to spring-4/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java index 0cc876d5b1..e3ed608521 100644 --- a/spring-4/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java +++ b/spring-4/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.connectionpool; +package com.baeldung.hikari; import static org.junit.Assert.*; diff --git a/spring-5/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java b/spring-5/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java similarity index 89% rename from spring-5/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java rename to spring-5/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java index 0bd8637681..7f8736ae87 100644 --- a/spring-5/src/test/java/com/baeldung/connectionpool/ApplicationWithHikariConnectionPool.java +++ b/spring-5/src/test/java/com/baeldung/hikari/ApplicationWithHikariConnectionPool.java @@ -1,4 +1,4 @@ -package com.baeldung.connectionpool; +package com.baeldung.hikari; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-5/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java b/spring-5/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java similarity index 94% rename from spring-5/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java rename to spring-5/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java index d91cca85ee..0c4b91bd8a 100644 --- a/spring-5/src/test/java/com/baeldung/connectionpool/HikariIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/hikari/HikariIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.connectionpool; +package com.baeldung.hikari; import static org.junit.Assert.*; From d5abe46c2515b0b645c5548aca2db2b025f681ac Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 9 Sep 2019 19:02:09 +0530 Subject: [PATCH 164/396] BAEL-17449 Slice 19 | The top 100 articles should have their own package in the module (#7755) --- .../baeldung/{spring/config => scopes}/ScopesConfig.java | 4 +--- .../application/Application.java | 7 ++++--- .../application/controllers/UserController.java | 7 ++++--- .../application/entities/User.java | 2 +- .../application/repositories/UserRepository.java | 5 +++-- .../application/UserControllerIntegrationTest.java | 7 ++++--- 6 files changed, 17 insertions(+), 15 deletions(-) rename spring-all/src/main/java/org/baeldung/{spring/config => scopes}/ScopesConfig.java (94%) rename spring-boot/src/main/java/com/baeldung/{validation => beanvalidation}/application/Application.java (78%) rename spring-boot/src/main/java/com/baeldung/{validation => beanvalidation}/application/controllers/UserController.java (87%) rename spring-boot/src/main/java/com/baeldung/{validation => beanvalidation}/application/entities/User.java (90%) rename spring-boot/src/main/java/com/baeldung/{validation => beanvalidation}/application/repositories/UserRepository.java (59%) rename spring-boot/src/test/java/com/baeldung/{validation => beanvalidation}/application/UserControllerIntegrationTest.java (91%) diff --git a/spring-all/src/main/java/org/baeldung/spring/config/ScopesConfig.java b/spring-all/src/main/java/org/baeldung/scopes/ScopesConfig.java similarity index 94% rename from spring-all/src/main/java/org/baeldung/spring/config/ScopesConfig.java rename to spring-all/src/main/java/org/baeldung/scopes/ScopesConfig.java index b5fe494ee2..11d3806b6e 100644 --- a/spring-all/src/main/java/org/baeldung/spring/config/ScopesConfig.java +++ b/spring-all/src/main/java/org/baeldung/scopes/ScopesConfig.java @@ -1,7 +1,5 @@ -package org.baeldung.spring.config; +package org.baeldung.scopes; -import org.baeldung.scopes.HelloMessageGenerator; -import org.baeldung.scopes.Person; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-boot/src/main/java/com/baeldung/validation/application/Application.java b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/Application.java similarity index 78% rename from spring-boot/src/main/java/com/baeldung/validation/application/Application.java rename to spring-boot/src/main/java/com/baeldung/beanvalidation/application/Application.java index af8f768193..b37eec9da0 100644 --- a/spring-boot/src/main/java/com/baeldung/validation/application/Application.java +++ b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/Application.java @@ -1,7 +1,8 @@ -package com.baeldung.validation.application; +package com.baeldung.beanvalidation.application; + +import com.baeldung.beanvalidation.application.entities.User; +import com.baeldung.beanvalidation.application.repositories.UserRepository; -import com.baeldung.validation.application.entities.User; -import com.baeldung.validation.application.repositories.UserRepository; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot/src/main/java/com/baeldung/validation/application/controllers/UserController.java b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java similarity index 87% rename from spring-boot/src/main/java/com/baeldung/validation/application/controllers/UserController.java rename to spring-boot/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java index a4aeefb70b..0c47e27e25 100644 --- a/spring-boot/src/main/java/com/baeldung/validation/application/controllers/UserController.java +++ b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/controllers/UserController.java @@ -1,7 +1,8 @@ -package com.baeldung.validation.application.controllers; +package com.baeldung.beanvalidation.application.controllers; + +import com.baeldung.beanvalidation.application.entities.User; +import com.baeldung.beanvalidation.application.repositories.UserRepository; -import com.baeldung.validation.application.entities.User; -import com.baeldung.validation.application.repositories.UserRepository; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/spring-boot/src/main/java/com/baeldung/validation/application/entities/User.java b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/entities/User.java similarity index 90% rename from spring-boot/src/main/java/com/baeldung/validation/application/entities/User.java rename to spring-boot/src/main/java/com/baeldung/beanvalidation/application/entities/User.java index 529368f132..8233d08f4e 100644 --- a/spring-boot/src/main/java/com/baeldung/validation/application/entities/User.java +++ b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/entities/User.java @@ -1,4 +1,4 @@ -package com.baeldung.validation.application.entities; +package com.baeldung.beanvalidation.application.entities; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/spring-boot/src/main/java/com/baeldung/validation/application/repositories/UserRepository.java b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java similarity index 59% rename from spring-boot/src/main/java/com/baeldung/validation/application/repositories/UserRepository.java rename to spring-boot/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java index b579addcaa..8bf7a9f8b2 100644 --- a/spring-boot/src/main/java/com/baeldung/validation/application/repositories/UserRepository.java +++ b/spring-boot/src/main/java/com/baeldung/beanvalidation/application/repositories/UserRepository.java @@ -1,8 +1,9 @@ -package com.baeldung.validation.application.repositories; +package com.baeldung.beanvalidation.application.repositories; -import com.baeldung.validation.application.entities.User; import org.springframework.data.repository.CrudRepository; import org.springframework.stereotype.Repository; +import com.baeldung.beanvalidation.application.entities.User; + @Repository public interface UserRepository extends CrudRepository {} diff --git a/spring-boot/src/test/java/com/baeldung/validation/application/UserControllerIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java similarity index 91% rename from spring-boot/src/test/java/com/baeldung/validation/application/UserControllerIntegrationTest.java rename to spring-boot/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java index 77a230ee6c..07d9b0807e 100644 --- a/spring-boot/src/test/java/com/baeldung/validation/application/UserControllerIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/beanvalidation/application/UserControllerIntegrationTest.java @@ -1,7 +1,8 @@ -package com.baeldung.validation.application; +package com.baeldung.beanvalidation.application; + +import com.baeldung.beanvalidation.application.controllers.UserController; +import com.baeldung.beanvalidation.application.repositories.UserRepository; -import com.baeldung.validation.application.controllers.UserController; -import com.baeldung.validation.application.repositories.UserRepository; import java.nio.charset.Charset; import static org.assertj.core.api.Assertions.assertThat; import org.hamcrest.core.Is; From 5ba18b2ec7853b52ad7210dc8a26f58dc660ead4 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Mon, 9 Sep 2019 21:45:01 -0500 Subject: [PATCH 165/396] BAEL-3149 and BAEL-3043 add links back to articles (#7765) * BAEL-2246: add link back to article * BAEL-2174: rename core-java-net module to core-java-networking * BAEL-2174: add link back to article * BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 add links back to articles * BAEL-2367: add link back to article * BAEL-2335: add link back to article * BAEL-2413: add link back to article * Update README.MD * BAEL-2577: add link back to article * BAEL-2490: add link back to article * BAEL-2471: add link back to article * BAEL-2583: add link back to article * BAEL-2738: add link back to article * BAEL-2711: Add spring-boot-angular module to root pom * BAEL-2544 BAEL-2711 BAEL-2575 BAEL-2657 Add links back to articles * BAEL-2736: Add link back to article * BAEL-2789: Add link back to article * BAEL-2489: add link back to article * BAEL-2840: add link back to article * BAEL-2655: add link back to article * BAEL-2884: add link back to article * BAEL-2985: Fix Spring Boot Apps in spring-data-rest module * BAEL-2898 BAEL-3057 BAEL-3020 add links back to articles * BAEL-3126 BAEL-2463 README * BAEL-2989: add README * BAEL-3149 BAEL-3043 update README --- core-java-modules/core-java-lang-oop-2/README.md | 1 + persistence-modules/java-cassandra/README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md index 72c3c6742b..5c615c25df 100644 --- a/core-java-modules/core-java-lang-oop-2/README.md +++ b/core-java-modules/core-java-lang-oop-2/README.md @@ -7,3 +7,4 @@ - [Cannot Reference “X” Before Supertype Constructor Has Been Called](https://www.baeldung.com/java-cannot-reference-x-before-supertype-constructor-error) - [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes) - [Raw Types in Java](https://www.baeldung.com/raw-types-java) +- [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword) diff --git a/persistence-modules/java-cassandra/README.md b/persistence-modules/java-cassandra/README.md index 3ab6f5f099..f3710c9d69 100644 --- a/persistence-modules/java-cassandra/README.md +++ b/persistence-modules/java-cassandra/README.md @@ -1,2 +1,3 @@ ### Relevant Articles: - [A Guide to Cassandra with Java](http://www.baeldung.com/cassandra-with-java) +- [Intro to DataStax Java Driver for Apache Cassandra](https://www.baeldung.com/cassandra-datastax-java-driver) From e48b29d58c714ed79b09e1a9a21fc5c1302f6ad7 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Tue, 10 Sep 2019 11:35:35 +0200 Subject: [PATCH 166/396] add custom interpolator --- .../interpolation/MyMessageInterpolator.java | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java new file mode 100644 index 0000000000..8251138b9b --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java @@ -0,0 +1,28 @@ +package com.baeldung.interpolation; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.validation.MessageInterpolator; +import java.util.Locale; + +public class MyMessageInterpolator implements MessageInterpolator { + + private static Logger logger = LoggerFactory.getLogger(MyMessageInterpolator.class); + + private final MessageInterpolator defaultInterpolator; + + public MyMessageInterpolator(MessageInterpolator interpolator) { + this.defaultInterpolator = interpolator; + } + + @Override + public String interpolate(String messageTemplate, Context context) { + logger.debug("Selecting the language " + Locale.getDefault() + " for the error message."); + return defaultInterpolator.interpolate(messageTemplate, context, Locale.getDefault()); + } + + @Override + public String interpolate(String messageTemplate, Context context, Locale locale) { + return defaultInterpolator.interpolate(messageTemplate, context, locale); + } +} From 4cfb4b8d252c3fe0ac5675652fd4d3d1174e185f Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 10 Sep 2019 17:12:41 +0530 Subject: [PATCH 167/396] BAEL-17439 Slice 18 | The top 100 articles should have their own package in the module (#7754) --- .../com/baeldung/{definition => springbean}/Config.java | 7 ++++--- .../{definition => springbean}/domain/Address.java | 2 +- .../{definition => springbean}/domain/Company.java | 2 +- .../SpringBeanIntegrationTest.java | 7 ++++--- 4 files changed, 10 insertions(+), 8 deletions(-) rename spring-core/src/main/java/com/baeldung/{definition => springbean}/Config.java (74%) rename spring-core/src/main/java/com/baeldung/{definition => springbean}/domain/Address.java (84%) rename spring-core/src/main/java/com/baeldung/{definition => springbean}/domain/Company.java (84%) rename spring-core/src/test/java/com/baeldung/{definition => springbean}/SpringBeanIntegrationTest.java (88%) diff --git a/spring-core/src/main/java/com/baeldung/definition/Config.java b/spring-core/src/main/java/com/baeldung/springbean/Config.java similarity index 74% rename from spring-core/src/main/java/com/baeldung/definition/Config.java rename to spring-core/src/main/java/com/baeldung/springbean/Config.java index 126e6259ca..27275dbb0f 100644 --- a/spring-core/src/main/java/com/baeldung/definition/Config.java +++ b/spring-core/src/main/java/com/baeldung/springbean/Config.java @@ -1,11 +1,12 @@ -package com.baeldung.definition; +package com.baeldung.springbean; -import com.baeldung.definition.domain.Address; -import com.baeldung.definition.domain.Company; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import com.baeldung.springbean.domain.Address; +import com.baeldung.springbean.domain.Company; + @Configuration @ComponentScan(basePackageClasses = Company.class) public class Config { diff --git a/spring-core/src/main/java/com/baeldung/definition/domain/Address.java b/spring-core/src/main/java/com/baeldung/springbean/domain/Address.java similarity index 84% rename from spring-core/src/main/java/com/baeldung/definition/domain/Address.java rename to spring-core/src/main/java/com/baeldung/springbean/domain/Address.java index 91be18398e..5704be4bf8 100644 --- a/spring-core/src/main/java/com/baeldung/definition/domain/Address.java +++ b/spring-core/src/main/java/com/baeldung/springbean/domain/Address.java @@ -1,4 +1,4 @@ -package com.baeldung.definition.domain; +package com.baeldung.springbean.domain; import lombok.Data; diff --git a/spring-core/src/main/java/com/baeldung/definition/domain/Company.java b/spring-core/src/main/java/com/baeldung/springbean/domain/Company.java similarity index 84% rename from spring-core/src/main/java/com/baeldung/definition/domain/Company.java rename to spring-core/src/main/java/com/baeldung/springbean/domain/Company.java index eabde8afdf..68c177dab7 100644 --- a/spring-core/src/main/java/com/baeldung/definition/domain/Company.java +++ b/spring-core/src/main/java/com/baeldung/springbean/domain/Company.java @@ -1,4 +1,4 @@ -package com.baeldung.definition.domain; +package com.baeldung.springbean.domain; import lombok.Data; import org.springframework.stereotype.Component; diff --git a/spring-core/src/test/java/com/baeldung/definition/SpringBeanIntegrationTest.java b/spring-core/src/test/java/com/baeldung/springbean/SpringBeanIntegrationTest.java similarity index 88% rename from spring-core/src/test/java/com/baeldung/definition/SpringBeanIntegrationTest.java rename to spring-core/src/test/java/com/baeldung/springbean/SpringBeanIntegrationTest.java index 0057611308..e148ab2dd9 100644 --- a/spring-core/src/test/java/com/baeldung/definition/SpringBeanIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/springbean/SpringBeanIntegrationTest.java @@ -1,11 +1,12 @@ -package com.baeldung.definition; +package com.baeldung.springbean; + +import static org.junit.Assert.assertEquals; -import com.baeldung.definition.domain.Company; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import static org.junit.Assert.assertEquals; +import com.baeldung.springbean.domain.Company; public class SpringBeanIntegrationTest { @Test From fe94b6237563a786e674cb1542a87d9ffd9ed29e Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Tue, 10 Sep 2019 17:13:16 +0530 Subject: [PATCH 168/396] BAEL-17450 Slice 20 | The top 100 articles should have their own package in the module (#7757) --- .../java/org/baeldung/{web => errorhandling}/ApiError.java | 2 +- .../{web => errorhandling}/CustomRestExceptionHandler.java | 2 +- .../java/org/baeldung/{web => errorhandling}/FooLiveTest.java | 4 +++- .../baeldung/mockito/{ => spy}/MockitoSpyIntegrationTest.java | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) rename spring-security-rest/src/main/java/org/baeldung/{web => errorhandling}/ApiError.java (97%) rename spring-security-rest/src/main/java/org/baeldung/{web => errorhandling}/CustomRestExceptionHandler.java (99%) rename spring-security-rest/src/test/java/org/baeldung/{web => errorhandling}/FooLiveTest.java (96%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{ => spy}/MockitoSpyIntegrationTest.java (98%) diff --git a/spring-security-rest/src/main/java/org/baeldung/web/ApiError.java b/spring-security-rest/src/main/java/org/baeldung/errorhandling/ApiError.java similarity index 97% rename from spring-security-rest/src/main/java/org/baeldung/web/ApiError.java rename to spring-security-rest/src/main/java/org/baeldung/errorhandling/ApiError.java index e1c58da64a..8a1ddd8882 100644 --- a/spring-security-rest/src/main/java/org/baeldung/web/ApiError.java +++ b/spring-security-rest/src/main/java/org/baeldung/errorhandling/ApiError.java @@ -1,4 +1,4 @@ -package org.baeldung.web; +package org.baeldung.errorhandling; import java.util.Arrays; import java.util.List; diff --git a/spring-security-rest/src/main/java/org/baeldung/web/CustomRestExceptionHandler.java b/spring-security-rest/src/main/java/org/baeldung/errorhandling/CustomRestExceptionHandler.java similarity index 99% rename from spring-security-rest/src/main/java/org/baeldung/web/CustomRestExceptionHandler.java rename to spring-security-rest/src/main/java/org/baeldung/errorhandling/CustomRestExceptionHandler.java index 71b1a4775e..cd4d58e60c 100644 --- a/spring-security-rest/src/main/java/org/baeldung/web/CustomRestExceptionHandler.java +++ b/spring-security-rest/src/main/java/org/baeldung/errorhandling/CustomRestExceptionHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.web; +package org.baeldung.errorhandling; import java.util.ArrayList; import java.util.List; diff --git a/spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java b/spring-security-rest/src/test/java/org/baeldung/errorhandling/FooLiveTest.java similarity index 96% rename from spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java rename to spring-security-rest/src/test/java/org/baeldung/errorhandling/FooLiveTest.java index 86beeb46a9..8d1db5736f 100644 --- a/spring-security-rest/src/test/java/org/baeldung/web/FooLiveTest.java +++ b/spring-security-rest/src/test/java/org/baeldung/errorhandling/FooLiveTest.java @@ -1,8 +1,10 @@ -package org.baeldung.web; +package org.baeldung.errorhandling; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; +import org.baeldung.errorhandling.ApiError; +import org.baeldung.web.TestConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.http.HttpStatus; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyIntegrationTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyIntegrationTest.java index 118d50ea40..d0b838a789 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoSpyIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package org.baeldung.mockito.spy; import static org.junit.Assert.assertEquals; From dc1cd98cd01e3739a5399f758d0fe4da108f2f01 Mon Sep 17 00:00:00 2001 From: Vivek Date: Tue, 10 Sep 2019 20:06:37 +0530 Subject: [PATCH 169/396] BAEL-3194: Radix Sort in Java (changed the method name to comply with site standards) (#7761) --- .../main/java/com/baeldung/algorithms/radixsort/RadixSort.java | 2 +- .../com/baeldung/algorithms/radixsort/RadixSortUnitTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java index 26c5c9a486..723a2f5a80 100644 --- a/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java +++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/radixsort/RadixSort.java @@ -29,7 +29,7 @@ public class RadixSort { frequency[digit]++; } - for (int i = 1; i < 10; i++) { + for (int i = 1; i < range; i++) { frequency[i] += frequency[i - 1]; } diff --git a/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java index f1b50f5c99..0f6c751ade 100644 --- a/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java +++ b/algorithms-sorting/src/test/java/com/baeldung/algorithms/radixsort/RadixSortUnitTest.java @@ -7,7 +7,7 @@ import org.junit.Test; public class RadixSortUnitTest { @Test - public void givenUnsortedArrayWhenRadixSortThenArraySorted() { + public void givenUnsortedArray_whenRadixSort_thenArraySorted() { int[] numbers = { 387, 468, 134, 123, 68, 221, 769, 37, 7 }; RadixSort.sort(numbers); int[] numbersSorted = { 7, 37, 68, 123, 134, 221, 387, 468, 769 }; From 4a3ca6804797f8364db4caf5686a5fa04df2e8cf Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Tue, 10 Sep 2019 16:52:28 +0100 Subject: [PATCH 170/396] [BAEL-16643] Split guava module --- guava-io/README.md | 4 +++ guava-io/pom.xml | 26 +++++++++++++++++++ .../GuavaCountingOutputStreamUnitTest.java | 0 .../com}/baeldung/guava/GuavaIOUnitTest.java | 0 guava/README.md | 9 ++----- guava/pom.xml | 9 +------ libraries-testing/README.md | 4 ++- libraries-testing/pom.xml | 8 ++++++ .../java/com}/baeldung/hamcrest/Animal.java | 0 .../test/java/com}/baeldung/hamcrest/Cat.java | 0 .../hamcrest/HamcrestMatcherUnitTest.java | 0 .../baeldung/hamcrest/IsPositiveInteger.java | 0 .../java/com}/baeldung/hamcrest/Person.java | 0 .../java/com}/baeldung/hamcrest/README.md | 0 pom.xml | 2 ++ 15 files changed, 46 insertions(+), 16 deletions(-) create mode 100644 guava-io/README.md create mode 100644 guava-io/pom.xml rename {guava/src/test/java/org => guava-io/src/main/test/java/com}/baeldung/guava/GuavaCountingOutputStreamUnitTest.java (100%) rename {guava/src/test/java/org => guava-io/src/main/test/java/com}/baeldung/guava/GuavaIOUnitTest.java (100%) rename {guava/src/test/java/org => libraries-testing/src/test/java/com}/baeldung/hamcrest/Animal.java (100%) rename {guava/src/test/java/org => libraries-testing/src/test/java/com}/baeldung/hamcrest/Cat.java (100%) rename {guava/src/test/java/org => libraries-testing/src/test/java/com}/baeldung/hamcrest/HamcrestMatcherUnitTest.java (100%) rename {guava/src/test/java/org => libraries-testing/src/test/java/com}/baeldung/hamcrest/IsPositiveInteger.java (100%) rename {guava/src/test/java/org => libraries-testing/src/test/java/com}/baeldung/hamcrest/Person.java (100%) rename {guava/src/test/java/org => libraries-testing/src/test/java/com}/baeldung/hamcrest/README.md (100%) diff --git a/guava-io/README.md b/guava-io/README.md new file mode 100644 index 0000000000..df7775a36d --- /dev/null +++ b/guava-io/README.md @@ -0,0 +1,4 @@ +### Relevant Articles: + +- [Using Guava CountingOutputStream](http://www.baeldung.com/guava-counting-outputstream) +- [Guava – Write to File, Read from File](http://www.baeldung.com/guava-write-to-file-read-from-file) diff --git a/guava-io/pom.xml b/guava-io/pom.xml new file mode 100644 index 0000000000..2a66baba80 --- /dev/null +++ b/guava-io/pom.xml @@ -0,0 +1,26 @@ + + 4.0.0 + com.baeldung + guava-io + 0.1.0-SNAPSHOT + guava-io + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + guava-io + + + src/main/resources + true + + + + + \ No newline at end of file diff --git a/guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamUnitTest.java b/guava-io/src/main/test/java/com/baeldung/guava/GuavaCountingOutputStreamUnitTest.java similarity index 100% rename from guava/src/test/java/org/baeldung/guava/GuavaCountingOutputStreamUnitTest.java rename to guava-io/src/main/test/java/com/baeldung/guava/GuavaCountingOutputStreamUnitTest.java diff --git a/guava/src/test/java/org/baeldung/guava/GuavaIOUnitTest.java b/guava-io/src/main/test/java/com/baeldung/guava/GuavaIOUnitTest.java similarity index 100% rename from guava/src/test/java/org/baeldung/guava/GuavaIOUnitTest.java rename to guava-io/src/main/test/java/com/baeldung/guava/GuavaIOUnitTest.java diff --git a/guava/README.md b/guava/README.md index 60754dbe57..d3bbbf6de5 100644 --- a/guava/README.md +++ b/guava/README.md @@ -1,11 +1,8 @@ -========= - -## Guava and Hamcrest Cookbooks and Examples +## Guava Examples ### Relevant Articles: - [Guava Functional Cookbook](http://www.baeldung.com/guava-functions-predicates) -- [Guava – Write to File, Read from File](http://www.baeldung.com/guava-write-to-file-read-from-file) - [Guide to Guava’s Ordering](http://www.baeldung.com/guava-ordering) - [Guide to Guava’s PreConditions](http://www.baeldung.com/guava-preconditions) - [Introduction to Guava CacheLoader](http://www.baeldung.com/guava-cacheloader) @@ -14,7 +11,5 @@ - [Guide to Guava’s Reflection Utilities](http://www.baeldung.com/guava-reflection) - [Guide to Mathematical Utilities in Guava](http://www.baeldung.com/guava-math) - [Bloom Filter in Java using Guava](http://www.baeldung.com/guava-bloom-filter) -- [Using Guava CountingOutputStream](http://www.baeldung.com/guava-counting-outputstream) -- [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers) - [Quick Guide to the Guava RateLimiter](http://www.baeldung.com/guava-rate-limiter) -- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers) + diff --git a/guava/pom.xml b/guava/pom.xml index 34eb7eafa6..3a19901a02 100644 --- a/guava/pom.xml +++ b/guava/pom.xml @@ -27,13 +27,7 @@ test - - - org.hamcrest - java-hamcrest - ${java-hamcrest.version} - test - + @@ -52,7 +46,6 @@ 3.6.1 - 2.0.0.0 \ No newline at end of file diff --git a/libraries-testing/README.md b/libraries-testing/README.md index 6b25a3b875..b4010056f7 100644 --- a/libraries-testing/README.md +++ b/libraries-testing/README.md @@ -5,4 +5,6 @@ - [Serenity BDD and Screenplay](http://www.baeldung.com/serenity-screenplay) - [Serenity BDD with Spring and JBehave](http://www.baeldung.com/serenity-spring-jbehave) - [Introduction to Awaitlity](http://www.baeldung.com/awaitlity-testing) -- [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) \ No newline at end of file +- [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) +- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers) +- [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers) \ No newline at end of file diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml index 8f7a27bbfa..7cc5a8f775 100644 --- a/libraries-testing/pom.xml +++ b/libraries-testing/pom.xml @@ -112,6 +112,13 @@ assertj-core ${assertj.version} + + + org.hamcrest + java-hamcrest + ${java-hamcrest.version} + test + net.serenity-bdd @@ -165,6 +172,7 @@ 4.3.8.RELEASE 3.0.3 3.6.2 + 2.0.0.0 diff --git a/guava/src/test/java/org/baeldung/hamcrest/Animal.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/Animal.java similarity index 100% rename from guava/src/test/java/org/baeldung/hamcrest/Animal.java rename to libraries-testing/src/test/java/com/baeldung/hamcrest/Animal.java diff --git a/guava/src/test/java/org/baeldung/hamcrest/Cat.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/Cat.java similarity index 100% rename from guava/src/test/java/org/baeldung/hamcrest/Cat.java rename to libraries-testing/src/test/java/com/baeldung/hamcrest/Cat.java diff --git a/guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherUnitTest.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/HamcrestMatcherUnitTest.java similarity index 100% rename from guava/src/test/java/org/baeldung/hamcrest/HamcrestMatcherUnitTest.java rename to libraries-testing/src/test/java/com/baeldung/hamcrest/HamcrestMatcherUnitTest.java diff --git a/guava/src/test/java/org/baeldung/hamcrest/IsPositiveInteger.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/IsPositiveInteger.java similarity index 100% rename from guava/src/test/java/org/baeldung/hamcrest/IsPositiveInteger.java rename to libraries-testing/src/test/java/com/baeldung/hamcrest/IsPositiveInteger.java diff --git a/guava/src/test/java/org/baeldung/hamcrest/Person.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/Person.java similarity index 100% rename from guava/src/test/java/org/baeldung/hamcrest/Person.java rename to libraries-testing/src/test/java/com/baeldung/hamcrest/Person.java diff --git a/guava/src/test/java/org/baeldung/hamcrest/README.md b/libraries-testing/src/test/java/com/baeldung/hamcrest/README.md similarity index 100% rename from guava/src/test/java/org/baeldung/hamcrest/README.md rename to libraries-testing/src/test/java/com/baeldung/hamcrest/README.md diff --git a/pom.xml b/pom.xml index 7f92acef6c..bec3d1a01a 100644 --- a/pom.xml +++ b/pom.xml @@ -442,6 +442,7 @@ grpc gson guava + guava-io guava-collections guava-collections-set guava-modules @@ -1166,6 +1167,7 @@ grpc gson guava + guava-io guava-collections guava-collections-set guava-modules From 51820357620bf80207af5fac3d37802657f4d8ce Mon Sep 17 00:00:00 2001 From: Denis Date: Sat, 31 Aug 2019 16:51:59 +0200 Subject: [PATCH 171/396] extract spring-mvc-basics-2 module --- spring-all/README.md | 3 - spring-mvc-basics-2/.gitignore | 13 ++ spring-mvc-basics-2/README.md | 11 ++ spring-mvc-basics-2/pom.xml | 37 ++++ .../java/com/baeldung/contexts/Greeting.java | 0 ...BasedApplicationAndServletInitializer.java | 1 - ...nnotationsBasedApplicationInitializer.java | 1 - .../config/ApplicationInitializer.java | 0 .../contexts/config/NormalWebAppConfig.java | 0 .../config/RootApplicationConfig.java | 0 ...BasedApplicationAndServletInitializer.java | 1 - .../contexts/config/SecureWebAppConfig.java | 0 .../contexts/normal/HelloWorldController.java | 0 .../secure/HelloWorldSecureController.java | 0 .../ApplicationContextUtilService.java | 0 .../contexts/services/GreeterService.java | 0 .../config/StudentControllerConfig.java | 60 ++++--- .../baeldung/controller/config/WebConfig.java | 54 +++--- .../controller/PassParametersController.java | 0 .../controller/RestAnnotatedController.java | 0 .../controller/controller/RestController.java | 3 +- .../controller/controller/TestController.java | 0 .../baeldung/controller/student/Student.java | 0 .../src/main/resources/application.properties | 1 + .../src/main/resources/logback.xml | 13 ++ .../src/main/resources/test-mvc.xml | 0 .../src/main/webapp/WEB-INF/greeting.xml | 0 .../src/main/webapp/WEB-INF/index.jsp | 0 .../webapp/WEB-INF/normal-webapp-servlet.xml | 0 .../webapp/WEB-INF/rootApplicationContext.xml | 0 .../webapp/WEB-INF/secure-webapp-servlet.xml | 0 .../webapp/WEB-INF/secure/view/welcome.jsp | 0 .../src/main/webapp/WEB-INF/view/sample.jsp | 0 .../webapp/WEB-INF/view/scopesExample.jsp | 0 .../main/webapp/WEB-INF/view/viewPage.html | 0 .../src/main/webapp/WEB-INF/view/welcome.jsp | 0 .../src/main/webapp/WEB-INF/web-old.xml | 0 .../src/main/webapp/WEB-INF/welcome.jsp | 0 .../src/main/webapp/index.jsp | 0 .../ControllerAnnotationIntegrationTest.java | 158 +++++++++--------- .../controller/ControllerIntegrationTest.java | 0 ...ssParametersControllerIntegrationTest.java | 0 .../src/test/resources/test-mvc.xml | 24 +++ 43 files changed, 235 insertions(+), 145 deletions(-) create mode 100644 spring-mvc-basics-2/.gitignore create mode 100644 spring-mvc-basics-2/README.md create mode 100644 spring-mvc-basics-2/pom.xml rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/Greeting.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java (94%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java (89%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java (92%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/services/ApplicationContextUtilService.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/com/baeldung/contexts/services/GreeterService.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/org/baeldung/controller/config/StudentControllerConfig.java (77%) rename {spring-all => spring-mvc-basics-2}/src/main/java/org/baeldung/controller/config/WebConfig.java (97%) rename {spring-all => spring-mvc-basics-2}/src/main/java/org/baeldung/controller/controller/PassParametersController.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/org/baeldung/controller/controller/RestAnnotatedController.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/org/baeldung/controller/controller/RestController.java (86%) rename {spring-all => spring-mvc-basics-2}/src/main/java/org/baeldung/controller/controller/TestController.java (100%) rename {spring-all => spring-mvc-basics-2}/src/main/java/org/baeldung/controller/student/Student.java (100%) create mode 100644 spring-mvc-basics-2/src/main/resources/application.properties create mode 100644 spring-mvc-basics-2/src/main/resources/logback.xml rename {spring-all => spring-mvc-basics-2}/src/main/resources/test-mvc.xml (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/greeting.xml (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/index.jsp (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/normal-webapp-servlet.xml (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/rootApplicationContext.xml (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/secure-webapp-servlet.xml (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/secure/view/welcome.jsp (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/view/sample.jsp (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/view/scopesExample.jsp (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/view/viewPage.html (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/view/welcome.jsp (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/web-old.xml (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/WEB-INF/welcome.jsp (100%) rename {spring-all => spring-mvc-basics-2}/src/main/webapp/index.jsp (100%) rename {spring-all => spring-mvc-basics-2}/src/test/java/org/baeldung/controller/ControllerAnnotationIntegrationTest.java (97%) rename {spring-all => spring-mvc-basics-2}/src/test/java/org/baeldung/controller/ControllerIntegrationTest.java (100%) rename {spring-all => spring-mvc-basics-2}/src/test/java/org/baeldung/controller/PassParametersControllerIntegrationTest.java (100%) create mode 100644 spring-mvc-basics-2/src/test/resources/test-mvc.xml diff --git a/spring-all/README.md b/spring-all/README.md index 95b87cfee1..96572c1d0e 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -15,14 +15,11 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor) - [What’s New in Spring 4.3?](http://www.baeldung.com/whats-new-in-spring-4-3) - [Running Setup Data on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring) -- [Quick Guide to Spring Controllers](http://www.baeldung.com/spring-controllers) - [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) - [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) - [A CLI with Spring Shell](http://www.baeldung.com/spring-shell-cli) - [JasperReports with Spring](http://www.baeldung.com/spring-jasper) -- [Model, ModelMap, and ModelView in Spring MVC](http://www.baeldung.com/spring-mvc-model-model-map-model-view) - [@Order in Spring](http://www.baeldung.com/spring-order) -- [Spring Web Contexts](http://www.baeldung.com/spring-web-contexts) - [Spring @Primary Annotation](http://www.baeldung.com/spring-primary) - [Spring Events](https://www.baeldung.com/spring-events) - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) diff --git a/spring-mvc-basics-2/.gitignore b/spring-mvc-basics-2/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-mvc-basics-2/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/spring-mvc-basics-2/README.md b/spring-mvc-basics-2/README.md new file mode 100644 index 0000000000..8cf753bbdc --- /dev/null +++ b/spring-mvc-basics-2/README.md @@ -0,0 +1,11 @@ +========= + +## Spring MVC Basics with Java Configuration Example Project + +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: +- [Quick Guide to Spring Controllers](http://www.baeldung.com/spring-controllers)- [The Spring @Controller and @RestController Annotations](http://www.baeldung.com/spring-controller-vs-restcontroller) +- [Model, ModelMap, and ModelView in Spring MVC](http://www.baeldung.com/spring-mvc-model-model-map-model-view) +- [Spring Web Contexts](http://www.baeldung.com/spring-web-contexts) \ No newline at end of file diff --git a/spring-mvc-basics-2/pom.xml b/spring-mvc-basics-2/pom.xml new file mode 100644 index 0000000000..706459a268 --- /dev/null +++ b/spring-mvc-basics-2/pom.xml @@ -0,0 +1,37 @@ + + + 4.0.0 + spring-mvc-basics-2 + spring-mvc-basics-2 + war + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + com.fasterxml.jackson.core + jackson-databind + + + org.springframework + spring-web + + + javax.servlet + javax.servlet-api + provided + + + org.springframework + spring-webmvc + + + + \ No newline at end of file diff --git a/spring-all/src/main/java/com/baeldung/contexts/Greeting.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/Greeting.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/contexts/Greeting.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/Greeting.java diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java similarity index 94% rename from spring-all/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java index 318dc5ea65..1dffad637a 100644 --- a/spring-all/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationAndServletInitializer.java @@ -2,7 +2,6 @@ package com.baeldung.contexts.config; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer; public class AnnotationsBasedApplicationAndServletInitializer //extends AbstractDispatcherServletInitializer { diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java similarity index 89% rename from spring-all/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java index b685d2fa83..ffa80d58bf 100644 --- a/spring-all/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/AnnotationsBasedApplicationInitializer.java @@ -1,6 +1,5 @@ package com.baeldung.contexts.config; -import org.springframework.web.context.AbstractContextLoaderInitializer; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/ApplicationInitializer.java diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/NormalWebAppConfig.java diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/RootApplicationConfig.java diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java similarity index 92% rename from spring-all/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java index d74d4a6c63..580e86d2b5 100644 --- a/spring-all/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java +++ b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/SecureAnnotationsBasedApplicationAndServletInitializer.java @@ -2,7 +2,6 @@ package com.baeldung.contexts.config; import org.springframework.web.context.WebApplicationContext; import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.servlet.support.AbstractDispatcherServletInitializer; public class SecureAnnotationsBasedApplicationAndServletInitializer// extends AbstractDispatcherServletInitializer { diff --git a/spring-all/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/config/SecureWebAppConfig.java diff --git a/spring-all/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/normal/HelloWorldController.java diff --git a/spring-all/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/secure/HelloWorldSecureController.java diff --git a/spring-all/src/main/java/com/baeldung/contexts/services/ApplicationContextUtilService.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/services/ApplicationContextUtilService.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/contexts/services/ApplicationContextUtilService.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/services/ApplicationContextUtilService.java diff --git a/spring-all/src/main/java/com/baeldung/contexts/services/GreeterService.java b/spring-mvc-basics-2/src/main/java/com/baeldung/contexts/services/GreeterService.java similarity index 100% rename from spring-all/src/main/java/com/baeldung/contexts/services/GreeterService.java rename to spring-mvc-basics-2/src/main/java/com/baeldung/contexts/services/GreeterService.java diff --git a/spring-all/src/main/java/org/baeldung/controller/config/StudentControllerConfig.java b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/config/StudentControllerConfig.java similarity index 77% rename from spring-all/src/main/java/org/baeldung/controller/config/StudentControllerConfig.java rename to spring-mvc-basics-2/src/main/java/org/baeldung/controller/config/StudentControllerConfig.java index 85305e057f..218418ecc8 100644 --- a/spring-all/src/main/java/org/baeldung/controller/config/StudentControllerConfig.java +++ b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/config/StudentControllerConfig.java @@ -1,32 +1,28 @@ -package org.baeldung.controller.config; - -import javax.servlet.ServletContext; -import javax.servlet.ServletException; -import javax.servlet.ServletRegistration; - -import org.springframework.context.support.GenericApplicationContext; -import org.springframework.web.WebApplicationInitializer; -import org.springframework.web.context.ContextLoaderListener; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; -import org.springframework.web.context.support.GenericWebApplicationContext; -import org.springframework.web.servlet.DispatcherServlet; - -public class StudentControllerConfig //implements WebApplicationInitializer -{ - - //uncomment to run the student controller example - //@Override - public void onStartup(ServletContext sc) throws ServletException { - AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); - root.register(WebConfig.class); - root.setServletContext(sc); - sc.addListener(new ContextLoaderListener(root)); - - DispatcherServlet dv = new DispatcherServlet(root); - - ServletRegistration.Dynamic appServlet = sc.addServlet("test-mvc", dv); - appServlet.setLoadOnStartup(1); - appServlet.addMapping("/test/*"); - } -} +package org.baeldung.controller.config; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import javax.servlet.ServletRegistration; + +import org.springframework.web.context.ContextLoaderListener; +import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; +import org.springframework.web.servlet.DispatcherServlet; + +public class StudentControllerConfig //implements WebApplicationInitializer +{ + + //uncomment to run the student controller example + //@Override + public void onStartup(ServletContext sc) throws ServletException { + AnnotationConfigWebApplicationContext root = new AnnotationConfigWebApplicationContext(); + root.register(WebConfig.class); + root.setServletContext(sc); + sc.addListener(new ContextLoaderListener(root)); + + DispatcherServlet dv = new DispatcherServlet(root); + + ServletRegistration.Dynamic appServlet = sc.addServlet("test-mvc", dv); + appServlet.setLoadOnStartup(1); + appServlet.addMapping("/test/*"); + } +} diff --git a/spring-all/src/main/java/org/baeldung/controller/config/WebConfig.java b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/config/WebConfig.java similarity index 97% rename from spring-all/src/main/java/org/baeldung/controller/config/WebConfig.java rename to spring-mvc-basics-2/src/main/java/org/baeldung/controller/config/WebConfig.java index a17210f3b8..485c1d9032 100644 --- a/spring-all/src/main/java/org/baeldung/controller/config/WebConfig.java +++ b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/config/WebConfig.java @@ -1,28 +1,28 @@ -package org.baeldung.controller.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import org.springframework.web.servlet.view.InternalResourceViewResolver; - -@Configuration -@EnableWebMvc -@ComponentScan(basePackages = { "org.baeldung.controller.controller", "org.baeldung.controller.config" }) -public class WebConfig implements WebMvcConfigurer { - @Override - public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { - configurer.enable(); - } - - @Bean - public ViewResolver viewResolver() { - InternalResourceViewResolver bean = new InternalResourceViewResolver(); - bean.setPrefix("/WEB-INF/"); - bean.setSuffix(".jsp"); - return bean; - } +package org.baeldung.controller.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.ViewResolver; +import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.view.InternalResourceViewResolver; + +@Configuration +@EnableWebMvc +@ComponentScan(basePackages = { "org.baeldung.controller.controller", "org.baeldung.controller.config" }) +public class WebConfig implements WebMvcConfigurer { + @Override + public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } + + @Bean + public ViewResolver viewResolver() { + InternalResourceViewResolver bean = new InternalResourceViewResolver(); + bean.setPrefix("/WEB-INF/"); + bean.setSuffix(".jsp"); + return bean; + } } \ No newline at end of file diff --git a/spring-all/src/main/java/org/baeldung/controller/controller/PassParametersController.java b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/controller/PassParametersController.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/controller/controller/PassParametersController.java rename to spring-mvc-basics-2/src/main/java/org/baeldung/controller/controller/PassParametersController.java diff --git a/spring-all/src/main/java/org/baeldung/controller/controller/RestAnnotatedController.java b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/controller/RestAnnotatedController.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/controller/controller/RestAnnotatedController.java rename to spring-mvc-basics-2/src/main/java/org/baeldung/controller/controller/RestAnnotatedController.java diff --git a/spring-all/src/main/java/org/baeldung/controller/controller/RestController.java b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/controller/RestController.java similarity index 86% rename from spring-all/src/main/java/org/baeldung/controller/controller/RestController.java rename to spring-mvc-basics-2/src/main/java/org/baeldung/controller/controller/RestController.java index 4b38b4dd34..4e5d1d9e17 100644 --- a/spring-all/src/main/java/org/baeldung/controller/controller/RestController.java +++ b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/controller/RestController.java @@ -10,7 +10,8 @@ import org.springframework.web.bind.annotation.ResponseBody; public class RestController { @GetMapping(value = "/student/{studentId}") - public @ResponseBody Student getTestData(@PathVariable Integer studentId) { + public @ResponseBody + Student getTestData(@PathVariable Integer studentId) { Student student = new Student(); student.setName("Peter"); student.setId(studentId); diff --git a/spring-all/src/main/java/org/baeldung/controller/controller/TestController.java b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/controller/TestController.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/controller/controller/TestController.java rename to spring-mvc-basics-2/src/main/java/org/baeldung/controller/controller/TestController.java diff --git a/spring-all/src/main/java/org/baeldung/controller/student/Student.java b/spring-mvc-basics-2/src/main/java/org/baeldung/controller/student/Student.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/controller/student/Student.java rename to spring-mvc-basics-2/src/main/java/org/baeldung/controller/student/Student.java diff --git a/spring-mvc-basics-2/src/main/resources/application.properties b/spring-mvc-basics-2/src/main/resources/application.properties new file mode 100644 index 0000000000..709574239b --- /dev/null +++ b/spring-mvc-basics-2/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/resources/logback.xml b/spring-mvc-basics-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-mvc-basics-2/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/spring-all/src/main/resources/test-mvc.xml b/spring-mvc-basics-2/src/main/resources/test-mvc.xml similarity index 100% rename from spring-all/src/main/resources/test-mvc.xml rename to spring-mvc-basics-2/src/main/resources/test-mvc.xml diff --git a/spring-all/src/main/webapp/WEB-INF/greeting.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/greeting.xml similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/greeting.xml rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/greeting.xml diff --git a/spring-all/src/main/webapp/WEB-INF/index.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/index.jsp similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/index.jsp rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/index.jsp diff --git a/spring-all/src/main/webapp/WEB-INF/normal-webapp-servlet.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/normal-webapp-servlet.xml similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/normal-webapp-servlet.xml rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/normal-webapp-servlet.xml diff --git a/spring-all/src/main/webapp/WEB-INF/rootApplicationContext.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/rootApplicationContext.xml similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/rootApplicationContext.xml rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/rootApplicationContext.xml diff --git a/spring-all/src/main/webapp/WEB-INF/secure-webapp-servlet.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/secure-webapp-servlet.xml similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/secure-webapp-servlet.xml rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/secure-webapp-servlet.xml diff --git a/spring-all/src/main/webapp/WEB-INF/secure/view/welcome.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/secure/view/welcome.jsp similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/secure/view/welcome.jsp rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/secure/view/welcome.jsp diff --git a/spring-all/src/main/webapp/WEB-INF/view/sample.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/sample.jsp similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/view/sample.jsp rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/view/sample.jsp diff --git a/spring-all/src/main/webapp/WEB-INF/view/scopesExample.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/scopesExample.jsp similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/view/scopesExample.jsp rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/view/scopesExample.jsp diff --git a/spring-all/src/main/webapp/WEB-INF/view/viewPage.html b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/viewPage.html similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/view/viewPage.html rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/view/viewPage.html diff --git a/spring-all/src/main/webapp/WEB-INF/view/welcome.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/welcome.jsp similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/view/welcome.jsp rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/view/welcome.jsp diff --git a/spring-all/src/main/webapp/WEB-INF/web-old.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/web-old.xml similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/web-old.xml rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/web-old.xml diff --git a/spring-all/src/main/webapp/WEB-INF/welcome.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/welcome.jsp similarity index 100% rename from spring-all/src/main/webapp/WEB-INF/welcome.jsp rename to spring-mvc-basics-2/src/main/webapp/WEB-INF/welcome.jsp diff --git a/spring-all/src/main/webapp/index.jsp b/spring-mvc-basics-2/src/main/webapp/index.jsp similarity index 100% rename from spring-all/src/main/webapp/index.jsp rename to spring-mvc-basics-2/src/main/webapp/index.jsp diff --git a/spring-all/src/test/java/org/baeldung/controller/ControllerAnnotationIntegrationTest.java b/spring-mvc-basics-2/src/test/java/org/baeldung/controller/ControllerAnnotationIntegrationTest.java similarity index 97% rename from spring-all/src/test/java/org/baeldung/controller/ControllerAnnotationIntegrationTest.java rename to spring-mvc-basics-2/src/test/java/org/baeldung/controller/ControllerAnnotationIntegrationTest.java index 82c8704360..e32d9f7aca 100644 --- a/spring-all/src/test/java/org/baeldung/controller/ControllerAnnotationIntegrationTest.java +++ b/spring-mvc-basics-2/src/test/java/org/baeldung/controller/ControllerAnnotationIntegrationTest.java @@ -1,79 +1,79 @@ -package org.baeldung.controller; - -import com.fasterxml.jackson.databind.ObjectMapper; -import org.baeldung.controller.config.WebConfig; -import org.baeldung.controller.student.Student; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.AnnotationConfigWebContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.servlet.ModelAndView; - -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(classes = { WebConfig.class }, loader = AnnotationConfigWebContextLoader.class) -public class ControllerAnnotationIntegrationTest { - - private MockMvc mockMvc; - - @Autowired - private WebApplicationContext wac; - - private Student selectedStudent; - - @Before - public void setUp() { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); - - selectedStudent = new Student(); - selectedStudent.setId(1); - selectedStudent.setName("Peter"); - } - - @Test - public void testTestController() throws Exception { - - ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test/")).andReturn().getModelAndView(); - - // validate modal data - Assert.assertSame(mv.getModelMap().get("data").toString(), "Welcome home man"); - - // validate view name - Assert.assertSame(mv.getViewName(), "welcome"); - } - - @Test - public void testRestController() throws Exception { - - String responseBody = this.mockMvc.perform(MockMvcRequestBuilders.get("/student/{studentId}", 1)).andReturn().getResponse().getContentAsString(); - - ObjectMapper reader = new ObjectMapper(); - - Student studentDetails = reader.readValue(responseBody, Student.class); - - Assert.assertEquals(selectedStudent, studentDetails); - - } - - @Test - public void testRestAnnotatedController() throws Exception { - - String responseBody = this.mockMvc.perform(MockMvcRequestBuilders.get("/annotated/student/{studentId}", 1)).andReturn().getResponse().getContentAsString(); - - ObjectMapper reader = new ObjectMapper(); - - Student studentDetails = reader.readValue(responseBody, Student.class); - - Assert.assertEquals(selectedStudent, studentDetails); - } - -} +package org.baeldung.controller; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.baeldung.controller.config.WebConfig; +import org.baeldung.controller.student.Student; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.web.AnnotationConfigWebContextLoader; +import org.springframework.test.context.web.WebAppConfiguration; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.setup.MockMvcBuilders; +import org.springframework.web.context.WebApplicationContext; +import org.springframework.web.servlet.ModelAndView; + +@RunWith(SpringJUnit4ClassRunner.class) +@WebAppConfiguration +@ContextConfiguration(classes = { WebConfig.class }, loader = AnnotationConfigWebContextLoader.class) +public class ControllerAnnotationIntegrationTest { + + private MockMvc mockMvc; + + @Autowired + private WebApplicationContext wac; + + private Student selectedStudent; + + @Before + public void setUp() { + this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); + + selectedStudent = new Student(); + selectedStudent.setId(1); + selectedStudent.setName("Peter"); + } + + @Test + public void testTestController() throws Exception { + + ModelAndView mv = this.mockMvc.perform(MockMvcRequestBuilders.get("/test/")).andReturn().getModelAndView(); + + // validate modal data + Assert.assertSame(mv.getModelMap().get("data").toString(), "Welcome home man"); + + // validate view name + Assert.assertSame(mv.getViewName(), "welcome"); + } + + @Test + public void testRestController() throws Exception { + + String responseBody = this.mockMvc.perform(MockMvcRequestBuilders.get("/student/{studentId}", 1)).andReturn().getResponse().getContentAsString(); + + ObjectMapper reader = new ObjectMapper(); + + Student studentDetails = reader.readValue(responseBody, Student.class); + + Assert.assertEquals(selectedStudent, studentDetails); + + } + + @Test + public void testRestAnnotatedController() throws Exception { + + String responseBody = this.mockMvc.perform(MockMvcRequestBuilders.get("/annotated/student/{studentId}", 1)).andReturn().getResponse().getContentAsString(); + + ObjectMapper reader = new ObjectMapper(); + + Student studentDetails = reader.readValue(responseBody, Student.class); + + Assert.assertEquals(selectedStudent, studentDetails); + } + +} diff --git a/spring-all/src/test/java/org/baeldung/controller/ControllerIntegrationTest.java b/spring-mvc-basics-2/src/test/java/org/baeldung/controller/ControllerIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/controller/ControllerIntegrationTest.java rename to spring-mvc-basics-2/src/test/java/org/baeldung/controller/ControllerIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/controller/PassParametersControllerIntegrationTest.java b/spring-mvc-basics-2/src/test/java/org/baeldung/controller/PassParametersControllerIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/controller/PassParametersControllerIntegrationTest.java rename to spring-mvc-basics-2/src/test/java/org/baeldung/controller/PassParametersControllerIntegrationTest.java diff --git a/spring-mvc-basics-2/src/test/resources/test-mvc.xml b/spring-mvc-basics-2/src/test/resources/test-mvc.xml new file mode 100644 index 0000000000..15f950ed4f --- /dev/null +++ b/spring-mvc-basics-2/src/test/resources/test-mvc.xml @@ -0,0 +1,24 @@ + + + + + + + + /WEB-INF/ + + + .jsp + + + \ No newline at end of file From f8ca31c99bd40a282d0d796d2cc873e76c3006d5 Mon Sep 17 00:00:00 2001 From: Denis Date: Tue, 10 Sep 2019 22:49:19 +0200 Subject: [PATCH 172/396] extract jasperreports to libraries-2 module --- libraries-2/README.md | 1 + libraries-2/pom.xml | 35 +++++++++++++++++-- .../com}/baeldung/jasperreports/Main.java | 7 ++-- .../jasperreports/SimpleReportExporter.java | 15 +++----- .../jasperreports/SimpleReportFiller.java | 17 ++++----- .../config/JasperRerportsSimpleConfig.java | 9 ++--- .../src/main/resources/employee-schema.sql | 0 .../main/resources/employeeEmailReport.jrxml | 0 .../src/main/resources/employeeReport.jrxml | 0 spring-all/README.md | 3 +- 10 files changed, 55 insertions(+), 32 deletions(-) rename {spring-all/src/main/java/org => libraries-2/src/main/java/com}/baeldung/jasperreports/Main.java (93%) rename {spring-all/src/main/java/org => libraries-2/src/main/java/com}/baeldung/jasperreports/SimpleReportExporter.java (87%) rename {spring-all/src/main/java/org => libraries-2/src/main/java/com}/baeldung/jasperreports/SimpleReportFiller.java (88%) rename {spring-all/src/main/java/org => libraries-2/src/main/java/com}/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java (83%) rename {spring-all => libraries-2}/src/main/resources/employee-schema.sql (100%) rename {spring-all => libraries-2}/src/main/resources/employeeEmailReport.jrxml (100%) rename {spring-all => libraries-2}/src/main/resources/employeeReport.jrxml (100%) diff --git a/libraries-2/README.md b/libraries-2/README.md index 400aa475d1..a9f0e86a5f 100644 --- a/libraries-2/README.md +++ b/libraries-2/README.md @@ -11,3 +11,4 @@ - [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication) - [Guide to MapDB](https://www.baeldung.com/mapdb) - [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos) +- [JasperReports with Spring](http://www.baeldung.com/spring-jasper) \ No newline at end of file diff --git a/libraries-2/pom.xml b/libraries-2/pom.xml index 708006fa15..1ffaf0bbd7 100644 --- a/libraries-2/pom.xml +++ b/libraries-2/pom.xml @@ -1,7 +1,7 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 libraries-2 libraries-2 @@ -112,10 +112,36 @@ mesos ${mesos.library.version} + + net.sf.jasperreports + jasperreports + ${jasperreports.version} + + + commons-logging + commons-logging + + + + + org.hsqldb + hsqldb + ${hsqldb.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-jdbc + ${spring.version} + - 3.0.7 + 3.0.7 3.6.2 4.8.28 6.0.0.Final @@ -129,5 +155,8 @@ 2.8.5 3.14.2 4.1.2 + 6.6.0 + 5.1.9.RELEASE + 2.5.0 diff --git a/spring-all/src/main/java/org/baeldung/jasperreports/Main.java b/libraries-2/src/main/java/com/baeldung/jasperreports/Main.java similarity index 93% rename from spring-all/src/main/java/org/baeldung/jasperreports/Main.java rename to libraries-2/src/main/java/com/baeldung/jasperreports/Main.java index 79aee100a6..1c75c161fb 100644 --- a/spring-all/src/main/java/org/baeldung/jasperreports/Main.java +++ b/libraries-2/src/main/java/com/baeldung/jasperreports/Main.java @@ -1,9 +1,10 @@ -package org.baeldung.jasperreports; +package com.baeldung.jasperreports; + +import com.baeldung.jasperreports.config.JasperRerportsSimpleConfig; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.HashMap; import java.util.Map; -import org.baeldung.jasperreports.config.JasperRerportsSimpleConfig; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args) { diff --git a/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportExporter.java b/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java similarity index 87% rename from spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportExporter.java rename to libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java index 103bb37eb4..fa4b25707b 100644 --- a/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportExporter.java +++ b/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportExporter.java @@ -1,22 +1,17 @@ -package org.baeldung.jasperreports; +package com.baeldung.jasperreports; -import java.util.logging.Level; -import java.util.logging.Logger; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.export.HtmlExporter; import net.sf.jasperreports.engine.export.JRCsvExporter; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter; -import net.sf.jasperreports.export.SimpleExporterInput; -import net.sf.jasperreports.export.SimpleHtmlExporterOutput; -import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput; -import net.sf.jasperreports.export.SimplePdfExporterConfiguration; -import net.sf.jasperreports.export.SimplePdfReportConfiguration; -import net.sf.jasperreports.export.SimpleWriterExporterOutput; -import net.sf.jasperreports.export.SimpleXlsxReportConfiguration; +import net.sf.jasperreports.export.*; import org.springframework.stereotype.Component; +import java.util.logging.Level; +import java.util.logging.Logger; + @Component public class SimpleReportExporter { diff --git a/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportFiller.java b/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java similarity index 88% rename from spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportFiller.java rename to libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java index 08891d940a..5f0f7e1345 100644 --- a/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportFiller.java +++ b/libraries-2/src/main/java/com/baeldung/jasperreports/SimpleReportFiller.java @@ -1,20 +1,17 @@ -package org.baeldung.jasperreports; +package com.baeldung.jasperreports; +import net.sf.jasperreports.engine.*; +import net.sf.jasperreports.engine.util.JRSaver; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.sql.DataSource; import java.io.InputStream; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; -import javax.sql.DataSource; -import net.sf.jasperreports.engine.JRException; -import net.sf.jasperreports.engine.JasperCompileManager; -import net.sf.jasperreports.engine.JasperFillManager; -import net.sf.jasperreports.engine.JasperPrint; -import net.sf.jasperreports.engine.JasperReport; -import net.sf.jasperreports.engine.util.JRSaver; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; @Component public class SimpleReportFiller { diff --git a/spring-all/src/main/java/org/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java b/libraries-2/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java similarity index 83% rename from spring-all/src/main/java/org/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java rename to libraries-2/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java index 5cc2d894c9..10bae0052f 100644 --- a/spring-all/src/main/java/org/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java +++ b/libraries-2/src/main/java/com/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java @@ -1,13 +1,14 @@ -package org.baeldung.jasperreports.config; +package com.baeldung.jasperreports.config; -import javax.sql.DataSource; -import org.baeldung.jasperreports.SimpleReportExporter; -import org.baeldung.jasperreports.SimpleReportFiller; +import com.baeldung.jasperreports.SimpleReportExporter; +import com.baeldung.jasperreports.SimpleReportFiller; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder; import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType; +import javax.sql.DataSource; + @Configuration public class JasperRerportsSimpleConfig { diff --git a/spring-all/src/main/resources/employee-schema.sql b/libraries-2/src/main/resources/employee-schema.sql similarity index 100% rename from spring-all/src/main/resources/employee-schema.sql rename to libraries-2/src/main/resources/employee-schema.sql diff --git a/spring-all/src/main/resources/employeeEmailReport.jrxml b/libraries-2/src/main/resources/employeeEmailReport.jrxml similarity index 100% rename from spring-all/src/main/resources/employeeEmailReport.jrxml rename to libraries-2/src/main/resources/employeeEmailReport.jrxml diff --git a/spring-all/src/main/resources/employeeReport.jrxml b/libraries-2/src/main/resources/employeeReport.jrxml similarity index 100% rename from spring-all/src/main/resources/employeeReport.jrxml rename to libraries-2/src/main/resources/employeeReport.jrxml diff --git a/spring-all/README.md b/spring-all/README.md index 96572c1d0e..16da3bc8a1 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -18,9 +18,8 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) - [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) - [A CLI with Spring Shell](http://www.baeldung.com/spring-shell-cli) -- [JasperReports with Spring](http://www.baeldung.com/spring-jasper) - [@Order in Spring](http://www.baeldung.com/spring-order) - [Spring @Primary Annotation](http://www.baeldung.com/spring-primary) - [Spring Events](https://www.baeldung.com/spring-events) - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) -- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) +- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) \ No newline at end of file From 714e909e9778bace2283364122232674df344273 Mon Sep 17 00:00:00 2001 From: Kevin Kraus Date: Tue, 10 Sep 2019 20:47:13 -0500 Subject: [PATCH 173/396] move to core-java-io --- .../java/com/baeldung/createfiles}/CreateFilesUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java-modules/{core-java/src/test/java/com/baeldung/files => core-java-io-2/src/test/java/com/baeldung/createfiles}/CreateFilesUnitTest.java (97%) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreateFilesUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java similarity index 97% rename from core-java-modules/core-java/src/test/java/com/baeldung/files/CreateFilesUnitTest.java rename to core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java index f2216f58c7..488b22ff89 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/files/CreateFilesUnitTest.java +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.files; +package com.baeldung.createfiles; import com.google.common.io.Files; import org.junit.Test; From 42b6bf5c02da3b2c9fa8e288f34da0d4ec223a7d Mon Sep 17 00:00:00 2001 From: Kevin Kraus Date: Tue, 10 Sep 2019 21:40:34 -0500 Subject: [PATCH 174/396] add asserts and use temp directory --- .../baeldung/createfiles/CreateFilesUnitTest.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java index 488b22ff89..338d53c597 100644 --- a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/createfiles/CreateFilesUnitTest.java @@ -6,6 +6,7 @@ import org.junit.Test; import java.io.File; import java.io.IOException; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; public class CreateFilesUnitTest { @@ -14,7 +15,8 @@ public class CreateFilesUnitTest { File tempDirectory = new File(System.getProperty("java.io.tmpdir")); File fileWithAbsolutePath = new File(tempDirectory.getAbsolutePath() + "/myDirectory/testFile.txt"); - fileWithAbsolutePath.mkdirs(); + assertFalse(fileWithAbsolutePath.exists()); + Files.touch(fileWithAbsolutePath); assertTrue(fileWithAbsolutePath.exists()); @@ -25,7 +27,8 @@ public class CreateFilesUnitTest { File tempDirectory = new File(System.getProperty("java.io.tmpdir")); File fileWithRelativePath = new File(tempDirectory, "myDirectory/newFile.txt"); - fileWithRelativePath.mkdirs(); + assertFalse(fileWithRelativePath.exists()); + Files.touch(fileWithRelativePath); assertTrue(fileWithRelativePath.exists()); @@ -33,9 +36,11 @@ public class CreateFilesUnitTest { @Test public void whenCreatingAFileWithFileSeparator_thenFileIsCreated() throws IOException { - File newFile = new File("src" + File.separator + "test" + File.separator + "resources" + File.separator + "newFile.txt"); + File tempDirectory = new File(System.getProperty("java.io.tmpdir")); + File newFile = new File(tempDirectory.getAbsolutePath() + File.separator + "newFile.txt"); + + assertFalse(newFile.exists()); - newFile.mkdirs(); Files.touch(newFile); assertTrue(newFile.exists()); From f4ec48e0b8162cc968f53d460a3fc491a6c0ce33 Mon Sep 17 00:00:00 2001 From: Devender Kumar <47500074+kumar-devender@users.noreply.github.com> Date: Wed, 11 Sep 2019 11:44:03 +0200 Subject: [PATCH 175/396] Added constraint group sequence test cases (#7763) --- .../validationgroup/CompleteInfo.java | 8 +++ .../validationgroup/RegistrationForm.java | 11 ++++ .../RegistrationFormUnitTest.java | 57 +++++++++++++++++++ 3 files changed, 76 insertions(+) create mode 100644 javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java new file mode 100644 index 0000000000..c989ea3a6f --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java @@ -0,0 +1,8 @@ +package org.baeldung.javabeanconstraints.validationgroup; + +import javax.validation.GroupSequence; + +@GroupSequence({BasicInfo.class, AdvanceInfo.class}) +public interface CompleteInfo { + +} diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java index 154d9821b6..ac8da5c26b 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java @@ -13,6 +13,9 @@ public class RegistrationForm { @NotBlank(groups = BasicInfo.class) private String phone; + @NotBlank(groups = { BasicInfo.class, AdvanceInfo.class }) + private String captcha; + @NotBlank(groups = AdvanceInfo.class) private String street; @NotBlank(groups = AdvanceInfo.class) @@ -95,5 +98,13 @@ public class RegistrationForm { public void setPhone(String phone) { this.phone = phone; } + + public String getCaptcha() { + return captcha; + } + + public void setCaptcha(String captcha) { + this.captcha = captcha; + } } diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java index f8944524f3..bd7034476e 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java @@ -43,6 +43,61 @@ public class RegistrationFormUnitTest { }); } + @Test + public void whenCaptchaIsBlank_thenShouldGiveConstraintViolationsForBasicInfo() { + RegistrationForm form = buildRegistrationFormWithBasicInfo(); + form.setCaptcha(""); + Set> violations = validator.validate(form, BasicInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath().toString()).isEqualTo("captcha"); + }); + } + + @Test + public void whenCaptchaIsBlank_thenShouldGiveConstraintViolationsForAdvanceInfo() { + RegistrationForm form = buildRegistrationFormWithAdvanceInfo(); + form.setCaptcha(""); + Set> violations = validator.validate(form, AdvanceInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath().toString()).isEqualTo("captcha"); + }); + } + + @Test + public void whenBasicInfoIsNotComplete_thenShouldGiveConstraintViolationsForBasicInfoOnly() { + RegistrationForm form = buildRegistrationFormWithBasicInfo(); + form.setFirstName(""); + Set> violations = validator.validate(form, CompleteInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath().toString()).isEqualTo("firstName"); + }); + } + + @Test + public void whenBasicInfoIsCompleteAndAdvanceInfoIsNotComplete_thenShouldGiveConstraintViolationsForAdvanceInfo() { + RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); + form.setZipCode(""); + Set> violations = validator.validate(form, CompleteInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath().toString()).isEqualTo("zipCode"); + }); + } + + @Test + public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolationsWithCompleteInfoValidationGroup() { + RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); + Set> violations = validator.validate(form, CompleteInfo.class); + assertThat(violations.size()).isEqualTo(0); + } + @Test public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolations() { RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); @@ -56,6 +111,7 @@ public class RegistrationFormUnitTest { form.setLastName("kumar"); form.setEmail("anyemail@yopmail.com"); form.setPhone("12345"); + form.setCaptcha("Y2HAhU5T"); return form; } @@ -70,6 +126,7 @@ public class RegistrationFormUnitTest { form.setStreet("alexa str."); form.setZipCode("19923"); form.setHouseNumber("2a"); + form.setCaptcha("Y2HAhU5T"); return form; } From 9addb86012c877ba02a507b3c7cc8d389d3f140d Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Wed, 11 Sep 2019 13:16:58 +0300 Subject: [PATCH 176/396] Split or move java-numbers module --- java-numbers-2/README.md | 8 ++ .../primechecker/BigIntegerPrimeChecker.java | 0 .../primechecker/BruteForcePrimeChecker.java | 0 .../primechecker/OptimisedPrimeChecker.java | 0 .../algorithms/primechecker/PrimeChecker.java | 0 .../primechecker/PrimesPrimeChecker.java | 0 .../java/com/baeldung/area/circle/Circle.java | 0 .../com/baeldung/area/circle/CircleArea.java | 0 .../java/com/baeldung/nan/NaNExample.java | 0 .../java/com/baeldung/pow/PowerExample.java | 0 .../com/baeldung/prime/PrimeGenerator.java | 118 +++++++++--------- .../primechecker/PrimeCheckerUnitTest.java | 0 .../com/baeldung/java/math/MathUnitTest.java | 0 .../prime/PrimeGeneratorUnitTest.java | 57 ++++----- java-numbers/README.md | 6 - 15 files changed, 96 insertions(+), 93 deletions(-) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java (100%) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java (100%) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java (100%) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java (100%) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java (100%) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/area/circle/Circle.java (100%) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/area/circle/CircleArea.java (100%) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/nan/NaNExample.java (100%) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/pow/PowerExample.java (100%) rename {java-numbers => java-numbers-2}/src/main/java/com/baeldung/prime/PrimeGenerator.java (96%) rename {java-numbers => java-numbers-2}/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java (100%) rename {java-numbers => java-numbers-2}/src/test/java/com/baeldung/java/math/MathUnitTest.java (100%) rename {java-numbers => java-numbers-2}/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java (97%) diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md index 52ffc822b9..1d2919aa63 100644 --- a/java-numbers-2/README.md +++ b/java-numbers-2/README.md @@ -1,2 +1,10 @@ ## Relevant Articles - [Lossy Conversion in Java](https://www.baeldung.com/java-lossy-conversion) +- [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math) +- [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area) +- [NaN in Java](http://www.baeldung.com/java-not-a-number) +- [Generating Prime Numbers in Java](http://www.baeldung.com/java-generate-prime-numbers) +- [Using Math.pow in Java](http://www.baeldung.com/java-math-pow) +- [Check If a Number Is Prime in Java](http://www.baeldung.com/java-prime-numbers) +- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) +- [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple) diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java similarity index 100% rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BigIntegerPrimeChecker.java diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java similarity index 100% rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/BruteForcePrimeChecker.java diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java similarity index 100% rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/OptimisedPrimeChecker.java diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java similarity index 100% rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimeChecker.java diff --git a/java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java b/java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java similarity index 100% rename from java-numbers/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java rename to java-numbers-2/src/main/java/com/baeldung/algorithms/primechecker/PrimesPrimeChecker.java diff --git a/java-numbers/src/main/java/com/baeldung/area/circle/Circle.java b/java-numbers-2/src/main/java/com/baeldung/area/circle/Circle.java similarity index 100% rename from java-numbers/src/main/java/com/baeldung/area/circle/Circle.java rename to java-numbers-2/src/main/java/com/baeldung/area/circle/Circle.java diff --git a/java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java b/java-numbers-2/src/main/java/com/baeldung/area/circle/CircleArea.java similarity index 100% rename from java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java rename to java-numbers-2/src/main/java/com/baeldung/area/circle/CircleArea.java diff --git a/java-numbers/src/main/java/com/baeldung/nan/NaNExample.java b/java-numbers-2/src/main/java/com/baeldung/nan/NaNExample.java similarity index 100% rename from java-numbers/src/main/java/com/baeldung/nan/NaNExample.java rename to java-numbers-2/src/main/java/com/baeldung/nan/NaNExample.java diff --git a/java-numbers/src/main/java/com/baeldung/pow/PowerExample.java b/java-numbers-2/src/main/java/com/baeldung/pow/PowerExample.java similarity index 100% rename from java-numbers/src/main/java/com/baeldung/pow/PowerExample.java rename to java-numbers-2/src/main/java/com/baeldung/pow/PowerExample.java diff --git a/java-numbers/src/main/java/com/baeldung/prime/PrimeGenerator.java b/java-numbers-2/src/main/java/com/baeldung/prime/PrimeGenerator.java similarity index 96% rename from java-numbers/src/main/java/com/baeldung/prime/PrimeGenerator.java rename to java-numbers-2/src/main/java/com/baeldung/prime/PrimeGenerator.java index 750807ce77..7511141a84 100644 --- a/java-numbers/src/main/java/com/baeldung/prime/PrimeGenerator.java +++ b/java-numbers-2/src/main/java/com/baeldung/prime/PrimeGenerator.java @@ -1,59 +1,59 @@ -package com.baeldung.prime; - -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -public class PrimeGenerator { - public static List sieveOfEratosthenes(int n) { - final boolean prime[] = new boolean[n + 1]; - Arrays.fill(prime, true); - - for (int p = 2; p * p <= n; p++) { - if (prime[p]) { - for (int i = p * 2; i <= n; i += p) - prime[i] = false; - } - } - - final List primes = new LinkedList<>(); - for (int i = 2; i <= n; i++) { - if (prime[i]) - primes.add(i); - } - return primes; - } - - public static List primeNumbersBruteForce(int max) { - final List primeNumbers = new LinkedList(); - for (int i = 2; i <= max; i++) { - if (isPrimeBruteForce(i)) { - primeNumbers.add(i); - } - } - return primeNumbers; - } - - private static boolean isPrimeBruteForce(int x) { - for (int i = 2; i < x; i++) { - if (x % i == 0) { - return false; - } - } - return true; - } - - public static List primeNumbersTill(int max) { - return IntStream.rangeClosed(2, max) - .filter(x -> isPrime(x)) - .boxed() - .collect(Collectors.toList()); - } - - private static boolean isPrime(int x) { - return IntStream.rangeClosed(2, (int) (Math.sqrt(x))) - .allMatch(n -> x % n != 0); - } -} +package com.baeldung.prime; + +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +public class PrimeGenerator { + public static List sieveOfEratosthenes(int n) { + final boolean prime[] = new boolean[n + 1]; + Arrays.fill(prime, true); + + for (int p = 2; p * p <= n; p++) { + if (prime[p]) { + for (int i = p * 2; i <= n; i += p) + prime[i] = false; + } + } + + final List primes = new LinkedList<>(); + for (int i = 2; i <= n; i++) { + if (prime[i]) + primes.add(i); + } + return primes; + } + + public static List primeNumbersBruteForce(int max) { + final List primeNumbers = new LinkedList(); + for (int i = 2; i <= max; i++) { + if (isPrimeBruteForce(i)) { + primeNumbers.add(i); + } + } + return primeNumbers; + } + + private static boolean isPrimeBruteForce(int x) { + for (int i = 2; i < x; i++) { + if (x % i == 0) { + return false; + } + } + return true; + } + + public static List primeNumbersTill(int max) { + return IntStream.rangeClosed(2, max) + .filter(x -> isPrime(x)) + .boxed() + .collect(Collectors.toList()); + } + + private static boolean isPrime(int x) { + return IntStream.rangeClosed(2, (int) (Math.sqrt(x))) + .allMatch(n -> x % n != 0); + } +} diff --git a/java-numbers/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java rename to java-numbers-2/src/test/java/com/baeldung/algorithms/primechecker/PrimeCheckerUnitTest.java diff --git a/java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/java/math/MathUnitTest.java similarity index 100% rename from java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java rename to java-numbers-2/src/test/java/com/baeldung/java/math/MathUnitTest.java diff --git a/java-numbers/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java b/java-numbers-2/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java similarity index 97% rename from java-numbers/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java rename to java-numbers-2/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java index 210bde076b..2509bd73d4 100644 --- a/java-numbers/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java +++ b/java-numbers-2/src/test/java/com/baeldung/prime/PrimeGeneratorUnitTest.java @@ -1,28 +1,29 @@ -package com.baeldung.prime; - -import java.util.Arrays; -import java.util.List; -import org.junit.Test; - -import static com.baeldung.prime.PrimeGenerator.*; -import static org.junit.Assert.*; - -public class PrimeGeneratorUnitTest { - @Test - public void whenBruteForced_returnsSuccessfully() { - final List primeNumbers = primeNumbersBruteForce(20); - assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); - } - - @Test - public void whenOptimized_returnsSuccessfully() { - final List primeNumbers = primeNumbersTill(20); - assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); - } - - @Test - public void whenSieveOfEratosthenes_returnsSuccessfully() { - final List primeNumbers = sieveOfEratosthenes(20); - assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); - } -} +package com.baeldung.prime; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; + +import static com.baeldung.prime.PrimeGenerator.*; +import static org.junit.Assert.*; + +public class PrimeGeneratorUnitTest { + @Test + public void whenBruteForced_returnsSuccessfully() { + final List primeNumbers = primeNumbersBruteForce(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } + + @Test + public void whenOptimized_returnsSuccessfully() { + final List primeNumbers = primeNumbersTill(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } + + @Test + public void whenSieveOfEratosthenes_returnsSuccessfully() { + final List primeNumbers = sieveOfEratosthenes(20); + assertEquals(Arrays.asList(new Integer[] { 2, 3, 5, 7, 11, 13, 17, 19 }), primeNumbers); + } +} diff --git a/java-numbers/README.md b/java-numbers/README.md index 2b1131f325..7885232c46 100644 --- a/java-numbers/README.md +++ b/java-numbers/README.md @@ -4,11 +4,7 @@ ### Relevant Articles: - [Number of Digits in an Integer in Java](http://www.baeldung.com/java-number-of-digits-in-int) -- [NaN in Java](http://www.baeldung.com/java-not-a-number) - [How to Round a Number to N Decimal Places in Java](http://www.baeldung.com/java-round-decimal-number) -- [Check If a Number Is Prime in Java](http://www.baeldung.com/java-prime-numbers) -- [Using Math.pow in Java](http://www.baeldung.com/java-math-pow) -- [Generating Prime Numbers in Java](http://www.baeldung.com/java-generate-prime-numbers) - [BigDecimal and BigInteger in Java](http://www.baeldung.com/java-bigdecimal-biginteger) - [Find All Pairs of Numbers in an Array That Add Up to a Given Sum](http://www.baeldung.com/java-algorithm-number-pairs-sum) - [Java – Random Long, Float, Integer and Double](http://www.baeldung.com/java-generate-random-long-float-integer-double) @@ -17,5 +13,3 @@ - [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) - [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string) - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) -- [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area) -- [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math) \ No newline at end of file From ff15a61559d30ef95318066cf2e4ff738f0441e4 Mon Sep 17 00:00:00 2001 From: fanatixan Date: Wed, 11 Sep 2019 13:00:16 +0200 Subject: [PATCH 177/396] BAEL-16653 (#7691) * added module 'design-patterns-behavioral' * added module 'design-patterns-structural' * added module 'design-patterns-creational' * added module 'design-patterns-architectural' * added module 'design-patterns-functional' * moved facade code examples from design-patterns to design-patterns-structural * moved singleton examples from design-patterns to design-patterns-creational * moved bridge examples from design-patterns to design-patterns-structural * moved creational examples from design-patterns to design-patterns-creational * moved observer examples from design-patterns to design-patterns-behavioral * moved flyweight examples from design-patterns to design-patterns-creational * moved service locator examples from design-patterns to design-patterns-architectural * moved double checked locking singleton examples from design-patterns to design-patterns-creational * moved composite examples from design-patterns to design-patterns-structural * moved visitor examples from design-patterns to design-patterns-behavioral * moved dao examples from design-patterns to design-patterns-architectural * moved interpreter examples from design-patterns to design-patterns-behavioral * moved state examples from design-patterns to design-patterns-behavioral * moved decorator examples from design-patterns to design-patterns-structural * renamed LogerUtil to LoggerUtil * moved template method examples from design-patterns to design-patterns-behavioral * moved chain of responsibility examples from design-patterns to design-patterns-behavioral * moved command examples from design-patterns to design-patterns-behavioral * moved constructor vs static factory method examples from design-patterns to design-patterns-creational * moved adapter examples from design-patterns to design-patterns-structural * moved currying examples from design-patterns to design-patterns-functional * moved proxy examples from design-patterns to design-patterns-structural * moved persistence.xml from design-patterns to design-patterns-architectural * deleted empty module: design-patterns * moved mediator examples from design-patterns-2 to design-patterns-behavioral * moved null object examples from design-patterns-2 to design-patterns-behavioral * moved null check examples from design-patterns to design-patterns-behavioral * moved freebuilder examples from design-patterns-2 to design-patterns-creational * added module design-patterns-behavioral-2 * moved memento examples from design-patterns-2 to design-patterns-behavioral-2 * removed empty module design-patterns-2 * changed http to https in readmes in modules design-patterns-* --- patterns/design-patterns-2/README.md | 5 - .../design-patterns-architectural/README.md | 3 + .../pom.xml | 20 +-- .../application/UserApplication.java | 0 .../config/JpaEntityManagerFactory.java | 0 .../config/PersistenceUnitInfoImpl.java | 0 .../com/baeldung/daopattern/daos/Dao.java | 0 .../baeldung/daopattern/daos/JpaUserDao.java | 0 .../com/baeldung/daopattern/daos/UserDao.java | 0 .../baeldung/daopattern/entities/User.java | 0 .../com/baeldung/service/locator/Cache.java | 0 .../service/locator/EmailService.java | 0 .../service/locator/InitialContext.java | 0 .../com/baeldung/service/locator/Main.java | 0 .../service/locator/MessagingService.java | 0 .../baeldung/service/locator/SMSService.java | 0 .../service/locator/ServiceLocator.java | 0 .../main/resources/META-INF/persistence.xml | 0 .../daopattern/test/UserDaoUnitTest.java | 0 .../design-patterns-behavioral-2/README.md | 2 + patterns/design-patterns-behavioral-2/pom.xml | 33 +++++ .../java/com/baeldung/memento/TextEditor.java | 0 .../java/com/baeldung/memento/TextWindow.java | 0 .../com/baeldung/memento/TextWindowState.java | 0 .../baeldung/memento/TextEditorUnitTest.java | 0 patterns/design-patterns-behavioral/README.md | 11 ++ .../pom.xml | 25 +--- .../AuthenticationProcessor.java | 0 .../AuthenticationProvider.java | 0 .../OAuthAuthenticationProcessor.java | 0 .../OAuthTokenProvider.java | 0 .../SamlAuthenticationProvider.java | 0 ...ernamePasswordAuthenticationProcessor.java | 0 .../UsernamePasswordProvider.java | 0 .../command/client/TextFileApplication.java | 0 .../command/OpenTextFileOperation.java | 0 .../command/SaveTextFileOperation.java | 0 .../command/command/TextFileOperation.java | 0 .../invoker/TextFileOperationExecutor.java | 0 .../baeldung/command/receiver/TextFile.java | 0 .../com/baeldung/interpreter/Context.java | 0 .../com/baeldung/interpreter/Expression.java | 0 .../java/com/baeldung/interpreter/From.java | 0 .../baeldung/interpreter/InterpreterDemo.java | 0 .../java/com/baeldung/interpreter/Row.java | 0 .../java/com/baeldung/interpreter/Select.java | 0 .../java/com/baeldung/interpreter/Where.java | 0 .../java/com/baeldung/mediator/Button.java | 0 .../main/java/com/baeldung/mediator/Fan.java | 0 .../java/com/baeldung/mediator/Mediator.java | 0 .../com/baeldung/mediator/PowerSupplier.java | 0 .../com/baeldung/nullobject/JmsRouter.java | 0 .../java/com/baeldung/nullobject/Message.java | 0 .../com/baeldung/nullobject/NullRouter.java | 0 .../java/com/baeldung/nullobject/Router.java | 0 .../baeldung/nullobject/RouterFactory.java | 0 .../baeldung/nullobject/RoutingHandler.java | 0 .../com/baeldung/nullobject/SmsRouter.java | 0 .../java/com/baeldung/nulls/APIContracts.java | 0 .../java/com/baeldung/nulls/Assertions.java | 0 .../com/baeldung/nulls/EmptyCollections.java | 0 .../baeldung/nulls/FindBugsAnnotations.java | 0 .../com/baeldung/nulls/Preconditions.java | 0 .../baeldung/nulls/PrimitivesAndWrapper.java | 0 .../java/com/baeldung/nulls/UsingLombok.java | 0 .../java/com/baeldung/nulls/UsingObjects.java | 0 .../com/baeldung/nulls/UsingOptional.java | 0 .../com/baeldung/nulls/UsingStringUtils.java | 0 .../java/com/baeldung/observer/Channel.java | 0 .../com/baeldung/observer/NewsAgency.java | 0 .../com/baeldung/observer/NewsChannel.java | 0 .../com/baeldung/observer/ONewsAgency.java | 0 .../com/baeldung/observer/ONewsChannel.java | 0 .../com/baeldung/observer/PCLNewsAgency.java | 0 .../com/baeldung/observer/PCLNewsChannel.java | 0 .../com/baeldung/state/DeliveredState.java | 0 .../java/com/baeldung/state/OrderedState.java | 0 .../main/java/com/baeldung/state/Package.java | 0 .../java/com/baeldung/state/PackageState.java | 0 .../com/baeldung/state/ReceivedState.java | 0 .../java/com/baeldung/state/StateDemo.java | 0 .../application/Application.java | 0 .../templatemethod/model/Computer.java | 0 .../templatemethod/model/ComputerBuilder.java | 0 .../templatemethod/model/HighEndComputer.java | 0 .../model/HighEndComputerBuilder.java | 0 .../model/StandardComputer.java | 0 .../model/StandardComputerBuilder.java | 0 .../java/com/baeldung/visitor/Document.java | 0 .../java/com/baeldung/visitor/Element.java | 0 .../com/baeldung/visitor/ElementVisitor.java | 0 .../com/baeldung/visitor/JsonElement.java | 0 .../java/com/baeldung/visitor/Visitor.java | 0 .../com/baeldung/visitor/VisitorDemo.java | 0 .../java/com/baeldung/visitor/XmlElement.java | 0 .../ChainOfResponsibilityIntegrationTest.java | 0 .../test/OpenTextFileOperationUnitTest.java | 0 .../test/SaveTextFileOperationUnitTest.java | 0 .../TextFileOperationExecutorUnitTest.java | 0 .../command/test/TextFileUnitTest.java | 0 .../mediator/MediatorIntegrationTest.java | 0 .../nulls/PrimitivesAndWrapperUnitTest.java | 0 .../baeldung/nulls/UsingLombokUnitTest.java | 0 .../baeldung/nulls/UsingObjectsUnitTest.java | 0 .../baeldung/nulls/UsingOptionalUnitTest.java | 0 .../nulls/UsingStringUtilsUnitTest.java | 0 .../observer/ObserverIntegrationTest.java | 0 .../baeldung/state/StatePatternUnitTest.java | 0 .../TemplateMethodPatternIntegrationTest.java | 0 patterns/design-patterns-creational/README.md | 8 ++ patterns/design-patterns-creational/pom.xml | 47 +++++++ .../application/Application.java | 22 +-- .../entities/User.java | 126 +++++++++--------- .../abstractfactory/AbstractFactory.java | 0 .../AbstractPatternDriver.java | 0 .../creational/abstractfactory/Animal.java | 0 .../abstractfactory/AnimalFactory.java | 0 .../creational/abstractfactory/Brown.java | 0 .../creational/abstractfactory/Color.java | 0 .../abstractfactory/ColorFactory.java | 0 .../creational/abstractfactory/Dog.java | 0 .../creational/abstractfactory/Duck.java | 0 .../abstractfactory/FactoryProvider.java | 0 .../creational/abstractfactory/White.java | 0 .../creational/builder/BankAccount.java | 0 .../builder/BuilderPatternDriver.java | 0 .../creational/factory/FactoryDriver.java | 0 .../baeldung/creational/factory/Heptagon.java | 0 .../baeldung/creational/factory/Octagon.java | 0 .../baeldung/creational/factory/Pentagon.java | 0 .../baeldung/creational/factory/Polygon.java | 0 .../creational/factory/PolygonFactory.java | 0 .../baeldung/creational/factory/Square.java | 0 .../baeldung/creational/factory/Triangle.java | 0 .../creational/singleton/Singleton.java | 0 .../creational/singleton/SingletonDriver.java | 0 .../main/java/com/baeldung/flyweight/Car.java | 3 - .../java/com/baeldung/flyweight/Engine.java | 0 .../java/com/baeldung/flyweight/Vehicle.java | 0 .../baeldung/flyweight/VehicleFactory.java | 0 .../com/baeldung/freebuilder/Address.java | 0 .../com/baeldung/freebuilder/Employee.java | 0 .../freebuilder/builder/Employee.java | 0 .../baeldung/singleton/ClassSingleton.java | 0 .../com/baeldung/singleton/EnumSingleton.java | 0 .../java/com/baeldung/singleton/Sandbox.java | 0 .../synchronization/DclSingleton.java | 0 .../synchronization/DraconianSingleton.java | 0 .../synchronization/EarlyInitSingleton.java | 0 .../synchronization/EnumSingleton.java | 0 .../InitOnDemandSingleton.java | 0 .../UserUnitTest.java | 84 ++++++------ .../AbstractPatternIntegrationTest.java | 0 .../BuilderPatternIntegrationTest.java | 0 .../factory/FactoryIntegrationTest.java | 0 .../singleton/SingletonIntegrationTest.java | 0 .../baeldung/flyweight/FlyweightUnitTest.java | 0 .../freebuilder/EmployeeBuilderUnitTest.java | 0 .../builder/EmployeeBuilderUnitTest.java | 0 ...ngletonSynchronizationIntegrationTest.java | 0 patterns/design-patterns-functional/README.md | 2 + patterns/design-patterns-functional/pom.xml | 25 ++++ .../java/com/baeldung/currying/Letter.java | 0 .../com/baeldung/currying/LetterUnitTest.java | 0 patterns/design-patterns-structural/README.md | 7 + patterns/design-patterns-structural/pom.xml | 30 +++++ .../adapter/AdapterPatternDriver.java | 2 +- .../com/baeldung/adapter/AstonMartin.java | 0 .../com/baeldung/adapter/BugattiVeyron.java | 0 .../java/com/baeldung/adapter/McLaren.java | 0 .../java/com/baeldung/adapter/Movable.java | 0 .../com/baeldung/adapter/MovableAdapter.java | 0 .../baeldung/adapter/MovableAdapterImpl.java | 0 .../main/java/com/baeldung/bridge/Blue.java | 0 .../baeldung/bridge/BridgePatternDriver.java | 0 .../main/java/com/baeldung/bridge/Color.java | 0 .../main/java/com/baeldung/bridge/Red.java | 0 .../main/java/com/baeldung/bridge/Shape.java | 0 .../main/java/com/baeldung/bridge/Square.java | 0 .../java/com/baeldung/bridge/Triangle.java | 0 .../com/baeldung/composite/CompositeDemo.java | 0 .../com/baeldung/composite/Department.java | 0 .../composite/FinancialDepartment.java | 0 .../baeldung/composite/HeadDepartment.java | 0 .../baeldung/composite/SalesDepartment.java | 0 .../com/baeldung/decorator/BubbleLights.java | 0 .../com/baeldung/decorator/ChristmasTree.java | 0 .../baeldung/decorator/ChristmasTreeImpl.java | 0 .../decorator/DecoratorPatternDriver.java | 2 +- .../java/com/baeldung/decorator/Garland.java | 0 .../com/baeldung/decorator/TreeDecorator.java | 0 .../com/baeldung/facade/CarEngineFacade.java | 0 .../facade/carsystem/AirFlowController.java | 0 .../facade/carsystem/AirFlowMeter.java | 0 .../facade/carsystem/CatalyticConverter.java | 0 .../facade/carsystem/CoolingController.java | 0 .../facade/carsystem/FuelInjector.java | 0 .../baeldung/facade/carsystem/FuelPump.java | 0 .../baeldung/facade/carsystem/Radiator.java | 0 .../baeldung/facade/carsystem/Starter.java | 0 .../facade/carsystem/TemperatureSensor.java | 0 .../com/baeldung/proxy/ExpensiveObject.java | 0 .../baeldung/proxy/ExpensiveObjectImpl.java | 2 +- .../baeldung/proxy/ExpensiveObjectProxy.java | 0 .../baeldung/proxy/ProxyPatternDriver.java | 0 .../java/com/baeldung/util/LoggerUtil.java} | 4 +- .../resources/log4jstructuraldp.properties | 0 .../AdapterPatternIntegrationTest.java | 9 +- .../bridge}/BridgePatternIntegrationTest.java | 8 +- .../DecoratorPatternIntegrationTest.java | 7 +- .../CarEngineFacadeIntegrationTest.java | 0 .../proxy}/ProxyPatternIntegrationTest.java | 7 +- .../com/baeldung/proxy}/TestAppenderDP.java | 2 +- patterns/design-patterns/README.md | 23 ---- patterns/pom.xml | 8 +- 215 files changed, 314 insertions(+), 213 deletions(-) delete mode 100644 patterns/design-patterns-2/README.md create mode 100644 patterns/design-patterns-architectural/README.md rename patterns/{design-patterns => design-patterns-architectural}/pom.xml (78%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/daopattern/application/UserApplication.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/daopattern/daos/Dao.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/daopattern/daos/UserDao.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/daopattern/entities/User.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/service/locator/Cache.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/service/locator/EmailService.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/service/locator/InitialContext.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/service/locator/Main.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/service/locator/MessagingService.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/service/locator/SMSService.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/java/com/baeldung/service/locator/ServiceLocator.java (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/main/resources/META-INF/persistence.xml (100%) rename patterns/{design-patterns => design-patterns-architectural}/src/test/java/com/baeldung/daopattern/test/UserDaoUnitTest.java (100%) create mode 100644 patterns/design-patterns-behavioral-2/README.md create mode 100644 patterns/design-patterns-behavioral-2/pom.xml rename patterns/{design-patterns-2 => design-patterns-behavioral-2}/src/main/java/com/baeldung/memento/TextEditor.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral-2}/src/main/java/com/baeldung/memento/TextWindow.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral-2}/src/main/java/com/baeldung/memento/TextWindowState.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral-2}/src/test/java/com/baeldung/memento/TextEditorUnitTest.java (100%) create mode 100644 patterns/design-patterns-behavioral/README.md rename patterns/{design-patterns-2 => design-patterns-behavioral}/pom.xml (69%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProcessor.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProvider.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/chainofresponsibility/OAuthAuthenticationProcessor.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/chainofresponsibility/OAuthTokenProvider.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/chainofresponsibility/SamlAuthenticationProvider.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordProvider.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/command/client/TextFileApplication.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/command/command/OpenTextFileOperation.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/command/command/SaveTextFileOperation.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/command/command/TextFileOperation.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/command/invoker/TextFileOperationExecutor.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/command/receiver/TextFile.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/interpreter/Context.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/interpreter/Expression.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/interpreter/From.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/interpreter/InterpreterDemo.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/interpreter/Row.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/interpreter/Select.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/interpreter/Where.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/mediator/Button.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/mediator/Fan.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/mediator/Mediator.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/mediator/PowerSupplier.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nullobject/JmsRouter.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nullobject/Message.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nullobject/NullRouter.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nullobject/Router.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nullobject/RouterFactory.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nullobject/RoutingHandler.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nullobject/SmsRouter.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/APIContracts.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/Assertions.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/EmptyCollections.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/Preconditions.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/PrimitivesAndWrapper.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/UsingLombok.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/UsingObjects.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/UsingOptional.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/main/java/com/baeldung/nulls/UsingStringUtils.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/observer/Channel.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/observer/NewsAgency.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/observer/NewsChannel.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/observer/ONewsAgency.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/observer/ONewsChannel.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/observer/PCLNewsAgency.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/observer/PCLNewsChannel.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/state/DeliveredState.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/state/OrderedState.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/state/Package.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/state/PackageState.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/state/ReceivedState.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/state/StateDemo.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/templatemethod/application/Application.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/templatemethod/model/Computer.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/templatemethod/model/ComputerBuilder.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/templatemethod/model/HighEndComputer.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/templatemethod/model/HighEndComputerBuilder.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/templatemethod/model/StandardComputer.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/templatemethod/model/StandardComputerBuilder.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/visitor/Document.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/visitor/Element.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/visitor/ElementVisitor.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/visitor/JsonElement.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/visitor/Visitor.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/visitor/VisitorDemo.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/main/java/com/baeldung/visitor/XmlElement.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/test/java/com/baeldung/chainofresponsibility/ChainOfResponsibilityIntegrationTest.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/test/java/com/baeldung/command/test/OpenTextFileOperationUnitTest.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/test/java/com/baeldung/command/test/SaveTextFileOperationUnitTest.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/test/java/com/baeldung/command/test/TextFileOperationExecutorUnitTest.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/test/java/com/baeldung/command/test/TextFileUnitTest.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/test/java/com/baeldung/mediator/MediatorIntegrationTest.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/test/java/com/baeldung/nulls/PrimitivesAndWrapperUnitTest.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/test/java/com/baeldung/nulls/UsingLombokUnitTest.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/test/java/com/baeldung/nulls/UsingObjectsUnitTest.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java (100%) rename patterns/{design-patterns-2 => design-patterns-behavioral}/src/test/java/com/baeldung/nulls/UsingStringUtilsUnitTest.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/test/java/com/baeldung/observer/ObserverIntegrationTest.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/test/java/com/baeldung/state/StatePatternUnitTest.java (100%) rename patterns/{design-patterns => design-patterns-behavioral}/src/test/java/com/baeldung/templatemethod/test/TemplateMethodPatternIntegrationTest.java (100%) create mode 100644 patterns/design-patterns-creational/README.md create mode 100644 patterns/design-patterns-creational/pom.xml rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java (97%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java (96%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/Animal.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/Brown.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/Color.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/Dog.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/Duck.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/FactoryProvider.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/abstractfactory/White.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/builder/BankAccount.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/builder/BuilderPatternDriver.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/factory/FactoryDriver.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/factory/Heptagon.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/factory/Octagon.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/factory/Pentagon.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/factory/Polygon.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/factory/PolygonFactory.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/factory/Square.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/factory/Triangle.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/singleton/Singleton.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/creational/singleton/SingletonDriver.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/flyweight/Car.java (95%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/flyweight/Engine.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/flyweight/Vehicle.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/flyweight/VehicleFactory.java (100%) rename patterns/{design-patterns-2 => design-patterns-creational}/src/main/java/com/baeldung/freebuilder/Address.java (100%) rename patterns/{design-patterns-2 => design-patterns-creational}/src/main/java/com/baeldung/freebuilder/Employee.java (100%) rename patterns/{design-patterns-2 => design-patterns-creational}/src/main/java/com/baeldung/freebuilder/builder/Employee.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/singleton/ClassSingleton.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/singleton/EnumSingleton.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/singleton/Sandbox.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/singleton/synchronization/DclSingleton.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/singleton/synchronization/DraconianSingleton.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/singleton/synchronization/EarlyInitSingleton.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/singleton/synchronization/EnumSingleton.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/main/java/com/baeldung/singleton/synchronization/InitOnDemandSingleton.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java (97%) rename patterns/{design-patterns => design-patterns-creational}/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/test/java/com/baeldung/creational/builder/BuilderPatternIntegrationTest.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/test/java/com/baeldung/creational/factory/FactoryIntegrationTest.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/test/java/com/baeldung/creational/singleton/SingletonIntegrationTest.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/test/java/com/baeldung/flyweight/FlyweightUnitTest.java (100%) rename patterns/{design-patterns-2 => design-patterns-creational}/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java (100%) rename patterns/{design-patterns-2 => design-patterns-creational}/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java (100%) rename patterns/{design-patterns => design-patterns-creational}/src/test/java/com/baeldung/singleton/synchronization/SingletonSynchronizationIntegrationTest.java (100%) create mode 100644 patterns/design-patterns-functional/README.md create mode 100644 patterns/design-patterns-functional/pom.xml rename patterns/{design-patterns => design-patterns-functional}/src/main/java/com/baeldung/currying/Letter.java (100%) rename patterns/{design-patterns => design-patterns-functional}/src/test/java/com/baeldung/currying/LetterUnitTest.java (100%) create mode 100644 patterns/design-patterns-structural/README.md create mode 100644 patterns/design-patterns-structural/pom.xml rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java (94%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/adapter/AstonMartin.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/adapter/BugattiVeyron.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/adapter/McLaren.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/adapter/Movable.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/adapter/MovableAdapter.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/adapter/MovableAdapterImpl.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/bridge/Blue.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/bridge/BridgePatternDriver.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/bridge/Color.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/bridge/Red.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/bridge/Shape.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/bridge/Square.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/bridge/Triangle.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/composite/CompositeDemo.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/composite/Department.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/composite/FinancialDepartment.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/composite/HeadDepartment.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/composite/SalesDepartment.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/decorator/BubbleLights.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/decorator/ChristmasTree.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/decorator/ChristmasTreeImpl.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java (90%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/decorator/Garland.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/decorator/TreeDecorator.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/CarEngineFacade.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/carsystem/AirFlowController.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/carsystem/AirFlowMeter.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/carsystem/CatalyticConverter.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/carsystem/CoolingController.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/carsystem/FuelInjector.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/carsystem/FuelPump.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/carsystem/Radiator.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/carsystem/Starter.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/facade/carsystem/TemperatureSensor.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/proxy/ExpensiveObject.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java (88%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/proxy/ExpensiveObjectProxy.java (100%) rename patterns/{design-patterns => design-patterns-structural}/src/main/java/com/baeldung/proxy/ProxyPatternDriver.java (100%) rename patterns/{design-patterns/src/main/java/com/baeldung/util/LogerUtil.java => design-patterns-structural/src/main/java/com/baeldung/util/LoggerUtil.java} (87%) rename patterns/{design-patterns => design-patterns-structural}/src/main/resources/log4jstructuraldp.properties (100%) rename patterns/{design-patterns/src/test/java/com/baeldung => design-patterns-structural/src/test/java/com/baeldung/adapter}/AdapterPatternIntegrationTest.java (75%) rename patterns/{design-patterns/src/test/java/com/baeldung => design-patterns-structural/src/test/java/com/baeldung/bridge}/BridgePatternIntegrationTest.java (72%) rename patterns/{design-patterns/src/test/java/com/baeldung => design-patterns-structural/src/test/java/com/baeldung/decorator}/DecoratorPatternIntegrationTest.java (75%) rename patterns/{design-patterns => design-patterns-structural}/src/test/java/com/baeldung/facade/CarEngineFacadeIntegrationTest.java (100%) rename patterns/{design-patterns/src/test/java/com/baeldung => design-patterns-structural/src/test/java/com/baeldung/proxy}/ProxyPatternIntegrationTest.java (87%) rename patterns/{design-patterns/src/test/java/com/baeldung => design-patterns-structural/src/test/java/com/baeldung/proxy}/TestAppenderDP.java (95%) delete mode 100644 patterns/design-patterns/README.md diff --git a/patterns/design-patterns-2/README.md b/patterns/design-patterns-2/README.md deleted file mode 100644 index 8e4ef657e1..0000000000 --- a/patterns/design-patterns-2/README.md +++ /dev/null @@ -1,5 +0,0 @@ -### Relevant Articles - -- [The Mediator Pattern in Java](https://www.baeldung.com/java-mediator-pattern) -- [Introduction to the Null Object Pattern](https://www.baeldung.com/java-null-object-pattern) -- [Avoid Check for Null Statement in Java](https://www.baeldung.com/java-avoid-null-check) diff --git a/patterns/design-patterns-architectural/README.md b/patterns/design-patterns-architectural/README.md new file mode 100644 index 0000000000..fbe4221752 --- /dev/null +++ b/patterns/design-patterns-architectural/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: +- [Service Locator Pattern](https://www.baeldung.com/java-service-locator-pattern) +- [The DAO Pattern in Java](https://www.baeldung.com/java-dao-pattern) diff --git a/patterns/design-patterns/pom.xml b/patterns/design-patterns-architectural/pom.xml similarity index 78% rename from patterns/design-patterns/pom.xml rename to patterns/design-patterns-architectural/pom.xml index e6bff64f9e..cf99919e7c 100644 --- a/patterns/design-patterns/pom.xml +++ b/patterns/design-patterns-architectural/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - design-patterns + design-patterns-architectural 1.0 - design-patterns + design-patterns-architectural jar @@ -21,7 +21,8 @@ ${assertj-core.version} test - + + javax javaee-api ${javaee.version} @@ -37,24 +38,15 @@ ${mysql-connector.version} jar - - log4j - log4j - ${log4j.version} - - - com.googlecode.grep4j - grep4j - ${grep4j.version} - UTF-8 1.8 1.8 - 1.8.7 + 3.9.1 + 8.0 5.2.16.Final 6.0.6 diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/application/UserApplication.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/application/UserApplication.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/application/UserApplication.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/application/UserApplication.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/JpaEntityManagerFactory.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/config/PersistenceUnitInfoImpl.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/Dao.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/Dao.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/Dao.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/Dao.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/JpaUserDao.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/UserDao.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/UserDao.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/daos/UserDao.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/daos/UserDao.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/daopattern/entities/User.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/entities/User.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/daopattern/entities/User.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/daopattern/entities/User.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/Cache.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/Cache.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/Cache.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/Cache.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/EmailService.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/EmailService.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/EmailService.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/EmailService.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/InitialContext.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/InitialContext.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/InitialContext.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/InitialContext.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/Main.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/Main.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/Main.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/Main.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/MessagingService.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/MessagingService.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/MessagingService.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/MessagingService.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/SMSService.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/SMSService.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/SMSService.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/SMSService.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/service/locator/ServiceLocator.java b/patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/ServiceLocator.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/service/locator/ServiceLocator.java rename to patterns/design-patterns-architectural/src/main/java/com/baeldung/service/locator/ServiceLocator.java diff --git a/patterns/design-patterns/src/main/resources/META-INF/persistence.xml b/patterns/design-patterns-architectural/src/main/resources/META-INF/persistence.xml similarity index 100% rename from patterns/design-patterns/src/main/resources/META-INF/persistence.xml rename to patterns/design-patterns-architectural/src/main/resources/META-INF/persistence.xml diff --git a/patterns/design-patterns/src/test/java/com/baeldung/daopattern/test/UserDaoUnitTest.java b/patterns/design-patterns-architectural/src/test/java/com/baeldung/daopattern/test/UserDaoUnitTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/daopattern/test/UserDaoUnitTest.java rename to patterns/design-patterns-architectural/src/test/java/com/baeldung/daopattern/test/UserDaoUnitTest.java diff --git a/patterns/design-patterns-behavioral-2/README.md b/patterns/design-patterns-behavioral-2/README.md new file mode 100644 index 0000000000..9618a9c458 --- /dev/null +++ b/patterns/design-patterns-behavioral-2/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Memento Design Pattern in Java](https://www.baeldung.com/java-memento-design-pattern) diff --git a/patterns/design-patterns-behavioral-2/pom.xml b/patterns/design-patterns-behavioral-2/pom.xml new file mode 100644 index 0000000000..7e73c0ad19 --- /dev/null +++ b/patterns/design-patterns-behavioral-2/pom.xml @@ -0,0 +1,33 @@ + + + 4.0.0 + design-patterns-behavioral-2 + 1.0 + design-patterns-behavioral-2 + jar + + + com.baeldung + patterns + 1.0.0-SNAPSHOT + .. + + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + UTF-8 + 1.8 + 1.8 + + 3.12.2 + + diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextEditor.java b/patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextEditor.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextEditor.java rename to patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextEditor.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextWindow.java b/patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextWindow.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextWindow.java rename to patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextWindow.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextWindowState.java b/patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextWindowState.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/memento/TextWindowState.java rename to patterns/design-patterns-behavioral-2/src/main/java/com/baeldung/memento/TextWindowState.java diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/memento/TextEditorUnitTest.java b/patterns/design-patterns-behavioral-2/src/test/java/com/baeldung/memento/TextEditorUnitTest.java similarity index 100% rename from patterns/design-patterns-2/src/test/java/com/baeldung/memento/TextEditorUnitTest.java rename to patterns/design-patterns-behavioral-2/src/test/java/com/baeldung/memento/TextEditorUnitTest.java diff --git a/patterns/design-patterns-behavioral/README.md b/patterns/design-patterns-behavioral/README.md new file mode 100644 index 0000000000..42514e0ad8 --- /dev/null +++ b/patterns/design-patterns-behavioral/README.md @@ -0,0 +1,11 @@ +### Relevant Articles: +- [The Observer Pattern in Java](https://www.baeldung.com/java-observer-pattern) +- [Visitor Design Pattern in Java](https://www.baeldung.com/java-visitor-pattern) +- [Interpreter Design Pattern in Java](https://www.baeldung.com/java-interpreter-pattern) +- [State Design Pattern in Java](https://www.baeldung.com/java-state-design-pattern) +- [Implementing the Template Method Pattern in Java](https://www.baeldung.com/java-template-method-pattern) +- [Chain of Responsibility Design Pattern in Java](https://www.baeldung.com/chain-of-responsibility-pattern) +- [The Command Pattern in Java](https://www.baeldung.com/java-command-pattern) +- [The Mediator Pattern in Java](https://www.baeldung.com/java-mediator-pattern) +- [Introduction to the Null Object Pattern](https://www.baeldung.com/java-null-object-pattern) +- [Avoid Check for Null Statement in Java](https://www.baeldung.com/java-avoid-null-check) diff --git a/patterns/design-patterns-2/pom.xml b/patterns/design-patterns-behavioral/pom.xml similarity index 69% rename from patterns/design-patterns-2/pom.xml rename to patterns/design-patterns-behavioral/pom.xml index f99bb4dc9c..d6603f94ec 100644 --- a/patterns/design-patterns-2/pom.xml +++ b/patterns/design-patterns-behavioral/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - design-patterns-2 + design-patterns-behavioral 1.0 - design-patterns-2 + design-patterns-behavioral jar @@ -31,32 +31,21 @@ commons-lang3 ${commons-lang3.version} + org.assertj assertj-core - ${assertj.version} + ${assertj-core.version} test - - - org.inferred - freebuilder - ${freebuilder.version} - true - - - com.google.code.findbugs - jsr305 - ${javax.annotations.version} - + UTF-8 1.8 1.8 + 16.0.2 - 3.12.2 - 2.4.1 - 3.0.2 + 3.9.1 diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProcessor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProcessor.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProcessor.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProcessor.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProvider.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProvider.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProvider.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/AuthenticationProvider.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/OAuthAuthenticationProcessor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/OAuthAuthenticationProcessor.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/OAuthAuthenticationProcessor.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/OAuthAuthenticationProcessor.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/OAuthTokenProvider.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/OAuthTokenProvider.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/OAuthTokenProvider.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/OAuthTokenProvider.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/SamlAuthenticationProvider.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/SamlAuthenticationProvider.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/SamlAuthenticationProvider.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/SamlAuthenticationProvider.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordAuthenticationProcessor.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordProvider.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordProvider.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordProvider.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/chainofresponsibility/UsernamePasswordProvider.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/client/TextFileApplication.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/client/TextFileApplication.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/command/client/TextFileApplication.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/client/TextFileApplication.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/command/OpenTextFileOperation.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/OpenTextFileOperation.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/command/command/OpenTextFileOperation.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/OpenTextFileOperation.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/command/SaveTextFileOperation.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/SaveTextFileOperation.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/command/command/SaveTextFileOperation.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/SaveTextFileOperation.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/command/TextFileOperation.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/TextFileOperation.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/command/command/TextFileOperation.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/command/TextFileOperation.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/invoker/TextFileOperationExecutor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/invoker/TextFileOperationExecutor.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/command/invoker/TextFileOperationExecutor.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/invoker/TextFileOperationExecutor.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/command/receiver/TextFile.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/receiver/TextFile.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/command/receiver/TextFile.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/command/receiver/TextFile.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Context.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Context.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Context.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Context.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Expression.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Expression.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Expression.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Expression.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/From.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/From.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/From.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/From.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/InterpreterDemo.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/InterpreterDemo.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/InterpreterDemo.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/InterpreterDemo.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Row.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Row.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Row.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Row.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Select.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Select.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Select.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Select.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/interpreter/Where.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Where.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/interpreter/Where.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/interpreter/Where.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Button.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Button.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Button.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Button.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Fan.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Fan.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Fan.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Fan.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Mediator.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Mediator.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/mediator/Mediator.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/Mediator.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/mediator/PowerSupplier.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/PowerSupplier.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/mediator/PowerSupplier.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/mediator/PowerSupplier.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/JmsRouter.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/JmsRouter.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/JmsRouter.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/JmsRouter.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Message.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/Message.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Message.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/Message.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/NullRouter.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/NullRouter.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/NullRouter.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/NullRouter.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Router.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/Router.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/Router.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/Router.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RouterFactory.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/RouterFactory.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RouterFactory.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/RouterFactory.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RoutingHandler.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/RoutingHandler.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/RoutingHandler.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/RoutingHandler.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/SmsRouter.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/SmsRouter.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nullobject/SmsRouter.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nullobject/SmsRouter.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/APIContracts.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/APIContracts.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/APIContracts.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/APIContracts.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/Assertions.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/Assertions.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/Assertions.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/Assertions.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/EmptyCollections.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/EmptyCollections.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/EmptyCollections.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/EmptyCollections.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/FindBugsAnnotations.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/Preconditions.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/Preconditions.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/Preconditions.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/Preconditions.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/PrimitivesAndWrapper.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/PrimitivesAndWrapper.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/PrimitivesAndWrapper.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/PrimitivesAndWrapper.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingLombok.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingLombok.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingLombok.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingLombok.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingObjects.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingObjects.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingObjects.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingObjects.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingOptional.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingOptional.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingOptional.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingOptional.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingStringUtils.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingStringUtils.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/nulls/UsingStringUtils.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/nulls/UsingStringUtils.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/Channel.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/Channel.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/observer/Channel.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/Channel.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/NewsAgency.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/NewsAgency.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/observer/NewsAgency.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/NewsAgency.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/NewsChannel.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/NewsChannel.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/observer/NewsChannel.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/NewsChannel.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/ONewsAgency.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/ONewsAgency.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/observer/ONewsAgency.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/ONewsAgency.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/ONewsChannel.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/ONewsChannel.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/observer/ONewsChannel.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/ONewsChannel.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/PCLNewsAgency.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/PCLNewsAgency.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/observer/PCLNewsAgency.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/PCLNewsAgency.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/observer/PCLNewsChannel.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/PCLNewsChannel.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/observer/PCLNewsChannel.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/observer/PCLNewsChannel.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/DeliveredState.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/state/DeliveredState.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/DeliveredState.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/OrderedState.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/state/OrderedState.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/OrderedState.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/Package.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/Package.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/state/Package.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/Package.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/PackageState.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/state/PackageState.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/PackageState.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/ReceivedState.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/state/ReceivedState.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/ReceivedState.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/state/StateDemo.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/StateDemo.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/state/StateDemo.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/state/StateDemo.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/application/Application.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/application/Application.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/application/Application.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/application/Application.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/Computer.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/Computer.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/Computer.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/Computer.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/ComputerBuilder.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/ComputerBuilder.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/ComputerBuilder.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/ComputerBuilder.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/HighEndComputer.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/HighEndComputer.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/HighEndComputer.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/HighEndComputer.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/HighEndComputerBuilder.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/HighEndComputerBuilder.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/HighEndComputerBuilder.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/HighEndComputerBuilder.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/StandardComputer.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/StandardComputer.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/StandardComputer.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/StandardComputer.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/StandardComputerBuilder.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/StandardComputerBuilder.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/templatemethod/model/StandardComputerBuilder.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/templatemethod/model/StandardComputerBuilder.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/Document.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Document.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/Document.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Document.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/Element.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Element.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/Element.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Element.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/ElementVisitor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/ElementVisitor.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/ElementVisitor.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/ElementVisitor.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/JsonElement.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/JsonElement.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/JsonElement.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/JsonElement.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/Visitor.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Visitor.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/Visitor.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/Visitor.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/VisitorDemo.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/VisitorDemo.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/VisitorDemo.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/VisitorDemo.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/visitor/XmlElement.java b/patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/XmlElement.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/visitor/XmlElement.java rename to patterns/design-patterns-behavioral/src/main/java/com/baeldung/visitor/XmlElement.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/chainofresponsibility/ChainOfResponsibilityIntegrationTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/chainofresponsibility/ChainOfResponsibilityIntegrationTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/chainofresponsibility/ChainOfResponsibilityIntegrationTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/chainofresponsibility/ChainOfResponsibilityIntegrationTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/command/test/OpenTextFileOperationUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/OpenTextFileOperationUnitTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/command/test/OpenTextFileOperationUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/OpenTextFileOperationUnitTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/command/test/SaveTextFileOperationUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/SaveTextFileOperationUnitTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/command/test/SaveTextFileOperationUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/SaveTextFileOperationUnitTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/command/test/TextFileOperationExecutorUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/TextFileOperationExecutorUnitTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/command/test/TextFileOperationExecutorUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/TextFileOperationExecutorUnitTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/command/test/TextFileUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/TextFileUnitTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/command/test/TextFileUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/command/test/TextFileUnitTest.java diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/mediator/MediatorIntegrationTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/mediator/MediatorIntegrationTest.java similarity index 100% rename from patterns/design-patterns-2/src/test/java/com/baeldung/mediator/MediatorIntegrationTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/mediator/MediatorIntegrationTest.java diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/PrimitivesAndWrapperUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/PrimitivesAndWrapperUnitTest.java similarity index 100% rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/PrimitivesAndWrapperUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/PrimitivesAndWrapperUnitTest.java diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingLombokUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingLombokUnitTest.java similarity index 100% rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingLombokUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingLombokUnitTest.java diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingObjectsUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingObjectsUnitTest.java similarity index 100% rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingObjectsUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingObjectsUnitTest.java diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java similarity index 100% rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingOptionalUnitTest.java diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingStringUtilsUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingStringUtilsUnitTest.java similarity index 100% rename from patterns/design-patterns-2/src/test/java/com/baeldung/nulls/UsingStringUtilsUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/nulls/UsingStringUtilsUnitTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/observer/ObserverIntegrationTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/observer/ObserverIntegrationTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/observer/ObserverIntegrationTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/observer/ObserverIntegrationTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/state/StatePatternUnitTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/state/StatePatternUnitTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/state/StatePatternUnitTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/state/StatePatternUnitTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/templatemethod/test/TemplateMethodPatternIntegrationTest.java b/patterns/design-patterns-behavioral/src/test/java/com/baeldung/templatemethod/test/TemplateMethodPatternIntegrationTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/templatemethod/test/TemplateMethodPatternIntegrationTest.java rename to patterns/design-patterns-behavioral/src/test/java/com/baeldung/templatemethod/test/TemplateMethodPatternIntegrationTest.java diff --git a/patterns/design-patterns-creational/README.md b/patterns/design-patterns-creational/README.md new file mode 100644 index 0000000000..0c00dc7b3a --- /dev/null +++ b/patterns/design-patterns-creational/README.md @@ -0,0 +1,8 @@ +### Relevant Articles: +- [Singletons in Java](https://www.baeldung.com/java-singleton) +- [Introduction to Creational Design Patterns](https://www.baeldung.com/creational-design-patterns) +- [Abstract Factory Pattern in Java](https://www.baeldung.com/java-abstract-factory-pattern) +- [Flyweight Pattern in Java](https://www.baeldung.com/java-flyweight) +- [Double-Checked Locking with Singleton](https://www.baeldung.com/java-singleton-double-checked-locking) +- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) +- [Automatic Generation of the Builder Pattern with FreeBuilder](https://www.baeldung.com/java-builder-pattern-freebuilder) diff --git a/patterns/design-patterns-creational/pom.xml b/patterns/design-patterns-creational/pom.xml new file mode 100644 index 0000000000..351f69f749 --- /dev/null +++ b/patterns/design-patterns-creational/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + design-patterns-creational + 1.0 + design-patterns-creational + jar + + + com.baeldung + patterns + 1.0.0-SNAPSHOT + .. + + + + + org.inferred + freebuilder + ${freebuilder.version} + true + + + com.google.code.findbugs + jsr305 + ${javax.annotations.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + UTF-8 + 1.8 + 1.8 + + 2.4.1 + 3.0.2 + 3.9.1 + + diff --git a/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java similarity index 97% rename from patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java index d19772072f..8730542dcb 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java +++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java @@ -1,12 +1,12 @@ -package com.baeldung.constructorsstaticfactorymethods.application; - -import com.baeldung.constructorsstaticfactorymethods.entities.User; - -public class Application { - - public static void main(String[] args) { - User user1 = User.createWithDefaultCountry("John", "john@domain.com"); - User user2 = User.createWithLoggedInstantiationTime("John", "john@domain.com", "Argentina"); - User user3 = User.getSingletonInstance("John", "john@domain.com", "Argentina"); - } +package com.baeldung.constructorsstaticfactorymethods.application; + +import com.baeldung.constructorsstaticfactorymethods.entities.User; + +public class Application { + + public static void main(String[] args) { + User user1 = User.createWithDefaultCountry("John", "john@domain.com"); + User user2 = User.createWithLoggedInstantiationTime("John", "john@domain.com", "Argentina"); + User user3 = User.getSingletonInstance("John", "john@domain.com", "Argentina"); + } } \ No newline at end of file diff --git a/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java similarity index 96% rename from patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java index 4036b622c6..f05a3baaa3 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java +++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java @@ -1,63 +1,63 @@ -package com.baeldung.constructorsstaticfactorymethods.entities; - -import java.time.LocalTime; -import java.util.logging.ConsoleHandler; -import java.util.logging.Level; -import java.util.logging.Logger; -import java.util.logging.SimpleFormatter; - -public class User { - - private static volatile User instance = null; - private static final Logger LOGGER = Logger.getLogger(User.class.getName()); - private final String name; - private final String email; - private final String country; - - public static User createWithDefaultCountry(String name, String email) { - return new User(name, email, "Argentina"); - } - - public static User createWithLoggedInstantiationTime(String name, String email, String country) { - setLoggerProperties(); - LOGGER.log(Level.INFO, "Creating User instance at : {0}", LocalTime.now()); - return new User(name, email, country); - } - - public static User getSingletonInstance(String name, String email, String country) { - if (instance == null) { - synchronized (User.class) { - if (instance == null) { - instance = new User(name, email, country); - } - } - } - return instance; - - } - - private User(String name, String email, String country) { - this.name = name; - this.email = email; - this.country = country; - } - - public String getName() { - return name; - } - - public String getEmail() { - return email; - } - - public String getCountry() { - return country; - } - - private static void setLoggerProperties() { - ConsoleHandler handler = new ConsoleHandler(); - handler.setLevel(Level.INFO); - handler.setFormatter(new SimpleFormatter()); - LOGGER.addHandler(handler); - } -} +package com.baeldung.constructorsstaticfactorymethods.entities; + +import java.time.LocalTime; +import java.util.logging.ConsoleHandler; +import java.util.logging.Level; +import java.util.logging.Logger; +import java.util.logging.SimpleFormatter; + +public class User { + + private static volatile User instance = null; + private static final Logger LOGGER = Logger.getLogger(User.class.getName()); + private final String name; + private final String email; + private final String country; + + public static User createWithDefaultCountry(String name, String email) { + return new User(name, email, "Argentina"); + } + + public static User createWithLoggedInstantiationTime(String name, String email, String country) { + setLoggerProperties(); + LOGGER.log(Level.INFO, "Creating User instance at : {0}", LocalTime.now()); + return new User(name, email, country); + } + + public static User getSingletonInstance(String name, String email, String country) { + if (instance == null) { + synchronized (User.class) { + if (instance == null) { + instance = new User(name, email, country); + } + } + } + return instance; + + } + + private User(String name, String email, String country) { + this.name = name; + this.email = email; + this.country = country; + } + + public String getName() { + return name; + } + + public String getEmail() { + return email; + } + + public String getCountry() { + return country; + } + + private static void setLoggerProperties() { + ConsoleHandler handler = new ConsoleHandler(); + handler.setLevel(Level.INFO); + handler.setFormatter(new SimpleFormatter()); + LOGGER.addHandler(handler); + } +} diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AbstractFactory.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AbstractPatternDriver.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Animal.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Animal.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Animal.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Animal.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/AnimalFactory.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Brown.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Brown.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Brown.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Brown.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Color.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Color.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Color.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Color.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/ColorFactory.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Dog.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Dog.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Dog.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Dog.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Duck.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Duck.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/Duck.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/Duck.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/FactoryProvider.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/FactoryProvider.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/FactoryProvider.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/FactoryProvider.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/White.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/White.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/abstractfactory/White.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/abstractfactory/White.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/builder/BankAccount.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/builder/BankAccount.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/builder/BankAccount.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/builder/BankAccount.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/builder/BuilderPatternDriver.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/builder/BuilderPatternDriver.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/builder/BuilderPatternDriver.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/builder/BuilderPatternDriver.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/FactoryDriver.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/FactoryDriver.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/FactoryDriver.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/FactoryDriver.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Heptagon.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Heptagon.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Heptagon.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Heptagon.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Octagon.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Octagon.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Octagon.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Octagon.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Pentagon.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Pentagon.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Pentagon.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Pentagon.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Polygon.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Polygon.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Polygon.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Polygon.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/PolygonFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/PolygonFactory.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/PolygonFactory.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/PolygonFactory.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Square.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Square.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Square.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Square.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Triangle.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Triangle.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/factory/Triangle.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/factory/Triangle.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/singleton/Singleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/singleton/Singleton.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/singleton/Singleton.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/singleton/Singleton.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/creational/singleton/SingletonDriver.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/creational/singleton/SingletonDriver.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/creational/singleton/SingletonDriver.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/creational/singleton/SingletonDriver.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/Car.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Car.java similarity index 95% rename from patterns/design-patterns/src/main/java/com/baeldung/flyweight/Car.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Car.java index a0b1a7cdf5..80ef992abb 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/Car.java +++ b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Car.java @@ -2,8 +2,6 @@ package com.baeldung.flyweight; import java.awt.Color; -import javax.annotation.concurrent.Immutable; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -12,7 +10,6 @@ import org.slf4j.LoggerFactory; * * @author Donato Rimenti */ -@Immutable public class Car implements Vehicle { /** diff --git a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/Engine.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Engine.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/flyweight/Engine.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Engine.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/Vehicle.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Vehicle.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/flyweight/Vehicle.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/Vehicle.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/flyweight/VehicleFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/VehicleFactory.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/flyweight/VehicleFactory.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/flyweight/VehicleFactory.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Address.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/Address.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Address.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/Address.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Employee.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/Employee.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/Employee.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/Employee.java diff --git a/patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/builder/Employee.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/builder/Employee.java similarity index 100% rename from patterns/design-patterns-2/src/main/java/com/baeldung/freebuilder/builder/Employee.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/freebuilder/builder/Employee.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/ClassSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/ClassSingleton.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/ClassSingleton.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/ClassSingleton.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/EnumSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/EnumSingleton.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/EnumSingleton.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/EnumSingleton.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/Sandbox.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/Sandbox.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/Sandbox.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/Sandbox.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/DclSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/DclSingleton.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/DclSingleton.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/DclSingleton.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/DraconianSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/DraconianSingleton.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/DraconianSingleton.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/DraconianSingleton.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/EarlyInitSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/EarlyInitSingleton.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/EarlyInitSingleton.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/EarlyInitSingleton.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/EnumSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/EnumSingleton.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/EnumSingleton.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/EnumSingleton.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/InitOnDemandSingleton.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/InitOnDemandSingleton.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/singleton/synchronization/InitOnDemandSingleton.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/singleton/synchronization/InitOnDemandSingleton.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java similarity index 97% rename from patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java index 0c0266a111..ee8698b18d 100644 --- a/patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java +++ b/patterns/design-patterns-creational/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java @@ -1,43 +1,43 @@ -package com.baeldung.constructorsstaticfactorymethods; - -import com.baeldung.constructorsstaticfactorymethods.entities.User; -import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; - -public class UserUnitTest { - - @Test - public void givenUserClass_whenCalledcreateWithDefaultCountry_thenCorrect() { - assertThat(User.createWithDefaultCountry("John", "john@domain.com")).isInstanceOf(User.class); - } - - @Test - public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetName_thenCorrect() { - User user = User.createWithDefaultCountry("John", "john@domain.com"); - assertThat(user.getName()).isEqualTo("John"); - } - - @Test - public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetEmail_thenCorrect() { - User user = User.createWithDefaultCountry("John", "john@domain.com"); - assertThat(user.getEmail()).isEqualTo("john@domain.com"); - } - - @Test - public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetCountry_thenCorrect() { - User user = User.createWithDefaultCountry("John", "john@domain.com"); - assertThat(user.getCountry()).isEqualTo("Argentina"); - } - - @Test - public void givenUserInstanceCreatedWithcreateWithInstantiationTime_whenCalledcreateWithInstantiationTime_thenCorrect() { - assertThat(User.createWithLoggedInstantiationTime("John", "john@domain.com", "Argentina")).isInstanceOf(User.class); - } - - @Test - public void givenUserInstanceCreatedWithgetSingletonIntance_whenCalledgetSingletonInstance_thenCorrect() { - User user1 = User.getSingletonInstance("John", "john@domain.com", "Argentina"); - User user2 = User.getSingletonInstance("John", "john@domain.com", "Argentina"); - assertThat(user1).isEqualTo(user2); - } +package com.baeldung.constructorsstaticfactorymethods; + +import com.baeldung.constructorsstaticfactorymethods.entities.User; +import static org.assertj.core.api.Assertions.assertThat; +import org.junit.Test; + +public class UserUnitTest { + + @Test + public void givenUserClass_whenCalledcreateWithDefaultCountry_thenCorrect() { + assertThat(User.createWithDefaultCountry("John", "john@domain.com")).isInstanceOf(User.class); + } + + @Test + public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetName_thenCorrect() { + User user = User.createWithDefaultCountry("John", "john@domain.com"); + assertThat(user.getName()).isEqualTo("John"); + } + + @Test + public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetEmail_thenCorrect() { + User user = User.createWithDefaultCountry("John", "john@domain.com"); + assertThat(user.getEmail()).isEqualTo("john@domain.com"); + } + + @Test + public void givenUserIntanceCreatedWithcreateWithDefaultCountry_whenCalledgetCountry_thenCorrect() { + User user = User.createWithDefaultCountry("John", "john@domain.com"); + assertThat(user.getCountry()).isEqualTo("Argentina"); + } + + @Test + public void givenUserInstanceCreatedWithcreateWithInstantiationTime_whenCalledcreateWithInstantiationTime_thenCorrect() { + assertThat(User.createWithLoggedInstantiationTime("John", "john@domain.com", "Argentina")).isInstanceOf(User.class); + } + + @Test + public void givenUserInstanceCreatedWithgetSingletonIntance_whenCalledgetSingletonInstance_thenCorrect() { + User user1 = User.getSingletonInstance("John", "john@domain.com", "Argentina"); + User user2 = User.getSingletonInstance("John", "john@domain.com", "Argentina"); + assertThat(user1).isEqualTo(user2); + } } \ No newline at end of file diff --git a/patterns/design-patterns/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/creational/abstractfactory/AbstractPatternIntegrationTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/creational/builder/BuilderPatternIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/creational/builder/BuilderPatternIntegrationTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/creational/builder/BuilderPatternIntegrationTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/creational/builder/BuilderPatternIntegrationTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/creational/factory/FactoryIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/creational/factory/FactoryIntegrationTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/creational/factory/FactoryIntegrationTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/creational/factory/FactoryIntegrationTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/creational/singleton/SingletonIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/creational/singleton/SingletonIntegrationTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/creational/singleton/SingletonIntegrationTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/creational/singleton/SingletonIntegrationTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/flyweight/FlyweightUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/flyweight/FlyweightUnitTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/flyweight/FlyweightUnitTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/flyweight/FlyweightUnitTest.java diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java similarity index 100% rename from patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/freebuilder/EmployeeBuilderUnitTest.java diff --git a/patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java similarity index 100% rename from patterns/design-patterns-2/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/freebuilder/builder/EmployeeBuilderUnitTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/singleton/synchronization/SingletonSynchronizationIntegrationTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/singleton/synchronization/SingletonSynchronizationIntegrationTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/singleton/synchronization/SingletonSynchronizationIntegrationTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/singleton/synchronization/SingletonSynchronizationIntegrationTest.java diff --git a/patterns/design-patterns-functional/README.md b/patterns/design-patterns-functional/README.md new file mode 100644 index 0000000000..04e21bafd5 --- /dev/null +++ b/patterns/design-patterns-functional/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Currying in Java](https://www.baeldung.com/java-currying) diff --git a/patterns/design-patterns-functional/pom.xml b/patterns/design-patterns-functional/pom.xml new file mode 100644 index 0000000000..5df7cc0cb9 --- /dev/null +++ b/patterns/design-patterns-functional/pom.xml @@ -0,0 +1,25 @@ + + + 4.0.0 + design-patterns-functional + 1.0 + design-patterns-functional + jar + + + com.baeldung + patterns + 1.0.0-SNAPSHOT + .. + + + + + + + UTF-8 + 1.8 + 1.8 + + diff --git a/patterns/design-patterns/src/main/java/com/baeldung/currying/Letter.java b/patterns/design-patterns-functional/src/main/java/com/baeldung/currying/Letter.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/currying/Letter.java rename to patterns/design-patterns-functional/src/main/java/com/baeldung/currying/Letter.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/currying/LetterUnitTest.java b/patterns/design-patterns-functional/src/test/java/com/baeldung/currying/LetterUnitTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/currying/LetterUnitTest.java rename to patterns/design-patterns-functional/src/test/java/com/baeldung/currying/LetterUnitTest.java diff --git a/patterns/design-patterns-structural/README.md b/patterns/design-patterns-structural/README.md new file mode 100644 index 0000000000..91620a522e --- /dev/null +++ b/patterns/design-patterns-structural/README.md @@ -0,0 +1,7 @@ +### Relevant Articles: +- [Facade Design Pattern in Java](https://www.baeldung.com/java-facade-pattern) +- [Proxy, Decorator, Adapter and Bridge Patterns](https://www.baeldung.com/java-structural-design-patterns) +- [Composite Design Pattern in Java](https://www.baeldung.com/java-composite-pattern) +- [The Decorator Pattern in Java](https://www.baeldung.com/java-decorator-pattern) +- [The Adapter Pattern in Java](https://www.baeldung.com/java-adapter-pattern) +- [The Proxy Pattern in Java](https://www.baeldung.com/java-proxy-pattern) diff --git a/patterns/design-patterns-structural/pom.xml b/patterns/design-patterns-structural/pom.xml new file mode 100644 index 0000000000..63806058c9 --- /dev/null +++ b/patterns/design-patterns-structural/pom.xml @@ -0,0 +1,30 @@ + + + 4.0.0 + design-patterns-structural + 1.0 + design-patterns-structural + jar + + + com.baeldung + patterns + 1.0.0-SNAPSHOT + .. + + + + + log4j + log4j + ${log4j.version} + + + + + UTF-8 + 1.8 + 1.8 + + diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java similarity index 94% rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java index a4e10a0868..9f696a5f40 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java +++ b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AdapterPatternDriver.java @@ -1,6 +1,6 @@ package com.baeldung.adapter; -import static com.baeldung.util.LogerUtil.LOG; +import static com.baeldung.util.LoggerUtil.LOG; public class AdapterPatternDriver { diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/AstonMartin.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AstonMartin.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/AstonMartin.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/AstonMartin.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/BugattiVeyron.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/BugattiVeyron.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/BugattiVeyron.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/BugattiVeyron.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/McLaren.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/McLaren.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/McLaren.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/McLaren.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/Movable.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/Movable.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/Movable.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/Movable.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/MovableAdapter.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/MovableAdapter.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/MovableAdapter.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/MovableAdapter.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/adapter/MovableAdapterImpl.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/MovableAdapterImpl.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/adapter/MovableAdapterImpl.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/adapter/MovableAdapterImpl.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Blue.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Blue.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Blue.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Blue.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/BridgePatternDriver.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/BridgePatternDriver.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/BridgePatternDriver.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/BridgePatternDriver.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Color.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Color.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Color.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Color.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Red.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Red.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Red.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Red.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Shape.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Shape.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Shape.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Shape.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Square.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Square.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Square.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Square.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/bridge/Triangle.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Triangle.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/bridge/Triangle.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/bridge/Triangle.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/CompositeDemo.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/CompositeDemo.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/composite/CompositeDemo.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/CompositeDemo.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/Department.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/Department.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/composite/Department.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/Department.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/FinancialDepartment.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/FinancialDepartment.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/composite/FinancialDepartment.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/FinancialDepartment.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/HeadDepartment.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/HeadDepartment.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/composite/HeadDepartment.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/HeadDepartment.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/composite/SalesDepartment.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/composite/SalesDepartment.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/composite/SalesDepartment.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/composite/SalesDepartment.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/BubbleLights.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/BubbleLights.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/BubbleLights.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/BubbleLights.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/ChristmasTree.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/ChristmasTree.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/ChristmasTree.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/ChristmasTree.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/ChristmasTreeImpl.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/ChristmasTreeImpl.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/ChristmasTreeImpl.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/ChristmasTreeImpl.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java similarity index 90% rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java index c20c23ff6e..6a9da7c78c 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java +++ b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/DecoratorPatternDriver.java @@ -1,6 +1,6 @@ package com.baeldung.decorator; -import static com.baeldung.util.LogerUtil.LOG; +import static com.baeldung.util.LoggerUtil.LOG; public class DecoratorPatternDriver { diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/Garland.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/Garland.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/Garland.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/Garland.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/decorator/TreeDecorator.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/TreeDecorator.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/decorator/TreeDecorator.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/decorator/TreeDecorator.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/CarEngineFacade.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/CarEngineFacade.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/CarEngineFacade.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/CarEngineFacade.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/AirFlowController.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/AirFlowController.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/AirFlowController.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/AirFlowController.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/AirFlowMeter.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/AirFlowMeter.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/AirFlowMeter.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/AirFlowMeter.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/CatalyticConverter.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/CatalyticConverter.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/CatalyticConverter.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/CatalyticConverter.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/CoolingController.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/CoolingController.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/CoolingController.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/CoolingController.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/FuelInjector.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/FuelInjector.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/FuelInjector.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/FuelInjector.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/FuelPump.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/FuelPump.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/FuelPump.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/FuelPump.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/Radiator.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/Radiator.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/Radiator.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/Radiator.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/Starter.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/Starter.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/Starter.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/Starter.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/TemperatureSensor.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/TemperatureSensor.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/facade/carsystem/TemperatureSensor.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/facade/carsystem/TemperatureSensor.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObject.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObject.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObject.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObject.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java similarity index 88% rename from patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java index 7ade31da88..6d38672a63 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java +++ b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectImpl.java @@ -1,6 +1,6 @@ package com.baeldung.proxy; -import static com.baeldung.util.LogerUtil.LOG;; +import static com.baeldung.util.LoggerUtil.LOG; public class ExpensiveObjectImpl implements ExpensiveObject { diff --git a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectProxy.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectProxy.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/proxy/ExpensiveObjectProxy.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ExpensiveObjectProxy.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/proxy/ProxyPatternDriver.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ProxyPatternDriver.java similarity index 100% rename from patterns/design-patterns/src/main/java/com/baeldung/proxy/ProxyPatternDriver.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/proxy/ProxyPatternDriver.java diff --git a/patterns/design-patterns/src/main/java/com/baeldung/util/LogerUtil.java b/patterns/design-patterns-structural/src/main/java/com/baeldung/util/LoggerUtil.java similarity index 87% rename from patterns/design-patterns/src/main/java/com/baeldung/util/LogerUtil.java rename to patterns/design-patterns-structural/src/main/java/com/baeldung/util/LoggerUtil.java index 7217a4bc40..9702cba0f5 100644 --- a/patterns/design-patterns/src/main/java/com/baeldung/util/LogerUtil.java +++ b/patterns/design-patterns-structural/src/main/java/com/baeldung/util/LoggerUtil.java @@ -8,7 +8,7 @@ import java.util.Properties; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; -public class LogerUtil { +public class LoggerUtil { public final static Logger LOG = Logger.getLogger("GLOBAL"); @@ -22,7 +22,7 @@ public class LogerUtil { props.load( new BufferedReader( new InputStreamReader( - LogerUtil.class.getResourceAsStream("/log4jstructuraldp.properties") + LoggerUtil.class.getResourceAsStream("/log4jstructuraldp.properties") ) ) ); diff --git a/patterns/design-patterns/src/main/resources/log4jstructuraldp.properties b/patterns/design-patterns-structural/src/main/resources/log4jstructuraldp.properties similarity index 100% rename from patterns/design-patterns/src/main/resources/log4jstructuraldp.properties rename to patterns/design-patterns-structural/src/main/resources/log4jstructuraldp.properties diff --git a/patterns/design-patterns/src/test/java/com/baeldung/AdapterPatternIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/adapter/AdapterPatternIntegrationTest.java similarity index 75% rename from patterns/design-patterns/src/test/java/com/baeldung/AdapterPatternIntegrationTest.java rename to patterns/design-patterns-structural/src/test/java/com/baeldung/adapter/AdapterPatternIntegrationTest.java index 78a1492d83..536caf7341 100644 --- a/patterns/design-patterns/src/test/java/com/baeldung/AdapterPatternIntegrationTest.java +++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/adapter/AdapterPatternIntegrationTest.java @@ -1,16 +1,9 @@ -package com.baeldung; +package com.baeldung.adapter; import static org.junit.Assert.assertEquals; import org.junit.Test; -import com.baeldung.adapter.AstonMartin; -import com.baeldung.adapter.BugattiVeyron; -import com.baeldung.adapter.McLaren; -import com.baeldung.adapter.Movable; -import com.baeldung.adapter.MovableAdapter; -import com.baeldung.adapter.MovableAdapterImpl; - public class AdapterPatternIntegrationTest { @Test public void givenMovableAdapter_WhenConvertingMPHToKMPH_thenSuccessfullyConverted() { diff --git a/patterns/design-patterns/src/test/java/com/baeldung/BridgePatternIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/bridge/BridgePatternIntegrationTest.java similarity index 72% rename from patterns/design-patterns/src/test/java/com/baeldung/BridgePatternIntegrationTest.java rename to patterns/design-patterns-structural/src/test/java/com/baeldung/bridge/BridgePatternIntegrationTest.java index adcb5cdd2c..814a91c070 100644 --- a/patterns/design-patterns/src/test/java/com/baeldung/BridgePatternIntegrationTest.java +++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/bridge/BridgePatternIntegrationTest.java @@ -1,15 +1,9 @@ -package com.baeldung; +package com.baeldung.bridge; import static org.junit.Assert.*; import org.junit.Test; -import com.baeldung.bridge.Blue; -import com.baeldung.bridge.Red; -import com.baeldung.bridge.Shape; -import com.baeldung.bridge.Square; -import com.baeldung.bridge.Triangle; - public class BridgePatternIntegrationTest { @Test diff --git a/patterns/design-patterns/src/test/java/com/baeldung/DecoratorPatternIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/decorator/DecoratorPatternIntegrationTest.java similarity index 75% rename from patterns/design-patterns/src/test/java/com/baeldung/DecoratorPatternIntegrationTest.java rename to patterns/design-patterns-structural/src/test/java/com/baeldung/decorator/DecoratorPatternIntegrationTest.java index 23a717ae2e..0f2e262346 100644 --- a/patterns/design-patterns/src/test/java/com/baeldung/DecoratorPatternIntegrationTest.java +++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/decorator/DecoratorPatternIntegrationTest.java @@ -1,14 +1,9 @@ -package com.baeldung; +package com.baeldung.decorator; import static org.junit.Assert.assertEquals; import org.junit.Test; -import com.baeldung.decorator.BubbleLights; -import com.baeldung.decorator.ChristmasTree; -import com.baeldung.decorator.ChristmasTreeImpl; -import com.baeldung.decorator.Garland; - public class DecoratorPatternIntegrationTest { @Test public void givenDecoratorPattern_WhenDecoratorsInjectedAtRuntime_thenConfigSuccess() { diff --git a/patterns/design-patterns/src/test/java/com/baeldung/facade/CarEngineFacadeIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/facade/CarEngineFacadeIntegrationTest.java similarity index 100% rename from patterns/design-patterns/src/test/java/com/baeldung/facade/CarEngineFacadeIntegrationTest.java rename to patterns/design-patterns-structural/src/test/java/com/baeldung/facade/CarEngineFacadeIntegrationTest.java diff --git a/patterns/design-patterns/src/test/java/com/baeldung/ProxyPatternIntegrationTest.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/ProxyPatternIntegrationTest.java similarity index 87% rename from patterns/design-patterns/src/test/java/com/baeldung/ProxyPatternIntegrationTest.java rename to patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/ProxyPatternIntegrationTest.java index c035793b64..6db19f7cea 100644 --- a/patterns/design-patterns/src/test/java/com/baeldung/ProxyPatternIntegrationTest.java +++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/ProxyPatternIntegrationTest.java @@ -1,6 +1,6 @@ -package com.baeldung; +package com.baeldung.proxy; -import static com.baeldung.util.LogerUtil.LOG; +import static com.baeldung.util.LoggerUtil.LOG; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -11,9 +11,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.baeldung.proxy.ExpensiveObject; -import com.baeldung.proxy.ExpensiveObjectProxy; - public class ProxyPatternIntegrationTest { public static TestAppenderDP appender; diff --git a/patterns/design-patterns/src/test/java/com/baeldung/TestAppenderDP.java b/patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/TestAppenderDP.java similarity index 95% rename from patterns/design-patterns/src/test/java/com/baeldung/TestAppenderDP.java rename to patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/TestAppenderDP.java index 2b3bc47292..1c6d9a2064 100644 --- a/patterns/design-patterns/src/test/java/com/baeldung/TestAppenderDP.java +++ b/patterns/design-patterns-structural/src/test/java/com/baeldung/proxy/TestAppenderDP.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.proxy; import java.util.ArrayList; import java.util.List; diff --git a/patterns/design-patterns/README.md b/patterns/design-patterns/README.md deleted file mode 100644 index 1c611f05d2..0000000000 --- a/patterns/design-patterns/README.md +++ /dev/null @@ -1,23 +0,0 @@ -### Relevant Articles: -- [Facade Design Pattern in Java](http://www.baeldung.com/java-facade-pattern) -- [Singletons in Java](http://www.baeldung.com/java-singleton) -- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns) -- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) -- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern) -- [Flyweight Pattern in Java](http://www.baeldung.com/java-flyweight) -- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern) -- [Double-Checked Locking with Singleton](http://www.baeldung.com/java-singleton-double-checked-locking) -- [Composite Design Pattern in Java](http://www.baeldung.com/java-composite-pattern) -- [Visitor Design Pattern in Java](http://www.baeldung.com/java-visitor-pattern) -- [The DAO Pattern in Java](http://www.baeldung.com/java-dao-pattern) -- [Interpreter Design Pattern in Java](http://www.baeldung.com/java-interpreter-pattern) -- [State Design Pattern in Java](https://www.baeldung.com/java-state-design-pattern) -- [The Decorator Pattern in Java](https://www.baeldung.com/java-decorator-pattern) -- [Abstract Factory Pattern in Java](https://www.baeldung.com/java-abstract-factory-pattern) -- [Implementing the Template Method Pattern in Java](http://www.baeldung.com/java-template-method-pattern) -- [Chain of Responsibility Design Pattern in Java](http://www.baeldung.com/chain-of-responsibility-pattern) -- [The Command Pattern in Java](http://www.baeldung.com/java-command-pattern) -- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) -- [The Adapter Pattern in Java](https://www.baeldung.com/java-adapter-pattern) -- [Currying in Java](https://www.baeldung.com/java-currying) -- [The Proxy Pattern in Java](https://www.baeldung.com/java-proxy-pattern) diff --git a/patterns/pom.xml b/patterns/pom.xml index 7f7368ca07..196c3c3319 100644 --- a/patterns/pom.xml +++ b/patterns/pom.xml @@ -16,8 +16,12 @@ front-controller intercepting-filter - design-patterns - design-patterns-2 + design-patterns-architectural + design-patterns-behavioral + design-patterns-behavioral-2 + design-patterns-creational + design-patterns-functional + design-patterns-structural solid dip backoff-jitter From b7c58ddce6477f20453654c9e3234edc0b653630 Mon Sep 17 00:00:00 2001 From: NickTononi <48349671+NickTononi@users.noreply.github.com> Date: Wed, 11 Sep 2019 13:23:33 +0200 Subject: [PATCH 178/396] [BAEL-3279]Add missing code snippets from the Spring RequestMapping article (#7768) * [BAEL-3279]Add missing code snippets from the Spring RequestMapping article * [BAEL-3279] Updated snippets * changhed tabs to spaces * fixed import issues * fixed package --- .../FooMappingExamplesController.java | 28 ++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java index 2c11e36141..90012ed054 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java +++ b/spring-rest-simple/src/main/java/com/baeldung/requestmapping/FooMappingExamplesController.java @@ -1,6 +1,8 @@ package com.baeldung.requestmapping; +import org.springframework.http.MediaType; import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -97,5 +99,29 @@ public class FooMappingExamplesController { public String putAndPostFoos() { return "Advanced - PUT and POST within single method"; } + + // --- Ambiguous Mapping + + @GetMapping(value = "foos/duplicate" ) + public String duplicate() { + return "Duplicate"; + } + + // uncomment for exception of type java.lang.IllegalStateException: Ambiguous mapping -} + // @GetMapping(value = "foos/duplicate" ) + // public String duplicateEx() { + // return "Duplicate"; + // } + + @GetMapping(value = "foos/duplicate/xml", produces = MediaType.APPLICATION_XML_VALUE) + public String duplicateXml() { + return "Duplicate Xml"; + } + + @GetMapping(value = "foos/duplicate/json", produces = MediaType.APPLICATION_JSON_VALUE) + public String duplicateJson() { + return "Duplicate Json"; + } + +} \ No newline at end of file From 4f1aa7ab6def9b1c9f0aa78ad33357042a66f890 Mon Sep 17 00:00:00 2001 From: Rui Vilao Date: Wed, 11 Sep 2019 20:02:21 +0200 Subject: [PATCH 179/396] Renames java-sql20 to a more generic module persistence-libraries. --- .../{java-sql2o => persistence-libraries}/README.md | 0 .../{java-sql2o => persistence-libraries}/pom.xml | 2 +- .../com/baeldung/persistence/sql2o/Sql2oIntegrationTest.java | 0 persistence-modules/pom.xml | 4 ++-- 4 files changed, 3 insertions(+), 3 deletions(-) rename persistence-modules/{java-sql2o => persistence-libraries}/README.md (100%) rename persistence-modules/{java-sql2o => persistence-libraries}/pom.xml (97%) rename persistence-modules/{java-sql2o => persistence-libraries}/src/test/java/com/baeldung/persistence/sql2o/Sql2oIntegrationTest.java (100%) diff --git a/persistence-modules/java-sql2o/README.md b/persistence-modules/persistence-libraries/README.md similarity index 100% rename from persistence-modules/java-sql2o/README.md rename to persistence-modules/persistence-libraries/README.md diff --git a/persistence-modules/java-sql2o/pom.xml b/persistence-modules/persistence-libraries/pom.xml similarity index 97% rename from persistence-modules/java-sql2o/pom.xml rename to persistence-modules/persistence-libraries/pom.xml index fe5a0e5dc8..cce051f303 100644 --- a/persistence-modules/java-sql2o/pom.xml +++ b/persistence-modules/persistence-libraries/pom.xml @@ -2,7 +2,7 @@ 4.0.0 - java-sql2o + persistence-libraries 1.0-SNAPSHOT diff --git a/persistence-modules/java-sql2o/src/test/java/com/baeldung/persistence/sql2o/Sql2oIntegrationTest.java b/persistence-modules/persistence-libraries/src/test/java/com/baeldung/persistence/sql2o/Sql2oIntegrationTest.java similarity index 100% rename from persistence-modules/java-sql2o/src/test/java/com/baeldung/persistence/sql2o/Sql2oIntegrationTest.java rename to persistence-modules/persistence-libraries/src/test/java/com/baeldung/persistence/sql2o/Sql2oIntegrationTest.java diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 9ae24efcc1..5dd0611f41 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -30,7 +30,7 @@ java-jpa java-jpa-2 java-mongodb - java-sql2o + persistence-libraries jnosql liquibase orientdb @@ -59,7 +59,7 @@ spring-jpa spring-persistence-simple jpa-hibernate-cascade-type - r2dbc + r2dbc spring-boot-jdbi From 075f6476fca917371867ce73c1cf39f2fa1234d4 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 11 Sep 2019 21:46:42 +0300 Subject: [PATCH 180/396] Update README.md --- java-math/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-math/README.md b/java-math/README.md index 244417d1a5..b0921e55ae 100644 --- a/java-math/README.md +++ b/java-math/README.md @@ -9,3 +9,4 @@ - [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage) - [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude) - [Debugging with Eclipse](https://www.baeldung.com/eclipse-debugging) +- [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication) From fb1ed77838ddb943b41b2233bb2555c96559e9db Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 11 Sep 2019 21:47:26 +0300 Subject: [PATCH 181/396] Update README.md --- libraries-2/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/libraries-2/README.md b/libraries-2/README.md index 400aa475d1..7d7fc67fa7 100644 --- a/libraries-2/README.md +++ b/libraries-2/README.md @@ -8,6 +8,5 @@ - [A Guide to Crawler4j](https://www.baeldung.com/crawler4j) - [Decode an OkHttp JSON Response](https://www.baeldung.com/okhttp-json-response) - [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map) -- [Matrix Multiplication in Java](https://www.baeldung.com/java-matrix-multiplication) - [Guide to MapDB](https://www.baeldung.com/mapdb) - [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos) From ec23ab367efe9342bb6de5763d07a4dec4d85c4f Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Thu, 12 Sep 2019 12:32:10 +0300 Subject: [PATCH 182/396] Split or move core-java-modules/core-java-lang-oop module (#7767) --- .../core-java-lang-oop-2/README.md | 5 ++++ .../core-java-lang-oop-2/pom.xml | 22 +++++++++++----- .../baeldung/constructors/BankAccount.java | 0 .../baeldung/constructors/Transaction.java | 0 .../com/baeldung/equalshashcode/Money.java | 0 .../com/baeldung/equalshashcode/Team.java | 0 .../com/baeldung/equalshashcode/Voucher.java | 0 .../baeldung/equalshashcode/WrongTeam.java | 0 .../baeldung/equalshashcode/WrongVoucher.java | 0 .../equalshashcode/entities/ComplexClass.java | 0 .../entities/PrimitiveClass.java | 0 .../equalshashcode/entities/Rectangle.java | 0 .../equalshashcode/entities/Shape.java | 0 .../equalshashcode/entities/Square.java | 0 .../baeldung/immutableobjects/Currency.java | 0 .../com/baeldung/immutableobjects/Money.java | 0 .../application/Application.java | 8 +----- .../inheritancecomposition/model/Actress.java | 0 .../model/Computer.java | 0 .../inheritancecomposition/model/Memory.java | 0 .../inheritancecomposition/model/Person.java | 0 .../model/Processor.java | 0 .../model/SoundCard.java | 0 .../model/StandardMemory.java | 0 .../model/StandardProcessor.java | 0 .../model/StandardSoundCard.java | 0 .../model/Waitress.java | 0 .../markerinterface/DeletableShape.java | 0 .../baeldung/markerinterface/Rectangle.java | 0 .../com/baeldung/markerinterface/Shape.java | 0 .../baeldung/markerinterface/ShapeDao.java | 0 .../constructors/ConstructorUnitTest.java | 2 -- .../equalshashcode/MoneyUnitTest.java | 6 ++--- .../baeldung/equalshashcode/TeamUnitTest.java | 9 +++---- .../entities/ComplexClassUnitTest.java | 8 +++--- .../entities/PrimitiveClassUnitTest.java | 0 .../entities/SquareClassUnitTest.java | 4 +-- .../ImmutableObjectsUnitTest.java | 4 +-- .../ActressUnitTest.java | 3 ++- .../CompositionUnitTest.java | 15 +++++------ .../InheritanceUnitTest.java | 5 ++-- .../PersonUnitTest.java | 3 ++- .../WaitressUnitTest.java | 3 ++- .../MarkerInterfaceUnitTest.java | 4 +-- .../core-java-lang-oop-3/.gitignore | 26 +++++++++++++++++++ .../core-java-lang-oop-3/README.md | 11 ++++++++ .../core-java-lang-oop-3/pom.xml | 26 +++++++++++++++++++ .../com/baeldung/accessmodifiers/Public.java | 0 .../baeldung/accessmodifiers/SubClass.java | 0 .../baeldung/accessmodifiers/SuperPublic.java | 0 .../another/AnotherPublic.java | 0 .../another/AnotherSubClass.java | 0 .../another/AnotherSuperPublic.java | 0 .../publicmodifier/ListOfThree.java | 0 .../publicmodifier/SpecialCharacters.java | 0 .../publicmodifier/Student.java | 0 .../com/baeldung/keyword/KeywordDemo.java | 0 .../keyword/superkeyword/SuperBase.java | 0 .../keyword/superkeyword/SuperSub.java | 0 .../keyword/thiskeyword/KeywordUnitTest.java | 0 .../relationships/aggregation/Car.java | 0 .../aggregation/CarWithStaticInnerWheel.java | 0 .../relationships/aggregation/Wheel.java | 0 .../relationships/association/Child.java | 0 .../relationships/association/Mother.java | 0 .../relationships/composition/Building.java | 0 .../BuildingWithDefinitionRoomInMethod.java | 0 .../relationships/university/Department.java | 0 .../relationships/university/Professor.java | 0 .../relationships/university/University.java | 0 .../PublicAccessModifierUnitTest.java | 11 ++++---- .../NonPrimitivesUnitTest.java | 2 +- .../parameterpassing/PrimitivesUnitTest.java | 0 .../core-java-lang-oop/README.md | 9 ------- core-java-modules/core-java-lang-oop/pom.xml | 7 ----- pom.xml | 2 ++ 76 files changed, 124 insertions(+), 71 deletions(-) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/constructors/BankAccount.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/constructors/Transaction.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/Money.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/Team.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/Voucher.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/WrongTeam.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/entities/Shape.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/equalshashcode/entities/Square.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/immutableobjects/Currency.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/immutableobjects/Money.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/application/Application.java (67%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/Person.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/markerinterface/DeletableShape.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/markerinterface/Rectangle.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/markerinterface/Shape.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/main/java/com/baeldung/markerinterface/ShapeDao.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java (96%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java (99%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java (94%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java (89%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java (100%) rename core-java-modules/{core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test => core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition}/ActressUnitTest.java (95%) rename core-java-modules/{core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test => core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition}/CompositionUnitTest.java (61%) rename core-java-modules/{core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test => core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition}/InheritanceUnitTest.java (93%) rename core-java-modules/{core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test => core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition}/PersonUnitTest.java (94%) rename core-java-modules/{core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test => core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition}/WaitressUnitTest.java (96%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-2}/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java (100%) create mode 100644 core-java-modules/core-java-lang-oop-3/.gitignore create mode 100644 core-java-modules/core-java-lang-oop-3/README.md create mode 100644 core-java-modules/core-java-lang-oop-3/pom.xml rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/accessmodifiers/Public.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/accessmodifiers/SubClass.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/keyword/KeywordDemo.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java (100%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/aggregation/Car.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/aggregation/Wheel.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/association/Child.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/association/Mother.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/composition/Building.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/university/Department.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/university/Professor.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/relationships/university/University.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java (99%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java (99%) rename core-java-modules/{core-java-lang-oop => core-java-lang-oop-3}/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java (100%) diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md index 5c615c25df..7fee77d4bb 100644 --- a/core-java-modules/core-java-lang-oop-2/README.md +++ b/core-java-modules/core-java-lang-oop-2/README.md @@ -8,3 +8,8 @@ - [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes) - [Raw Types in Java](https://www.baeldung.com/raw-types-java) - [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword) +- [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces) +- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) +- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object) +- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition) +- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) diff --git a/core-java-modules/core-java-lang-oop-2/pom.xml b/core-java-modules/core-java-lang-oop-2/pom.xml index b7bd72372b..d27df147b7 100644 --- a/core-java-modules/core-java-lang-oop-2/pom.xml +++ b/core-java-modules/core-java-lang-oop-2/pom.xml @@ -15,16 +15,26 @@ - - com.h2database - h2 - ${h2.version} - test - + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + nl.jqno.equalsverifier + equalsverifier + ${equalsverifier.version} + test + 1.4.199 + + 3.10.0 + 3.0.3 diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/BankAccount.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/BankAccount.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/Transaction.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/constructors/Transaction.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Money.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Money.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Team.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Team.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Voucher.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/Voucher.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongTeam.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongTeam.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Shape.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Shape.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Square.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/equalshashcode/entities/Square.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Currency.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Currency.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Money.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/immutableobjects/Money.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java similarity index 67% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java index 7761fdce56..fc6db9411c 100644 --- a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/application/Application.java @@ -1,12 +1,6 @@ package com.baeldung.inheritancecomposition.application; -import com.baeldung.inheritancecomposition.model.Actress; -import com.baeldung.inheritancecomposition.model.Computer; -import com.baeldung.inheritancecomposition.model.StandardMemory; -import com.baeldung.inheritancecomposition.model.Person; -import com.baeldung.inheritancecomposition.model.StandardProcessor; -import com.baeldung.inheritancecomposition.model.StandardSoundCard; -import com.baeldung.inheritancecomposition.model.Waitress; +import com.baeldung.inheritancecomposition.model.*; public class Application { diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Person.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Person.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/DeletableShape.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/DeletableShape.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/DeletableShape.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/DeletableShape.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Rectangle.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Rectangle.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Rectangle.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Rectangle.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Shape.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Shape.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/Shape.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/Shape.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/ShapeDao.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/ShapeDao.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/markerinterface/ShapeDao.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/markerinterface/ShapeDao.java diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java similarity index 96% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java index 66c8520e34..274fe77764 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java @@ -1,11 +1,9 @@ package com.baeldung.constructors; -import com.google.common.collect.Comparators; import org.junit.Test; import java.time.LocalDateTime; import java.time.Month; -import java.util.ArrayList; import java.util.logging.Logger; import static org.assertj.core.api.Assertions.*; diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java index 60584fdb53..8fc99e0e81 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java @@ -1,10 +1,10 @@ package com.baeldung.equalshashcode; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.assertFalse; - import org.junit.Test; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + public class MoneyUnitTest { @Test diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java similarity index 99% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java index a2de408796..7dfc6d47a3 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java @@ -1,14 +1,13 @@ package com.baeldung.equalshashcode; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; +import nl.jqno.equalsverifier.EqualsVerifier; +import org.junit.Test; import java.util.HashMap; import java.util.Map; -import org.junit.Test; - -import nl.jqno.equalsverifier.EqualsVerifier; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; public class TeamUnitTest { diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java similarity index 94% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java index 0cb4ace0ab..05b1e3e0b9 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java @@ -1,13 +1,11 @@ package com.baeldung.equalshashcode.entities; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; - import org.junit.Assert; import org.junit.Test; -import com.baeldung.equalshashcode.entities.ComplexClass; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; public class ComplexClassUnitTest { diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java similarity index 89% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java index a25e8bd486..7722ee7605 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java @@ -1,11 +1,9 @@ package com.baeldung.equalshashcode.entities; -import java.awt.Color; - import org.junit.Assert; import org.junit.Test; -import com.baeldung.equalshashcode.entities.Square; +import java.awt.*; public class SquareClassUnitTest { diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java index 01dfeac050..7b917023ee 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java @@ -1,11 +1,11 @@ package com.baeldung.immutableobjects; -import static org.junit.Assert.assertEquals; +import org.junit.Test; import java.util.ArrayList; import java.util.List; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class ImmutableObjectsUnitTest { diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java similarity index 95% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java index 6dbf2302ae..e174ceceae 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/ActressUnitTest.java @@ -1,8 +1,9 @@ -package com.baeldung.inheritancecomposition.test; +package com.baeldung.inheritancecomposition; import com.baeldung.inheritancecomposition.model.Actress; import org.junit.BeforeClass; import org.junit.Test; + import static org.assertj.core.api.Assertions.*; public class ActressUnitTest { diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java similarity index 61% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java index 987af047a5..7699ecb4a7 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/CompositionUnitTest.java @@ -1,15 +1,12 @@ -package com.baeldung.inheritancecomposition.test; +package com.baeldung.inheritancecomposition; -import com.baeldung.inheritancecomposition.model.Computer; -import com.baeldung.inheritancecomposition.model.Memory; -import com.baeldung.inheritancecomposition.model.Processor; -import com.baeldung.inheritancecomposition.model.StandardMemory; -import com.baeldung.inheritancecomposition.model.StandardProcessor; -import com.baeldung.inheritancecomposition.model.StandardSoundCard; -import java.util.Optional; -import static org.assertj.core.api.Assertions.assertThat; +import com.baeldung.inheritancecomposition.model.*; import org.junit.Test; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + public class CompositionUnitTest { diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java similarity index 93% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java index 3ddbc19607..515e05528b 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/InheritanceUnitTest.java @@ -1,11 +1,12 @@ -package com.baeldung.inheritancecomposition.test; +package com.baeldung.inheritancecomposition; import com.baeldung.inheritancecomposition.model.Actress; import com.baeldung.inheritancecomposition.model.Person; import com.baeldung.inheritancecomposition.model.Waitress; -import static org.assertj.core.api.Assertions.assertThat; import org.junit.Test; +import static org.assertj.core.api.Assertions.assertThat; + public class InheritanceUnitTest { @Test diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java similarity index 94% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java index 313070b274..ea0b87f6e6 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/PersonUnitTest.java @@ -1,8 +1,9 @@ -package com.baeldung.inheritancecomposition.test; +package com.baeldung.inheritancecomposition; import com.baeldung.inheritancecomposition.model.Person; import org.junit.BeforeClass; import org.junit.Test; + import static org.assertj.core.api.Assertions.*; public class PersonUnitTest { diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java similarity index 96% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java index c23fc4d403..816868be13 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/inheritancecomposition/WaitressUnitTest.java @@ -1,8 +1,9 @@ -package com.baeldung.inheritancecomposition.test; +package com.baeldung.inheritancecomposition; import com.baeldung.inheritancecomposition.model.Waitress; import org.junit.BeforeClass; import org.junit.Test; + import static org.assertj.core.api.Assertions.*; public class WaitressUnitTest { diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java index 81cd51ce51..64e5d8cdb1 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java +++ b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/markerinterface/MarkerInterfaceUnitTest.java @@ -1,9 +1,9 @@ package com.baeldung.markerinterface; -import static org.junit.jupiter.api.Assertions.assertEquals; - import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; + public class MarkerInterfaceUnitTest { @Test diff --git a/core-java-modules/core-java-lang-oop-3/.gitignore b/core-java-modules/core-java-lang-oop-3/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/core-java-modules/core-java-lang-oop-3/.gitignore @@ -0,0 +1,26 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +*.txt +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md new file mode 100644 index 0000000000..57df2c1769 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-3/README.md @@ -0,0 +1,11 @@ +========= + +## Core Java Lang OOP 3 Cookbooks and Examples + +### Relevant Articles: +- [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference) +- [Access Modifiers in Java](http://www.baeldung.com/java-access-modifiers) +- [Guide to the super Java Keyword](http://www.baeldung.com/java-super) +- [Guide to the this Java Keyword](http://www.baeldung.com/java-this) +- [Java Public Access Modifier](https://www.baeldung.com/java-public-keyword) +- [Composition, Aggregation and Association in Java](https://www.baeldung.com/java-composition-aggregation-association) \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-3/pom.xml b/core-java-modules/core-java-lang-oop-3/pom.xml new file mode 100644 index 0000000000..29807b5bef --- /dev/null +++ b/core-java-modules/core-java-lang-oop-3/pom.xml @@ -0,0 +1,26 @@ + + 4.0.0 + com.baeldung + core-java-lang-oop-3 + 0.1.0-SNAPSHOT + core-java-lang-oop-3 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + com.h2database + h2 + ${h2.version} + test + + + + diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/Public.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/Public.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SubClass.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SubClass.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/ListOfThree.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/SpecialCharacters.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/accessmodifiers/publicmodifier/Student.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/KeywordDemo.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java diff --git a/core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/Car.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Car.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/Car.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Car.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/CarWithStaticInnerWheel.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/Wheel.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Wheel.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/aggregation/Wheel.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/aggregation/Wheel.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/association/Child.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Child.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/association/Child.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Child.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/association/Mother.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Mother.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/association/Mother.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/association/Mother.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/composition/Building.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/Building.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/composition/Building.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/Building.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/composition/BuildingWithDefinitionRoomInMethod.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/Department.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Department.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/Department.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Department.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/Professor.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Professor.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/Professor.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/Professor.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/University.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/University.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/relationships/university/University.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/relationships/university/University.java diff --git a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java similarity index 99% rename from core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java index a2d891ac93..ed8fb4f45a 100644 --- a/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java +++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/accessmodifiers/PublicAccessModifierUnitTest.java @@ -1,14 +1,11 @@ package com.baeldung.accessmodifiers; +import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; +import com.baeldung.accessmodifiers.publicmodifier.Student; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.api.TestInstance.Lifecycle; -import com.baeldung.accessmodifiers.publicmodifier.ListOfThree; -import com.baeldung.accessmodifiers.publicmodifier.Student; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; import java.math.BigDecimal; import java.sql.Connection; import java.sql.DriverManager; @@ -17,6 +14,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; + @TestInstance(Lifecycle.PER_CLASS) public class PublicAccessModifierUnitTest { diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java similarity index 99% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java index 62f891d11b..bf0d12936d 100644 --- a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java +++ b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java @@ -27,7 +27,7 @@ public class NonPrimitivesUnitTest { b1.num++; } } - + class Foo { public int num; diff --git a/core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java rename to core-java-modules/core-java-lang-oop-3/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md index c9ee9a9e94..1751da8b3e 100644 --- a/core-java-modules/core-java-lang-oop/README.md +++ b/core-java-modules/core-java-lang-oop/README.md @@ -12,13 +12,4 @@ - [Object Type Casting in Java](http://www.baeldung.com/java-type-casting) - [The “final” Keyword in Java](http://www.baeldung.com/java-final) - [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure) -- [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference) - [Variable and Method Hiding in Java](http://www.baeldung.com/java-variable-method-hiding) -- [Access Modifiers in Java](http://www.baeldung.com/java-access-modifiers) -- [Guide to the super Java Keyword](http://www.baeldung.com/java-super) -- [Guide to the this Java Keyword](http://www.baeldung.com/java-this) -- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object) -- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition) -- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) -- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) -- [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces) diff --git a/core-java-modules/core-java-lang-oop/pom.xml b/core-java-modules/core-java-lang-oop/pom.xml index 46003b132b..d86347b51f 100644 --- a/core-java-modules/core-java-lang-oop/pom.xml +++ b/core-java-modules/core-java-lang-oop/pom.xml @@ -56,12 +56,6 @@ ${assertj-core.version} test - - nl.jqno.equalsverifier - equalsverifier - ${equalsverifier.version} - test - @@ -78,7 +72,6 @@ 2.8.2 3.10.0 - 3.0.3 diff --git a/pom.xml b/pom.xml index 7f92acef6c..297df13b82 100644 --- a/pom.xml +++ b/pom.xml @@ -408,6 +408,7 @@ core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop core-java-modules/core-java-lang-oop-2 + core-java-modules/core-java-lang-oop-3 core-java-modules core-java-modules/core-java-networking core-java-modules/core-java-perf @@ -1135,6 +1136,7 @@ core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop core-java-modules/core-java-lang-oop-2 + core-java-modules/core-java-lang-oop-3 core-java-modules core-java-modules/core-java-networking core-java-modules/core-java-perf From 8673e3a460e4fa1abb021697525d170fd4d92831 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Thu, 12 Sep 2019 11:37:21 +0200 Subject: [PATCH 183/396] BAEL-3132 - Linux Commands - Loop Through Directories/Folders (#7682) * BAEL-3132 - Linux Commands - Loop Through Directories/Folders * BAEL-3132 - Linux Commands - Loop Through Directories/Folders - update pom description. * BAEL-3132 - Linux Commands - Loop Through Directories/Folders - Add another example using find exec. * BAEL-3132 - Linux Commands - Loop Through Directories/Folders --- linux-bash/loops/src/main/bash/find_directories.sh | 9 +++++++++ linux-bash/loops/src/main/bash/loop_directories.sh | 11 +++++++++++ 2 files changed, 20 insertions(+) create mode 100755 linux-bash/loops/src/main/bash/find_directories.sh create mode 100755 linux-bash/loops/src/main/bash/loop_directories.sh diff --git a/linux-bash/loops/src/main/bash/find_directories.sh b/linux-bash/loops/src/main/bash/find_directories.sh new file mode 100755 index 0000000000..8a9b20294d --- /dev/null +++ b/linux-bash/loops/src/main/bash/find_directories.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +find . -maxdepth 1 -mindepth 1 -type d -printf '%f\n' + +find . -maxdepth 1 -mindepth 1 -type d | while read dir; do + echo "$dir" +done + +find . -maxdepth 1 -type d -exec echo {} \; \ No newline at end of file diff --git a/linux-bash/loops/src/main/bash/loop_directories.sh b/linux-bash/loops/src/main/bash/loop_directories.sh new file mode 100755 index 0000000000..77e661d710 --- /dev/null +++ b/linux-bash/loops/src/main/bash/loop_directories.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +for dir in */; do + echo "$dir" +done + +for file in *; do + if [ -d "$file" ]; then + echo "$file" + fi +done \ No newline at end of file From d96a0726802b73a852e86611691579c6f9590f50 Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Thu, 12 Sep 2019 12:54:41 +0300 Subject: [PATCH 184/396] Split or move core-java-modules/core-java-networking module --- .../core-java-networking-2/README.md | 2 ++ core-java-modules/core-java-networking-2/pom.xml | 16 +++++++++++++++- .../httprequest/FullResponseBuilder.java | 0 .../httprequest/ParameterStringBuilder.java | 0 .../java/com/baeldung/mail/EmailService.java | 7 ++----- .../httprequest/HttpRequestLiveTest.java | 9 +-------- core-java-modules/core-java-networking/README.md | 2 -- core-java-modules/core-java-networking/pom.xml | 11 ----------- 8 files changed, 20 insertions(+), 27 deletions(-) rename core-java-modules/{core-java-networking => core-java-networking-2}/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java (100%) rename core-java-modules/{core-java-networking => core-java-networking-2}/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java (100%) rename core-java-modules/{core-java-networking => core-java-networking-2}/src/main/java/com/baeldung/mail/EmailService.java (97%) rename core-java-modules/{core-java-networking => core-java-networking-2}/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java (96%) diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md index 6b6151248e..ce54ce5e56 100644 --- a/core-java-modules/core-java-networking-2/README.md +++ b/core-java-modules/core-java-networking-2/README.md @@ -1,3 +1,5 @@ ### Relevant Articles - [Checking if a URL Exists in Java](https://www.baeldung.com/java-check-url-exists) +- [Do a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) +- [Sending Emails with Java](http://www.baeldung.com/java-email) diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml index 8a26f6ab9f..1e46a9ef7f 100644 --- a/core-java-modules/core-java-networking-2/pom.xml +++ b/core-java-modules/core-java-networking-2/pom.xml @@ -12,9 +12,23 @@ + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + javax.mail + mail + ${javax.mail.version} + core-java-networking-2 - + + + + 1.5.0-b01 + diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java similarity index 100% rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/FullResponseBuilder.java diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java similarity index 100% rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/httprequest/ParameterStringBuilder.java diff --git a/core-java-modules/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java similarity index 97% rename from core-java-modules/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java rename to core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java index e775b9f708..bd2024fdfa 100644 --- a/core-java-modules/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/mail/EmailService.java @@ -1,15 +1,12 @@ package com.baeldung.mail; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.io.File; -import java.util.Properties; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; +import java.io.File; +import java.util.Properties; public class EmailService { diff --git a/core-java-modules/core-java-networking/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java similarity index 96% rename from core-java-modules/core-java-networking/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java rename to core-java-modules/core-java-networking-2/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java index 77bf9bc8db..41e0f2d6af 100644 --- a/core-java-modules/core-java-networking/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/httprequest/HttpRequestLiveTest.java @@ -3,14 +3,7 @@ package com.baeldung.httprequest; import org.apache.commons.lang3.StringUtils; import org.junit.Test; -import com.baeldung.httprequest.FullResponseBuilder; -import com.baeldung.httprequest.ParameterStringBuilder; - -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.Reader; +import java.io.*; import java.net.CookieManager; import java.net.HttpCookie; import java.net.HttpURLConnection; diff --git a/core-java-modules/core-java-networking/README.md b/core-java-modules/core-java-networking/README.md index 2341520df7..33fc3684a3 100644 --- a/core-java-modules/core-java-networking/README.md +++ b/core-java-modules/core-java-networking/README.md @@ -7,12 +7,10 @@ - [Connecting Through Proxy Servers in Core Java](https://www.baeldung.com/java-connect-via-proxy-server) - [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast) - [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) -- [Sending Emails with Java](http://www.baeldung.com/java-email) - [A Guide To HTTP Cookies In Java](http://www.baeldung.com/cookies-java) - [A Guide to the Java URL](http://www.baeldung.com/java-url) - [Working with Network Interfaces in Java](http://www.baeldung.com/java-network-interfaces) - [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets) - [Guide to Java URL Encoding/Decoding](http://www.baeldung.com/java-url-encoding-decoding) -- [Do a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) - [Read an InputStream using the Java Server Socket](https://www.baeldung.com/java-inputstream-server-socket) diff --git a/core-java-modules/core-java-networking/pom.xml b/core-java-modules/core-java-networking/pom.xml index e2ee7b2fcc..b5071bf7df 100644 --- a/core-java-modules/core-java-networking/pom.xml +++ b/core-java-modules/core-java-networking/pom.xml @@ -14,11 +14,6 @@ - - javax.mail - mail - ${javax.mail.version} - commons-io commons-io @@ -29,11 +24,6 @@ spring-web ${springframework.spring-web.version} - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - @@ -41,7 +31,6 @@ - 1.5.0-b01 4.3.4.RELEASE From 1f129995deb23d3ccb89dd84a3d7289b5691959b Mon Sep 17 00:00:00 2001 From: Kamlesh Kumar Date: Thu, 12 Sep 2019 19:28:07 +0530 Subject: [PATCH 185/396] BAEL-3139: Moved code to a new project core-java-concurrency-2 (#7778) --- .../core-java-concurrency-2/.gitignore | 26 ++++++++++++++++++ .../core-java-concurrency-2/README.md | 7 +++++ .../core-java-concurrency-2/pom.xml | 27 +++++++++++++++++++ .../concurrent/mutex/SequenceGenerator.java | 0 .../mutex/SequenceGeneratorUsingMonitor.java | 0 .../SequenceGeneratorUsingReentrantLock.java | 0 .../SequenceGeneratorUsingSemaphore.java | 0 ...quenceGeneratorUsingSynchronizedBlock.java | 0 ...uenceGeneratorUsingSynchronizedMethod.java | 0 .../src/main/resources/logback.xml | 19 +++++++++++++ .../concurrent/mutex/MutexUnitTest.java | 0 .../src/test/resources/.gitignore | 13 +++++++++ 12 files changed, 92 insertions(+) create mode 100644 core-java-modules/core-java-concurrency-2/.gitignore create mode 100644 core-java-modules/core-java-concurrency-2/README.md create mode 100644 core-java-modules/core-java-concurrency-2/pom.xml rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-2}/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-2}/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-2}/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-2}/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-2}/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-2}/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java (100%) create mode 100644 core-java-modules/core-java-concurrency-2/src/main/resources/logback.xml rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-2}/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java (100%) create mode 100644 core-java-modules/core-java-concurrency-2/src/test/resources/.gitignore diff --git a/core-java-modules/core-java-concurrency-2/.gitignore b/core-java-modules/core-java-concurrency-2/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/.gitignore @@ -0,0 +1,26 @@ +*.class + +0.* + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* +.resourceCache + +# Packaged files # +*.jar +*.war +*.ear + +# Files generated by integration tests +*.txt +backup-pom.xml +/bin/ +/temp + +#IntelliJ specific +.idea/ +*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-2/README.md b/core-java-modules/core-java-concurrency-2/README.md new file mode 100644 index 0000000000..749d174968 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/README.md @@ -0,0 +1,7 @@ +========= + +## Core Java Concurrency 2 Examples + +### Relevant Articles: +- [Using a Mutex Object in Java](https://www.baeldung.com/java-mutex) + diff --git a/core-java-modules/core-java-concurrency-2/pom.xml b/core-java-modules/core-java-concurrency-2/pom.xml new file mode 100644 index 0000000000..6b179a29c7 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/pom.xml @@ -0,0 +1,27 @@ + + 4.0.0 + com.baeldung + core-java-concurrency-2 + 0.1.0-SNAPSHOT + core-java-concurrency-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + core-java-concurrency-2 + + + src/main/resources + true + + + + + diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGenerator.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingMonitor.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingReentrantLock.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSemaphore.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedBlock.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java b/core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java rename to core-java-modules/core-java-concurrency-2/src/main/java/com/baeldung/concurrent/mutex/SequenceGeneratorUsingSynchronizedMethod.java diff --git a/core-java-modules/core-java-concurrency-2/src/main/resources/logback.xml b/core-java-modules/core-java-concurrency-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java b/core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java rename to core-java-modules/core-java-concurrency-2/src/test/java/com/baeldung/concurrent/mutex/MutexUnitTest.java diff --git a/core-java-modules/core-java-concurrency-2/src/test/resources/.gitignore b/core-java-modules/core-java-concurrency-2/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-concurrency-2/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file From c5675b4a314201eaafe02a0bce5a1261eb12e123 Mon Sep 17 00:00:00 2001 From: Antonio Moreno Date: Fri, 13 Sep 2019 05:43:40 +0200 Subject: [PATCH 186/396] adding methods in java tutorial (#7766) * adding methods in java tutorial * adding static method and removing link --- .../com/baeldung/basicmethods/PersonName.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/basicmethods/PersonName.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/basicmethods/PersonName.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/basicmethods/PersonName.java new file mode 100644 index 0000000000..43bbf0dd62 --- /dev/null +++ b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/basicmethods/PersonName.java @@ -0,0 +1,37 @@ +package com.baeldung.basicmethods; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.PrintWriter; + +public class PersonName { + + public String getName(String firstName, String lastName) throws RuntimeException { + return firstName + " " + lastName; + } + + public String getName(String firstName, String middleName, String lastName) { + if (!middleName.equals("")) { + return firstName + " " + lastName; + } + return firstName + " " + middleName + " " + lastName; + } + + public void printFullName(String firstName, String lastName) { + System.out.println(firstName + " " + lastName); + } + + public void writeName(String name) throws IOException { + PrintWriter out = new PrintWriter(new FileWriter("OutFile.txt")); + out.println("Name: " + name); + out.close(); + } + + public static String getNameStatic(String firstName, String lastName) { + return firstName + " " + lastName; + } + + public static void callToStaticMethod() { + System.out.println("Name is: " + PersonName.getNameStatic("Alan", "Turing")); + } +} From 2c19d277d447158e7998039eff73b7d4065fde65 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 13 Sep 2019 16:08:57 +0530 Subject: [PATCH 187/396] BAEL-17420 Slice 16 | The top 100 articles should have their own package in the module (#7747) --- .../java/listInitialization/ListInitializationUnitTest.java | 2 +- .../PostJSONWithHttpURLConnection.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename core-java-modules/core-java/src/main/java/com/baeldung/{urlconnection => jsonposturlconnection}/PostJSONWithHttpURLConnection.java (97%) diff --git a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java b/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java index b484eecef7..25f39e9a13 100644 --- a/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java +++ b/core-java-modules/core-java-collections-list-2/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java @@ -42,7 +42,7 @@ public class ListInitializationUnitTest { } @Test - public void givenArrayAsList_whenCreated_thenShareReference() { + public void givenArraysAsList_whenCreated_thenShareReference() { String[] array = { "foo", "bar" }; List list = Arrays.asList(array); array[0] = "baz"; diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java b/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java similarity index 97% rename from core-java-modules/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java rename to core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java index 38b4a0411d..b2469ac984 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/urlconnection/PostJSONWithHttpURLConnection.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/jsonposturlconnection/PostJSONWithHttpURLConnection.java @@ -1,4 +1,4 @@ -package com.baeldung.urlconnection; +package com.baeldung.jsonposturlconnection; import java.io.BufferedReader; import java.io.IOException; From 2a165908c278b735fd6d954f444a6730a826419a Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Sat, 14 Sep 2019 12:46:52 +0300 Subject: [PATCH 188/396] unmarshalling dates using JAXB - examples (#7672) --- .../baeldung/jaxb/dateunmarshalling/Book.java | 25 +++++++++ .../dateunmarshalling/BookDateAdapter.java | 27 ++++++++++ .../BookLocalDateTimeAdapter.java | 27 ++++++++++ .../jaxb/dateunmarshalling/DateAdapter.java | 21 ++++++++ .../JaxbDateUnmarshalling.java | 45 ++++++++++++++++ .../LocalDateTimeAdapter.java | 21 ++++++++ .../resources/custom-date-unmarshalling.xml | 5 ++ .../resources/default-date-unmarshalling.xml | 5 ++ .../JaxbDateUnmarshallingUnitTest.java | 52 +++++++++++++++++++ 9 files changed, 228 insertions(+) create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/Book.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookDateAdapter.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookLocalDateTimeAdapter.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/DateAdapter.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshalling.java create mode 100644 jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/LocalDateTimeAdapter.java create mode 100644 jaxb/src/main/resources/custom-date-unmarshalling.xml create mode 100644 jaxb/src/main/resources/default-date-unmarshalling.xml create mode 100644 jaxb/src/test/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshallingUnitTest.java diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/Book.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/Book.java new file mode 100644 index 0000000000..0625c58344 --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/Book.java @@ -0,0 +1,25 @@ +package com.baeldung.jaxb.dateunmarshalling; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.datatype.XMLGregorianCalendar; + +@XmlRootElement(name = "book") +public class Book { + + @XmlElement(name = "title", required = true) + private String title; + + @XmlElement(name = "published", required = true) + private XMLGregorianCalendar published; + + public XMLGregorianCalendar getPublished() { + return published; + } + + @Override + public String toString() { + return "[title: " + title + "; published: " + published.toString() + "]"; + } + +} \ No newline at end of file diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookDateAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookDateAdapter.java new file mode 100644 index 0000000000..c882f37a04 --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookDateAdapter.java @@ -0,0 +1,27 @@ +package com.baeldung.jaxb.dateunmarshalling; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import java.util.Date; + +@XmlRootElement(name = "book") +public class BookDateAdapter { + + @XmlElement(name = "title", required = true) + private String title; + + @XmlElement(name = "published", required = true) + @XmlJavaTypeAdapter(DateAdapter.class) + private Date published; + + public Date getPublished() { + return published; + } + + @Override + public String toString() { + return "[title: " + title + "; published: " + published.toString() + "]"; + } + +} \ No newline at end of file diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookLocalDateTimeAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookLocalDateTimeAdapter.java new file mode 100644 index 0000000000..53a780a87a --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/BookLocalDateTimeAdapter.java @@ -0,0 +1,27 @@ +package com.baeldung.jaxb.dateunmarshalling; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; +import java.time.LocalDateTime; + +@XmlRootElement(name = "book") +public class BookLocalDateTimeAdapter { + + @XmlElement(name = "title", required = true) + private String title; + + @XmlElement(name = "published", required = true) + @XmlJavaTypeAdapter(LocalDateTimeAdapter.class) + private LocalDateTime published; + + public LocalDateTime getPublished() { + return published; + } + + @Override + public String toString() { + return "[title: " + title + "; published: " + published.toString() + "]"; + } + +} \ No newline at end of file diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/DateAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/DateAdapter.java new file mode 100644 index 0000000000..3b0fd0bd26 --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/DateAdapter.java @@ -0,0 +1,21 @@ +package com.baeldung.jaxb.dateunmarshalling; + +import javax.xml.bind.annotation.adapters.XmlAdapter; +import java.text.SimpleDateFormat; +import java.util.Date; + +public class DateAdapter extends XmlAdapter { + + private static final String CUSTOM_FORMAT_STRING = "yyyy-MM-dd HH:mm:ss"; + + @Override + public String marshal(Date v) { + return new SimpleDateFormat(CUSTOM_FORMAT_STRING).format(v); + } + + @Override + public Date unmarshal(String v) throws Exception { + return new SimpleDateFormat(CUSTOM_FORMAT_STRING).parse(v); + } + +} \ No newline at end of file diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshalling.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshalling.java new file mode 100644 index 0000000000..205859b2bf --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshalling.java @@ -0,0 +1,45 @@ +package com.baeldung.jaxb.dateunmarshalling; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import java.io.InputStream; + +public class JaxbDateUnmarshalling { + + public static final String DEFAULT_DATE_UNMARSHALLING_FILE = "default-date-unmarshalling.xml"; + public static final String CUSTOM_DATE_UNMARSHALLING_FILE = "custom-date-unmarshalling.xml"; + + public static Book unmarshalDates(InputStream inputFile) throws JAXBException { + JAXBContext jaxbContext = JAXBContext.newInstance(Book.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + return (Book) jaxbUnmarshaller.unmarshal(inputFile); + } + + public static BookDateAdapter unmarshalDatesUsingCustomXmlAdapter(InputStream inputFile) throws JAXBException { + JAXBContext jaxbContext = JAXBContext.newInstance(BookDateAdapter.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + return (BookDateAdapter) jaxbUnmarshaller.unmarshal(inputFile); + } + + public static BookLocalDateTimeAdapter unmarshalDatesUsingJava8(InputStream inputFile) throws JAXBException { + JAXBContext jaxbContext = JAXBContext.newInstance(BookLocalDateTimeAdapter.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + return (BookLocalDateTimeAdapter) jaxbUnmarshaller.unmarshal(inputFile); + } + + public static InputStream getInputStream(String file) { + ClassLoader classLoader = JaxbDateUnmarshalling.class.getClassLoader(); + return classLoader.getResourceAsStream(file); + } + + public static void main(String[] args) throws JAXBException { + Book book = unmarshalDates(getInputStream(DEFAULT_DATE_UNMARSHALLING_FILE)); + BookDateAdapter bookDateAdapter = unmarshalDatesUsingCustomXmlAdapter(getInputStream(CUSTOM_DATE_UNMARSHALLING_FILE)); + BookLocalDateTimeAdapter bookLocalDateTimeAdapter = unmarshalDatesUsingJava8(getInputStream(CUSTOM_DATE_UNMARSHALLING_FILE)); + System.out.println(book); + System.out.println(bookDateAdapter); + System.out.println(bookLocalDateTimeAdapter); + } + +} diff --git a/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/LocalDateTimeAdapter.java b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/LocalDateTimeAdapter.java new file mode 100644 index 0000000000..7fa224334c --- /dev/null +++ b/jaxb/src/main/java/com/baeldung/jaxb/dateunmarshalling/LocalDateTimeAdapter.java @@ -0,0 +1,21 @@ +package com.baeldung.jaxb.dateunmarshalling; + +import javax.xml.bind.annotation.adapters.XmlAdapter; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +public class LocalDateTimeAdapter extends XmlAdapter { + + private DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + @Override + public String marshal(LocalDateTime dateTime) { + return dateTime.format(dateFormat); + } + + @Override + public LocalDateTime unmarshal(String dateTime) { + return LocalDateTime.parse(dateTime, dateFormat); + } + +} \ No newline at end of file diff --git a/jaxb/src/main/resources/custom-date-unmarshalling.xml b/jaxb/src/main/resources/custom-date-unmarshalling.xml new file mode 100644 index 0000000000..f4cc7a4f79 --- /dev/null +++ b/jaxb/src/main/resources/custom-date-unmarshalling.xml @@ -0,0 +1,5 @@ + + + Book1 + 1979-11-28 02:31:32 + \ No newline at end of file diff --git a/jaxb/src/main/resources/default-date-unmarshalling.xml b/jaxb/src/main/resources/default-date-unmarshalling.xml new file mode 100644 index 0000000000..44cfa7e6c5 --- /dev/null +++ b/jaxb/src/main/resources/default-date-unmarshalling.xml @@ -0,0 +1,5 @@ + + + Book1 + 1979-11-28T02:31:32 + \ No newline at end of file diff --git a/jaxb/src/test/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshallingUnitTest.java b/jaxb/src/test/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshallingUnitTest.java new file mode 100644 index 0000000000..298034be3d --- /dev/null +++ b/jaxb/src/test/java/com/baeldung/jaxb/dateunmarshalling/JaxbDateUnmarshallingUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.jaxb.dateunmarshalling; + +import org.junit.Test; + +import javax.xml.bind.JAXBException; +import javax.xml.datatype.DatatypeConfigurationException; +import javax.xml.datatype.DatatypeFactory; +import javax.xml.datatype.XMLGregorianCalendar; +import java.io.InputStream; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Date; + +import static org.junit.Assert.assertEquals; + +public class JaxbDateUnmarshallingUnitTest { + + @Test + public void whenUnmarshalDatesIsCalled_ThenCorrectDateIsReturned() throws JAXBException, DatatypeConfigurationException { + InputStream inputStream = JaxbDateUnmarshalling.getInputStream(JaxbDateUnmarshalling.DEFAULT_DATE_UNMARSHALLING_FILE); + XMLGregorianCalendar expected = DatatypeFactory.newInstance().newXMLGregorianCalendar("1979-11-28T02:31:32"); + + Book book = JaxbDateUnmarshalling.unmarshalDates(inputStream); + + assertEquals(expected, book.getPublished()); + } + + @Test + public void whenUnmarshalDatesUsingCustomXmlAdapterIsCalled_ThenCorrectDateIsReturned() throws JAXBException, ParseException { + InputStream inputStream = JaxbDateUnmarshalling.getInputStream(JaxbDateUnmarshalling.CUSTOM_DATE_UNMARSHALLING_FILE); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); + Date expected = format.parse("1979-11-28 02:31:32"); + + BookDateAdapter book = JaxbDateUnmarshalling.unmarshalDatesUsingCustomXmlAdapter(inputStream); + + assertEquals(expected, book.getPublished()); + } + + @Test + public void whenUnmarshalDatesUsingJava8IsCalled_ThenCorrectDateIsReturned() throws JAXBException { + InputStream inputStream = JaxbDateUnmarshalling.getInputStream(JaxbDateUnmarshalling.CUSTOM_DATE_UNMARSHALLING_FILE); + DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + LocalDateTime expected = LocalDateTime.parse("1979-11-28 02:31:32", dateFormat); + + BookLocalDateTimeAdapter book = JaxbDateUnmarshalling.unmarshalDatesUsingJava8(inputStream); + + assertEquals(expected, book.getPublished()); + } + +} \ No newline at end of file From 9a0ba02e6ddf92ace2c39a08a83821d3fbd51470 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sat, 14 Sep 2019 13:37:24 +0100 Subject: [PATCH 189/396] Add article links to mockito module --- testing-modules/mockito/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index 8fe57016e3..9c6407f9da 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -21,4 +21,6 @@ - [Quick Guide to BDDMockito](http://www.baeldung.com/bdd-mockito) - [Hamcrest Bean Matchers](http://www.baeldung.com/hamcrest-bean-matchers) - [Hamcrest Object Matchers](http://www.baeldung.com/hamcrest-object-matchers) +- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers) +- [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers) - [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) From ac043d32f5ae68af412de4ee1d8dc7654884e37e Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sat, 14 Sep 2019 13:40:30 +0100 Subject: [PATCH 190/396] [BAEL-16643] removed the wrong article link from libraries-testing readme and moved hamcrest README article link --- libraries-testing/README.md | 3 +-- .../src/test/java/com/baeldung/hamcrest/README.md | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 libraries-testing/src/test/java/com/baeldung/hamcrest/README.md diff --git a/libraries-testing/README.md b/libraries-testing/README.md index b4010056f7..fb2c7123a3 100644 --- a/libraries-testing/README.md +++ b/libraries-testing/README.md @@ -6,5 +6,4 @@ - [Serenity BDD with Spring and JBehave](http://www.baeldung.com/serenity-spring-jbehave) - [Introduction to Awaitlity](http://www.baeldung.com/awaitlity-testing) - [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) -- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers) -- [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers) \ No newline at end of file +- [Testing with Hamcrest](http://www.baeldung.com/java-junit-hamcrest-guide) \ No newline at end of file diff --git a/libraries-testing/src/test/java/com/baeldung/hamcrest/README.md b/libraries-testing/src/test/java/com/baeldung/hamcrest/README.md deleted file mode 100644 index 7266ecda3a..0000000000 --- a/libraries-testing/src/test/java/com/baeldung/hamcrest/README.md +++ /dev/null @@ -1,2 +0,0 @@ -### Relevant Articles: -- [Testing with Hamcrest](http://www.baeldung.com/java-junit-hamcrest-guide) From c291aae952fb5bf9314a4bf3c5b413cfa0420ea6 Mon Sep 17 00:00:00 2001 From: Juan Moreno Date: Sat, 14 Sep 2019 11:30:41 -0300 Subject: [PATCH 191/396] BAEL 2338 - Sample code for the article (#7762) * FEAT Added Jaxp transformer to convert xml to html * CHORE Added additional refactors * UPDATE Refactor to use Map instead of Element navigation * FEAT Added Stax transformer to convert from XML to HTML * FEAT Added Freemarker transformer * FEAT Added Mustache transformer --- xml/pom.xml | 16 ++- .../freemarker/FreemarkerTransformer.java | 40 +++++++ .../baeldung/xmlhtml/helpers/XMLRunner.java | 6 +- .../xmlhtml/helpers/jaxp/CustomHandler.java | 34 ------ .../xmlhtml/helpers/jaxp/JAXPHelper.java | 90 -------------- .../xmlhtml/helpers/stax/STAXHelper.java | 112 ------------------ .../xmlhtml/jaxp/JaxpTransformer.java | 102 ++++++++++++++++ .../xmlhtml/mustache/MustacheTransformer.java | 30 +++++ .../com/baeldung/xmlhtml/pojo/stax/Body.java | 23 ---- .../xmlhtml/pojo/stax/CustomElement.java | 13 -- .../xmlhtml/pojo/stax/NestedElement.java | 13 -- .../xmlhtml/stax/StaxTransformer.java | 89 ++++++++++++++ .../xml/attribute/Dom4jProcessorUnitTest.java | 4 +- .../xml/attribute/JooxProcessorUnitTest.java | 4 +- .../FreemarkerTransformerUnitTest.java | 32 +++++ .../xmlhtml/jaxp/JaxpTransformerUnitTest.java | 33 ++++++ .../mustache/MustacheTransformerUnitTest.java | 30 +++++ .../xmlhtml/stax/StaxTransformerUnitTest.java | 28 +++++ .../test/resources/templates/freemarker.html | 11 ++ .../resources/templates/template.mustache | 11 ++ .../test/resources/xmlhtml/notification.html | 11 ++ .../test/resources/xmlhtml/notification.xml | 6 + 22 files changed, 444 insertions(+), 294 deletions(-) create mode 100644 xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java delete mode 100644 xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/CustomHandler.java delete mode 100644 xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/JAXPHelper.java delete mode 100644 xml/src/main/java/com/baeldung/xmlhtml/helpers/stax/STAXHelper.java create mode 100644 xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java create mode 100644 xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java delete mode 100644 xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/Body.java delete mode 100644 xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/CustomElement.java delete mode 100644 xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/NestedElement.java create mode 100644 xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java create mode 100644 xml/src/test/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformerUnitTest.java create mode 100644 xml/src/test/java/com/baeldung/xmlhtml/jaxp/JaxpTransformerUnitTest.java create mode 100644 xml/src/test/java/com/baeldung/xmlhtml/mustache/MustacheTransformerUnitTest.java create mode 100644 xml/src/test/java/com/baeldung/xmlhtml/stax/StaxTransformerUnitTest.java create mode 100644 xml/src/test/resources/templates/freemarker.html create mode 100644 xml/src/test/resources/templates/template.mustache create mode 100644 xml/src/test/resources/xmlhtml/notification.html create mode 100644 xml/src/test/resources/xmlhtml/notification.xml diff --git a/xml/pom.xml b/xml/pom.xml index 540b1fc03b..d500d72454 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -1,6 +1,6 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 xml 0.1-SNAPSHOT @@ -59,6 +59,16 @@ stax-api ${stax-api.version} + + org.freemarker + freemarker + ${freemarker.version} + + + com.github.spullara.mustache.java + compiler + ${mustache.version} + org.openjdk.jmh @@ -324,6 +334,8 @@ 2.6.3 5.5.0 1.21 + 2.3.29 + 0.9.6 3.5 2.4 diff --git a/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java new file mode 100644 index 0000000000..61528dbfad --- /dev/null +++ b/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java @@ -0,0 +1,40 @@ +package com.baeldung.xmlhtml.freemarker; + +import com.baeldung.xmlhtml.stax.StaxTransformer; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import freemarker.template.TemplateExceptionHandler; + +import javax.xml.stream.XMLStreamException; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.nio.charset.StandardCharsets; + +public class FreemarkerTransformer { + private StaxTransformer staxTransformer; + private String templateDirectory; + private String templateFile; + + public FreemarkerTransformer(StaxTransformer staxTransformer, String templateDirectory, String templateFile) { + this.staxTransformer = staxTransformer; + this.templateDirectory = templateDirectory; + this.templateFile = templateFile; + } + + public String html() throws IOException, XMLStreamException, TemplateException { + Configuration cfg = new Configuration(Configuration.VERSION_2_3_29); + cfg.setDirectoryForTemplateLoading(new File(templateDirectory)); + cfg.setDefaultEncoding(StandardCharsets.UTF_8.toString()); + cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); + cfg.setLogTemplateExceptions(false); + cfg.setWrapUncheckedExceptions(true); + cfg.setFallbackOnNullLoopVariable(false); + Template temp = cfg.getTemplate(templateFile); + Writer output = new StringWriter(); + temp.process(staxTransformer.buildMap(), output); + return output.toString(); + } +} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/helpers/XMLRunner.java b/xml/src/main/java/com/baeldung/xmlhtml/helpers/XMLRunner.java index 02b2577795..2bd6895c52 100644 --- a/xml/src/main/java/com/baeldung/xmlhtml/helpers/XMLRunner.java +++ b/xml/src/main/java/com/baeldung/xmlhtml/helpers/XMLRunner.java @@ -2,15 +2,11 @@ package com.baeldung.xmlhtml.helpers; import com.baeldung.xmlhtml.helpers.jaxb.JAXBHelper; -import com.baeldung.xmlhtml.helpers.jaxp.JAXPHelper; -import com.baeldung.xmlhtml.helpers.stax.STAXHelper; +import com.baeldung.xmlhtml.stax.StaxTransformer; public class XMLRunner { public static void doWork() { JAXBHelper.example(); - JAXPHelper.saxParser(); - JAXPHelper.documentBuilder(); - STAXHelper.write(STAXHelper.read()); } } diff --git a/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/CustomHandler.java b/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/CustomHandler.java deleted file mode 100644 index e6351c9e22..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/CustomHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.baeldung.xmlhtml.helpers.jaxp; - -import org.xml.sax.ContentHandler; -import org.xml.sax.Locator; - -import static com.baeldung.xmlhtml.Constants.*; - -public class CustomHandler implements ContentHandler { - - public void startDocument() {} - - public void startElement(String uri, String localName, String qName, org.xml.sax.Attributes atts) { } - - public void endDocument() { - System.out.println(DOCUMENT_END); - } - - public void endElement(String uri, String localName, String qName) { } - - public void startPrefixMapping(String prefix, String uri) { } - - public void endPrefixMapping(String prefix) { } - - public void setDocumentLocator(Locator locator) { } - - public void characters(char[] ch, int start, int length) { } - - public void ignorableWhitespace(char[] ch, int start, int length) { } - - public void processingInstruction(String target, String data) { } - - public void skippedEntity(String name) { } - -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/JAXPHelper.java b/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/JAXPHelper.java deleted file mode 100644 index 3196d543da..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/helpers/jaxp/JAXPHelper.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.baeldung.xmlhtml.helpers.jaxp; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.XMLReader; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.SAXParser; -import javax.xml.parsers.SAXParserFactory; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; -import java.io.File; - -import static com.baeldung.xmlhtml.Constants.*; - -public class JAXPHelper { - - private static void print(Document document) { - NodeList list = document.getChildNodes(); - try { - for (int i = 0; i < list.getLength(); i++) { - Node node = list.item(i); - String message = - node.getNodeType() - + WHITE_SPACE - + node.getNodeName() - + LINE_BREAK; - System.out.println(message); - } - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - } - - public static void saxParser() { - SAXParserFactory spf = SAXParserFactory.newInstance(); - spf.setNamespaceAware(true); - try { - SAXParser saxParser = spf.newSAXParser(); - XMLReader xmlReader = saxParser.getXMLReader(); - xmlReader.setContentHandler(new CustomHandler()); - xmlReader.parse(XML_FILE_IN); - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - } - - public static void documentBuilder() { - DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); - try { - DocumentBuilder db = dbf.newDocumentBuilder(); - Document parsed = db.parse(new File(XML_FILE_IN)); - Element xml = parsed.getDocumentElement(); - - Document doc = db.newDocument(); - Element html = doc.createElement("html"); - Element head = doc.createElement("head"); - html.appendChild(head); - - Element body = doc.createElement("body"); - Element descendantOne = doc.createElement("p"); - descendantOne.setTextContent("descendantOne: " + - xml.getElementsByTagName("descendantOne") - .item(0).getTextContent()); - Element descendantThree = doc.createElement("p"); - descendantThree.setTextContent("descendantThree: " + - xml.getElementsByTagName("descendantThree") - .item(0).getTextContent()); - Element nested = doc.createElement("div"); - nested.appendChild(descendantThree); - - body.appendChild(descendantOne); - body.appendChild(nested); - html.appendChild(body); - doc.appendChild(html); - - TransformerFactory tFactory = TransformerFactory.newInstance(); - tFactory - .newTransformer() - .transform(new DOMSource(doc), new StreamResult(new File(JAXP_FILE_OUT))); - - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - } -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/helpers/stax/STAXHelper.java b/xml/src/main/java/com/baeldung/xmlhtml/helpers/stax/STAXHelper.java deleted file mode 100644 index a9b9217b6a..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/helpers/stax/STAXHelper.java +++ /dev/null @@ -1,112 +0,0 @@ -package com.baeldung.xmlhtml.helpers.stax; - -import com.baeldung.xmlhtml.pojo.stax.Body; -import com.baeldung.xmlhtml.pojo.stax.CustomElement; -import com.baeldung.xmlhtml.pojo.stax.NestedElement; - -import javax.xml.stream.XMLInputFactory; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamReader; -import javax.xml.stream.XMLStreamWriter; -import java.io.FileInputStream; -import java.io.FileWriter; - -import static com.baeldung.xmlhtml.Constants.*; - -public class STAXHelper { - - private static XMLStreamReader reader() { - XMLStreamReader xmlStreamReader = null; - try { - xmlStreamReader = XMLInputFactory.newInstance().createXMLStreamReader(new FileInputStream(XML_FILE_IN)); - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - return xmlStreamReader; - } - - private static XMLStreamWriter writer() { - XMLStreamWriter xmlStreamWriter = null; - try { - xmlStreamWriter = XMLOutputFactory.newInstance().createXMLStreamWriter(new FileWriter(STAX_FILE_OUT)); - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - return xmlStreamWriter; - } - - public static Body read() { - Body body = new Body(); - try { - XMLStreamReader xmlStreamReader = reader(); - - CustomElement customElement = new CustomElement(); - NestedElement nestedElement = new NestedElement(); - CustomElement child = new CustomElement(); - - while (xmlStreamReader.hasNext()) { - xmlStreamReader.next(); - if (xmlStreamReader.isStartElement()) { - System.out.println(xmlStreamReader.getLocalName()); - if (xmlStreamReader.getLocalName().equals("descendantOne")) { - customElement.setValue(xmlStreamReader.getElementText()); - } - if (xmlStreamReader.getLocalName().equals("descendantThree")) { - child.setValue(xmlStreamReader.getElementText()); - } - } - } - - nestedElement.setCustomElement(child); - body.setCustomElement(customElement); - body.setNestedElement(nestedElement); - - xmlStreamReader.close(); - - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - return body; - } - - public static void write(Body body) { - try { - - XMLStreamWriter xmlStreamWriter = writer(); - xmlStreamWriter.writeStartElement("html"); - xmlStreamWriter.writeCharacters(BREAK + TAB); - xmlStreamWriter.writeStartElement("head"); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB); - xmlStreamWriter.writeStartElement("meta"); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB); - xmlStreamWriter.writeStartElement("body"); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB); - xmlStreamWriter.writeStartElement("p"); - xmlStreamWriter.writeCharacters("descendantOne: " + body.getCustomElement().getValue()); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB); - xmlStreamWriter.writeStartElement("div"); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB + TAB); - xmlStreamWriter.writeStartElement("p"); - xmlStreamWriter.writeCharacters(BREAK); - xmlStreamWriter.writeCharacters(TAB + TAB + TAB + TAB + "descendantThree: " + body.getNestedElement().getCustomElement().getValue()); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB + TAB); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB + TAB); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK + TAB); - xmlStreamWriter.writeEndElement(); - xmlStreamWriter.writeCharacters(BREAK); - xmlStreamWriter.writeEndDocument(); - xmlStreamWriter.flush(); - xmlStreamWriter.close(); - - } catch (Exception ex) { - System.out.println(EXCEPTION_ENCOUNTERED + ex); - } - - } -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java new file mode 100644 index 0000000000..be3dde3805 --- /dev/null +++ b/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java @@ -0,0 +1,102 @@ +package com.baeldung.xmlhtml.jaxp; + +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.xml.sax.SAXException; + +import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.HashMap; +import java.util.Map; + +public class JaxpTransformer { + + private Document input; + private DocumentBuilderFactory factory; + + public JaxpTransformer(String resourcePath) throws ParserConfigurationException, IOException, SAXException { + // 1- Build the doc from the XML file + factory = DocumentBuilderFactory.newInstance(); + factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + input = factory + .newDocumentBuilder() + .parse(resourcePath); + } + + public String html() throws ParserConfigurationException, TransformerException { + Element xml = input.getDocumentElement(); + Document doc = factory + .newDocumentBuilder() + .newDocument(); + //Build Map + Map map = buildMap(xml); + //Head + Element html = doc.createElement("html"); + html.setAttribute("lang", "en"); + Element head = buildHead(map, doc); + html.appendChild(head); + //Body + Element body = buildBody(map, doc); + html.appendChild(body); + doc.appendChild(html); + Writer output = applyTransformation(doc); + return String.format("%n%s", output.toString()); + } + + private Writer applyTransformation(Document doc) throws TransformerException { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); + Writer output = new StringWriter(); + Transformer transformer = transformerFactory.newTransformer(); + transformer.transform(new DOMSource(doc), new StreamResult(output)); + return output; + } + + private Map buildMap(Element xml) { + Map map = new HashMap<>(); + map.put("heading", xml + .getElementsByTagName("heading") + .item(0) + .getTextContent()); + map.put("from", String.format("from: %s", xml + .getElementsByTagName("from") + .item(0) + .getTextContent())); + map.put("content", xml + .getElementsByTagName("content") + .item(0) + .getTextContent()); + return map; + } + + private Element buildHead(Map map, Document doc) { + Element head = doc.createElement("head"); + Element title = doc.createElement("title"); + title.setTextContent(map.get("heading")); + head.appendChild(title); + return head; + } + + private Element buildBody(Map map, Document doc) { + Element body = doc.createElement("body"); + Element from = doc.createElement("p"); + from.setTextContent(map.get("from")); + Element success = doc.createElement("p"); + success.setTextContent(map.get("content")); + body.appendChild(from); + body.appendChild(success); + return body; + } + +} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java new file mode 100644 index 0000000000..ce3bf3cada --- /dev/null +++ b/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java @@ -0,0 +1,30 @@ +package com.baeldung.xmlhtml.mustache; + +import com.baeldung.xmlhtml.stax.StaxTransformer; +import com.github.mustachejava.DefaultMustacheFactory; +import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheFactory; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.io.StringWriter; +import java.io.Writer; + +public class MustacheTransformer { + private StaxTransformer staxTransformer; + private String templateFile; + + public MustacheTransformer(StaxTransformer staxTransformer, String templateFile) { + this.staxTransformer = staxTransformer; + this.templateFile = templateFile; + } + + public String html() throws IOException, XMLStreamException { + MustacheFactory mf = new DefaultMustacheFactory(); + Mustache mustache = mf.compile(templateFile); + Writer output = new StringWriter(); + mustache.execute(output, staxTransformer.buildMap()); + output.flush(); + return output.toString(); + } +} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/Body.java b/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/Body.java deleted file mode 100644 index 630dfe967f..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/Body.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.xmlhtml.pojo.stax; - -public class Body { - - private CustomElement customElement; - - public CustomElement getCustomElement() { - return customElement; - } - public void setCustomElement(CustomElement customElement) { - this.customElement = customElement; - } - - private NestedElement nestedElement; - - public NestedElement getNestedElement() { - return nestedElement; - } - public void setNestedElement(NestedElement nestedElement) { - this.nestedElement = nestedElement; - } - -} \ No newline at end of file diff --git a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/CustomElement.java b/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/CustomElement.java deleted file mode 100644 index 6fc1d7b787..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/CustomElement.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.xmlhtml.pojo.stax; - -public class CustomElement { - - private String value; - - public String getValue() { - return value; - } - public void setValue(String value) { - this.value = value; - } -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/NestedElement.java b/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/NestedElement.java deleted file mode 100644 index 146ee068af..0000000000 --- a/xml/src/main/java/com/baeldung/xmlhtml/pojo/stax/NestedElement.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.xmlhtml.pojo.stax; - -public class NestedElement { - - private CustomElement customElement; - - public CustomElement getCustomElement() { - return customElement; - } - public void setCustomElement(CustomElement customElement) { - this.customElement = customElement; - } -} diff --git a/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java new file mode 100644 index 0000000000..67b3c1c9ce --- /dev/null +++ b/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java @@ -0,0 +1,89 @@ +package com.baeldung.xmlhtml.stax; + +import javax.xml.stream.*; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.StringWriter; +import java.io.Writer; +import java.util.HashMap; +import java.util.Map; + +public class StaxTransformer { + + private XMLStreamReader input; + + public StaxTransformer(String resourcePath) throws FileNotFoundException, XMLStreamException { + XMLInputFactory factory = XMLInputFactory.newInstance(); + factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); + factory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); + input = factory.createXMLStreamReader(new FileInputStream(resourcePath)); + } + + public String html() throws XMLStreamException { + Map map = buildMap(); + Writer output = new StringWriter(); + XMLStreamWriter writer = XMLOutputFactory + .newInstance() + .createXMLStreamWriter(output); + //Head + writer.writeDTD(""); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("html"); + writer.writeAttribute("lang", "en"); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("head"); + writer.writeCharacters(String.format("%n")); + writer.writeDTD(""); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("title"); + writer.writeCharacters(map.get("heading")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + //Body + writer.writeStartElement("body"); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("p"); + writer.writeCharacters(map.get("from")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("p"); + writer.writeCharacters(map.get("content")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeEndDocument(); + writer.writeCharacters(String.format("%n")); + writer.flush(); + writer.close(); + return output.toString(); + } + + public Map buildMap() throws XMLStreamException { + Map map = new HashMap<>(); + while (input.hasNext()) { + input.next(); + if (input.isStartElement()) { + if (input + .getLocalName() + .equals("heading")) { + map.put("heading", input.getElementText()); + } + if (input + .getLocalName() + .equals("from")) { + map.put("from", String.format("from: %s", input.getElementText())); + } + if (input + .getLocalName() + .equals("content")) { + map.put("content", input.getElementText()); + } + } + } + input.close(); + return map; + } +} diff --git a/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java b/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java index 351b8bc437..6c4aa02700 100644 --- a/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/attribute/Dom4jProcessorUnitTest.java @@ -47,7 +47,9 @@ public class Dom4jProcessorUnitTest { String expectedXml = new String(Files.readAllBytes((Paths.get(getClass().getResource("/xml/attribute_expected.xml") .toURI())))); - String result = transformer.modifyAttribute(attribute, oldValue, newValue); + String result = transformer + .modifyAttribute(attribute, oldValue, newValue) + .replaceAll("(?m)^[ \t]*\r?\n", "");//Delete extra spaces added by Java 11 assertThat(result).and(expectedXml) .areSimilar(); diff --git a/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java b/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java index 40d0c671e7..0fdfcfeb52 100644 --- a/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java +++ b/xml/src/test/java/com/baeldung/xml/attribute/JooxProcessorUnitTest.java @@ -47,7 +47,9 @@ public class JooxProcessorUnitTest { String expectedXml = new String(Files.readAllBytes((Paths.get(getClass().getResource("/xml/attribute_expected.xml") .toURI())))); - String result = transformer.modifyAttribute(attribute, oldValue, newValue); + String result = transformer + .modifyAttribute(attribute, oldValue, newValue) + .replaceAll("(?m)^[ \t]*\r?\n", "");//Delete extra spaces added by Java 11 assertThat(result).and(expectedXml) .areSimilar(); diff --git a/xml/src/test/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformerUnitTest.java b/xml/src/test/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformerUnitTest.java new file mode 100644 index 0000000000..c110f88e99 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformerUnitTest.java @@ -0,0 +1,32 @@ +package com.baeldung.xmlhtml.freemarker; + +import com.baeldung.xmlhtml.stax.StaxTransformer; +import freemarker.template.TemplateException; +import org.junit.jupiter.api.Test; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.assertj.core.api.Assertions.assertThat; + +public class FreemarkerTransformerUnitTest { + + @Test + public void givenXml_whenTransform_thenGetHtml() throws IOException, URISyntaxException, XMLStreamException, TemplateException { + String expectedHtml = new String(Files.readAllBytes((Paths.get(getClass() + .getResource("/xmlhtml/notification.html") + .toURI())))); + StaxTransformer staxTransformer = new StaxTransformer("src/test/resources/xmlhtml/notification.xml"); + String templateFile = "freemarker.html"; + String templateDirectory = "src/test/resources/templates"; + FreemarkerTransformer transformer = new FreemarkerTransformer(staxTransformer, templateDirectory, templateFile); + + String result = transformer.html(); + + assertThat(result).isEqualTo(expectedHtml); + } + +} diff --git a/xml/src/test/java/com/baeldung/xmlhtml/jaxp/JaxpTransformerUnitTest.java b/xml/src/test/java/com/baeldung/xmlhtml/jaxp/JaxpTransformerUnitTest.java new file mode 100644 index 0000000000..02fc422ee9 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xmlhtml/jaxp/JaxpTransformerUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.xmlhtml.jaxp; + +import org.junit.jupiter.api.Test; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.TransformerException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.assertj.core.api.Assertions.assertThat; + +public class JaxpTransformerUnitTest { + + @Test + public void givenXml_whenTransform_thenGetHtml() throws IOException, SAXException, ParserConfigurationException, TransformerException, URISyntaxException { + String path = getClass() + .getResource("/xmlhtml/notification.xml") + .toString(); + String expectedHtml = new String(Files.readAllBytes((Paths.get(getClass() + .getResource("/xmlhtml/notification.html") + .toURI())))); + JaxpTransformer transformer = new JaxpTransformer(path); + + String result = transformer + .html() + .replaceAll("(?m)^\\s+", "");//Delete extra spaces added by Java 11 + + assertThat(result).isEqualTo(expectedHtml); + } +} diff --git a/xml/src/test/java/com/baeldung/xmlhtml/mustache/MustacheTransformerUnitTest.java b/xml/src/test/java/com/baeldung/xmlhtml/mustache/MustacheTransformerUnitTest.java new file mode 100644 index 0000000000..b53a23d4fb --- /dev/null +++ b/xml/src/test/java/com/baeldung/xmlhtml/mustache/MustacheTransformerUnitTest.java @@ -0,0 +1,30 @@ +package com.baeldung.xmlhtml.mustache; + +import com.baeldung.xmlhtml.stax.StaxTransformer; +import org.junit.jupiter.api.Test; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.assertj.core.api.Assertions.assertThat; + +public class MustacheTransformerUnitTest { + + @Test + public void givenXml_whenTransform_thenGetHtml() throws IOException, URISyntaxException, XMLStreamException { + String expectedHtml = new String(Files.readAllBytes((Paths.get(getClass() + .getResource("/xmlhtml/notification.html") + .toURI())))); + StaxTransformer staxTransformer = new StaxTransformer("src/test/resources/xmlhtml/notification.xml"); + String templateFile = "src/test/resources/templates/template.mustache"; + MustacheTransformer transformer = new MustacheTransformer(staxTransformer, templateFile); + + String result = transformer.html(); + + assertThat(result).isEqualTo(expectedHtml); + } + +} diff --git a/xml/src/test/java/com/baeldung/xmlhtml/stax/StaxTransformerUnitTest.java b/xml/src/test/java/com/baeldung/xmlhtml/stax/StaxTransformerUnitTest.java new file mode 100644 index 0000000000..0c7329e899 --- /dev/null +++ b/xml/src/test/java/com/baeldung/xmlhtml/stax/StaxTransformerUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.xmlhtml.stax; + +import org.junit.jupiter.api.Test; + +import javax.xml.stream.XMLStreamException; +import java.io.IOException; +import java.net.URISyntaxException; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.assertj.core.api.Assertions.assertThat; + +public class StaxTransformerUnitTest { + + @Test + public void givenXml_whenTransform_thenGetHtml() throws IOException, URISyntaxException, XMLStreamException { + String path = "src/test/resources/xmlhtml/notification.xml"; + String expectedHtml = new String(Files.readAllBytes((Paths.get(getClass() + .getResource("/xmlhtml/notification.html") + .toURI())))); + StaxTransformer transformer = new StaxTransformer(path); + + String result = transformer.html(); + + assertThat(result).isEqualTo(expectedHtml); + } + +} diff --git a/xml/src/test/resources/templates/freemarker.html b/xml/src/test/resources/templates/freemarker.html new file mode 100644 index 0000000000..15ec7f9fff --- /dev/null +++ b/xml/src/test/resources/templates/freemarker.html @@ -0,0 +1,11 @@ + + + + +${heading} + + +

    ${from}

    +

    ${content}

    + + diff --git a/xml/src/test/resources/templates/template.mustache b/xml/src/test/resources/templates/template.mustache new file mode 100644 index 0000000000..8c209843e1 --- /dev/null +++ b/xml/src/test/resources/templates/template.mustache @@ -0,0 +1,11 @@ + + + + +{{heading}} + + +

    {{from}}

    +

    {{content}}

    + + diff --git a/xml/src/test/resources/xmlhtml/notification.html b/xml/src/test/resources/xmlhtml/notification.html new file mode 100644 index 0000000000..4a0ef09c5d --- /dev/null +++ b/xml/src/test/resources/xmlhtml/notification.html @@ -0,0 +1,11 @@ + + + + +Build #7 passed + + +

    from: builds@baeldung.com

    +

    Success: The Jenkins CI build passed

    + + diff --git a/xml/src/test/resources/xmlhtml/notification.xml b/xml/src/test/resources/xmlhtml/notification.xml new file mode 100644 index 0000000000..c3550d6f04 --- /dev/null +++ b/xml/src/test/resources/xmlhtml/notification.xml @@ -0,0 +1,6 @@ + + + builds@baeldung.com + Build #7 passed + Success: The Jenkins CI build passed + \ No newline at end of file From 7da248c9dbe38c0f486f150fb98fd5f1f35d7d5d Mon Sep 17 00:00:00 2001 From: binary-joe Date: Thu, 22 Aug 2019 22:38:33 +0200 Subject: [PATCH 192/396] BAEL-2976 http basic auth --- .../core-java-networking-2/pom.xml | 13 +++- .../com/baeldung/url/auth/HttpClient.java | 72 +++++++++++++++++++ .../baeldung/url/auth/HttpClientUnitTest.java | 52 ++++++++++++++ 3 files changed, 135 insertions(+), 2 deletions(-) create mode 100644 core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java create mode 100644 core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml index 8a26f6ab9f..bea832aa14 100644 --- a/core-java-modules/core-java-networking-2/pom.xml +++ b/core-java-modules/core-java-networking-2/pom.xml @@ -1,5 +1,5 @@ + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-java-networking-2 core-java-networking-2 @@ -12,9 +12,18 @@ + + org.apache.httpcomponents + httpclient + ${httpclient.version} + core-java-networking-2 - + + + + 4.5.9 + diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java new file mode 100644 index 0000000000..dccaf3de84 --- /dev/null +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java @@ -0,0 +1,72 @@ +package com.baeldung.url.auth; + +import java.io.IOException; +import java.net.Authenticator; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; +import java.net.PasswordAuthentication; +import java.net.ProtocolException; +import java.net.URL; +import java.nio.charset.StandardCharsets; + +import org.apache.commons.codec.binary.Base64; + +public class HttpClient { + + private final String user; + private final String password; + + public HttpClient(String user, String password) { + this.user = user; + this.password = password; + } + + public int sendRquestWithAuthHeader(String url) throws IOException { + HttpURLConnection connection = null; + try { + connection = createConnection(url); + connection.setRequestProperty("Authorization", createBasicAuthHeaderValue()); + return connection.getResponseCode(); + } finally { + if (connection != null) { + connection.disconnect(); + } + } + } + + public int sendRquestWithAuthenticator(String url) throws IOException { + setAuthenticator(); + + HttpURLConnection connection = null; + try { + connection = createConnection(url); + return connection.getResponseCode(); + } finally { + if (connection != null) { + connection.disconnect(); + } + } + } + + private void setAuthenticator() { + Authenticator.setDefault(new Authenticator() { + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(user, password.toCharArray()); + } + }); + } + + private String createBasicAuthHeaderValue() { + String auth = user + ":" + password; + byte[] encodedAuth = Base64.encodeBase64(auth.getBytes(StandardCharsets.UTF_8)); + String authHeaderValue = "Basic " + new String(encodedAuth); + return authHeaderValue; + } + + private HttpURLConnection createConnection(String urlString) throws MalformedURLException, IOException, ProtocolException { + URL url = new URL(String.format(urlString)); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + return connection; + } +} diff --git a/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java new file mode 100644 index 0000000000..0ccb6e5a54 --- /dev/null +++ b/core-java-modules/core-java-networking-2/src/test/java/com/baeldung/url/auth/HttpClientUnitTest.java @@ -0,0 +1,52 @@ +package com.baeldung.url.auth; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class HttpClientUnitTest { + + @Test + public void sendRquestWithAuthHeader() throws Exception { + HttpClient httpClient = new HttpClient("user1", "pass1"); + + int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); + + assertTrue(isSuccess(status)); + } + + @Test + public void sendRquestWithAuthHeader_whenIncorrectCredentials_thenNotSuccessful() throws Exception { + HttpClient httpClient = new HttpClient("John", "Smith"); + + int status = httpClient.sendRquestWithAuthHeader("https://httpbin.org/basic-auth/user1/pass1"); + + assertTrue(isUnauthorized(status)); + } + + @Test + public void sendRquestWithAuthenticator() throws Exception { + HttpClient httpClient = new HttpClient("user2", "pass2"); + + int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); + + assertTrue(isSuccess(status)); + } + + @Test + public void sendRquestWithAuthenticator_whenIncorrectCredentials_thenNotSuccessful() throws Exception { + HttpClient httpClient = new HttpClient("John", "Smith"); + + int status = httpClient.sendRquestWithAuthenticator("https://httpbin.org/basic-auth/user2/pass2"); + + assertTrue(isUnauthorized(status)); + } + + private boolean isSuccess(int status) { + return (status >= 200) && (status < 300); + } + + private boolean isUnauthorized(int status) { + return status == 401; + } +} From 60c990b8c1e1df51203b8d592a39eea2ca439687 Mon Sep 17 00:00:00 2001 From: binary-joe Date: Sat, 14 Sep 2019 19:37:32 +0200 Subject: [PATCH 193/396] fix merge issue; refactoring --- .../core-java-networking-2/pom.xml | 2 ++ .../com/baeldung/url/auth/HttpClient.java | 24 ++++++++++--------- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/core-java-modules/core-java-networking-2/pom.xml b/core-java-modules/core-java-networking-2/pom.xml index 3837b77eba..2d404a553b 100644 --- a/core-java-modules/core-java-networking-2/pom.xml +++ b/core-java-modules/core-java-networking-2/pom.xml @@ -16,6 +16,8 @@ org.apache.httpcomponents httpclient ${httpclient.version} + + org.apache.commons commons-lang3 ${commons-lang3.version} diff --git a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java index dccaf3de84..779f8aa898 100644 --- a/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java +++ b/core-java-modules/core-java-networking-2/src/main/java/com/baeldung/url/auth/HttpClient.java @@ -48,12 +48,11 @@ public class HttpClient { } } - private void setAuthenticator() { - Authenticator.setDefault(new Authenticator() { - protected PasswordAuthentication getPasswordAuthentication() { - return new PasswordAuthentication(user, password.toCharArray()); - } - }); + private HttpURLConnection createConnection(String urlString) throws MalformedURLException, IOException, ProtocolException { + URL url = new URL(String.format(urlString)); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + return connection; } private String createBasicAuthHeaderValue() { @@ -63,10 +62,13 @@ public class HttpClient { return authHeaderValue; } - private HttpURLConnection createConnection(String urlString) throws MalformedURLException, IOException, ProtocolException { - URL url = new URL(String.format(urlString)); - HttpURLConnection connection = (HttpURLConnection) url.openConnection(); - connection.setRequestMethod("GET"); - return connection; + private void setAuthenticator() { + Authenticator.setDefault(new BasicAuthenticator()); + } + + private final class BasicAuthenticator extends Authenticator { + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(user, password.toCharArray()); + } } } From b63ad29ecca6c737b7aad4472883250c01298794 Mon Sep 17 00:00:00 2001 From: Lukasz Rys <> Date: Sat, 14 Sep 2019 22:44:06 +0200 Subject: [PATCH 194/396] [ BAEL-1869 ]: Fix Couchbase tests --- .../domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java | 2 +- .../repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java | 2 +- .../repository/view/ViewPersonRepositoryIntegrationTest.java | 4 +++- .../src/test/resources/application.properties | 4 ++++ 4 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 spring-5-data-reactive/src/test/resources/application.properties diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java index 0c1b6bde6c..c8dbbf429e 100644 --- a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLPersonRepositoryLiveTest.java @@ -12,7 +12,7 @@ import reactor.test.StepVerifier; import java.util.UUID; @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(properties = {"spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration"}) public class N1QLPersonRepositoryLiveTest { @Autowired private N1QLPersonRepository personRepository; diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java index 4ba2206e0a..8c6ce137f1 100644 --- a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/n1ql/N1QLSortingPersonRepositoryLiveTest.java @@ -13,7 +13,7 @@ import reactor.test.StepVerifier; import java.util.UUID; @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(properties = {"spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration"}) public class N1QLSortingPersonRepositoryLiveTest { @Autowired private N1QLSortingPersonRepository personRepository; diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java index 712e7b0d37..18aa06ce58 100644 --- a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java @@ -8,6 +8,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringRunner; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; @@ -16,7 +17,8 @@ import reactor.test.StepVerifier; import java.util.UUID; @RunWith(SpringRunner.class) -@SpringBootTest(properties = { "spring.couchbase.port=10010" }, classes = { ViewReactiveCouchbaseConfiguration.class, CouchbaseProperties.class, CouchbaseMockConfiguration.class }) +@SpringBootTest(properties = { "spring.couchbase.port=10010", "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration" }, + classes = { CouchbaseMockConfiguration.class, ViewReactiveCouchbaseConfiguration.class, CouchbaseProperties.class }) public class ViewPersonRepositoryIntegrationTest { @Autowired private ViewPersonRepository personRepository; diff --git a/spring-5-data-reactive/src/test/resources/application.properties b/spring-5-data-reactive/src/test/resources/application.properties new file mode 100644 index 0000000000..53fad807fe --- /dev/null +++ b/spring-5-data-reactive/src/test/resources/application.properties @@ -0,0 +1,4 @@ +spring.couchbase.bucket.name=default +spring.couchbase.bootstrap-hosts=localhost +spring.couchbase.port=8091 +spring.couchbase.bucket.password=123456 \ No newline at end of file From 84fb781009665669c57bb7adc50ddf59083b63f8 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Sun, 15 Sep 2019 04:01:12 +0530 Subject: [PATCH 195/396] [BAEL-16631] - Split or move algorithms-miscellaneous-2 module (#7702) * [BAEL-16631] - Split or move algorithms-miscellaneous-2 module * [BAEL-16631] - Remove the .gitignore files and changed the links to https --- algorithms-miscellaneous-2/.gitignore | 4 -- algorithms-miscellaneous-2/README.md | 25 +++----- algorithms-miscellaneous-5/README.md | 5 ++ algorithms-miscellaneous-5/pom.xml | 57 +++++++++++++++++++ .../conversion/HexStringConverter.java | 0 .../relativelyprime/RelativelyPrime.java | 0 .../algorithms/reversingtree/TreeNode.java | 0 .../reversingtree/TreeReverser.java | 0 .../src/main/resources/logback.xml | 13 +++++ .../ByteArrayConverterUnitTest.java | 0 .../RelativelyPrimeUnitTest.java | 0 .../reversingtree/TreeReverserUnitTest.java | 0 pom.xml | 2 + 13 files changed, 85 insertions(+), 21 deletions(-) delete mode 100644 algorithms-miscellaneous-2/.gitignore create mode 100644 algorithms-miscellaneous-5/README.md create mode 100644 algorithms-miscellaneous-5/pom.xml rename {algorithms-miscellaneous-2 => algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java (100%) rename {algorithms-miscellaneous-2 => algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java (100%) rename {algorithms-miscellaneous-2 => algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java (100%) rename {algorithms-miscellaneous-2 => algorithms-miscellaneous-5}/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java (100%) create mode 100644 algorithms-miscellaneous-5/src/main/resources/logback.xml rename {algorithms-miscellaneous-2 => algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java (100%) rename {algorithms-miscellaneous-2 => algorithms-miscellaneous-5}/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java (100%) diff --git a/algorithms-miscellaneous-2/.gitignore b/algorithms-miscellaneous-2/.gitignore deleted file mode 100644 index 30b2b7442c..0000000000 --- a/algorithms-miscellaneous-2/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/target/ -.settings/ -.classpath -.project \ No newline at end of file diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md index 462644dddb..745b106963 100644 --- a/algorithms-miscellaneous-2/README.md +++ b/algorithms-miscellaneous-2/README.md @@ -1,19 +1,10 @@ ## Relevant articles: -- [Dijkstra Algorithm in Java](http://www.baeldung.com/java-dijkstra) -- [Introduction to Cobertura](http://www.baeldung.com/cobertura) -- [Test a Linked List for Cyclicity](http://www.baeldung.com/java-linked-list-cyclicity) -- [Introduction to JGraphT](http://www.baeldung.com/jgrapht) -- [A Maze Solver in Java](http://www.baeldung.com/java-solve-maze) -- [Create a Sudoku Solver in Java](http://www.baeldung.com/java-sudoku) -- [Displaying Money Amounts in Words](http://www.baeldung.com/java-money-into-words) -- [A Collaborative Filtering Recommendation System in Java](http://www.baeldung.com/java-collaborative-filtering-recommendations) -- [Check If Two Rectangles Overlap In Java](https://www.baeldung.com/java-check-if-two-rectangles-overlap) -- [Calculate the Distance Between Two Points in Java](https://www.baeldung.com/java-distance-between-two-points) -- [Find the Intersection of Two Lines in Java](https://www.baeldung.com/java-intersection-of-two-lines) -- [Round Up to the Nearest Hundred](https://www.baeldung.com/java-round-up-nearest-hundred) -- [Calculate Percentage in Java](https://www.baeldung.com/java-calculate-percentage) -- [Converting Between Byte Arrays and Hexadecimal Strings in Java](https://www.baeldung.com/java-byte-arrays-hex-strings) -- [Convert Latitude and Longitude to a 2D Point in Java](https://www.baeldung.com/java-convert-latitude-longitude) -- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree) -- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers) +- [Dijkstra Algorithm in Java](https://www.baeldung.com/java-dijkstra) +- [Introduction to Cobertura](https://www.baeldung.com/cobertura) +- [Test a Linked List for Cyclicity](https://www.baeldung.com/java-linked-list-cyclicity) +- [Introduction to JGraphT](https://www.baeldung.com/jgrapht) +- [A Maze Solver in Java](https://www.baeldung.com/java-solve-maze) +- [Create a Sudoku Solver in Java](https://www.baeldung.com/java-sudoku) +- [Displaying Money Amounts in Words](https://www.baeldung.com/java-money-into-words) +- [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations) \ No newline at end of file diff --git a/algorithms-miscellaneous-5/README.md b/algorithms-miscellaneous-5/README.md new file mode 100644 index 0000000000..7ed71e61cc --- /dev/null +++ b/algorithms-miscellaneous-5/README.md @@ -0,0 +1,5 @@ +## Relevant articles: + +- [Converting Between Byte Arrays and Hexadecimal Strings in Java](https://www.baeldung.com/java-byte-arrays-hex-strings) +- [Reversing a Binary Tree in Java](https://www.baeldung.com/java-reversing-a-binary-tree) +- [Find If Two Numbers Are Relatively Prime in Java](https://www.baeldung.com/java-two-relatively-prime-numbers) \ No newline at end of file diff --git a/algorithms-miscellaneous-5/pom.xml b/algorithms-miscellaneous-5/pom.xml new file mode 100644 index 0000000000..d17f93e6e0 --- /dev/null +++ b/algorithms-miscellaneous-5/pom.xml @@ -0,0 +1,57 @@ + + 4.0.0 + algorithms-miscellaneous-5 + 0.0.1-SNAPSHOT + algorithms-miscellaneous-5 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + pl.allegro.finance + tradukisto + ${tradukisto.version} + + + org.assertj + assertj-core + ${org.assertj.core.version} + test + + + + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + + + + + 1.0.1 + 3.9.0 + 1.11 + + + \ No newline at end of file diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/conversion/HexStringConverter.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/relativelyprime/RelativelyPrime.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeNode.java diff --git a/algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java b/algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java similarity index 100% rename from algorithms-miscellaneous-2/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java rename to algorithms-miscellaneous-5/src/main/java/com/baeldung/algorithms/reversingtree/TreeReverser.java diff --git a/algorithms-miscellaneous-5/src/main/resources/logback.xml b/algorithms-miscellaneous-5/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/algorithms-miscellaneous-5/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/conversion/ByteArrayConverterUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/relativelyprime/RelativelyPrimeUnitTest.java diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java b/algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java similarity index 100% rename from algorithms-miscellaneous-2/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java rename to algorithms-miscellaneous-5/src/test/java/com/baeldung/algorithms/reversingtree/TreeReverserUnitTest.java diff --git a/pom.xml b/pom.xml index b3701016d1..c3f3a62da1 100644 --- a/pom.xml +++ b/pom.xml @@ -339,6 +339,7 @@ algorithms-miscellaneous-1 algorithms-miscellaneous-2 algorithms-miscellaneous-3 + algorithms-miscellaneous-5 algorithms-sorting animal-sniffer-mvn-plugin annotations @@ -1072,6 +1073,7 @@ algorithms-miscellaneous-1 algorithms-miscellaneous-2 algorithms-miscellaneous-3 + algorithms-miscellaneous-5 algorithms-sorting animal-sniffer-mvn-plugin annotations From 2bbf63e7f6227f24812f14e805cf65b971973758 Mon Sep 17 00:00:00 2001 From: Lukasz Rys <> Date: Sun, 15 Sep 2019 10:20:21 +0200 Subject: [PATCH 196/396] [ BAEL-1869 ]: Use couchbase.properties instead of application.properties. Exclude mongo auto in couchbase to boost performance --- .../com/baeldung/couchbase/ReactiveCouchbaseApplication.java | 3 ++- .../baeldung/couchbase/configuration/CouchbaseProperties.java | 3 +++ .../src/main/resources/couchbase.properties | 4 ++++ .../repository/view/ViewPersonRepositoryIntegrationTest.java | 2 +- 4 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 spring-5-data-reactive/src/main/resources/couchbase.properties diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java index 917bcfdaa8..4e5bf9d5dc 100644 --- a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/ReactiveCouchbaseApplication.java @@ -2,8 +2,9 @@ package com.baeldung.couchbase; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; -@SpringBootApplication +@SpringBootApplication(exclude = MongoAutoConfiguration.class) public class ReactiveCouchbaseApplication { public static void main(String[] args) { diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java index 480c96e986..81f19eebd6 100644 --- a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/CouchbaseProperties.java @@ -1,12 +1,15 @@ package com.baeldung.couchbase.configuration; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; import java.util.Collections; import java.util.List; @Configuration +@PropertySource("classpath:couchbase.properties") public class CouchbaseProperties { private final List bootstrapHosts; diff --git a/spring-5-data-reactive/src/main/resources/couchbase.properties b/spring-5-data-reactive/src/main/resources/couchbase.properties new file mode 100644 index 0000000000..53fad807fe --- /dev/null +++ b/spring-5-data-reactive/src/main/resources/couchbase.properties @@ -0,0 +1,4 @@ +spring.couchbase.bucket.name=default +spring.couchbase.bootstrap-hosts=localhost +spring.couchbase.port=8091 +spring.couchbase.bucket.password=123456 \ No newline at end of file diff --git a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java index 18aa06ce58..15688e1b80 100644 --- a/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java +++ b/spring-5-data-reactive/src/test/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepositoryIntegrationTest.java @@ -17,7 +17,7 @@ import reactor.test.StepVerifier; import java.util.UUID; @RunWith(SpringRunner.class) -@SpringBootTest(properties = { "spring.couchbase.port=10010", "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration" }, +@SpringBootTest(properties = { "spring.couchbase.port=10010", "spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration" }, classes = { CouchbaseMockConfiguration.class, ViewReactiveCouchbaseConfiguration.class, CouchbaseProperties.class }) public class ViewPersonRepositoryIntegrationTest { From 32e77c7f9cd47ddcc52f07cd10cf2cd7e1791b4a Mon Sep 17 00:00:00 2001 From: Lukasz Rys <> Date: Sun, 15 Sep 2019 10:26:09 +0200 Subject: [PATCH 197/396] [ BAEL-1869 ]: Remove application.properties --- .../src/test/resources/application.properties | 4 ---- 1 file changed, 4 deletions(-) delete mode 100644 spring-5-data-reactive/src/test/resources/application.properties diff --git a/spring-5-data-reactive/src/test/resources/application.properties b/spring-5-data-reactive/src/test/resources/application.properties deleted file mode 100644 index 53fad807fe..0000000000 --- a/spring-5-data-reactive/src/test/resources/application.properties +++ /dev/null @@ -1,4 +0,0 @@ -spring.couchbase.bucket.name=default -spring.couchbase.bootstrap-hosts=localhost -spring.couchbase.port=8091 -spring.couchbase.bucket.password=123456 \ No newline at end of file From 60fc96727a1f667ba256dc805d0b71c0fd7fb398 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 15 Sep 2019 17:53:10 +0530 Subject: [PATCH 198/396] [BAEL-17326] - Extract versions into properties --- bazel/bazelapp/pom.xml | 7 ++++-- kotlin-libraries/pom.xml | 23 ++++++++++++------- libraries/pom.xml | 3 ++- .../oauth2-authorization-server/pom.xml | 9 +++++--- .../oauth2-resource-server/pom.xml | 3 ++- oauth2-framework-impl/pom.xml | 6 +++-- optaplanner/pom.xml | 6 ++++- persistence-modules/java-jpa/pom.xml | 8 ++++--- persistence-modules/r2dbc/pom.xml | 3 ++- persistence-modules/sirix/pom.xml | 3 ++- persistence-modules/spring-boot-mysql/pom.xml | 1 - .../spring-persistence-simple/pom.xml | 3 ++- .../greeter-spring-boot-autoconfigure/pom.xml | 2 +- spring-boot-data/pom.xml | 5 +--- spring-boot-logging-log4j2/pom.xml | 3 ++- spring-boot-mvc-birt/pom.xml | 7 +++--- .../spring-cloud-stream-kafka/pom.xml | 8 ++++--- spring-di/pom.xml | 2 +- spring-rest/pom.xml | 2 +- spring-security-kerberos/pom.xml | 10 +++++--- testing-modules/easy-random/pom.xml | 6 ++++- 21 files changed, 77 insertions(+), 43 deletions(-) diff --git a/bazel/bazelapp/pom.xml b/bazel/bazelapp/pom.xml index 9c9fb59619..e56cc06ef4 100644 --- a/bazel/bazelapp/pom.xml +++ b/bazel/bazelapp/pom.xml @@ -16,14 +16,17 @@ com.baeldung bazelgreeting - 1.0.0-SNAPSHOT + ${bazelgreeting.version} org.apache.commons commons-lang3 - 3.9 + ${commons-lang3.version} + + 1.0.0-SNAPSHOT + \ No newline at end of file diff --git a/kotlin-libraries/pom.xml b/kotlin-libraries/pom.xml index e252329426..5299b5029e 100644 --- a/kotlin-libraries/pom.xml +++ b/kotlin-libraries/pom.xml @@ -100,7 +100,7 @@ io.arrow-kt arrow-core - 0.7.3 + ${arrow-core.version} @@ -117,7 +117,7 @@ nl.komponents.kovenant kovenant - 3.3.0 + ${kovenant.version} pom @@ -132,13 +132,13 @@ com.google.guava guava - 27.1-jre + ${guava.version} org.jetbrains.kotlinx kotlinx-collections-immutable - 0.1 + ${kotlinx-collections-immutable.version} @@ -151,26 +151,26 @@ net.bytebuddy byte-buddy - 1.8.13 + ${byte-buddy.version} compile net.bytebuddy byte-buddy-agent - 1.8.13 + ${byte-buddy.version} compile org.objenesis objenesis - 2.6 + ${objenesis.version} compile io.reactivex.rxjava2 rxkotlin - 2.3.0 + ${rxkotlin.version} @@ -186,6 +186,13 @@ 3.10.0 0.10.4 1.9.3 + 27.1-jre + 3.3.0 + 1.8.13 + 2.6 + 2.3.0 + 0.1 + 0.7.3 diff --git a/libraries/pom.xml b/libraries/pom.xml index a8ded19a1e..9511563817 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -579,7 +579,7 @@ org.asciidoctor asciidoctor-maven-plugin - 1.5.7.1 + ${asciidoctor-maven-plugin.version} @@ -789,6 +789,7 @@ 2.7.1 3.6 0.9.11 + 1.5.7.1 diff --git a/oauth2-framework-impl/oauth2-authorization-server/pom.xml b/oauth2-framework-impl/oauth2-authorization-server/pom.xml index 6ab7a60f72..25927c9f1a 100644 --- a/oauth2-framework-impl/oauth2-authorization-server/pom.xml +++ b/oauth2-framework-impl/oauth2-authorization-server/pom.xml @@ -18,23 +18,26 @@ 1.4.199 9080 9443 + 7.3 + 1.62 + 1.62 com.nimbusds nimbus-jose-jwt - 7.3 + ${nimbus-jose-jwt.version} org.bouncycastle bcprov-jdk15on - 1.62 + ${bcprov-jdk15on.version} org.bouncycastle bcpkix-jdk15on - 1.62 + ${bcpkix-jdk15on.version} diff --git a/oauth2-framework-impl/oauth2-resource-server/pom.xml b/oauth2-framework-impl/oauth2-resource-server/pom.xml index e6bc860c67..5e5cd087ed 100644 --- a/oauth2-framework-impl/oauth2-resource-server/pom.xml +++ b/oauth2-framework-impl/oauth2-resource-server/pom.xml @@ -18,13 +18,14 @@ 8643 http://localhost:9080 http://localhost:9280 + 1.1 org.eclipse.microprofile.jwt microprofile-jwt-auth-api - 1.1 + ${microprofile-jwt-auth-api.version} provided diff --git a/oauth2-framework-impl/pom.xml b/oauth2-framework-impl/pom.xml index 47d42eaaea..fd1a2c926f 100644 --- a/oauth2-framework-impl/pom.xml +++ b/oauth2-framework-impl/pom.xml @@ -15,19 +15,21 @@ false RELEASE 2.6.4 + 8.0 + 1.3 javax javaee-web-api - 8.0 + ${javaee-web-api.version} provided org.eclipse.microprofile.config microprofile-config-api - 1.3 + ${microprofile-config-api.version} provided diff --git a/optaplanner/pom.xml b/optaplanner/pom.xml index 93b1e68264..bcf7080a1e 100644 --- a/optaplanner/pom.xml +++ b/optaplanner/pom.xml @@ -16,8 +16,12 @@ org.optaplanner optaplanner-core - 7.9.0.Final + ${optaplanner-core.version} + + 7.9.0.Final + + \ No newline at end of file diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml index ced049d281..7ce8262ba5 100644 --- a/persistence-modules/java-jpa/pom.xml +++ b/persistence-modules/java-jpa/pom.xml @@ -57,7 +57,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.5.1 + ${maven-compiler-plugin.version} -proc:none @@ -65,7 +65,7 @@ org.bsc.maven maven-processor-plugin - 3.3.3 + ${maven-processor-plugin.version} process @@ -86,7 +86,7 @@ org.codehaus.mojo build-helper-maven-plugin - 3.0.0 + ${build-helper-maven-plugin.version} add-source @@ -110,6 +110,8 @@ 2.7.4-RC1 42.2.5 2.2 + 3.3.3 + 3.0.0 \ No newline at end of file diff --git a/persistence-modules/r2dbc/pom.xml b/persistence-modules/r2dbc/pom.xml index 388abafdaf..fd48a47f12 100644 --- a/persistence-modules/r2dbc/pom.xml +++ b/persistence-modules/r2dbc/pom.xml @@ -17,6 +17,7 @@ 1.8 + 0.8.0.M8 @@ -41,7 +42,7 @@ io.r2dbc r2dbc-h2 - 0.8.0.M8 + ${r2dbc-h2.version} diff --git a/persistence-modules/sirix/pom.xml b/persistence-modules/sirix/pom.xml index 677c5b8f3a..8de961120f 100644 --- a/persistence-modules/sirix/pom.xml +++ b/persistence-modules/sirix/pom.xml @@ -20,7 +20,7 @@ io.sirix sirix-core - 0.9.3 + ${sirix-core.version} @@ -48,5 +48,6 @@ UTF-8 11 + 0.9.3 diff --git a/persistence-modules/spring-boot-mysql/pom.xml b/persistence-modules/spring-boot-mysql/pom.xml index 6be58332aa..29374ec116 100644 --- a/persistence-modules/spring-boot-mysql/pom.xml +++ b/persistence-modules/spring-boot-mysql/pom.xml @@ -17,7 +17,6 @@ org.springframework.boot spring-boot-starter-web - 2.1.5.RELEASE org.springframework.boot diff --git a/persistence-modules/spring-persistence-simple/pom.xml b/persistence-modules/spring-persistence-simple/pom.xml index d0b3f5fe29..f0cf8e49d5 100644 --- a/persistence-modules/spring-persistence-simple/pom.xml +++ b/persistence-modules/spring-persistence-simple/pom.xml @@ -116,7 +116,7 @@ com.mysema.maven apt-maven-plugin - 1.1.3 + ${apt-maven-plugin.version} generate-sources @@ -148,6 +148,7 @@ 21.0 3.8.0 + 1.1.3 \ No newline at end of file diff --git a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml index 1e4ee698c6..74e786be99 100644 --- a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml +++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml @@ -44,7 +44,7 @@ org.springframework.boot spring-boot-starter-test - 1.5.10.RELEASE + ${spring-boot.version} test diff --git a/spring-boot-data/pom.xml b/spring-boot-data/pom.xml index 9c11e09f4a..4af0acc3c0 100644 --- a/spring-boot-data/pom.xml +++ b/spring-boot-data/pom.xml @@ -18,25 +18,22 @@ org.springframework.boot spring-boot-starter-data-redis - 2.1.6.RELEASE org.springframework.boot spring-boot-starter-data-mongodb - 2.1.6.RELEASE org.springframework.boot spring-boot-starter-data-jpa - 2.1.6.RELEASE com.h2database h2 - 1.4.197 + ${h2.version} diff --git a/spring-boot-logging-log4j2/pom.xml b/spring-boot-logging-log4j2/pom.xml index 64696969ca..8e4bf60f91 100644 --- a/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-logging-log4j2/pom.xml @@ -37,7 +37,7 @@ org.projectlombok lombok - 1.18.4 + ${lombok.version} provided @@ -79,5 +79,6 @@ com.baeldung.springbootlogging.SpringBootLoggingApplication 1.3.8.RELEASE 1.1.16 + 1.18.4 diff --git a/spring-boot-mvc-birt/pom.xml b/spring-boot-mvc-birt/pom.xml index bf6bbbf71d..3532b20c15 100644 --- a/spring-boot-mvc-birt/pom.xml +++ b/spring-boot-mvc-birt/pom.xml @@ -48,19 +48,19 @@ com.innoventsolutions.birt.runtime org.eclipse.birt.runtime_4.8.0-20180626 - 4.8.0 + ${eclipse.birt.runtime.version} log4j log4j - 1.2.17 + ${log4j.version} org.projectlombok lombok - 1.18.6 + ${lombok.version} provided @@ -80,6 +80,7 @@ com.baeldung.birt.engine.ReportEngineApplication 1.8 1.8 + 4.8.0 diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml index 13ad18810e..18bc426364 100644 --- a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kafka/pom.xml @@ -18,6 +18,8 @@ 1.8 Greenwich.SR1 + 4.0.0 + 1.8.2 @@ -41,19 +43,19 @@ io.confluent kafka-avro-serializer - 4.0.0 + ${kafka-avro-serializer.version} org.apache.avro avro-compiler - 1.8.2 + ${avro.version} org.apache.avro avro-maven-plugin - 1.8.2 + ${avro.version} diff --git a/spring-di/pom.xml b/spring-di/pom.xml index f3ad380778..5bcdda7371 100644 --- a/spring-di/pom.xml +++ b/spring-di/pom.xml @@ -66,7 +66,7 @@ org.apache.maven.plugins maven-war-plugin - 3.2.2 + ${maven-war-plugin.version} false diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 670bac9805..555eafe40a 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -139,7 +139,7 @@ commons-io commons-io - 2.4 + ${commons-io.version} au.com.dius diff --git a/spring-security-kerberos/pom.xml b/spring-security-kerberos/pom.xml index d98d0ff508..437e8566bb 100644 --- a/spring-security-kerberos/pom.xml +++ b/spring-security-kerberos/pom.xml @@ -28,17 +28,17 @@ org.springframework.security.kerberos spring-security-kerberos-core - 1.0.1.RELEASE + ${spring-security-kerberos.version} org.springframework.security.kerberos spring-security-kerberos-web - 1.0.1.RELEASE + ${spring-security-kerberos.version} org.springframework.security.kerberos spring-security-kerberos-client - 1.0.1.RELEASE + ${spring-security-kerberos.version} @@ -61,4 +61,8 @@ + + + 1.0.1.RELEASE + diff --git a/testing-modules/easy-random/pom.xml b/testing-modules/easy-random/pom.xml index 93c0027f8f..d80927c3e8 100644 --- a/testing-modules/easy-random/pom.xml +++ b/testing-modules/easy-random/pom.xml @@ -17,8 +17,12 @@ org.jeasy easy-random-core - 4.0.0 + ${easy-random-core.version} + + 4.0.0 + + \ No newline at end of file From dd5a432614153e57326b58afef3c1624385cd132 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 15 Sep 2019 16:54:50 +0300 Subject: [PATCH 199/396] BAEL-3191 - Categories in Groovy --- .../baeldung/category/BaeldungCategory.groovy | 17 ++++ .../baeldung/category/NumberCategory.groovy | 16 +++ .../baeldung/category/CategoryUnitTest.groovy | 99 +++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy create mode 100644 core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy create mode 100644 core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy diff --git a/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy b/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy new file mode 100644 index 0000000000..366dd182c8 --- /dev/null +++ b/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy @@ -0,0 +1,17 @@ +package com.baeldung.category; + +class BaeldungCategory { + + public static String capitalize(String self) { + String capitalizedStr = self; + if (self.size() > 0) { + capitalizedStr = self.substring(0, 1).toUpperCase() + self.substring(1); + } + return capitalizedStr + } + + public static Number square(Number self) { + return self*self; + } + +} diff --git a/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy b/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy new file mode 100644 index 0000000000..cf0e5282fc --- /dev/null +++ b/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy @@ -0,0 +1,16 @@ +package com.baeldung.category; + +import groovy.lang.Category + +@Category(Number) +class NumberCategory { + + public Number cube() { + return this*this*this + } + + public Number toThePower(Number exponent) { + return Math.pow(this, exponent) + } + +} diff --git a/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy new file mode 100644 index 0000000000..2e10efbe03 --- /dev/null +++ b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy @@ -0,0 +1,99 @@ +package com.baeldung.category + +import groovy.time.* +import java.text.SimpleDateFormat +import groovy.xml.* +import groovy.xml.dom.* +import com.baeldung.category.BaeldungCategory +import com.baeldung.category.NumberCategory + +class CategoryUnitTest extends GroovyTestCase { + + void test_whenUsingTimeCategory_thenOperationOnDate() { + def jan_1_2019 = new Date("01/01/2019") + use (TimeCategory) { + assert jan_1_2019 + 10.seconds == new Date("01/01/2019 00:00:10") + + assert jan_1_2019 + 20.minutes == new Date("01/01/2019 00:20:00") + + assert jan_1_2019 + 2.hours == new Date("01/01/2019 02:00:00") + + assert jan_1_2019 - 1.day == new Date("12/31/2018") + + assert jan_1_2019 + 2.weeks == new Date("01/15/2019") + + assert jan_1_2019 - 2.months == new Date("11/01/2018") + + assert jan_1_2019 + 3.years == new Date("01/01/2022") + } + } + + 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() { + + def baeldungArticlesText = """ + +
    + An Intro to the Java Debug Interface (JDI) + A quick and practical overview of Java Debug Interface. +
    +
    + A Quick Guide to Working with Web Services in Groovy + Learn how to work with Web Services in Groovy. +
    +
    +""" + def baeldungArticlesDom = DOMBuilder.newInstance().parseText(baeldungArticlesText) + + def root = baeldungArticlesDom.documentElement + + use (DOMCategory) { + assert root.article.size() == 2 + + def articles = root.article + + assert articles[0].title.text() == "An Intro to the Java Debug Interface (JDI)" + assert articles[1].desc.text() == "Learn how to work with Web Services in Groovy." + + def articleNode3 = root.appendNode(new QName("article"), ["core-java": "false"]) + + articleNode3.appendNode("title", "Metaprogramming in Groovy") + articleNode3.appendNode("desc", "Explore the concept of runtime and compile-time metaprogramming in Groovy") + + assert root.article.size() == 3 + + assert root.article[2].title.text() == "Metaprogramming in Groovy" + } + } + + void test_whenUsingBaeldungCategory_thenCapitalizeString() { + use (BaeldungCategory) { + assert "norman".capitalize() == "Norman" + } + } + + void test_whenUsingBaeldungCategory_thenSquareNumber() { + use (BaeldungCategory) { + assert 50.square() == 2500 + assert 20.01.square() == 400.4001 + } + } + + void test_whenUsingNumberUtils_thenCubeNumber() { + use (NumberCategory) { + assert 3.cube() == 27 + assert 2.4.toThePower(4) == 33.1776 + } + } + +} From 0a4f2a11486548acf86e17d93b95c6b9fc7ecc1e Mon Sep 17 00:00:00 2001 From: Alexander Molochko Date: Sun, 15 Sep 2019 17:13:30 +0300 Subject: [PATCH 200/396] BAEL-2378 Fix Non-blocking Spring Boot with Kotlin Coroutines --- .../controller/ProductControllerCoroutines.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/spring-boot-kotlin/src/main/kotlin/com/baeldung/nonblockingcoroutines/controller/ProductControllerCoroutines.kt b/spring-boot-kotlin/src/main/kotlin/com/baeldung/nonblockingcoroutines/controller/ProductControllerCoroutines.kt index d70d352cda..363090abac 100644 --- a/spring-boot-kotlin/src/main/kotlin/com/baeldung/nonblockingcoroutines/controller/ProductControllerCoroutines.kt +++ b/spring-boot-kotlin/src/main/kotlin/com/baeldung/nonblockingcoroutines/controller/ProductControllerCoroutines.kt @@ -5,6 +5,8 @@ import com.baeldung.nonblockingcoroutines.repository.ProductRepositoryCoroutines import kotlinx.coroutines.Deferred import kotlinx.coroutines.FlowPreview import kotlinx.coroutines.GlobalScope +import kotlinx.coroutines.CoroutineStart +import kotlinx.coroutines.coroutineScope import kotlinx.coroutines.async import kotlinx.coroutines.flow.Flow import org.springframework.beans.factory.annotation.Autowired @@ -28,17 +30,17 @@ class ProductControllerCoroutines { } @GetMapping("/{id}/stock") - suspend fun findOneInStock(@PathVariable id: Int): ProductStockView { - val product: Deferred = GlobalScope.async { + suspend fun findOneInStock(@PathVariable id: Int): ProductStockView = coroutineScope { + val product: Deferred = async(start = CoroutineStart.LAZY) { productRepository.getProductById(id) } - val quantity: Deferred = GlobalScope.async { + val quantity: Deferred = async(start = CoroutineStart.LAZY) { webClient.get() .uri("/stock-service/product/$id/quantity") .accept(APPLICATION_JSON) .awaitExchange().awaitBody() } - return ProductStockView(product.await()!!, quantity.await()) + ProductStockView(product.await()!!, quantity.await()) } @FlowPreview From 16c90aeb1b9f7724f5857fc9ed7448610a1d5962 Mon Sep 17 00:00:00 2001 From: psevestre Date: Sun, 15 Sep 2019 13:05:41 -0300 Subject: [PATCH 201/396] [BAEL-3164] Remove extra files (#7792) * [BAEL-3164] Add spring-boot-jdbi module * [BAEL-3164] Remove extra files --- persistence-modules/pom.xml | 2 +- .../spring-boot-jdbi/.gitignore | 31 -- .../.mvn/wrapper/MavenWrapperDownloader.java | 114 ------- .../.mvn/wrapper/maven-wrapper.jar | Bin 48337 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 - persistence-modules/spring-boot-jdbi/HELP.md | 9 + persistence-modules/spring-boot-jdbi/mvnw | 286 ------------------ persistence-modules/spring-boot-jdbi/mvnw.cmd | 161 ---------- 8 files changed, 10 insertions(+), 594 deletions(-) delete mode 100644 persistence-modules/spring-boot-jdbi/.gitignore delete mode 100644 persistence-modules/spring-boot-jdbi/.mvn/wrapper/MavenWrapperDownloader.java delete mode 100644 persistence-modules/spring-boot-jdbi/.mvn/wrapper/maven-wrapper.jar delete mode 100644 persistence-modules/spring-boot-jdbi/.mvn/wrapper/maven-wrapper.properties create mode 100644 persistence-modules/spring-boot-jdbi/HELP.md delete mode 100644 persistence-modules/spring-boot-jdbi/mvnw delete mode 100644 persistence-modules/spring-boot-jdbi/mvnw.cmd diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 5dd0611f41..0c22267192 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -59,7 +59,7 @@ spring-jpa spring-persistence-simple jpa-hibernate-cascade-type - r2dbc + r2dbc spring-boot-jdbi diff --git a/persistence-modules/spring-boot-jdbi/.gitignore b/persistence-modules/spring-boot-jdbi/.gitignore deleted file mode 100644 index a2a3040aa8..0000000000 --- a/persistence-modules/spring-boot-jdbi/.gitignore +++ /dev/null @@ -1,31 +0,0 @@ -HELP.md -target/ -!.mvn/wrapper/maven-wrapper.jar -!**/src/main/** -!**/src/test/** - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -build/ - -### VS Code ### -.vscode/ diff --git a/persistence-modules/spring-boot-jdbi/.mvn/wrapper/MavenWrapperDownloader.java b/persistence-modules/spring-boot-jdbi/.mvn/wrapper/MavenWrapperDownloader.java deleted file mode 100644 index 72308aa479..0000000000 --- a/persistence-modules/spring-boot-jdbi/.mvn/wrapper/MavenWrapperDownloader.java +++ /dev/null @@ -1,114 +0,0 @@ -/* -Licensed to the Apache Software Foundation (ASF) under one -or more contributor license agreements. See the NOTICE file -distributed with this work for additional information -regarding copyright ownership. The ASF licenses this file -to you under the Apache License, Version 2.0 (the -"License"); you may not use this file except in compliance -with the License. You may obtain a copy of the License at - - https://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, -software distributed under the License is distributed on an -"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, either express or implied. See the License for the -specific language governing permissions and limitations -under the License. -*/ - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.net.URL; -import java.nio.channels.Channels; -import java.nio.channels.ReadableByteChannel; -import java.util.Properties; - -public class MavenWrapperDownloader { - - /** - * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. - */ - private static final String DEFAULT_DOWNLOAD_URL = - "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar"; - - /** - * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to - * use instead of the default one. - */ - private static final String MAVEN_WRAPPER_PROPERTIES_PATH = - ".mvn/wrapper/maven-wrapper.properties"; - - /** - * Path where the maven-wrapper.jar will be saved to. - */ - private static final String MAVEN_WRAPPER_JAR_PATH = - ".mvn/wrapper/maven-wrapper.jar"; - - /** - * Name of the property which should be used to override the default download url for the wrapper. - */ - private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; - - public static void main(String args[]) { - System.out.println("- Downloader started"); - File baseDirectory = new File(args[0]); - System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); - - // If the maven-wrapper.properties exists, read it and check if it contains a custom - // wrapperUrl parameter. - File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); - String url = DEFAULT_DOWNLOAD_URL; - if(mavenWrapperPropertyFile.exists()) { - FileInputStream mavenWrapperPropertyFileInputStream = null; - try { - mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); - Properties mavenWrapperProperties = new Properties(); - mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); - url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); - } catch (IOException e) { - System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); - } finally { - try { - if(mavenWrapperPropertyFileInputStream != null) { - mavenWrapperPropertyFileInputStream.close(); - } - } catch (IOException e) { - // Ignore ... - } - } - } - System.out.println("- Downloading from: : " + url); - - File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); - if(!outputFile.getParentFile().exists()) { - if(!outputFile.getParentFile().mkdirs()) { - System.out.println( - "- ERROR creating output direcrory '" + outputFile.getParentFile().getAbsolutePath() + "'"); - } - } - System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); - try { - downloadFileFromURL(url, outputFile); - System.out.println("Done"); - System.exit(0); - } catch (Throwable e) { - System.out.println("- Error downloading"); - e.printStackTrace(); - System.exit(1); - } - } - - private static void downloadFileFromURL(String urlString, File destination) throws Exception { - URL website = new URL(urlString); - ReadableByteChannel rbc; - rbc = Channels.newChannel(website.openStream()); - FileOutputStream fos = new FileOutputStream(destination); - fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); - fos.close(); - rbc.close(); - } - -} diff --git a/persistence-modules/spring-boot-jdbi/.mvn/wrapper/maven-wrapper.jar b/persistence-modules/spring-boot-jdbi/.mvn/wrapper/maven-wrapper.jar deleted file mode 100644 index 01e67997377a393fd672c7dcde9dccbedf0cb1e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48337 zcmbTe1CV9Qwl>;j+wQV$+qSXFw%KK)%eHN!%U!l@+x~l>b1vR}@9y}|TM-#CBjy|< zb7YRpp)Z$$Gzci_H%LgxZ{NNV{%Qa9gZlF*E2<($D=8;N5Asbx8se{Sz5)O13x)rc z5cR(k$_mO!iis+#(8-D=#R@|AF(8UQ`L7dVNSKQ%v^P|1A%aF~Lye$@HcO@sMYOb3 zl`5!ThJ1xSJwsg7hVYFtE5vS^5UE0$iDGCS{}RO;R#3y#{w-1hVSg*f1)7^vfkxrm!!N|oTR0Hj?N~IbVk+yC#NK} z5myv()UMzV^!zkX@O=Yf!(Z_bF7}W>k*U4@--&RH0tHiHY0IpeezqrF#@8{E$9d=- z7^kT=1Bl;(Q0k{*_vzz1Et{+*lbz%mkIOw(UA8)EE-Pkp{JtJhe@VXQ8sPNTn$Vkj zicVp)sV%0omhsj;NCmI0l8zzAipDV#tp(Jr7p_BlL$}Pys_SoljztS%G-Wg+t z&Q#=<03Hoga0R1&L!B);r{Cf~b$G5p#@?R-NNXMS8@cTWE^7V!?ixz(Ag>lld;>COenWc$RZ61W+pOW0wh>sN{~j; zCBj!2nn|4~COwSgXHFH?BDr8pK323zvmDK-84ESq25b;Tg%9(%NneBcs3;r znZpzntG%E^XsSh|md^r-k0Oen5qE@awGLfpg;8P@a-s<{Fwf?w3WapWe|b-CQkqlo z46GmTdPtkGYdI$e(d9Zl=?TU&uv94VR`g|=7xB2Ur%=6id&R2 z4e@fP7`y58O2sl;YBCQFu7>0(lVt-r$9|06Q5V>4=>ycnT}Fyz#9p;3?86`ZD23@7 z7n&`!LXzjxyg*P4Tz`>WVvpU9-<5MDSDcb1 zZaUyN@7mKLEPGS$^odZcW=GLe?3E$JsMR0kcL4#Z=b4P94Q#7O%_60{h>0D(6P*VH z3}>$stt2s!)w4C4 z{zsj!EyQm$2ARSHiRm49r7u)59ZyE}ZznFE7AdF&O&!-&(y=?-7$LWcn4L_Yj%w`qzwz`cLqPRem1zN; z)r)07;JFTnPODe09Z)SF5@^uRuGP~Mjil??oWmJTaCb;yx4?T?d**;AW!pOC^@GnT zaY`WF609J>fG+h?5&#}OD1<%&;_lzM2vw70FNwn2U`-jMH7bJxdQM#6+dPNiiRFGT z7zc{F6bo_V%NILyM?rBnNsH2>Bx~zj)pJ}*FJxW^DC2NLlOI~18Mk`7sl=t`)To6Ui zu4GK6KJx^6Ms4PP?jTn~jW6TOFLl3e2-q&ftT=31P1~a1%7=1XB z+H~<1dh6%L)PbBmtsAr38>m~)?k3}<->1Bs+;227M@?!S+%X&M49o_e)X8|vZiLVa z;zWb1gYokP;Sbao^qD+2ZD_kUn=m=d{Q9_kpGxcbdQ0d5<_OZJ!bZJcmgBRf z!Cdh`qQ_1NLhCulgn{V`C%|wLE8E6vq1Ogm`wb;7Dj+xpwik~?kEzDT$LS?#%!@_{ zhOoXOC95lVcQU^pK5x$Da$TscVXo19Pps zA!(Mk>N|tskqBn=a#aDC4K%jV#+qI$$dPOK6;fPO)0$0j$`OV+mWhE+TqJoF5dgA=TH-}5DH_)H_ zh?b(tUu@65G-O)1ah%|CsU8>cLEy0!Y~#ut#Q|UT92MZok0b4V1INUL-)Dvvq`RZ4 zTU)YVX^r%_lXpn_cwv`H=y49?!m{krF3Rh7O z^z7l4D<+^7E?ji(L5CptsPGttD+Z7{N6c-`0V^lfFjsdO{aJMFfLG9+wClt<=Rj&G zf6NgsPSKMrK6@Kvgarmx{&S48uc+ZLIvk0fbH}q-HQ4FSR33$+%FvNEusl6xin!?e z@rrWUP5U?MbBDeYSO~L;S$hjxISwLr&0BOSd?fOyeCWm6hD~)|_9#jo+PVbAY3wzf zcZS*2pX+8EHD~LdAl>sA*P>`g>>+&B{l94LNLp#KmC)t6`EPhL95s&MMph46Sk^9x%B$RK!2MI--j8nvN31MNLAJBsG`+WMvo1}xpaoq z%+W95_I`J1Pr&Xj`=)eN9!Yt?LWKs3-`7nf)`G6#6#f+=JK!v943*F&veRQxKy-dm(VcnmA?K_l~ zfDWPYl6hhN?17d~^6Zuo@>Hswhq@HrQ)sb7KK^TRhaM2f&td)$6zOn7we@ zd)x4-`?!qzTGDNS-E(^mjM%d46n>vPeMa;%7IJDT(nC)T+WM5F-M$|p(78W!^ck6)A_!6|1o!D97tw8k|5@0(!8W&q9*ovYl)afk z2mxnniCOSh7yHcSoEu8k`i15#oOi^O>uO_oMpT=KQx4Ou{&C4vqZG}YD0q!{RX=`#5wmcHT=hqW3;Yvg5Y^^ ziVunz9V)>2&b^rI{ssTPx26OxTuCw|+{tt_M0TqD?Bg7cWN4 z%UH{38(EW1L^!b~rtWl)#i}=8IUa_oU8**_UEIw+SYMekH;Epx*SA7Hf!EN&t!)zuUca@_Q^zW(u_iK_ zrSw{nva4E6-Npy9?lHAa;b(O z`I74A{jNEXj(#r|eS^Vfj-I!aHv{fEkzv4=F%z0m;3^PXa27k0Hq#RN@J7TwQT4u7 ztisbp3w6#k!RC~!5g-RyjpTth$lf!5HIY_5pfZ8k#q!=q*n>~@93dD|V>=GvH^`zn zVNwT@LfA8^4rpWz%FqcmzX2qEAhQ|_#u}md1$6G9qD%FXLw;fWWvqudd_m+PzI~g3 z`#WPz`M1XUKfT3&T4~XkUie-C#E`GN#P~S(Zx9%CY?EC?KP5KNK`aLlI1;pJvq@d z&0wI|dx##t6Gut6%Y9c-L|+kMov(7Oay++QemvI`JOle{8iE|2kZb=4x%a32?>-B~ z-%W$0t&=mr+WJ3o8d(|^209BapD`@6IMLbcBlWZlrr*Yrn^uRC1(}BGNr!ct z>xzEMV(&;ExHj5cce`pk%6!Xu=)QWtx2gfrAkJY@AZlHWiEe%^_}mdzvs(6>k7$e; ze4i;rv$_Z$K>1Yo9f4&Jbx80?@X!+S{&QwA3j#sAA4U4#v zwZqJ8%l~t7V+~BT%j4Bwga#Aq0&#rBl6p$QFqS{DalLd~MNR8Fru+cdoQ78Dl^K}@l#pmH1-e3?_0tZKdj@d2qu z_{-B11*iuywLJgGUUxI|aen-((KcAZZdu8685Zi1b(#@_pmyAwTr?}#O7zNB7U6P3 zD=_g*ZqJkg_9_X3lStTA-ENl1r>Q?p$X{6wU6~e7OKNIX_l9T# z>XS?PlNEM>P&ycY3sbivwJYAqbQH^)z@PobVRER*Ud*bUi-hjADId`5WqlZ&o+^x= z-Lf_80rC9>tqFBF%x#`o>69>D5f5Kp->>YPi5ArvgDwV#I6!UoP_F0YtfKoF2YduA zCU!1`EB5;r68;WyeL-;(1K2!9sP)at9C?$hhy(dfKKBf}>skPqvcRl>UTAB05SRW! z;`}sPVFFZ4I%YrPEtEsF(|F8gnfGkXI-2DLsj4_>%$_ZX8zVPrO=_$7412)Mr9BH{ zwKD;e13jP2XK&EpbhD-|`T~aI`N(*}*@yeDUr^;-J_`fl*NTSNbupyHLxMxjwmbuw zt3@H|(hvcRldE+OHGL1Y;jtBN76Ioxm@UF1K}DPbgzf_a{`ohXp_u4=ps@x-6-ZT>F z)dU`Jpu~Xn&Qkq2kg%VsM?mKC)ArP5c%r8m4aLqimgTK$atIxt^b8lDVPEGDOJu!) z%rvASo5|v`u_}vleP#wyu1$L5Ta%9YOyS5;w2I!UG&nG0t2YL|DWxr#T7P#Ww8MXDg;-gr`x1?|V`wy&0vm z=hqozzA!zqjOm~*DSI9jk8(9nc4^PL6VOS$?&^!o^Td8z0|eU$9x8s{8H!9zK|)NO zqvK*dKfzG^Dy^vkZU|p9c+uVV3>esY)8SU1v4o{dZ+dPP$OT@XCB&@GJ<5U&$Pw#iQ9qzuc`I_%uT@%-v zLf|?9w=mc;b0G%%{o==Z7AIn{nHk`>(!e(QG%(DN75xfc#H&S)DzSFB6`J(cH!@mX3mv_!BJv?ByIN%r-i{Y zBJU)}Vhu)6oGoQjT2tw&tt4n=9=S*nQV`D_MSw7V8u1-$TE>F-R6Vo0giKnEc4NYZ zAk2$+Tba~}N0wG{$_7eaoCeb*Ubc0 zq~id50^$U>WZjmcnIgsDione)f+T)0ID$xtgM zpGZXmVez0DN!)ioW1E45{!`G9^Y1P1oXhP^rc@c?o+c$^Kj_bn(Uo1H2$|g7=92v- z%Syv9Vo3VcibvH)b78USOTwIh{3%;3skO_htlfS?Cluwe`p&TMwo_WK6Z3Tz#nOoy z_E17(!pJ>`C2KECOo38F1uP0hqBr>%E=LCCCG{j6$b?;r?Fd$4@V-qjEzgWvzbQN%_nlBg?Ly`x-BzO2Nnd1 zuO|li(oo^Rubh?@$q8RVYn*aLnlWO_dhx8y(qzXN6~j>}-^Cuq4>=d|I>vhcjzhSO zU`lu_UZ?JaNs1nH$I1Ww+NJI32^qUikAUfz&k!gM&E_L=e_9}!<(?BfH~aCmI&hfzHi1~ zraRkci>zMPLkad=A&NEnVtQQ#YO8Xh&K*;6pMm$ap_38m;XQej5zEqUr`HdP&cf0i z5DX_c86@15jlm*F}u-+a*^v%u_hpzwN2eT66Zj_1w)UdPz*jI|fJb#kSD_8Q-7q9gf}zNu2h=q{)O*XH8FU)l|m;I;rV^QpXRvMJ|7% zWKTBX*cn`VY6k>mS#cq!uNw7H=GW3?wM$8@odjh$ynPiV7=Ownp}-|fhULZ)5{Z!Q z20oT!6BZTK;-zh=i~RQ$Jw>BTA=T(J)WdnTObDM#61lUm>IFRy@QJ3RBZr)A9CN!T z4k7%)I4yZ-0_n5d083t!=YcpSJ}M5E8`{uIs3L0lIaQws1l2}+w2(}hW&evDlMnC!WV?9U^YXF}!N*iyBGyCyJ<(2(Ca<>!$rID`( zR?V~-53&$6%DhW=)Hbd-oetTXJ-&XykowOx61}1f`V?LF=n8Nb-RLFGqheS7zNM_0 z1ozNap9J4GIM1CHj-%chrCdqPlP307wfrr^=XciOqn?YPL1|ozZ#LNj8QoCtAzY^q z7&b^^K&?fNSWD@*`&I+`l9 zP2SlD0IO?MK60nbucIQWgz85l#+*<{*SKk1K~|x{ux+hn=SvE_XE`oFlr7$oHt-&7 zP{+x)*y}Hnt?WKs_Ymf(J^aoe2(wsMMRPu>Pg8H#x|zQ_=(G5&ieVhvjEXHg1zY?U zW-hcH!DJPr+6Xnt)MslitmnHN(Kgs4)Y`PFcV0Qvemj;GG`kf<>?p})@kd9DA7dqs zNtGRKVr0%x#Yo*lXN+vT;TC{MR}}4JvUHJHDLd-g88unUj1(#7CM<%r!Z1Ve>DD)FneZ| z8Q0yI@i4asJaJ^ge%JPl>zC3+UZ;UDUr7JvUYNMf=M2t{It56OW1nw#K8%sXdX$Yg zpw3T=n}Om?j3-7lu)^XfBQkoaZ(qF0D=Aw&D%-bsox~`8Y|!whzpd5JZ{dmM^A5)M zOwWEM>bj}~885z9bo{kWFA0H(hv(vL$G2;pF$@_M%DSH#g%V*R(>;7Z7eKX&AQv1~ z+lKq=488TbTwA!VtgSHwduwAkGycunrg}>6oiX~;Kv@cZlz=E}POn%BWt{EEd;*GV zmc%PiT~k<(TA`J$#6HVg2HzF6Iw5w9{C63y`Y7?OB$WsC$~6WMm3`UHaWRZLN3nKiV# zE;iiu_)wTr7ZiELH$M^!i5eC9aRU#-RYZhCl1z_aNs@f`tD4A^$xd7I_ijCgI!$+| zsulIT$KB&PZ}T-G;Ibh@UPafvOc-=p7{H-~P)s{3M+;PmXe7}}&Mn+9WT#(Jmt5DW%73OBA$tC#Ug!j1BR~=Xbnaz4hGq zUOjC*z3mKNbrJm1Q!Ft^5{Nd54Q-O7<;n})TTQeLDY3C}RBGwhy*&wgnl8dB4lwkG zBX6Xn#hn|!v7fp@@tj9mUPrdD!9B;tJh8-$aE^t26n_<4^=u~s_MfbD?lHnSd^FGGL6the7a|AbltRGhfET*X;P7=AL?WPjBtt;3IXgUHLFMRBz(aWW_ zZ?%%SEPFu&+O?{JgTNB6^5nR@)rL6DFqK$KS$bvE#&hrPs>sYsW=?XzOyD6ixglJ8rdt{P8 zPAa*+qKt(%ju&jDkbB6x7aE(={xIb*&l=GF(yEnWPj)><_8U5m#gQIIa@l49W_=Qn^RCsYqlEy6Om%!&e~6mCAfDgeXe3aYpHQAA!N|kmIW~Rk}+p6B2U5@|1@7iVbm5&e7E3;c9q@XQlb^JS(gmJl%j9!N|eNQ$*OZf`3!;raRLJ z;X-h>nvB=S?mG!-VH{65kwX-UwNRMQB9S3ZRf`hL z#WR)+rn4C(AG(T*FU}`&UJOU4#wT&oDyZfHP^s9#>V@ens??pxuu-6RCk=Er`DF)X z>yH=P9RtrtY;2|Zg3Tnx3Vb!(lRLedVRmK##_#;Kjnlwq)eTbsY8|D{@Pjn_=kGYO zJq0T<_b;aB37{U`5g6OSG=>|pkj&PohM%*O#>kCPGK2{0*=m(-gKBEOh`fFa6*~Z! zVxw@7BS%e?cV^8{a`Ys4;w=tH4&0izFxgqjE#}UfsE^?w)cYEQjlU|uuv6{>nFTp| zNLjRRT1{g{?U2b6C^w{!s+LQ(n}FfQPDfYPsNV?KH_1HgscqG7z&n3Bh|xNYW4i5i zT4Uv-&mXciu3ej=+4X9h2uBW9o(SF*N~%4%=g|48R-~N32QNq!*{M4~Y!cS4+N=Zr z?32_`YpAeg5&r_hdhJkI4|i(-&BxCKru`zm9`v+CN8p3r9P_RHfr{U$H~RddyZKw{ zR?g5i>ad^Ge&h?LHlP7l%4uvOv_n&WGc$vhn}2d!xIWrPV|%x#2Q-cCbQqQ|-yoTe z_C(P))5e*WtmpB`Fa~#b*yl#vL4D_h;CidEbI9tsE%+{-4ZLKh#9^{mvY24#u}S6oiUr8b0xLYaga!(Fe7Dxi}v6 z%5xNDa~i%tN`Cy_6jbk@aMaY(xO2#vWZh9U?mrNrLs5-*n>04(-Dlp%6AXsy;f|a+ z^g~X2LhLA>xy(8aNL9U2wr=ec%;J2hEyOkL*D%t4cNg7WZF@m?kF5YGvCy`L5jus# zGP8@iGTY|ov#t&F$%gkWDoMR7v*UezIWMeg$C2~WE9*5%}$3!eFiFJ?hypfIA(PQT@=B|^Ipcu z{9cM3?rPF|gM~{G)j*af1hm+l92W7HRpQ*hSMDbh(auwr}VBG7`ldp>`FZ^amvau zTa~Y7%tH@>|BB6kSRGiWZFK?MIzxEHKGz#P!>rB-90Q_UsZ=uW6aTzxY{MPP@1rw- z&RP^Ld%HTo($y?6*aNMz8h&E?_PiO{jq%u4kr#*uN&Q+Yg1Rn831U4A6u#XOzaSL4 zrcM+0v@%On8N*Mj!)&IzXW6A80bUK&3w|z06cP!UD^?_rb_(L-u$m+#%YilEjkrlxthGCLQ@Q?J!p?ggv~0 z!qipxy&`w48T0(Elsz<^hp_^#1O1cNJ1UG=61Nc=)rlRo_P6v&&h??Qvv$ifC3oJh zo)ZZhU5enAqU%YB>+FU!1vW)i$m-Z%w!c&92M1?))n4z1a#4-FufZ$DatpJ^q)_Zif z;Br{HmZ|8LYRTi`#?TUfd;#>c4@2qM5_(H+Clt@kkQT+kx78KACyvY)?^zhyuN_Z& z-*9_o_f3IC2lX^(aLeqv#>qnelb6_jk+lgQh;TN>+6AU9*6O2h_*=74m;xSPD1^C9 zE0#!+B;utJ@8P6_DKTQ9kNOf`C*Jj0QAzsngKMQVDUsp=k~hd@wt}f{@$O*xI!a?p z6Gti>uE}IKAaQwKHRb0DjmhaF#+{9*=*^0)M-~6lPS-kCI#RFGJ-GyaQ+rhbmhQef zwco))WNA1LFr|J3Qsp4ra=_j?Y%b{JWMX6Zr`$;*V`l`g7P0sP?Y1yOY;e0Sb!AOW0Em=U8&i8EKxTd$dX6=^Iq5ZC%zMT5Jjj%0_ zbf|}I=pWjBKAx7wY<4-4o&E6vVStcNlT?I18f5TYP9!s|5yQ_C!MNnRyDt7~u~^VS@kKd}Zwc~? z=_;2}`Zl^xl3f?ce8$}g^V)`b8Pz88=9FwYuK_x%R?sbAF-dw`*@wokEC3mp0Id>P z>OpMGxtx!um8@gW2#5|)RHpRez+)}_p;`+|*m&3&qy{b@X>uphcgAVgWy`?Nc|NlH z75_k2%3h7Fy~EkO{vBMuzV7lj4B}*1Cj(Ew7oltspA6`d69P`q#Y+rHr5-m5&be&( zS1GcP5u#aM9V{fUQTfHSYU`kW&Wsxeg;S*{H_CdZ$?N>S$JPv!_6T(NqYPaS{yp0H7F~7vy#>UHJr^lV?=^vt4?8$v8vkI-1eJ4{iZ!7D5A zg_!ZxZV+9Wx5EIZ1%rbg8`-m|=>knmTE1cpaBVew_iZpC1>d>qd3`b6<(-)mtJBmd zjuq-qIxyKvIs!w4$qpl{0cp^-oq<=-IDEYV7{pvfBM7tU+ zfX3fc+VGtqjPIIx`^I0i>*L-NfY=gFS+|sC75Cg;2<)!Y`&p&-AxfOHVADHSv1?7t zlOKyXxi|7HdwG5s4T0))dWudvz8SZpxd<{z&rT<34l}XaaP86x)Q=2u5}1@Sgc41D z2gF)|aD7}UVy)bnm788oYp}Es!?|j73=tU<_+A4s5&it~_K4 z;^$i0Vnz8y&I!abOkzN|Vz;kUTya#Wi07>}Xf^7joZMiHH3Mdy@e_7t?l8^A!r#jTBau^wn#{|!tTg=w01EQUKJOca!I zV*>St2399#)bMF++1qS8T2iO3^oA`i^Px*i)T_=j=H^Kp4$Zao(>Y)kpZ=l#dSgcUqY=7QbGz9mP9lHnII8vl?yY9rU+i%X)-j0&-- zrtaJsbkQ$;DXyIqDqqq)LIJQ!`MIsI;goVbW}73clAjN;1Rtp7%{67uAfFNe_hyk= zn=8Q1x*zHR?txU)x9$nQu~nq7{Gbh7?tbgJ>i8%QX3Y8%T{^58W^{}(!9oPOM+zF3 zW`%<~q@W}9hoes56uZnNdLkgtcRqPQ%W8>o7mS(j5Sq_nN=b0A`Hr%13P{uvH?25L zMfC&Z0!{JBGiKoVwcIhbbx{I35o}twdI_ckbs%1%AQ(Tdb~Xw+sXAYcOoH_9WS(yM z2dIzNLy4D%le8Fxa31fd;5SuW?ERAsagZVEo^i};yjBhbxy9&*XChFtOPV8G77{8! zlYemh2vp7aBDMGT;YO#=YltE~(Qv~e7c=6$VKOxHwvrehtq>n|w}vY*YvXB%a58}n zqEBR4zueP@A~uQ2x~W-{o3|-xS@o>Ad@W99)ya--dRx;TZLL?5E(xstg(6SwDIpL5 zMZ)+)+&(hYL(--dxIKB*#v4mDq=0ve zNU~~jk426bXlS8%lcqsvuqbpgn zbFgxap;17;@xVh+Y~9@+-lX@LQv^Mw=yCM&2!%VCfZsiwN>DI=O?vHupbv9!4d*>K zcj@a5vqjcjpwkm@!2dxzzJGQ7#ujW(IndUuYC)i3N2<*doRGX8a$bSbyRO#0rA zUpFyEGx4S9$TKuP9BybRtjcAn$bGH-9>e(V{pKYPM3waYrihBCQf+UmIC#E=9v?or z_7*yzZfT|)8R6>s(lv6uzosT%WoR`bQIv(?llcH2Bd@26?zU%r1K25qscRrE1 z9TIIP_?`78@uJ{%I|_K;*syVinV;pCW!+zY-!^#n{3It^6EKw{~WIA0pf_hVzEZy zFzE=d-NC#mge{4Fn}we02-%Zh$JHKpXX3qF<#8__*I}+)Npxm?26dgldWyCmtwr9c zOXI|P0zCzn8M_Auv*h9;2lG}x*E|u2!*-s}moqS%Z`?O$<0amJG9n`dOV4**mypG- zE}In1pOQ|;@@Jm;I#m}jkQegIXag4K%J;C7<@R2X8IdsCNqrbsaUZZRT|#6=N!~H} zlc2hPngy9r+Gm_%tr9V&HetvI#QwUBKV&6NC~PK>HNQ3@fHz;J&rR7XB>sWkXKp%A ziLlogA`I*$Z7KzLaX^H_j)6R|9Q>IHc? z{s0MsOW>%xW|JW=RUxY@@0!toq`QXa=`j;)o2iDBiDZ7c4Bc>BiDTw+zk}Jm&vvH8qX$R`M6Owo>m%n`eizBf!&9X6 z)f{GpMak@NWF+HNg*t#H5yift5@QhoYgT7)jxvl&O=U54Z>FxT5prvlDER}AwrK4Q z*&JP9^k332OxC$(E6^H`#zw|K#cpwy0i*+!z{T23;dqUKbjP!-r*@_!sp+Uec@^f0 zIJMjqhp?A#YoX5EB%iWu;mxJ1&W6Nb4QQ@GElqNjFNRc*=@aGc$PHdoUptckkoOZC zk@c9i+WVnDI=GZ1?lKjobDl%nY2vW~d)eS6Lch&J zDi~}*fzj9#<%xg<5z-4(c}V4*pj~1z2z60gZc}sAmys^yvobWz)DKDGWuVpp^4-(!2Nn7 z3pO})bO)({KboXlQA>3PIlg@Ie$a=G;MzVeft@OMcKEjIr=?;=G0AH?dE_DcNo%n$_bFjqQ8GjeIyJP^NkX~7e&@+PqnU-c3@ABap z=}IZvC0N{@fMDOpatOp*LZ7J6Hz@XnJzD!Yh|S8p2O($2>A4hbpW{8?#WM`uJG>?} zwkDF3dimqejl$3uYoE7&pr5^f4QP-5TvJ;5^M?ZeJM8ywZ#Dm`kR)tpYieQU;t2S! z05~aeOBqKMb+`vZ2zfR*2(&z`Y1VROAcR(^Q7ZyYlFCLHSrTOQm;pnhf3Y@WW#gC1 z7b$_W*ia0@2grK??$pMHK>a$;J)xIx&fALD4)w=xlT=EzrwD!)1g$2q zy8GQ+r8N@?^_tuCKVi*q_G*!#NxxY#hpaV~hF} zF1xXy#XS|q#)`SMAA|46+UnJZ__lETDwy}uecTSfz69@YO)u&QORO~F^>^^j-6q?V z-WK*o?XSw~ukjoIT9p6$6*OStr`=+;HrF#)p>*>e|gy0D9G z#TN(VSC11^F}H#?^|^ona|%;xCC!~H3~+a>vjyRC5MPGxFqkj6 zttv9I_fv+5$vWl2r8+pXP&^yudvLxP44;9XzUr&a$&`?VNhU^$J z`3m68BAuA?ia*IF%Hs)@>xre4W0YoB^(X8RwlZ?pKR)rvGX?u&K`kb8XBs^pe}2v* z_NS*z7;4%Be$ts_emapc#zKjVMEqn8;aCX=dISG3zvJP>l4zHdpUwARLixQSFzLZ0 z$$Q+9fAnVjA?7PqANPiH*XH~VhrVfW11#NkAKjfjQN-UNz?ZT}SG#*sk*)VUXZ1$P zdxiM@I2RI7Tr043ZgWd3G^k56$Non@LKE|zLwBgXW#e~{7C{iB3&UjhKZPEj#)cH9 z%HUDubc0u@}dBz>4zU;sTluxBtCl!O4>g9ywc zhEiM-!|!C&LMjMNs6dr6Q!h{nvTrNN0hJ+w*h+EfxW=ro zxAB%*!~&)uaqXyuh~O`J(6e!YsD0o0l_ung1rCAZt~%4R{#izD2jT~${>f}m{O!i4 z`#UGbiSh{L=FR`Q`e~9wrKHSj?I>eXHduB`;%TcCTYNG<)l@A%*Ld?PK=fJi}J? z9T-|Ib8*rLE)v_3|1+Hqa!0ch>f% zfNFz@o6r5S`QQJCwRa4zgx$7AyQ7ZTv2EM7ZQHh!72CFL+qT`Y)k!)|Zr;7mcfV8T z)PB$1r*5rUzgE@y^E_kDG3Ol5n6q}eU2hJcXY7PI1}N=>nwC6k%nqxBIAx4Eix*`W zch0}3aPFe5*lg1P(=7J^0ZXvpOi9v2l*b?j>dI%iamGp$SmFaxpZod*TgYiyhF0= za44lXRu%9MA~QWN;YX@8LM32BqKs&W4&a3ve9C~ndQq>S{zjRNj9&&8k-?>si8)^m zW%~)EU)*$2YJzTXjRV=-dPAu;;n2EDYb=6XFyz`D0f2#29(mUX}*5~KU3k>$LwN#OvBx@ zl6lC>UnN#0?mK9*+*DMiboas!mmGnoG%gSYeThXI<=rE(!Pf-}oW}?yDY0804dH3o zo;RMFJzxP|srP-6ZmZ_peiVycfvH<`WJa9R`Z#suW3KrI*>cECF(_CB({ToWXSS18#3%vihZZJ{BwJPa?m^(6xyd1(oidUkrOU zlqyRQUbb@W_C)5Q)%5bT3K0l)w(2cJ-%?R>wK35XNl&}JR&Pn*laf1M#|s4yVXQS# zJvkT$HR;^3k{6C{E+{`)J+~=mPA%lv1T|r#kN8kZP}os;n39exCXz^cc{AN(Ksc%} zA561&OeQU8gIQ5U&Y;Ca1TatzG`K6*`9LV<|GL-^=qg+nOx~6 zBEMIM7Q^rkuhMtw(CZtpU(%JlBeV?KC+kjVDL34GG1sac&6(XN>nd+@Loqjo%i6I~ zjNKFm^n}K=`z8EugP20fd_%~$Nfu(J(sLL1gvXhxZt|uvibd6rLXvM%!s2{g0oNA8 z#Q~RfoW8T?HE{ge3W>L9bx1s2_L83Odx)u1XUo<`?a~V-_ZlCeB=N-RWHfs1(Yj!_ zP@oxCRysp9H8Yy@6qIc69TQx(1P`{iCh)8_kH)_vw1=*5JXLD(njxE?2vkOJ z>qQz!*r`>X!I69i#1ogdVVB=TB40sVHX;gak=fu27xf*}n^d>@*f~qbtVMEW!_|+2 zXS`-E%v`_>(m2sQnc6+OA3R z-6K{6$KZsM+lF&sn~w4u_md6J#+FzqmtncY;_ z-Q^D=%LVM{A0@VCf zV9;?kF?vV}*=N@FgqC>n-QhKJD+IT7J!6llTEH2nmUxKiBa*DO4&PD5=HwuD$aa(1 z+uGf}UT40OZAH@$jjWoI7FjOQAGX6roHvf_wiFKBfe4w|YV{V;le}#aT3_Bh^$`Pp zJZGM_()iFy#@8I^t{ryOKQLt%kF7xq&ZeD$$ghlTh@bLMv~||?Z$#B2_A4M&8)PT{ zyq$BzJpRrj+=?F}zH+8XcPvhRP+a(nnX2^#LbZqgWQ7uydmIM&FlXNx4o6m;Q5}rB z^ryM&o|~a-Zb20>UCfSFwdK4zfk$*~<|90v0=^!I?JnHBE{N}74iN;w6XS=#79G+P zB|iewe$kk;9^4LinO>)~KIT%%4Io6iFFXV9gJcIvu-(!um{WfKAwZDmTrv=wb#|71 zWqRjN8{3cRq4Ha2r5{tw^S>0DhaC3m!i}tk9q08o>6PtUx1GsUd{Z17FH45rIoS+oym1>3S0B`>;uo``+ADrd_Um+8s$8V6tKsA8KhAm z{pTv@zj~@+{~g&ewEBD3um9@q!23V_8Nb0_R#1jcg0|MyU)?7ua~tEY63XSvqwD`D zJ+qY0Wia^BxCtXpB)X6htj~*7)%un+HYgSsSJPAFED7*WdtlFhuJj5d3!h8gt6$(s ztrx=0hFH8z(Fi9}=kvPI?07j&KTkssT=Vk!d{-M50r!TsMD8fPqhN&%(m5LGpO>}L zse;sGl_>63FJ)(8&8(7Wo2&|~G!Lr^cc!uuUBxGZE)ac7Jtww7euxPo)MvxLXQXlk zeE>E*nMqAPwW0&r3*!o`S7wK&078Q#1bh!hNbAw0MFnK-2gU25&8R@@j5}^5-kHeR z!%krca(JG%&qL2mjFv380Gvb*eTLllTaIpVr3$gLH2e3^xo z=qXjG0VmES%OXAIsOQG|>{aj3fv+ZWdoo+a9tu8)4AyntBP>+}5VEmv@WtpTo<-aH zF4C(M#dL)MyZmU3sl*=TpAqU#r>c8f?-zWMq`wjEcp^jG2H`8m$p-%TW?n#E5#Th+ z7Zy#D>PPOA4|G@-I$!#Yees_9Ku{i_Y%GQyM)_*u^nl+bXMH!f_ z8>BM|OTex;vYWu`AhgfXFn)0~--Z7E0WR-v|n$XB-NOvjM156WR(eu z(qKJvJ%0n+%+%YQP=2Iz-hkgI_R>7+=)#FWjM#M~Y1xM8m_t8%=FxV~Np$BJ{^rg9 z5(BOvYfIY{$h1+IJyz-h`@jhU1g^Mo4K`vQvR<3wrynWD>p{*S!kre-(MT&`7-WK! zS}2ceK+{KF1yY*x7FH&E-1^8b$zrD~Ny9|9(!1Y)a#)*zf^Uo@gy~#%+*u`U!R`^v zCJ#N!^*u_gFq7;-XIYKXvac$_=booOzPgrMBkonnn%@#{srUC<((e*&7@YR?`CP;o zD2*OE0c%EsrI72QiN`3FpJ#^Bgf2~qOa#PHVmbzonW=dcrs92>6#{pEnw19AWk%;H zJ4uqiD-dx*w2pHf8&Jy{NXvGF^Gg!ungr2StHpMQK5^+ zEmDjjBonrrT?d9X;BHSJeU@lX19|?On)(Lz2y-_;_!|}QQMsq4Ww9SmzGkzVPQTr* z)YN>_8i^rTM>Bz@%!!v)UsF&Nb{Abz>`1msFHcf{)Ufc_a-mYUPo@ei#*%I_jWm#7 zX01=Jo<@6tl`c;P_uri^gJxDVHOpCano2Xc5jJE8(;r@y6THDE>x*#-hSKuMQ_@nc z68-JLZyag_BTRE(B)Pw{B;L0+Zx!5jf%z-Zqug*og@^ zs{y3{Za(0ywO6zYvES>SW*cd4gwCN^o9KQYF)Lm^hzr$w&spGNah6g>EQBufQCN!y zI5WH$K#67$+ic{yKAsX@el=SbBcjRId*cs~xk~3BBpQsf%IsoPG)LGs zdK0_rwz7?L0XGC^2$dktLQ9qjwMsc1rpGx2Yt?zmYvUGnURx(1k!kmfPUC@2Pv;r9 z`-Heo+_sn+!QUJTAt;uS_z5SL-GWQc#pe0uA+^MCWH=d~s*h$XtlN)uCI4$KDm4L$ zIBA|m0o6@?%4HtAHRcDwmzd^(5|KwZ89#UKor)8zNI^EsrIk z1QLDBnNU1!PpE3iQg9^HI){x7QXQV{&D>2U%b_II>*2*HF2%>KZ>bxM)Jx4}|CCEa`186nD_B9h`mv6l45vRp*L+z_nx5i#9KvHi>rqxJIjKOeG(5lCeo zLC|-b(JL3YP1Ds=t;U!Y&Gln*Uwc0TnDSZCnh3m$N=xWMcs~&Rb?w}l51ubtz=QUZsWQhWOX;*AYb)o(^<$zU_v=cFwN~ZVrlSLx| zpr)Q7!_v*%U}!@PAnZLqOZ&EbviFbej-GwbeyaTq)HSBB+tLH=-nv1{MJ-rGW%uQ1 znDgP2bU@}!Gd=-;3`KlJYqB@U#Iq8Ynl%eE!9g;d*2|PbC{A}>mgAc8LK<69qcm)piu?`y~3K8zlZ1>~K_4T{%4zJG6H?6%{q3B-}iP_SGXELeSv*bvBq~^&C=3TsP z9{cff4KD2ZYzkArq=;H(Xd)1CAd%byUXZdBHcI*%a24Zj{Hm@XA}wj$=7~$Q*>&4} z2-V62ek{rKhPvvB711`qtAy+q{f1yWuFDcYt}hP)Vd>G?;VTb^P4 z(QDa?zvetCoB_)iGdmQ4VbG@QQ5Zt9a&t(D5Rf#|hC`LrONeUkbV)QF`ySE5x+t_v z-(cW{S13ye9>gtJm6w&>WwJynxJQm8U2My?#>+(|)JK}bEufIYSI5Y}T;vs?rzmLE zAIk%;^qbd@9WUMi*cGCr=oe1-nthYRQlhVHqf{ylD^0S09pI}qOQO=3&dBsD)BWo# z$NE2Ix&L&4|Aj{;ed*A?4z4S!7o_Kg^8@%#ZW26_F<>y4ghZ0b|3+unIoWDUVfen~ z`4`-cD7qxQSm9hF-;6WvCbu$t5r$LCOh}=`k1(W<&bG-xK{VXFl-cD%^Q*x-9eq;k8FzxAqZB zH@ja_3%O7XF~>owf3LSC_Yn!iO}|1Uc5uN{Wr-2lS=7&JlsYSp3IA%=E?H6JNf()z zh>jA>JVsH}VC>3Be>^UXk&3o&rK?eYHgLwE-qCHNJyzDLmg4G(uOFX5g1f(C{>W3u zn~j`zexZ=sawG8W+|SErqc?uEvQP(YT(YF;u%%6r00FP;yQeH)M9l+1Sv^yddvGo- z%>u>5SYyJ|#8_j&%h3#auTJ!4y@yEg<(wp#(~NH zXP7B#sv@cW{D4Iz1&H@5wW(F82?-JmcBt@Gw1}WK+>FRXnX(8vwSeUw{3i%HX6-pvQS-~Omm#x-udgp{=9#!>kDiLwqs_7fYy{H z)jx_^CY?5l9#fR$wukoI>4aETnU>n<$UY!JDlIvEti908)Cl2Ziyjjtv|P&&_8di> z<^amHu|WgwMBKHNZ)t)AHII#SqDIGTAd<(I0Q_LNPk*?UmK>C5=rIN^gs}@65VR*!J{W;wp5|&aF8605*l-Sj zQk+C#V<#;=Sl-)hzre6n0n{}|F=(#JF)X4I4MPhtm~qKeR8qM?a@h!-kKDyUaDrqO z1xstrCRCmDvdIFOQ7I4qesby8`-5Y>t_E1tUTVOPuNA1De9| z8{B0NBp*X2-ons_BNzb*Jk{cAJ(^F}skK~i;p0V(R7PKEV3bB;syZ4(hOw47M*-r8 z3qtuleeteUl$FHL$)LN|q8&e;QUN4(id`Br{rtsjpBdriO}WHLcr<;aqGyJP{&d6? zMKuMeLbc=2X0Q_qvSbl3r?F8A^oWw9Z{5@uQ`ySGm@DUZ=XJ^mKZ-ipJtmiXjcu<%z?Nj%-1QY*O{NfHd z=V}Y(UnK=f?xLb-_~H1b2T&0%O*2Z3bBDf06-nO*q%6uEaLs;=omaux7nqqW%tP$i zoF-PC%pxc(ymH{^MR_aV{@fN@0D1g&zv`1$Pyu3cvdR~(r*3Y%DJ@&EU?EserVEJ` zEprux{EfT+(Uq1m4F?S!TrZ+!AssSdX)fyhyPW6C`}ko~@y#7acRviE(4>moNe$HXzf zY@@fJa~o_r5nTeZ7ceiXI=k=ISkdp1gd1p)J;SlRn^5;rog!MlTr<<6-U9|oboRBN zlG~o*dR;%?9+2=g==&ZK;Cy0pyQFe)x!I!8g6;hGl`{{3q1_UzZy)J@c{lBIEJVZ& z!;q{8h*zI!kzY#RO8z3TNlN$}l;qj10=}du!tIKJs8O+?KMJDoZ+y)Iu`x`yJ@krO zwxETN$i!bz8{!>BKqHpPha{96eriM?mST)_9Aw-1X^7&;Bf=c^?17k)5&s08^E$m^ zRt02U_r!99xfiow-XC~Eo|Yt8t>32z=rv$Z;Ps|^26H73JS1Xle?;-nisDq$K5G3y znR|l8@rlvv^wj%tdgw+}@F#Ju{SkrQdqZ?5zh;}|IPIdhy3ivi0Q41C@4934naAaY z%+otS8%Muvrr{S-Y96G?b2j0ldu1&coOqsq^vfcUT3}#+=#;fii6@M+hDp}dr9A0Y zjbhvqmB03%4jhsZ{_KQfGh5HKm-=dFxN;3tnwBej^uzcVLrrs z>eFP-jb#~LE$qTP9JJ;#$nVOw%&;}y>ezA6&i8S^7YK#w&t4!A36Ub|or)MJT z^GGrzgcnQf6D+!rtfuX|Pna`Kq*ScO#H=de2B7%;t+Ij<>N5@(Psw%>nT4cW338WJ z>TNgQ^!285hS1JoHJcBk;3I8%#(jBmcpEkHkQDk%!4ygr;Q2a%0T==W zT#dDH>hxQx2E8+jE~jFY$FligkN&{vUZeIn*#I_Ca!l&;yf){eghi z>&?fXc-C$z8ab$IYS`7g!2#!3F@!)cUquAGR2oiR0~1pO<$3Y$B_@S2dFwu~B0e4D z6(WiE@O{(!vP<(t{p|S5#r$jl6h;3@+ygrPg|bBDjKgil!@Sq)5;rXNjv#2)N5_nn zuqEURL>(itBYrT&3mu-|q;soBd52?jMT75cvXYR!uFuVP`QMot+Yq?CO%D9$Jv24r zhq1Q5`FD$r9%&}9VlYcqNiw2#=3dZsho0cKKkv$%X&gmVuv&S__zyz@0zmZdZI59~s)1xFs~kZS0C^271hR*O z9nt$5=y0gjEI#S-iV0paHx!|MUNUq&$*zi>DGt<#?;y;Gms|dS{2#wF-S`G3$^$7g z1#@7C65g$=4Ij?|Oz?X4=zF=QfixmicIw{0oDL5N7iY}Q-vcVXdyQNMb>o_?3A?e6 z$4`S_=6ZUf&KbMgpn6Zt>6n~)zxI1>{HSge3uKBiN$01WB9OXscO?jd!)`?y5#%yp zJvgJU0h+|^MdA{!g@E=dJuyHPOh}i&alC+cY*I3rjB<~DgE{`p(FdHuXW;p$a+%5` zo{}x#Ex3{Sp-PPi)N8jGVo{K!$^;z%tVWm?b^oG8M?Djk)L)c{_-`@F|8LNu|BTUp zQY6QJVzVg8S{8{Pe&o}Ux=ITQ6d42;0l}OSEA&Oci$p?-BL187L6rJ>Q)aX0)Wf%T zneJF2;<-V%-VlcA?X03zpf;wI&8z9@Hy0BZm&ac-Gdtgo>}VkZYk##OOD+nVOKLFJ z5hgXAhkIzZtCU%2M#xl=D7EQPwh?^gZ_@0p$HLd*tF>qgA_P*dP;l^cWm&iQSPJZE zBoipodanrwD0}}{H#5o&PpQpCh61auqlckZq2_Eg__8;G-CwyH#h1r0iyD#Hd_$WgM89n+ldz;=b!@pvr4;x zs|YH}rQuCyZO!FWMy%lUyDE*0)(HR}QEYxIXFexCkq7SHmSUQ)2tZM2s`G<9dq;Vc ziNVj5hiDyqET?chgEA*YBzfzYh_RX#0MeD@xco%)ON%6B7E3#3iFBkPK^P_=&8$pf zpM<0>QmE~1FX1>mztm>JkRoosOq8cdJ1gF5?%*zMDak%qubN}SM!dW6fgH<*F>4M7 zX}%^g{>ng^2_xRNGi^a(epr8SPSP>@rg7s=0PO-#5*s}VOH~4GpK9<4;g=+zuJY!& ze_ld=ybcca?dUI-qyq2Mwl~-N%iCGL;LrE<#N}DRbGow7@5wMf&d`kT-m-@geUI&U z0NckZmgse~(#gx;tsChgNd|i1Cz$quL>qLzEO}ndg&Pg4f zy`?VSk9X5&Ab_TyKe=oiIiuNTWCsk6s9Ie2UYyg1y|i}B7h0k2X#YY0CZ;B7!dDg7 z_a#pK*I7#9-$#Iev5BpN@xMq@mx@TH@SoNWc5dv%^8!V}nADI&0K#xu_#y)k%P2m~ zqNqQ{(fj6X8JqMe5%;>MIkUDd#n@J9Dm~7_wC^z-Tcqqnsfz54jPJ1*+^;SjJzJhG zIq!F`Io}+fRD>h#wjL;g+w?Wg`%BZ{f()%Zj)sG8permeL0eQ9vzqcRLyZ?IplqMg zpQaxM11^`|6%3hUE9AiM5V)zWpPJ7nt*^FDga?ZP!U1v1aeYrV2Br|l`J^tgLm;~%gX^2l-L9L`B?UDHE9_+jaMxy|dzBY4 zjsR2rcZ6HbuyyXsDV(K0#%uPd#<^V%@9c7{6Qd_kQEZL&;z_Jf+eabr)NF%@Ulz_a1e(qWqJC$tTC! zwF&P-+~VN1Vt9OPf`H2N{6L@UF@=g+xCC_^^DZ`8jURfhR_yFD7#VFmklCR*&qk;A zzyw8IH~jFm+zGWHM5|EyBI>n3?2vq3W?aKt8bC+K1`YjklQx4*>$GezfU%E|>Or9Y zNRJ@s(>L{WBXdNiJiL|^In*1VA`xiE#D)%V+C;KuoQi{1t3~4*8 z;tbUGJ2@2@$XB?1!U;)MxQ}r67D&C49k{ceku^9NyFuSgc}DC2pD|+S=qLH&L}Vd4 zM=-UK4{?L?xzB@v;qCy}Ib65*jCWUh(FVc&rg|+KnopG`%cb>t;RNv=1%4= z#)@CB7i~$$JDM>q@4ll8{Ja5Rsq0 z$^|nRac)f7oZH^=-VdQldC~E_=5%JRZSm!z8TJocv`w<_e0>^teZ1en^x!yQse%Lf z;JA5?0vUIso|MS03y${dX19A&bU4wXS~*T7h+*4cgSIX11EB?XGiBS39hvWWuyP{!5AY^x5j{!c?z<}7f-kz27%b>llPq%Z7hq+CU|Ev2 z*jh(wt-^7oL`DQ~Zw+GMH}V*ndCc~ zr>WVQHJQ8ZqF^A7sH{N5~PbeDihT$;tUP`OwWn=j6@L+!=T|+ze%YQ zO+|c}I)o_F!T(^YLygYOTxz&PYDh9DDiv_|Ewm~i7|&Ck^$jsv_0n_}q-U5|_1>*L44)nt!W|;4q?n&k#;c4wpSx5atrznZbPc;uQI^I}4h5Fy`9J)l z7yYa7Rg~f@0oMHO;seQl|E@~fd|532lLG#e6n#vXrfdh~?NP){lZ z&3-33d;bUTEAG=!4_{YHd3%GCV=WS|2b)vZgX{JC)?rsljjzWw@Hflbwg3kIs^l%y zm3fVP-55Btz;<-p`X(ohmi@3qgdHmwXfu=gExL!S^ve^MsimP zNCBV>2>=BjLTobY^67f;8mXQ1YbM_NA3R^s z{zhY+5@9iYKMS-)S>zSCQuFl!Sd-f@v%;;*fW5hme#xAvh0QPtJ##}b>&tth$)6!$ z0S&b2OV-SE<|4Vh^8rs*jN;v9aC}S2EiPKo(G&<6C|%$JQ{;JEg-L|Yob*<-`z?AsI(~U(P>cC=1V$OETG$7i# zG#^QwW|HZuf3|X|&86lOm+M+BE>UJJSSAAijknNp*eyLUq=Au z7&aqR(x8h|>`&^n%p#TPcC@8@PG% zM&7k6IT*o-NK61P1XGeq0?{8kA`x;#O+|7`GTcbmyWgf^JvWU8Y?^7hpe^85_VuRq7yS~8uZ=Cf%W^OfwF_cbBhr`TMw^MH0<{3y zU=y;22&oVlrH55eGNvoklhfPM`bPX`|C_q#*etS^O@5PeLk(-DrK`l|P*@#T4(kRZ z`AY7^%&{!mqa5}q%<=x1e29}KZ63=O>89Q)yO4G@0USgbGhR#r~OvWI4+yu4*F8o`f?EG~x zBCEND=ImLu2b(FDF3sOk_|LPL!wrzx_G-?&^EUof1C~A{feam{2&eAf@2GWem7! z|LV-lff1Dk+mvTw@=*8~0@_Xu@?5u?-u*r8E7>_l1JRMpi{9sZqYG+#Ty4%Mo$`ds zsVROZH*QoCErDeU7&=&-ma>IUM|i_Egxp4M^|%^I7ecXzq@K8_oz!}cHK#>&+$E4rs2H8Fyc)@Bva?(KO%+oc!+3G0&Rv1cP)e9u_Y|dXr#!J;n%T4+9rTF>^m_4X3 z(g+$G6Zb@RW*J-IO;HtWHvopoVCr7zm4*h{rX!>cglE`j&;l_m(FTa?hUpgv%LNV9 zkSnUu1TXF3=tX)^}kDZk|AF%7FmLv6sh?XCORzhTU%d>y4cC;4W5mn=i6vLf2 ztbTQ8RM@1gn|y$*jZa8&u?yTOlNo{coXPgc%s;_Y!VJw2Z1bf%57p%kC1*5e{bepl zwm?2YGk~x=#69_Ul8A~(BB}>UP27=M)#aKrxWc-)rLL+97=>x|?}j)_5ewvoAY?P| z{ekQQbmjbGC%E$X*x-M=;Fx}oLHbzyu=Dw>&WtypMHnOc92LSDJ~PL7sU!}sZw`MY z&3jd_wS8>a!si2Y=ijCo(rMnAqq z-o2uzz}Fd5wD%MAMD*Y&=Ct?|B6!f0jfiJt;hvkIyO8me(u=fv_;C;O4X^vbO}R_% zo&Hx7C@EcZ!r%oy}|S-8CvPR?Ns0$j`FtMB;h z`#0Qq)+6Fxx;RCVnhwp`%>0H4hk(>Kd!(Y}>U+Tr_6Yp?W%jt_zdusOcA$pTA z(4l9$K=VXT2ITDs!OcShuUlG=R6#x@t74B2x7Dle%LGwsZrtiqtTuZGFUio_Xwpl} z=T7jdfT~ld#U${?)B67E*mP*E)XebDuMO(=3~Y=}Z}rm;*4f~7ka196QIHj;JK%DU z?AQw4I4ZufG}gmfVQ3w{snkpkgU~Xi;}V~S5j~;No^-9eZEYvA`Et=Q4(5@qcK=Pr zk9mo>v!%S>YD^GQc7t4c!C4*qU76b}r(hJhO*m-s9OcsktiXY#O1<OoH z#J^Y@1A;nRrrxNFh?3t@Hx9d>EZK*kMb-oe`2J!gZ;~I*QJ*f1p93>$lU|4qz!_zH z&mOaj#(^uiFf{*Nq?_4&9ZssrZeCgj1J$1VKn`j+bH%9#C5Q5Z@9LYX1mlm^+jkHf z+CgcdXlX5);Ztq6OT@;UK_zG(M5sv%I`d2(i1)>O`VD|d1_l(_aH(h>c7fP_$LA@d z6Wgm))NkU!v^YaRK_IjQy-_+>f_y(LeS@z+B$5be|FzXqqg}`{eYpO;sXLrU{*fJT zQHUEXoWk%wh%Kal`E~jiu@(Q@&d&dW*!~9;T=gA{{~NJwQvULf;s43Ku#A$NgaR^1 z%U3BNX`J^YE-#2dM*Ov*CzGdP9^`iI&`tmD~Bwqy4*N=DHt%RycykhF* zc7BcXG28Jvv(5G8@-?OATk6|l{Rg1 zwdU2Md1Qv?#$EO3E}zk&9>x1sQiD*sO0dGSUPkCN-gjuppdE*%*d*9tEWyQ%hRp*7 zT`N^=$PSaWD>f;h@$d2Ca7 z8bNsm14sdOS%FQhMn9yC83$ z-YATg3X!>lWbLUU7iNk-`O%W8MrgI03%}@6l$9+}1KJ1cTCiT3>^e}-cTP&aEJcUt zCTh_xG@Oa-v#t_UDKKfd#w0tJfA+Ash!0>X&`&;2%qv$!Gogr4*rfMcKfFl%@{ztA zwoAarl`DEU&W_DUcIq-{xaeRu(ktyQ64-uw?1S*A>7pRHH5_F)_yC+2o@+&APivkn zwxDBp%e=?P?3&tiVQb8pODI}tSU8cke~T#JLAxhyrZ(yx)>fUhig`c`%;#7Ot9le# zSaep4L&sRBd-n&>6=$R4#mU8>T>=pB)feU9;*@j2kyFHIvG`>hWYJ_yqv?Kk2XTw` z42;hd=hm4Iu0h{^M>-&c9zKPtqD>+c$~>k&Wvq#>%FjOyifO%RoFgh*XW$%Hz$y2-W!@W6+rFJja=pw-u_s0O3WMVgLb&CrCQ)8I^6g!iQj%a%#h z<~<0S#^NV4n!@tiKb!OZbkiSPp~31?f9Aj#fosfd*v}j6&7YpRGgQ5hI_eA2m+Je) zT2QkD;A@crBzA>7T zw4o1MZ_d$)puHvFA2J|`IwSXKZyI_iK_}FvkLDaFj^&6}e|5@mrHr^prr{fPVuN1+ z4=9}DkfKLYqUq7Q7@qa$)o6&2)kJx-3|go}k9HCI6ahL?NPA&khLUL}k_;mU&7GcN zNG6(xXW}(+a%IT80=-13-Q~sBo>$F2m`)7~wjW&XKndrz8soC*br=F*A_>Sh_Y}2Mt!#A1~2l?|hj) z9wpN&jISjW)?nl{@t`yuLviwvj)vyZQ4KR#mU-LE)mQ$yThO1oohRv;93oEXE8mYE zXPQSVCK~Lp3hIA_46A{8DdA+rguh@98p?VG2+Nw(4mu=W(sK<#S`IoS9nwuOM}C0) zH9U|6N=BXf!jJ#o;z#6vi=Y3NU5XT>ZNGe^z4u$i&x4ty^Sl;t_#`|^hmur~;r;o- z*CqJb?KWBoT`4`St5}10d*RL?!hm`GaFyxLMJPgbBvjVD??f7GU9*o?4!>NabqqR! z{BGK7%_}96G95B299eErE5_rkGmSWKP~590$HXvsRGJN5-%6d@=~Rs_68BLA1RkZb zD%ccBqGF0oGuZ?jbulkt!M}{S1;9gwAVkgdilT^_AS`w6?UH5Jd=wTUA-d$_O0DuM z|9E9XZFl$tZctd`Bq=OfI(cw4A)|t zl$W~3_RkP zFA6wSu+^efs79KH@)0~c3Dn1nSkNj_s)qBUGs6q?G0vjT&C5Y3ax-seA_+_}m`aj} zvW04)0TSIpqQkD@#NXZBg9z@GK1^ru*aKLrc4{J0PjhNfJT}J;vEeJ1ov?*KVNBy< zXtNIY3TqLZ=o1Byc^wL!1L6#i6n(088T9W<_iu~$S&VWGfmD|wNj?Q?Dnc#6iskoG zt^u26JqFnt=xjS-=|ACC%(=YQh{_alLW1tk;+tz1ujzeQ--lEu)W^Jk>UmHK(H303f}P2i zrsrQ*nEz`&{V!%2O446^8qLR~-Pl;2Y==NYj^B*j1vD}R5plk>%)GZSSjbi|tx>YM zVd@IS7b>&Uy%v==*35wGwIK4^iV{31mc)dS^LnN8j%#M}s%B@$=bPFI_ifcyPd4hilEWm71chIwfIR(-SeQaf20{;EF*(K(Eo+hu{}I zZkjXyF}{(x@Ql~*yig5lAq7%>-O5E++KSzEe(sqiqf1>{Em)pN`wf~WW1PntPpzKX zn;14G3FK7IQf!~n>Y=cd?=jhAw1+bwlVcY_kVuRyf!rSFNmR4fOc(g7(fR{ANvcO< zbG|cnYvKLa>dU(Z9YP796`Au?gz)Ys?w!af`F}1#W>x_O|k9Q z>#<6bKDt3Y}?KT2tmhU>H6Umn}J5M zarILVggiZs=kschc2TKib2`gl^9f|(37W93>80keUkrC3ok1q{;PO6HMbm{cZ^ROcT#tWWsQy?8qKWt<42BGryC(Dx>^ohIa0u7$^)V@Bn17^(VUgBD> zAr*Wl6UwQ&AAP%YZ;q2cZ;@2M(QeYFtW@PZ+mOO5gD1v-JzyE3^zceyE5H?WLW?$4 zhBP*+3i<09M$#XU;jwi7>}kW~v%9agMDM_V1$WlMV|U-Ldmr|<_nz*F_kcgrJnrViguEnJt{=Mk5f4Foin7(3vUXC>4gyJ>sK<;-p{h7 z2_mr&Fca!E^7R6VvodGznqJn3o)Ibd`gk>uKF7aemX*b~Sn#=NYl5j?v*T4FWZF2D zaX(M9hJ2YuEi%b~4?RkJwT*?aCRT@ecBkq$O!i}EJJEw`*++J_a>gsMo0CG^pZ3x+ zdfTSbCgRwtvAhL$p=iIf7%Vyb!j*UJsmOMler--IauWQ;(ddOk+U$WgN-RBle~v9v z9m2~@h|x*3t@m+4{U2}fKzRoVePrF-}U{`YT|vW?~64Bv*7|Dz03 zRYM^Yquhf*ZqkN?+NK4Ffm1;6BR0ZyW3MOFuV1ljP~V(=-tr^Tgu#7$`}nSd<8?cP z`VKtIz5$~InI0YnxAmn|pJZj+nPlI3zWsykXTKRnDCBm~Dy*m^^qTuY+8dSl@>&B8~0H$Y0Zc25APo|?R= z>_#h^kcfs#ae|iNe{BWA7K1mLuM%K!_V?fDyEqLkkT&<`SkEJ;E+Py^%hPVZ(%a2P4vL=vglF|X_`Z$^}q470V+7I4;UYdcZ7vU=41dd{d#KmI+|ZGa>C10g6w1a?wxAc&?iYsEv zuCwWvcw4FoG=Xrq=JNyPG*yIT@xbOeV`$s_kx`pH0DXPf0S7L?F208x4ET~j;yQ2c zhtq=S{T%82U7GxlUUKMf-NiuhHD$5*x{6}}_eZ8_kh}(}BxSPS9<(x2m$Rn0sx>)a zt$+qLRJU}0)5X>PXVxE?Jxpw(kD0W43ctKkj8DjpYq}lFZE98Je+v2t7uxuKV;p0l z5b9smYi5~k2%4aZe+~6HyobTQ@4_z#*lRHl# zSA`s~Jl@RGq=B3SNQF$+puBQv>DaQ--V!alvRSI~ZoOJx3VP4sbk!NdgMNBVbG&BX zdG*@)^g4#M#qoT`^NTR538vx~rdyOZcfzd7GBHl68-rG|fkofiGAXTJx~`~%a&boY zZ#M4sYwHIOnu-Mr!Ltpl8!NrX^p74tq{f_F4%M@&<=le;>xc5pAi&qn4P>04D$fp` z(OuJXQia--?vD0DIE6?HC|+DjH-?Cl|GqRKvs8PSe027_NH=}+8km9Ur8(JrVx@*x z0lHuHd=7*O+&AU_B;k{>hRvV}^Uxl^L1-c-2j4V^TG?2v66BRxd~&-GMfcvKhWgwu z60u{2)M{ZS)r*=&J4%z*rtqs2syPiOQq(`V0UZF)boPOql@E0U39>d>MP=BqFeJzz zh?HDKtY3%mR~reR7S2rsR0aDMA^a|L^_*8XM9KjabpYSBu z;zkfzU~12|X_W_*VNA=e^%Za14PMOC!z`5Xt|Fl$2bP9fz>(|&VJFZ9{z;;eEGhOl zl7OqqDJzvgZvaWc7Nr!5lfl*Qy7_-fy9%f(v#t#&2#9o-ba%J3(%s#C=@dagx*I{d zB&AzGT9EEiknWJU^naNdz7Logo%#OFV!eyCIQuzgpZDDN-1F}JJTdGXiLN85p|GT! zGOfNd8^RD;MsK*^3gatg2#W0J<8j)UCkUYoZRR|R*UibOm-G)S#|(`$hPA7UmH+fT ziZxTgeiR_yzvNS1s+T!xw)QgNSH(_?B@O?uTBwMj`G)2c^8%g8zu zxMu5SrQ^J+K91tkPrP%*nTpyZor#4`)}(T-Y8eLd(|sv8xcIoHnicKyAlQfm1YPyI z!$zimjMlEcmJu?M6z|RtdouAN1U5lKmEWY3gajkPuUHYRvTVeM05CE@`@VZ%dNoZN z>=Y3~f$~Gosud$AN{}!DwV<6CHm3TPU^qcR!_0$cY#S5a+GJU-2I2Dv;ktonSLRRH zALlc(lvX9rm-b5`09uNu904c}sU(hlJZMp@%nvkcgwkT;Kd7-=Z_z9rYH@8V6Assf zKpXju&hT<=x4+tCZ{elYtH+_F$V=tq@-`oC%vdO>0Wmu#w*&?_=LEWRJpW|spYc8V z=$)u#r}Pu7kvjSuM{FSyy9_&851CO^B zTm$`pF+lBWU!q>X#;AO1&=tOt=i!=9BVPC#kPJU}K$pO&8Ads)XOFr336_Iyn z$d{MTGYQLX9;@mdO;_%2Ayw3hv}_$UT00*e{hWxS?r=KT^ymEwBo429b5i}LFmSk` zo)-*bF1g;y@&o=34TW|6jCjUx{55EH&DZ?7wB_EmUg*B4zc6l7x-}qYLQR@^7o6rrgkoujRNym9O)K>wNfvY+uy+4Om{XgRHi#Hpg*bZ36_X%pP`m7FIF z?n?G*g&>kt$>J_PiXIDzgw3IupL3QZbysSzP&}?JQ-6TN-aEYbA$X>=(Zm}0{hm6J zJnqQnEFCZGmT06LAdJ^T#o`&)CA*eIYu?zzDJi#c$1H9zX}hdATSA|zX0Vb^q$mgg z&6kAJ=~gIARct>}4z&kzWWvaD9#1WK=P>A_aQxe#+4cpJtcRvd)TCu! z>eqrt)r(`qYw6JPKRXSU#;zYNB7a@MYoGuAT0Nzxr`>$=vk`uEq2t@k9?jYqg)MXl z67MA3^5_}Ig*mycsGeH0_VtK3bNo;8#0fFQ&qDAj=;lMU9%G)&HL>NO|lWU3z+m4t7 zfV*3gSuZ++rIWsinX@QaT>dsbD>Xp8%8c`HLamm~(i{7L&S0uZ;`W-tqU4XAgQclM$PxE76OH(PSjHjR$(nh({vsNnawhP!!HcP!l)5 zG;C=k0xL<^q+4rpbp{sGzcc~ZfGv9J*k~PPl}e~t$>WPSxzi0}05(D6d<=5+E}Y4e z@_QZtDcC7qh4#dQFYb6Pulf_8iAYYE z1SWJfNe5@auBbE5O=oeO@o*H5mS(pm%$!5yz-71~lEN5=x0eN|V`xAeP;eTje?eC= z53WneK;6n35{OaIH2Oh6Hx)kV-jL-wMzFlynGI8Wk_A<~_|06rKB#Pi_QY2XtIGW_ zYr)RECK_JRzR1tMd(pM(L=F98y~7wd4QBKAmFF(AF(e~+80$GLZpFc;a{kj1h}g4l z3SxIRlV=h%Pl1yRacl^g>9q%>U+`P(J`oh-w8i82mFCn|NJ5oX*^VKODX2>~HLUky z3D(ak0Sj=Kv^&8dUhU(3Ab!U5TIy97PKQ))&`Ml~hik%cHNspUpCn24cqH@dq6ZVo zO9xz!cEMm;NL;#z-tThlFF%=^ukE8S0;hDMR_`rv#eTYg7io1w9n_vJpK+6%=c#Y?wjAs_(#RQA0gr&Va2BQTq` zUc8)wHEDl&Uyo<>-PHksM;b-y(`E_t8Rez@Iw+eogcEI*FDg@Bc;;?3j3&kPsq(mx z+Yr_J#?G6D?t2G%O9o&e7Gbf&>#(-)|8)GIbG_a${TU26cVrIQSt=% zQ~XY-b1VQVc>IV=7um0^Li>dF z`zSm_o*i@ra4B+Tw5jdguVqx`O(f4?_USIMJzLvS$*kvBfEuToq-VR%K*%1VHu=++ zQ`=cG3cCnEv{ZbP-h9qbkF}%qT$j|Z7ZB2?s7nK@gM{bAD=eoDKCCMlm4LG~yre!- zzPP#Rn9ZDUgb4++M78-V&VX<1ah(DN z(4O5b`Fif%*k?L|t%!WY`W$C_C`tzC`tI7XC`->oJs_Ezs=K*O_{*#SgNcvYdmBbG zHd8!UTzGApZC}n7LUp1fe0L<3|B5GdLbxX@{ETeUB2vymJgWP0q2E<&!Dtg4>v`aa zw(QcLoA&eK{6?Rb&6P0kY+YszBLXK49i~F!jr)7|xcnA*mOe1aZgkdmt4{Nq2!!SL z`aD{6M>c00muqJt4$P+RAj*cV^vn99UtJ*s${&agQ;C>;SEM|l%KoH_^kAcmX=%)* zHpByMU_F12iGE#68rHGAHO_ReJ#<2ijo|T7`{PSG)V-bKw}mpTJwtCl%cq2zxB__m zM_p2k8pDmwA*$v@cmm>I)TW|7a7ng*X7afyR1dcuVGl|BQzy$MM+zD{d~n#)9?1qW zdk(th4Ljb-vpv5VUt&9iuQBnQ$JicZ)+HoL`&)B^Jr9F1wvf=*1and~v}3u{+7u7F zf0U`l4Qx-ANfaB3bD1uIeT^zeXerps8nIW(tmIxYSL;5~!&&ZOLVug2j4t7G=zzK+ zmPy5<4h%vq$Fw)i1)ya{D;GyEm3fybsc8$=$`y^bRdmO{XU#95EZ$I$bBg)FW#=}s z@@&c?xwLF3|C7$%>}T7xl0toBc6N^C{!>a8vWc=G!bAFKmn{AKS6RxOWIJBZXP&0CyXAiHd?7R#S46K6UXYXl#c_#APL5SfW<<-|rcfX&B6e*isa|L^RK=0}D`4q-T0VAs0 zToyrF6`_k$UFGAGhY^&gg)(Fq0p%J{h?E)WQ(h@Gy=f6oxUSAuT4ir}jI)36|NnmnI|vtij;t!jT?6Jf-E19}9Lf9(+N+ z)+0)I5mST_?3diP*n2=ZONTYdXkjKsZ%E$jjU@0w_lL+UHJOz|K{{Uh%Zy0dhiqyh zofWXzgRyFzY>zpMC8-L^43>u#+-zlaTMOS(uS!p{Jw#u3_9s)(s)L6j-+`M5sq?f+ zIIcjq$}~j9b`0_hIz~?4?b(Sqdpi(;1=8~wkIABU+APWQdf5v@g=1c{c{d*J(X5+cfEdG?qxq z{GKkF;)8^H&Xdi~fb~hwtJRsfg#tdExEuDRY^x9l6=E+|fxczIW4Z29NS~-oLa$Iq z93;5$(M0N8ba%8&q>vFc=1}a8T?P~_nrL5tYe~X>G=3QoFlBae8vVt-K!^@vusN<8gQJ!WD7H%{*YgY0#(tXxXy##C@o^U7ysxe zLmUWN@4)JBjjZ3G-_)mrA`|NPCc8Oe!%Ios4$HWpBmJse7q?)@Xk%$x&lIY>vX$7L zpfNWlXxy2p7TqW`Wq22}Q3OC2OWTP_X(*#kRx1WPe%}$C!Qn^FvdYmvqgk>^nyk;6 zXv*S#P~NVx1n6pdbXuX9x_}h1SY#3ZyvLZ&VnWVva4)9D|i7kjGY{>am&^ z-_x1UYM1RU#z17=AruK~{BK$A65Sajj_OW|cpYQBGWO*xfGJXSn4E&VMWchq%>0yP z{M2q=zx!VnO71gb8}Al2i+uxb=ffIyx@oso@8Jb88ld6M#wgXd=WcX$q$91o(94Ek zjeBqQ+CZ64hI>sZ@#tjdL}JeJu?GS7N^s$WCIzO`cvj60*d&#&-BQ>+qK#7l+!u1t zBuyL-Cqups?2>)ek2Z|QnAqs_`u1#y8=~Hvsn^2Jtx-O`limc*w;byk^2D-!*zqRi zVcX+4lzwcCgb+(lROWJ~qi;q2!t6;?%qjGcIza=C6{T7q6_?A@qrK#+)+?drrs3U}4Fov+Y}`>M z#40OUPpwpaC-8&q8yW0XWGw`RcSpBX+7hZ@xarfCNnrl-{k@`@Vv> zYWB*T=4hLJ1SObSF_)2AaX*g(#(88~bVG9w)ZE91eIQWflNecYC zzUt}ov<&)S&i$}?LlbIi9i&-g=UUgjWTq*v$!0$;8u&hwL*S^V!GPSpM3PR3Ra5*d z7d77UC4M{#587NcZS4+JN=m#i)7T0`jWQ{HK3rIIlr3cDFt4odV25yu9H1!}BVW-& zrqM5DjDzbd^pE^Q<-$1^_tX)dX8;97ILK{ z!{kF{!h`(`6__+1UD5=8sS&#!R>*KqN9_?(Z$4cY#B)pG8>2pZqI;RiYW6aUt7kk*s^D~Rml_fg$m+4+O5?J&p1)wE zp5L-X(6og1s(?d7X#l-RWO+5Jj(pAS{nz1abM^O;8hb^X4pC7ADpzUlS{F~RUoZp^ zuJCU_fq}V!9;knx^uYD2S9E`RnEsyF^ZO$;`8uWNI%hZzKq=t`q12cKEvQjJ9dww9 zCerpM3n@Ag+XZJztlqHRs!9X(Dv&P;_}zz$N&xwA@~Kfnd3}YiABK*T)Ar2E?OG6V z<;mFs`D?U7>Rradv7(?3oCZZS_0Xr#3NNkpM1@qn-X$;aNLYL;yIMX4uubh^Xb?HloImt$=^s8vm)3g!{H1D|k zmbg_Rr-ypQokGREIcG<8u(=W^+oxelI&t0U`dT=bBMe1fl+9!l&vEPFFu~yAu!XIv4@S{;| z8?%<1@hJp%7AfZPYRARF1hf`cq_VFQ-y74;EdMob{z&qec2hiQJOQa>f-?Iz^VXOr z-wnfu*uT$(5WmLsGsVkHULPBvTRy0H(}S0SQ18W0kp_U}8Phc3gz!Hj#*VYh$AiDE245!YA0M$Q@rM zT;}1DQ}MxV<)*j{hknSHyihgMPCK=H)b-iz9N~KT%<&Qmjf39L@&7b;;>9nQkDax- zk%7ZMA%o41l#(G5K=k{D{80E@P|I;aufYpOlIJXv!dS+T^plIVpPeZ)Gp`vo+?BWt z8U8u=C51u%>yDCWt>`VGkE5~2dD4y_8+n_+I9mFN(4jHJ&x!+l*>%}b4Z>z#(tb~< z+<+X~GIi`sDb=SI-7m>*krlqE3aQD?D5WiYX;#8m|ENYKw}H^95u!=n=xr3jxhCB&InJ7>zgLJg;i?Sjjd`YW!2; z%+y=LwB+MMnSGF@iu#I%!mvt)aXzQ*NW$cHNHwjoaLtqKCHqB}LW^ozBX?`D4&h%# zeMZ3ZumBn}5y9&odo3=hN$Q&SRte*^-SNZg2<}6>OzRpF91oy0{RuZU(Q0I zvx%|9>;)-Ca9#L)HQt~axu0q{745Ac;s1XQKV ze3D9I5gV5SP-J>&3U!lg1`HN>n5B6XxYpwhL^t0Z)4$`YK93vTd^7BD%<)cIm|4e!;*%9}B-3NX+J*Nr@;5(27Zmf(TmfHsej^Bz+J1 zXKIjJ)H{thL4WOuro|6&aPw=-JW8G=2 z|L4YL)^rYf7J7DOKXpTX$4$Y{-2B!jT4y^w8yh3LKRKO3-4DOshFk}N^^Q{r(0K0+ z?7w}x>(s{Diq6K)8sy)>%*g&{u>)l+-Lg~=gteW?pE`B@FE`N!F-+aE;XhjF+2|RV z8vV2((yeA-VDO;3=^E;fhW~b=Wd5r8otQrO{Vu)M1{j(+?+^q%xpYCojc6rmQ<&ytZ2ly?bw*X)WB8(n^B4Gmxr^1bQ&=m;I4O$g{ z3m|M{tmkOyAPnMHu(Z}Q1X1GM|A+)VDP3Fz934zSl)z>N|D^`G-+>Mej|VcK+?iew zQ3=DH4zz;i>z{Yv_l@j*?{936kxM{c7eK$1cf8wxL>>O#`+vsu*KR)te$adfTD*w( zAStXnZk<6N3V-Vs#GB%vXZat+(EFWbkbky#{yGY`rOvN)?{5qUuFv=r=dyYZrULf%MppWuNRUWc z8|YaIn}P0DGkwSZ(njAO$Zhr3Yw`3O1A+&F*2UjO{0`P%kK(qL;kEkfjRC=lxPRjL z{{4PO3-*5RZ_B3LUB&?ZpJ4nk1E4L&eT~HX0Jo(|uGQCW3utB@p)rF@W*n$==TlS zKiTfzhrLbAeRqru%D;fUwXOUcHud{pw@Ib1xxQ}<2)?KC&%y5PVef<7rcu2l!8dsy z?lvdaHJ#s$0m18y{x#fB$o=l)-sV?Qya5GWf#8Vd{~Grn@qgX#!EI`Y>++l%1A;eL z{_7t6jMeEr@a+oxyCL^+_}9Qc;i0&Xd%LXp?to*R|26LKHG(m0)*QF4*h;5%YG5<9)c> z1vq!7bIJSv1^27i-mcH!zX>ep3Iw0^{nx<1jOy)N_UoFD8v}x~2mEWapI3m~kMQkR z#&@4FuEGBn`mgtSx6jeY7vUQNf=^}sTZErIEpH!cy|@7Z zU4h_Oxxd2s=f{}$XXy4}%JqTSjRC \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG="`dirname "$PRG"`/$link" - fi - done - - saveddir=`pwd` - - M2_HOME=`dirname "$PRG"`/.. - - # make it fully qualified - M2_HOME=`cd "$M2_HOME" && pwd` - - cd "$saveddir" - # echo Using m2 at $M2_HOME -fi - -# For Cygwin, ensure paths are in UNIX format before anything is touched -if $cygwin ; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --unix "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --unix "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --unix "$CLASSPATH"` -fi - -# For Mingw, ensure paths are in UNIX format before anything is touched -if $mingw ; then - [ -n "$M2_HOME" ] && - M2_HOME="`(cd "$M2_HOME"; pwd)`" - [ -n "$JAVA_HOME" ] && - JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" - # TODO classpath? -fi - -if [ -z "$JAVA_HOME" ]; then - javaExecutable="`which javac`" - if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then - # readlink(1) is not available as standard on Solaris 10. - readLink=`which readlink` - if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then - if $darwin ; then - javaHome="`dirname \"$javaExecutable\"`" - javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" - else - javaExecutable="`readlink -f \"$javaExecutable\"`" - fi - javaHome="`dirname \"$javaExecutable\"`" - javaHome=`expr "$javaHome" : '\(.*\)/bin'` - JAVA_HOME="$javaHome" - export JAVA_HOME - fi - fi -fi - -if [ -z "$JAVACMD" ] ; then - if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - else - JAVACMD="`which java`" - fi -fi - -if [ ! -x "$JAVACMD" ] ; then - echo "Error: JAVA_HOME is not defined correctly." >&2 - echo " We cannot execute $JAVACMD" >&2 - exit 1 -fi - -if [ -z "$JAVA_HOME" ] ; then - echo "Warning: JAVA_HOME environment variable is not set." -fi - -CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher - -# traverses directory structure from process work directory to filesystem root -# first directory with .mvn subdirectory is considered project base directory -find_maven_basedir() { - - if [ -z "$1" ] - then - echo "Path not specified to find_maven_basedir" - return 1 - fi - - basedir="$1" - wdir="$1" - while [ "$wdir" != '/' ] ; do - if [ -d "$wdir"/.mvn ] ; then - basedir=$wdir - break - fi - # workaround for JBEAP-8937 (on Solaris 10/Sparc) - if [ -d "${wdir}" ]; then - wdir=`cd "$wdir/.."; pwd` - fi - # end of workaround - done - echo "${basedir}" -} - -# concatenates all lines of a file -concat_lines() { - if [ -f "$1" ]; then - echo "$(tr -s '\n' ' ' < "$1")" - fi -} - -BASE_DIR=`find_maven_basedir "$(pwd)"` -if [ -z "$BASE_DIR" ]; then - exit 1; -fi - -########################################################################################## -# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -# This allows using the maven wrapper in projects that prohibit checking in binary data. -########################################################################################## -if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found .mvn/wrapper/maven-wrapper.jar" - fi -else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." - fi - jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" - while IFS="=" read key value; do - case "$key" in (wrapperUrl) jarUrl="$value"; break ;; - esac - done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" - if [ "$MVNW_VERBOSE" = true ]; then - echo "Downloading from: $jarUrl" - fi - wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" - - if command -v wget > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found wget ... using wget" - fi - wget "$jarUrl" -O "$wrapperJarPath" - elif command -v curl > /dev/null; then - if [ "$MVNW_VERBOSE" = true ]; then - echo "Found curl ... using curl" - fi - curl -o "$wrapperJarPath" "$jarUrl" - else - if [ "$MVNW_VERBOSE" = true ]; then - echo "Falling back to using Java to download" - fi - javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" - if [ -e "$javaClass" ]; then - if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Compiling MavenWrapperDownloader.java ..." - fi - # Compiling the Java class - ("$JAVA_HOME/bin/javac" "$javaClass") - fi - if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then - # Running the downloader - if [ "$MVNW_VERBOSE" = true ]; then - echo " - Running MavenWrapperDownloader.java ..." - fi - ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") - fi - fi - fi -fi -########################################################################################## -# End of extension -########################################################################################## - -export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} -if [ "$MVNW_VERBOSE" = true ]; then - echo $MAVEN_PROJECTBASEDIR -fi -MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" - -# For Cygwin, switch paths to Windows format before running java -if $cygwin; then - [ -n "$M2_HOME" ] && - M2_HOME=`cygpath --path --windows "$M2_HOME"` - [ -n "$JAVA_HOME" ] && - JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` - [ -n "$CLASSPATH" ] && - CLASSPATH=`cygpath --path --windows "$CLASSPATH"` - [ -n "$MAVEN_PROJECTBASEDIR" ] && - MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` -fi - -WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -exec "$JAVACMD" \ - $MAVEN_OPTS \ - -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ - "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ - ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/persistence-modules/spring-boot-jdbi/mvnw.cmd b/persistence-modules/spring-boot-jdbi/mvnw.cmd deleted file mode 100644 index fef5a8f7f9..0000000000 --- a/persistence-modules/spring-boot-jdbi/mvnw.cmd +++ /dev/null @@ -1,161 +0,0 @@ -@REM ---------------------------------------------------------------------------- -@REM Licensed to the Apache Software Foundation (ASF) under one -@REM or more contributor license agreements. See the NOTICE file -@REM distributed with this work for additional information -@REM regarding copyright ownership. The ASF licenses this file -@REM to you under the Apache License, Version 2.0 (the -@REM "License"); you may not use this file except in compliance -@REM with the License. You may obtain a copy of the License at -@REM -@REM https://www.apache.org/licenses/LICENSE-2.0 -@REM -@REM Unless required by applicable law or agreed to in writing, -@REM software distributed under the License is distributed on an -@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -@REM KIND, either express or implied. See the License for the -@REM specific language governing permissions and limitations -@REM under the License. -@REM ---------------------------------------------------------------------------- - -@REM ---------------------------------------------------------------------------- -@REM Maven2 Start Up Batch script -@REM -@REM Required ENV vars: -@REM JAVA_HOME - location of a JDK home dir -@REM -@REM Optional ENV vars -@REM M2_HOME - location of maven2's installed home dir -@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands -@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending -@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven -@REM e.g. to debug Maven itself, use -@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files -@REM ---------------------------------------------------------------------------- - -@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' -@echo off -@REM set title of command window -title %0 -@REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' -@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% - -@REM set %HOME% to equivalent of $HOME -if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") - -@REM Execute a user defined script before this one -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre -@REM check for pre script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" -if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" -:skipRcPre - -@setlocal - -set ERROR_CODE=0 - -@REM To isolate internal variables from possible post scripts, we use another setlocal -@setlocal - -@REM ==== START VALIDATION ==== -if not "%JAVA_HOME%" == "" goto OkJHome - -echo. -echo Error: JAVA_HOME not found in your environment. >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -:OkJHome -if exist "%JAVA_HOME%\bin\java.exe" goto init - -echo. -echo Error: JAVA_HOME is set to an invalid directory. >&2 -echo JAVA_HOME = "%JAVA_HOME%" >&2 -echo Please set the JAVA_HOME variable in your environment to match the >&2 -echo location of your Java installation. >&2 -echo. -goto error - -@REM ==== END VALIDATION ==== - -:init - -@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". -@REM Fallback to current working directory if not found. - -set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% -IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir - -set EXEC_DIR=%CD% -set WDIR=%EXEC_DIR% -:findBaseDir -IF EXIST "%WDIR%"\.mvn goto baseDirFound -cd .. -IF "%WDIR%"=="%CD%" goto baseDirNotFound -set WDIR=%CD% -goto findBaseDir - -:baseDirFound -set MAVEN_PROJECTBASEDIR=%WDIR% -cd "%EXEC_DIR%" -goto endDetectBaseDir - -:baseDirNotFound -set MAVEN_PROJECTBASEDIR=%EXEC_DIR% -cd "%EXEC_DIR%" - -:endDetectBaseDir - -IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig - -@setlocal EnableExtensions EnableDelayedExpansion -for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a -@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% - -:endReadAdditionalConfig - -SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" -set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" -set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain - -set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.4.2/maven-wrapper-0.4.2.jar" -FOR /F "tokens=1,2 delims==" %%A IN (%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties) DO ( - IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B -) - -@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central -@REM This allows using the maven wrapper in projects that prohibit checking in binary data. -if exist %WRAPPER_JAR% ( - echo Found %WRAPPER_JAR% -) else ( - echo Couldn't find %WRAPPER_JAR%, downloading it ... - echo Downloading from: %DOWNLOAD_URL% - powershell -Command "(New-Object Net.WebClient).DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')" - echo Finished downloading %WRAPPER_JAR% -) -@REM End of extension - -%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* -if ERRORLEVEL 1 goto error -goto end - -:error -set ERROR_CODE=1 - -:end -@endlocal & set ERROR_CODE=%ERROR_CODE% - -if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost -@REM check for post script, once with legacy .bat ending and once with .cmd ending -if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" -if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" -:skipRcPost - -@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' -if "%MAVEN_BATCH_PAUSE%" == "on" pause - -if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% - -exit /B %ERROR_CODE% From 31be377141a553037013dbe23e701d3878f6b0aa Mon Sep 17 00:00:00 2001 From: Nikunj Gandhi Date: Sun, 15 Sep 2019 13:17:48 -0400 Subject: [PATCH 202/396] BAEL-3214 | Java FileWriter class code - 2 --- .../filewriter/FileWriterExample.java | 37 ++++++ .../filewriter/FileWriterExampleTest.java | 122 ------------------ .../filewriter/FileWriterExampleUnitTest.java | 57 ++++++++ 3 files changed, 94 insertions(+), 122 deletions(-) create mode 100644 core-java-modules/core-java-io-2/src/main/java/com/baeldung/filewriter/FileWriterExample.java delete mode 100644 core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java create mode 100644 core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java diff --git a/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filewriter/FileWriterExample.java b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filewriter/FileWriterExample.java new file mode 100644 index 0000000000..d60f0800ec --- /dev/null +++ b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filewriter/FileWriterExample.java @@ -0,0 +1,37 @@ +package com.baeldung.filewriter; + +import java.io.BufferedWriter; +import java.io.FileWriter; +import java.io.IOException; +import java.util.List; + +public class FileWriterExample { + + public void writeString(String fileName, String strToWrite) throws IOException { + try (FileWriter fileWriter = new FileWriter(fileName)) { + fileWriter.write(strToWrite); + } + } + + public void appendString(String fileName, String stringToAppend) throws IOException { + try (FileWriter fileWriter = new FileWriter(fileName, true)) { + fileWriter.append(stringToAppend); + } + } + + public void writeCharArray(String fileName, char[] charArrToWrite) throws IOException { + try (FileWriter fileWriter = new FileWriter(fileName)) { + fileWriter.write(charArrToWrite); + } + } + + public void writeWithBufferedWriter(String fileName, List stringsToWrite) throws IOException { + try (FileWriter fileWriter = new FileWriter(fileName); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) { + for (String stringToWrite : stringsToWrite) { + bufferedWriter.write(stringToWrite); + } + } + + } + +} diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java deleted file mode 100644 index 2147bd5ef2..0000000000 --- a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleTest.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.baeldung.filewriter; - -import static org.junit.Assert.assertEquals; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.FileWriter; -import java.io.IOException; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; - -import org.junit.After; -import org.junit.Test; - -public class FileWriterExampleTest { - - @After - public void tearDown() throws IOException { - Files.delete(Path.of("src/test/resources/FileWriterTest.txt")); - } - - @Test - public void testFileWriter_Constructor_With_FileName() throws IOException { - try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { - fileWriter.write("Hello Folks!"); - } - - assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - } - - @Test - public void testFileWriter_Constructor_With_FileName_And_Charset() throws IOException { - try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", Charset.forName("US-ASCII"))) { - fileWriter.write("Hello Folks! Let us learn the Façade design pattern"); - } - - System.out.println(new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - assertEquals("Hello Folks! Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - } - - @Test - public void testFileWriter_Constructor_With_FileName_And_AppendFlag() throws IOException { - try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { - fileWriter.write("Hello Folks!"); - } - - try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", true)) { - fileWriter.write("Let us learn the Façade design pattern"); - } - - assertEquals("Hello Folks!Let us learn the Façade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - } - - @Test - public void testFileWriter_Constructor_With_FileName_And_Charset_And_AppendFlag() throws IOException { - try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", Charset.forName("US-ASCII"))) { - fileWriter.write("Hello Folks!"); - } - - try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", Charset.forName("US-ASCII"), true)) { - fileWriter.write("Let us learn the Façade design pattern"); - } - - assertEquals("Hello Folks!Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - } - - @Test - public void testFileWriter_Constructor_With_File() throws IOException { - try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"))) { - fileWriter.write("Hello Folks!"); - } - - assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - } - - @Test - public void testFileWriter_Constructor_With_File_And_Charset() throws IOException { - try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), Charset.forName("US-ASCII"))) { - fileWriter.write("Hello Folks!Let us learn the Façade design pattern"); - } - - assertEquals("Hello Folks!Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - } - - @Test - public void testFileWriter_Constructor_With_File_And_AppendFlag() throws IOException { - try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"))) { - fileWriter.write("Hello Folks!"); - } - - try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), true)) { - fileWriter.write("Let us learn the Façade design pattern"); - } - - assertEquals("Hello Folks!Let us learn the Façade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - } - - @Test - public void testFileWriter_Constructor_With_File_And_Charset_And_AppendFlag() throws IOException { - try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), Charset.forName("US-ASCII"))) { - fileWriter.write("Hello Folks!"); - } - - try (FileWriter fileWriter = new FileWriter(new File("src/test/resources/FileWriterTest.txt"), Charset.forName("US-ASCII"), true)) { - fileWriter.write("Let us learn the Façade design pattern"); - } - - assertEquals("Hello Folks!Let us learn the Fa?ade design pattern", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - } - - @Test - public void testFileWriter_Constructor_With_FileDescriptor() throws FileNotFoundException, IOException { - try (FileOutputStream fos = new FileOutputStream(new File("src/test/resources/FileWriterTest.txt")); FileWriter fileWriter = new FileWriter(fos.getFD())) { - fileWriter.write("Hello Folks!"); - } - - assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); - } - -} diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java new file mode 100644 index 0000000000..a1fdb5459e --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java @@ -0,0 +1,57 @@ +package com.baeldung.filewriter; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.stream.IntStream; + +import org.junit.After; +import org.junit.Assert; +import org.junit.Test; + +public class FileWriterExampleUnitTest { + + private static final String FILE_NAME = "src/test/resources/FileWriterTest.txt"; + private static final String STRING_TO_WRITE = "Hello Folks!"; + private static final String STRING_TO_APPEND = "Hello Folks Again!"; + private static final char[] CHAR_ARRAY_TO_WRITE = STRING_TO_WRITE.toCharArray(); + + private FileWriterExample fileWriterExample = new FileWriterExample(); + + @After + public void tearDown() throws IOException { + Files.delete(Path.of(FILE_NAME)); + } + + @Test + public void testWriteString() throws IOException { + fileWriterExample.writeString(FILE_NAME, STRING_TO_WRITE); + Assert.assertEquals(STRING_TO_WRITE, new String(Files.readAllBytes(Path.of(FILE_NAME)))); + } + + @Test + public void testAppendString() throws IOException { + fileWriterExample.writeString(FILE_NAME, STRING_TO_WRITE); + fileWriterExample.appendString(FILE_NAME, STRING_TO_APPEND); + Assert.assertEquals(STRING_TO_WRITE + STRING_TO_APPEND, new String(Files.readAllBytes(Path.of(FILE_NAME)))); + } + + @Test + public void testWriteCharArray() throws IOException { + fileWriterExample.writeCharArray(FILE_NAME, CHAR_ARRAY_TO_WRITE); + Assert.assertEquals(STRING_TO_WRITE, new String(Files.readAllBytes(Path.of(FILE_NAME)))); + } + + @Test + public void testWriteWithBufferedWriter() throws IOException{ + final List stringsToWrite = new ArrayList<>(); + for(int i=0 ; i < 10000;i++) { + stringsToWrite.add("Random string "+i); + } + fileWriterExample.writeWithBufferedWriter(FILE_NAME, stringsToWrite); + Assert.assertNotNull(new String(Files.readAllBytes(Path.of(FILE_NAME)))); + } +} From 6ee7181125bba706b79b12db41c276e4286274dd Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Mon, 16 Sep 2019 14:32:40 +0530 Subject: [PATCH 203/396] [BAEL-16630] - Split or move algorithms-miscellaneous-1 module (#7699) * [BAEL-16630] - Split or move algorithms-miscellaneous-1 module * [BAEL-16630] - Removed .gitignore file and changed all links to https --- algorithms-miscellaneous-1/.gitignore | 4 -- algorithms-miscellaneous-1/README.md | 23 +++------ algorithms-miscellaneous-4/README.md | 9 ++++ algorithms-miscellaneous-4/pom.xml | 51 +++++++++++++++++++ .../MiddleElementLookup.java | 0 .../algorithms/middleelementlookup/Node.java | 0 .../algorithms/multiswarm/Constants.java | 0 .../multiswarm/FitnessFunction.java | 0 .../algorithms/multiswarm/Multiswarm.java | 0 .../algorithms/multiswarm/Particle.java | 0 .../baeldung/algorithms/multiswarm/Swarm.java | 0 .../algorithms/permutation/Permutation.java | 0 .../string/EnglishAlphabetLetters.java | 0 ...ongestSubstringNonRepeatingCharacters.java | 0 .../string/SubstringPalindrome.java | 0 .../string/search/StringSearchAlgorithms.java | 0 .../src/main/resources/logback.xml | 13 +++++ .../MiddleElementLookupUnitTest.java | 0 .../StringSearchAlgorithmsUnitTest.java | 0 .../multiswarm/LolFitnessFunction.java | 0 .../multiswarm/MultiswarmUnitTest.java | 0 .../EnglishAlphabetLettersUnitTest.java | 0 ...bstringNonRepeatingCharactersUnitTest.java | 0 .../string/SubstringPalindromeUnitTest.java | 0 .../algorithms/support/MayFailRule.java | 0 pom.xml | 2 + 26 files changed, 82 insertions(+), 20 deletions(-) delete mode 100644 algorithms-miscellaneous-1/.gitignore create mode 100644 algorithms-miscellaneous-4/README.md create mode 100644 algorithms-miscellaneous-4/pom.xml rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/permutation/Permutation.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java (100%) create mode 100644 algorithms-miscellaneous-4/src/main/resources/logback.xml rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java (100%) rename {algorithms-miscellaneous-1 => algorithms-miscellaneous-4}/src/test/java/com/baeldung/algorithms/support/MayFailRule.java (100%) diff --git a/algorithms-miscellaneous-1/.gitignore b/algorithms-miscellaneous-1/.gitignore deleted file mode 100644 index 30b2b7442c..0000000000 --- a/algorithms-miscellaneous-1/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/target/ -.settings/ -.classpath -.project \ No newline at end of file diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md index 479c2792f6..57f5a5d478 100644 --- a/algorithms-miscellaneous-1/README.md +++ b/algorithms-miscellaneous-1/README.md @@ -1,18 +1,9 @@ ## Relevant articles: -- [Validating Input With Finite Automata in Java](http://www.baeldung.com/java-finite-automata) -- [Example of Hill Climbing Algorithm](http://www.baeldung.com/java-hill-climbing-algorithm) -- [Monte Carlo Tree Search for Tic-Tac-Toe Game](http://www.baeldung.com/java-monte-carlo-tree-search) -- [Binary Search Algorithm in Java](http://www.baeldung.com/java-binary-search) -- [Introduction to Minimax Algorithm](http://www.baeldung.com/java-minimax-algorithm) -- [How to Calculate Levenshtein Distance in Java?](http://www.baeldung.com/java-levenshtein-distance) -- [How to Find the Kth Largest Element in Java](http://www.baeldung.com/java-kth-largest-element) -- [Multi-Swarm Optimization Algorithm in Java](http://www.baeldung.com/java-multi-swarm-algorithm) -- [String Search Algorithms for Large Texts](http://www.baeldung.com/java-full-text-search-algorithms) -- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters) -- [Find the Middle Element of a Linked List](http://www.baeldung.com/java-linked-list-middle-element) -- [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial) -- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings) -- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters) -- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations) -- [Generate Combinations in Java](https://www.baeldung.com/java-combinations-algorithm) +- [Validating Input With Finite Automata in Java](https://www.baeldung.com/java-finite-automata) +- [Example of Hill Climbing Algorithm](https://www.baeldung.com/java-hill-climbing-algorithm) +- [Monte Carlo Tree Search for Tic-Tac-Toe Game](https://www.baeldung.com/java-monte-carlo-tree-search) +- [Binary Search Algorithm in Java](https://www.baeldung.com/java-binary-search) +- [Introduction to Minimax Algorithm](https://www.baeldung.com/java-minimax-algorithm) +- [How to Calculate Levenshtein Distance in Java?](https://www.baeldung.com/java-levenshtein-distance) +- [How to Find the Kth Largest Element in Java](https://www.baeldung.com/java-kth-largest-element) \ No newline at end of file diff --git a/algorithms-miscellaneous-4/README.md b/algorithms-miscellaneous-4/README.md new file mode 100644 index 0000000000..fabb4d29b8 --- /dev/null +++ b/algorithms-miscellaneous-4/README.md @@ -0,0 +1,9 @@ +## Relevant articles: + +- [Multi-Swarm Optimization Algorithm in Java](https://www.baeldung.com/java-multi-swarm-algorithm) +- [String Search Algorithms for Large Texts](https://www.baeldung.com/java-full-text-search-algorithms) +- [Check If a String Contains All The Letters of The Alphabet](https://www.baeldung.com/java-string-contains-all-letters) +- [Find the Middle Element of a Linked List](https://www.baeldung.com/java-linked-list-middle-element) +- [Find Substrings That Are Palindromes in Java](https://www.baeldung.com/java-palindrome-substrings) +- [Find the Longest Substring without Repeating Characters](https://www.baeldung.com/java-longest-substring-without-repeated-characters) +- [Permutations of an Array in Java](https://www.baeldung.com/java-array-permutations) \ No newline at end of file diff --git a/algorithms-miscellaneous-4/pom.xml b/algorithms-miscellaneous-4/pom.xml new file mode 100644 index 0000000000..8fd8f807ba --- /dev/null +++ b/algorithms-miscellaneous-4/pom.xml @@ -0,0 +1,51 @@ + + 4.0.0 + algorithms-miscellaneous-4 + 0.0.1-SNAPSHOT + algorithms-miscellaneous-4 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + com.google.guava + guava + ${guava.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + org.assertj + assertj-core + ${org.assertj.core.version} + test + + + + + + + + org.codehaus.mojo + exec-maven-plugin + ${exec-maven-plugin.version} + + + + + + + 3.9.0 + 27.0.1-jre + + + \ No newline at end of file diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/MiddleElementLookup.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/middleelementlookup/Node.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Constants.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/FitnessFunction.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Multiswarm.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Particle.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/multiswarm/Swarm.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/permutation/Permutation.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/permutation/Permutation.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/EnglishAlphabetLetters.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java b/algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java similarity index 100% rename from algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java rename to algorithms-miscellaneous-4/src/main/java/com/baeldung/algorithms/string/search/StringSearchAlgorithms.java diff --git a/algorithms-miscellaneous-4/src/main/resources/logback.xml b/algorithms-miscellaneous-4/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/algorithms-miscellaneous-4/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/MiddleElementLookupUnitTest.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/StringSearchAlgorithmsUnitTest.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/LolFitnessFunction.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/multiswarm/MultiswarmUnitTest.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/EnglishAlphabetLettersUnitTest.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/support/MayFailRule.java b/algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/support/MayFailRule.java rename to algorithms-miscellaneous-4/src/test/java/com/baeldung/algorithms/support/MayFailRule.java diff --git a/pom.xml b/pom.xml index c3f3a62da1..133ab7dfbe 100644 --- a/pom.xml +++ b/pom.xml @@ -339,6 +339,7 @@ algorithms-miscellaneous-1 algorithms-miscellaneous-2 algorithms-miscellaneous-3 + algorithms-miscellaneous-4 algorithms-miscellaneous-5 algorithms-sorting animal-sniffer-mvn-plugin @@ -1073,6 +1074,7 @@ algorithms-miscellaneous-1 algorithms-miscellaneous-2 algorithms-miscellaneous-3 + algorithms-miscellaneous-4 algorithms-miscellaneous-5 algorithms-sorting animal-sniffer-mvn-plugin From 8d6c2dc2ed835cf5275fbae269017560fb819e91 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Mon, 16 Sep 2019 11:00:12 +0100 Subject: [PATCH 204/396] =?UTF-8?q?[BAEL-16662]=20Move=20articles=20out=20?= =?UTF-8?q?of=20spring-core=20and=20into=20spring-di=20and=20=E2=80=A6=20(?= =?UTF-8?q?#7750)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * [BAEL-16662] Move articles out of spring-core and into spring-di and spring-core-2 * [BAEL-16662] Fixed required config classes * [BAEL-16662] - Removed unused dependencies from spring-core --- spring-core-2/README.md | 3 + spring-core-2/pom.xml | 5 ++ .../com/baeldung/beanfactory/Employee.java | 0 .../com/baeldung/collection/BaeldungBean.java | 0 .../baeldung/collection/CollectionConfig.java | 0 .../collection/CollectionInjectionDemo.java | 0 .../baeldung/collection/CollectionsBean.java | 0 .../factorybean/FactoryBeanAppConfig.java | 0 .../factorybean/NonSingleToolFactory.java | 0 .../java/com/baeldung/factorybean/README.md | 0 .../factorybean/SingleToolFactory.java | 0 .../java/com/baeldung/factorybean/Tool.java | 0 .../com/baeldung/factorybean/ToolFactory.java | 0 ...yWithClassPathResourceIntegrationTest.java | 0 .../java/com/baeldung/beanfactory/README.md | 0 .../AbstractFactoryBeanIntegrationTest.java | 0 .../FactoryBeanJavaConfigIntegrationTest.java | 0 .../FactoryBeanXmlConfigIntegrationTest.java | 0 spring-core/README.md | 12 +-- ...pplicationContextTestResourceNameType.java | 0 ...plicationContextTestResourceQualifier.java | 0 spring-di/README.md | 8 ++ spring-di/pom.xml | 78 ++++++++++++++++--- .../CircularDependencyA.java | 0 .../CircularDependencyB.java | 0 .../com/baeldung/constructordi/Config.java | 0 .../baeldung/constructordi/SpringRunner.java | 62 +++++++-------- .../baeldung/constructordi/domain/Car.java | 42 +++++----- .../baeldung/constructordi/domain/Engine.java | 0 .../constructordi/domain/Transmission.java | 0 .../AnotherArbitraryDependency.java | 0 .../dependency/ArbitraryDependency.java | 0 .../YetAnotherArbitraryDependency.java | 0 .../exception/app/PurchaseDeptService.java | 0 .../SpringDependenciesExampleApplication.java | 0 .../exception/repository/DressRepository.java | 0 .../repository/InventoryRepository.java | 0 .../exception/repository/ShoeRepository.java | 0 .../ArticleFormatter.java | 0 .../ArticleWithConstructorInjection.java | 0 .../ArticleWithSetterInjection.java | 0 .../TextFormatter.java | 0 .../annotation/CarQualifier.java | 0 .../app/CustomConfiguration.java | 0 .../dependencyinjectiontypes/model/Car.java | 0 .../model/CarHandler.java | 0 .../model/Motorcycle.java | 0 .../model/Vehicle.java | 0 .../baeldung/dependson/DriverApplication.java | 0 .../com/baeldung/dependson/config/Config.java | 0 .../file/processor/FileProcessor.java | 0 .../dependson/file/reader/FileReader.java | 0 .../dependson/file/writer/FileWriter.java | 0 .../com/baeldung/dependson/shared/File.java | 0 .../java/com/baeldung/di/spring/Account.java | 54 ++++++------- .../baeldung/di/spring/AccountService.java | 10 +-- .../di/spring/AccountServiceImpl.java | 16 ++-- .../baeldung/di/spring/AudioBookService.java | 0 .../di/spring/AudioBookServiceImpl.java | 0 .../com/baeldung/di/spring/AuthorService.java | 0 .../baeldung/di/spring/AuthorServiceImpl.java | 0 .../com/baeldung/di/spring/BookService.java | 10 +-- .../baeldung/di/spring/BookServiceImpl.java | 20 ++--- .../main/java/com/baeldung/di/spring/Foo.java | 8 +- .../com/baeldung/di/spring/FooProcessor.java | 10 +-- .../java/com/baeldung/di/spring/IService.java | 10 +-- .../java/com/baeldung/di/spring/IndexApp.java | 38 ++++----- .../com/baeldung/di/spring/IndexService.java | 20 ++--- .../di/spring/InstanceServiceFactory.java | 28 +++---- .../com/baeldung/di/spring/MessageApp.java | 28 +++---- .../baeldung/di/spring/MessageService.java | 32 ++++---- .../com/baeldung/di/spring/PersonDao.java | 0 .../com/baeldung/di/spring/PersonDaoImpl.java | 0 .../baeldung/di/spring/SpringBeansConfig.java | 0 .../baeldung/di/spring/SpringMainConfig.java | 36 ++++----- .../di/spring/SpringPersonService.java | 0 .../di/spring/StaticServiceFactory.java | 28 +++---- .../com/baeldung/di/spring/UserService.java | 40 +++++----- .../baeldung/methodinjections/AppConfig.java | 10 +++ .../com/baeldung/methodinjections/Grader.java | 19 +++++ .../methodinjections/SchoolNotification.java | 45 +++++++++++ .../baeldung/methodinjections/Student.java | 27 +++++++ .../methodinjections/StudentServices.java | 21 +++++ .../{org => com}/baeldung/sample/App.java | 2 +- .../baeldung/sample/AppConfig.java | 2 +- .../main/java/com/baeldung/sample/Bar.java | 5 ++ .../baeldung/sample/BarFormatter.java | 2 +- .../main/java/com/baeldung/sample/Foo.java | 5 ++ .../main/java/com/baeldung/sample/FooDAO.java | 5 ++ .../baeldung/sample/FooFormatter.java | 2 +- .../baeldung/sample/FooService.java | 2 +- .../baeldung/sample/Formatter.java | 2 +- .../baeldung/sample/FormatterType.java | 2 +- .../main/java/org/baeldung/sample/Bar.java | 5 -- .../main/java/org/baeldung/sample/Foo.java | 5 -- .../main/java/org/baeldung/sample/FooDAO.java | 5 -- .../src/main/resources/application.properties | 2 + spring-di/src/main/resources/baeldung.xml | 20 +++++ .../resources/beaninjectiontypes-context.xml | 22 ++++++ spring-di/src/main/resources/beans.xml | 15 ++++ ...classpathxmlapplicationcontext-example.xml | 18 +++++ ...pplicationcontext-internationalization.xml | 14 ++++ .../com.baeldung.di.spring.properties | 1 + .../main/resources/com.baeldung.di.spring.xml | 43 ++++++++++ .../src/main/resources/constructordi.xml | 22 ++++++ .../dependencyinjectiontypes-context.xml | 23 ++++++ .../resources/dialog/dialog_en.properties | 3 + .../resources/dialog/dialog_zh_CN.properties | 3 + .../factorybean-abstract-spring-ctx.xml | 15 ++++ .../main/resources/factorybean-spring-ctx.xml | 10 +++ .../src/main/resources/injectiontypes.xml | 15 ++++ spring-di/src/main/resources/logback.xml | 13 ++++ spring-di/src/main/resources/setterdi.xml | 24 ++++++ .../FieldAutowiredIntegrationTest.java | 0 .../FieldAutowiredNameIntegrationTest.java | 0 ...ieldQualifierAutowiredIntegrationTest.java | 0 .../CircularDependencyIntegrationTest.java | 0 .../circulardependency/TestConfig.java | 0 .../ApplicationContextTestAutowiredName.java | 0 ...licationContextTestAutowiredQualifier.java | 0 .../ApplicationContextTestAutowiredType.java | 0 .../ApplicationContextTestInjectName.java | 0 ...ApplicationContextTestInjectQualifier.java | 0 .../ApplicationContextTestInjectType.java | 0 ...torDependencyInjectionIntegrationTest.java | 0 .../DependencyInjectionIntegrationTest.java | 0 .../baeldung/dependson/config/TestConfig.java | 0 .../FileProcessorIntegrationTest.java | 0 .../spring/BeanInjectionIntegrationTest.java | 62 +++++++-------- .../baeldung/di/spring/SpringUnitTest.java | 0 .../FieldByNameInjectIntegrationTest.java | 0 .../inject/FieldInjectIntegrationTest.java | 0 .../FieldQualifierInjectIntegrationTest.java | 0 .../StudentIntegrationTest.java | 0 .../sample/FooServiceIntegrationTest.java | 2 +- .../test/resources/beanfactory-example.xml | 13 ++++ .../src/test/resources/data/employees.dat | 1 + spring-di/src/test/resources/input.txt | 1 + spring-di/src/test/resources/output.txt | 1 + 139 files changed, 787 insertions(+), 320 deletions(-) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/beanfactory/Employee.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/collection/BaeldungBean.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/collection/CollectionConfig.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/collection/CollectionsBean.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/factorybean/README.md (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/factorybean/SingleToolFactory.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/factorybean/Tool.java (100%) rename {spring-core => spring-core-2}/src/main/java/com/baeldung/factorybean/ToolFactory.java (100%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java (100%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/beanfactory/README.md (100%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java (100%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java (100%) rename {spring-core => spring-core-2}/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java (100%) rename spring-core/src/{main => test}/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java (100%) rename spring-core/src/{main => test}/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/constructordi/Config.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/constructordi/SpringRunner.java (96%) rename {spring-core => spring-di}/src/main/java/com/baeldung/constructordi/domain/Car.java (96%) rename {spring-core => spring-di}/src/main/java/com/baeldung/constructordi/domain/Engine.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/constructordi/domain/Transmission.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependency/ArbitraryDependency.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependency/exception/app/SpringDependenciesExampleApplication.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependency/exception/repository/InventoryRepository.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleFormatter.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithConstructorInjection.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithSetterInjection.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/TextFormatter.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/annotation/CarQualifier.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/app/CustomConfiguration.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/model/Car.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/model/CarHandler.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/model/Motorcycle.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependencyinjectiontypes/model/Vehicle.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependson/DriverApplication.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependson/config/Config.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependson/file/processor/FileProcessor.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependson/file/reader/FileReader.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependson/file/writer/FileWriter.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/dependson/shared/File.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/Account.java (94%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/AccountService.java (93%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java (95%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/AudioBookService.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/AudioBookServiceImpl.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/AuthorService.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/AuthorServiceImpl.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/BookService.java (93%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/BookServiceImpl.java (95%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/Foo.java (93%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/FooProcessor.java (94%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/IService.java (94%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/IndexApp.java (94%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/IndexService.java (94%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java (96%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/MessageApp.java (94%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/MessageService.java (94%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/PersonDao.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/PersonDaoImpl.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/SpringBeansConfig.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/SpringMainConfig.java (96%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/SpringPersonService.java (100%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java (96%) rename {spring-core => spring-di}/src/main/java/com/baeldung/di/spring/UserService.java (95%) create mode 100644 spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java create mode 100644 spring-di/src/main/java/com/baeldung/methodinjections/Grader.java create mode 100644 spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java create mode 100644 spring-di/src/main/java/com/baeldung/methodinjections/Student.java create mode 100644 spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java rename spring-di/src/main/java/{org => com}/baeldung/sample/App.java (92%) rename spring-di/src/main/java/{org => com}/baeldung/sample/AppConfig.java (87%) create mode 100644 spring-di/src/main/java/com/baeldung/sample/Bar.java rename spring-di/src/main/java/{org => com}/baeldung/sample/BarFormatter.java (86%) create mode 100644 spring-di/src/main/java/com/baeldung/sample/Foo.java create mode 100644 spring-di/src/main/java/com/baeldung/sample/FooDAO.java rename spring-di/src/main/java/{org => com}/baeldung/sample/FooFormatter.java (86%) rename spring-di/src/main/java/{org => com}/baeldung/sample/FooService.java (91%) rename spring-di/src/main/java/{org => com}/baeldung/sample/Formatter.java (65%) rename spring-di/src/main/java/{org => com}/baeldung/sample/FormatterType.java (93%) delete mode 100644 spring-di/src/main/java/org/baeldung/sample/Bar.java delete mode 100644 spring-di/src/main/java/org/baeldung/sample/Foo.java delete mode 100644 spring-di/src/main/java/org/baeldung/sample/FooDAO.java create mode 100644 spring-di/src/main/resources/application.properties create mode 100644 spring-di/src/main/resources/baeldung.xml create mode 100644 spring-di/src/main/resources/beaninjectiontypes-context.xml create mode 100644 spring-di/src/main/resources/beans.xml create mode 100644 spring-di/src/main/resources/classpathxmlapplicationcontext-example.xml create mode 100644 spring-di/src/main/resources/classpathxmlapplicationcontext-internationalization.xml create mode 100644 spring-di/src/main/resources/com.baeldung.di.spring.properties create mode 100644 spring-di/src/main/resources/com.baeldung.di.spring.xml create mode 100644 spring-di/src/main/resources/constructordi.xml create mode 100644 spring-di/src/main/resources/dependencyinjectiontypes-context.xml create mode 100644 spring-di/src/main/resources/dialog/dialog_en.properties create mode 100644 spring-di/src/main/resources/dialog/dialog_zh_CN.properties create mode 100644 spring-di/src/main/resources/factorybean-abstract-spring-ctx.xml create mode 100644 spring-di/src/main/resources/factorybean-spring-ctx.xml create mode 100644 spring-di/src/main/resources/injectiontypes.xml create mode 100644 spring-di/src/main/resources/logback.xml create mode 100644 spring-di/src/main/resources/setterdi.xml rename {spring-core => spring-di}/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/circulardependency/TestConfig.java (100%) rename {spring-core/src/main => spring-di/src/test}/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java (100%) rename {spring-core/src/main => spring-di/src/test}/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java (100%) rename {spring-core/src/main => spring-di/src/test}/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java (100%) rename {spring-core/src/main => spring-di/src/test}/java/com/baeldung/configuration/ApplicationContextTestInjectName.java (100%) rename {spring-core/src/main => spring-di/src/test}/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java (100%) rename {spring-core/src/main => spring-di/src/test}/java/com/baeldung/configuration/ApplicationContextTestInjectType.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/dependencyinjectiontypes/DependencyInjectionIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/dependson/config/TestConfig.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/dependson/processor/FileProcessorIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java (96%) rename {spring-core => spring-di}/src/test/java/com/baeldung/di/spring/SpringUnitTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java (100%) rename {spring-core => spring-di}/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java (100%) rename spring-di/src/test/java/{org => com}/baeldung/sample/FooServiceIntegrationTest.java (96%) create mode 100644 spring-di/src/test/resources/beanfactory-example.xml create mode 100644 spring-di/src/test/resources/data/employees.dat create mode 100644 spring-di/src/test/resources/input.txt create mode 100644 spring-di/src/test/resources/output.txt diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 4c9e3b9ddf..113bbe9c83 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -1,3 +1,6 @@ ## Relevant Articles: - [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean) +- [Exploring the Spring BeanFactory API](http://www.baeldung.com/spring-beanfactory) +- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) +- [Spring – Injecting Collections](http://www.baeldung.com/spring-injecting-collections) diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index d68beda64a..c9334e3d38 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -14,6 +14,11 @@ + + org.springframework + spring-test + ${spring.version} + org.springframework spring-beans diff --git a/spring-core/src/main/java/com/baeldung/beanfactory/Employee.java b/spring-core-2/src/main/java/com/baeldung/beanfactory/Employee.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/beanfactory/Employee.java rename to spring-core-2/src/main/java/com/baeldung/beanfactory/Employee.java diff --git a/spring-core/src/main/java/com/baeldung/collection/BaeldungBean.java b/spring-core-2/src/main/java/com/baeldung/collection/BaeldungBean.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/collection/BaeldungBean.java rename to spring-core-2/src/main/java/com/baeldung/collection/BaeldungBean.java diff --git a/spring-core/src/main/java/com/baeldung/collection/CollectionConfig.java b/spring-core-2/src/main/java/com/baeldung/collection/CollectionConfig.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/collection/CollectionConfig.java rename to spring-core-2/src/main/java/com/baeldung/collection/CollectionConfig.java diff --git a/spring-core/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java b/spring-core-2/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java rename to spring-core-2/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java diff --git a/spring-core/src/main/java/com/baeldung/collection/CollectionsBean.java b/spring-core-2/src/main/java/com/baeldung/collection/CollectionsBean.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/collection/CollectionsBean.java rename to spring-core-2/src/main/java/com/baeldung/collection/CollectionsBean.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java b/spring-core-2/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java b/spring-core-2/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/README.md b/spring-core-2/src/main/java/com/baeldung/factorybean/README.md similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/README.md rename to spring-core-2/src/main/java/com/baeldung/factorybean/README.md diff --git a/spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java b/spring-core-2/src/main/java/com/baeldung/factorybean/SingleToolFactory.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/SingleToolFactory.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/SingleToolFactory.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/Tool.java b/spring-core-2/src/main/java/com/baeldung/factorybean/Tool.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/Tool.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/Tool.java diff --git a/spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java b/spring-core-2/src/main/java/com/baeldung/factorybean/ToolFactory.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/factorybean/ToolFactory.java rename to spring-core-2/src/main/java/com/baeldung/factorybean/ToolFactory.java diff --git a/spring-core/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/beanfactory/README.md b/spring-core-2/src/test/java/com/baeldung/beanfactory/README.md similarity index 100% rename from spring-core/src/test/java/com/baeldung/beanfactory/README.md rename to spring-core-2/src/test/java/com/baeldung/beanfactory/README.md diff --git a/spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java b/spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java rename to spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java diff --git a/spring-core/README.md b/spring-core/README.md index 111b034bef..3ff3f1ea41 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -1,22 +1,12 @@ ### Relevant Articles: - [Wiring in Spring: @Autowired, @Resource and @Inject](http://www.baeldung.com/spring-annotations-resource-inject-autowire) -- [Exploring the Spring BeanFactory API](http://www.baeldung.com/spring-beanfactory) -- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) -- [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) - [Constructor Injection in Spring with Lombok](http://www.baeldung.com/spring-injection-lombok) - [Introduction to Spring’s StreamUtils](http://www.baeldung.com/spring-stream-utils) - [XML-Based Injection in Spring](http://www.baeldung.com/spring-xml-injection) - [A Quick Guide to the Spring @Lazy Annotation](http://www.baeldung.com/spring-lazy-annotation) -- [Injecting Prototype Beans into a Singleton Instance in Spring](http://www.baeldung.com/spring-inject-prototype-bean-into-singleton) -- [@Lookup Annotation in Spring](http://www.baeldung.com/spring-lookup) - [BeanNameAware and BeanFactoryAware Interfaces in Spring](http://www.baeldung.com/spring-bean-name-factory-aware) -- [Spring – Injecting Collections](http://www.baeldung.com/spring-injecting-collections) - [Access a File from the Classpath in a Spring Application](http://www.baeldung.com/spring-classpath-file-access) -- [Controlling Bean Creation Order with @DependsOn Annotation](http://www.baeldung.com/spring-depends-on) -- [Spring Autowiring of Generic Types](https://www.baeldung.com/spring-autowire-generics) - [Spring Application Context Events](https://www.baeldung.com/spring-context-events) -- [Unsatisfied Dependency in Spring](https://www.baeldung.com/spring-unsatisfied-dependency) - [What is a Spring Bean?](https://www.baeldung.com/spring-bean) - [Spring PostConstruct and PreDestroy Annotations](https://www.baeldung.com/spring-postconstruct-predestroy) -- [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection) -- [Circular Dependencies in Spring](http://www.baeldung.com/circular-dependencies-in-spring) + diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java b/spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java rename to spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceNameType.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java b/spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java rename to spring-core/src/test/java/com/baeldung/configuration/ApplicationContextTestResourceQualifier.java diff --git a/spring-di/README.md b/spring-di/README.md index a61ebe5127..59651751ee 100644 --- a/spring-di/README.md +++ b/spring-di/README.md @@ -1,3 +1,11 @@ ### Relevant Articles - [The Spring @Qualifier Annotation](https://www.baeldung.com/spring-qualifier-annotation) +- [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) +- [Spring Autowiring of Generic Types](https://www.baeldung.com/spring-autowire-generics) +- [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection) +- [Injecting Prototype Beans into a Singleton Instance in Spring](http://www.baeldung.com/spring-inject-prototype-bean-into-singleton) +- [@Lookup Annotation in Spring](http://www.baeldung.com/spring-lookup) +- [Controlling Bean Creation Order with @DependsOn Annotation](http://www.baeldung.com/spring-depends-on) +- [Unsatisfied Dependency in Spring](https://www.baeldung.com/spring-unsatisfied-dependency) +- [Circular Dependencies in Spring](http://www.baeldung.com/circular-dependencies-in-spring) diff --git a/spring-di/pom.xml b/spring-di/pom.xml index f3ad380778..53a4ae58c6 100644 --- a/spring-di/pom.xml +++ b/spring-di/pom.xml @@ -9,18 +9,70 @@ spring-di - parent-boot-2 com.baeldung + parent-spring-5 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-spring-5 - + + org.springframework + spring-test + ${spring.version} + + + org.springframework + spring-beans + ${spring.version} + org.springframework spring-context + ${spring.version} + + javax.inject + javax.inject + ${javax.inject.version} + + + com.google.guava + guava + ${guava.version} + + + org.projectlombok + lombok + ${lombok.version} + + + org.springframework.boot + spring-boot-starter + ${spring-boot.version} + + + org.springframework.boot + spring-boot-test + ${mockito.spring.boot.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + commons-io + commons-io + ${commons.io.version} + + + + + + javax.annotation @@ -28,12 +80,12 @@ ${annotation-api.version} - - - org.springframework - spring-test - test - + + + + + + @@ -97,6 +149,14 @@ 5.0.6.RELEASE 1.3.2 + + 1.4.4.RELEASE + 1 + 20.0 + 2.5 + 1.5.2.RELEASE + 1.10.19 + 3.12.2 \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java b/spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java rename to spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyA.java diff --git a/spring-core/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java b/spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java rename to spring-di/src/main/java/com/baeldung/circulardependency/CircularDependencyB.java diff --git a/spring-core/src/main/java/com/baeldung/constructordi/Config.java b/spring-di/src/main/java/com/baeldung/constructordi/Config.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/constructordi/Config.java rename to spring-di/src/main/java/com/baeldung/constructordi/Config.java diff --git a/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java b/spring-di/src/main/java/com/baeldung/constructordi/SpringRunner.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java rename to spring-di/src/main/java/com/baeldung/constructordi/SpringRunner.java index bffd35ec59..abbe97a4bd 100644 --- a/spring-core/src/main/java/com/baeldung/constructordi/SpringRunner.java +++ b/spring-di/src/main/java/com/baeldung/constructordi/SpringRunner.java @@ -1,31 +1,31 @@ -package com.baeldung.constructordi; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import com.baeldung.constructordi.domain.Car; - -public class SpringRunner { - public static void main(String[] args) { - Car toyota = getCarFromXml(); - - System.out.println(toyota); - - toyota = getCarFromJavaConfig(); - - System.out.println(toyota); - } - - private static Car getCarFromJavaConfig() { - ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); - - return context.getBean(Car.class); - } - - private static Car getCarFromXml() { - ApplicationContext context = new ClassPathXmlApplicationContext("constructordi.xml"); - - return context.getBean(Car.class); - } -} +package com.baeldung.constructordi; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import com.baeldung.constructordi.domain.Car; + +public class SpringRunner { + public static void main(String[] args) { + Car toyota = getCarFromXml(); + + System.out.println(toyota); + + toyota = getCarFromJavaConfig(); + + System.out.println(toyota); + } + + private static Car getCarFromJavaConfig() { + ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); + + return context.getBean(Car.class); + } + + private static Car getCarFromXml() { + ApplicationContext context = new ClassPathXmlApplicationContext("constructordi.xml"); + + return context.getBean(Car.class); + } +} diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java b/spring-di/src/main/java/com/baeldung/constructordi/domain/Car.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java rename to spring-di/src/main/java/com/baeldung/constructordi/domain/Car.java index 5c9467fdf4..9f68ba5cd9 100644 --- a/spring-core/src/main/java/com/baeldung/constructordi/domain/Car.java +++ b/spring-di/src/main/java/com/baeldung/constructordi/domain/Car.java @@ -1,21 +1,21 @@ -package com.baeldung.constructordi.domain; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class Car { - private Engine engine; - private Transmission transmission; - - @Autowired - public Car(Engine engine, Transmission transmission) { - this.engine = engine; - this.transmission = transmission; - } - - @Override - public String toString() { - return String.format("Engine: %s Transmission: %s", engine, transmission); - } -} +package com.baeldung.constructordi.domain; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class Car { + private Engine engine; + private Transmission transmission; + + @Autowired + public Car(Engine engine, Transmission transmission) { + this.engine = engine; + this.transmission = transmission; + } + + @Override + public String toString() { + return String.format("Engine: %s Transmission: %s", engine, transmission); + } +} diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Engine.java b/spring-di/src/main/java/com/baeldung/constructordi/domain/Engine.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/constructordi/domain/Engine.java rename to spring-di/src/main/java/com/baeldung/constructordi/domain/Engine.java diff --git a/spring-core/src/main/java/com/baeldung/constructordi/domain/Transmission.java b/spring-di/src/main/java/com/baeldung/constructordi/domain/Transmission.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/constructordi/domain/Transmission.java rename to spring-di/src/main/java/com/baeldung/constructordi/domain/Transmission.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java b/spring-di/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java rename to spring-di/src/main/java/com/baeldung/dependency/AnotherArbitraryDependency.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/ArbitraryDependency.java b/spring-di/src/main/java/com/baeldung/dependency/ArbitraryDependency.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/ArbitraryDependency.java rename to spring-di/src/main/java/com/baeldung/dependency/ArbitraryDependency.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java b/spring-di/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java rename to spring-di/src/main/java/com/baeldung/dependency/YetAnotherArbitraryDependency.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java b/spring-di/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/app/PurchaseDeptService.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/app/SpringDependenciesExampleApplication.java b/spring-di/src/main/java/com/baeldung/dependency/exception/app/SpringDependenciesExampleApplication.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/app/SpringDependenciesExampleApplication.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/app/SpringDependenciesExampleApplication.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java b/spring-di/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/repository/DressRepository.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/InventoryRepository.java b/spring-di/src/main/java/com/baeldung/dependency/exception/repository/InventoryRepository.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/repository/InventoryRepository.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/repository/InventoryRepository.java diff --git a/spring-core/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java b/spring-di/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java rename to spring-di/src/main/java/com/baeldung/dependency/exception/repository/ShoeRepository.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleFormatter.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleFormatter.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleFormatter.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleFormatter.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithConstructorInjection.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithConstructorInjection.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithConstructorInjection.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithConstructorInjection.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithSetterInjection.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithSetterInjection.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithSetterInjection.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/ArticleWithSetterInjection.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/TextFormatter.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/TextFormatter.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/TextFormatter.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/TextFormatter.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/annotation/CarQualifier.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/annotation/CarQualifier.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/annotation/CarQualifier.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/annotation/CarQualifier.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/app/CustomConfiguration.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/app/CustomConfiguration.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/app/CustomConfiguration.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/app/CustomConfiguration.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Car.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Car.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Car.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Car.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/CarHandler.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/CarHandler.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/CarHandler.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/CarHandler.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Motorcycle.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Motorcycle.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Motorcycle.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Motorcycle.java diff --git a/spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Vehicle.java b/spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Vehicle.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependencyinjectiontypes/model/Vehicle.java rename to spring-di/src/main/java/com/baeldung/dependencyinjectiontypes/model/Vehicle.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/DriverApplication.java b/spring-di/src/main/java/com/baeldung/dependson/DriverApplication.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/DriverApplication.java rename to spring-di/src/main/java/com/baeldung/dependson/DriverApplication.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/config/Config.java b/spring-di/src/main/java/com/baeldung/dependson/config/Config.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/config/Config.java rename to spring-di/src/main/java/com/baeldung/dependson/config/Config.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/file/processor/FileProcessor.java b/spring-di/src/main/java/com/baeldung/dependson/file/processor/FileProcessor.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/file/processor/FileProcessor.java rename to spring-di/src/main/java/com/baeldung/dependson/file/processor/FileProcessor.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/file/reader/FileReader.java b/spring-di/src/main/java/com/baeldung/dependson/file/reader/FileReader.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/file/reader/FileReader.java rename to spring-di/src/main/java/com/baeldung/dependson/file/reader/FileReader.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/file/writer/FileWriter.java b/spring-di/src/main/java/com/baeldung/dependson/file/writer/FileWriter.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/file/writer/FileWriter.java rename to spring-di/src/main/java/com/baeldung/dependson/file/writer/FileWriter.java diff --git a/spring-core/src/main/java/com/baeldung/dependson/shared/File.java b/spring-di/src/main/java/com/baeldung/dependson/shared/File.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/dependson/shared/File.java rename to spring-di/src/main/java/com/baeldung/dependson/shared/File.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/Account.java b/spring-di/src/main/java/com/baeldung/di/spring/Account.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/Account.java rename to spring-di/src/main/java/com/baeldung/di/spring/Account.java index 6d9883bda5..e34f2864e5 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/Account.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/Account.java @@ -1,27 +1,27 @@ -package com.baeldung.di.spring; - -import org.springframework.stereotype.Component; - -@Component -public class Account { - - private String accountNumber; - private String type; - - public String getAccountNumber() { - return accountNumber; - } - - public void setAccountNumber(String accountNumber) { - this.accountNumber = accountNumber; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - -} +package com.baeldung.di.spring; + +import org.springframework.stereotype.Component; + +@Component +public class Account { + + private String accountNumber; + private String type; + + public String getAccountNumber() { + return accountNumber; + } + + public void setAccountNumber(String accountNumber) { + this.accountNumber = accountNumber; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AccountService.java b/spring-di/src/main/java/com/baeldung/di/spring/AccountService.java similarity index 93% rename from spring-core/src/main/java/com/baeldung/di/spring/AccountService.java rename to spring-di/src/main/java/com/baeldung/di/spring/AccountService.java index 75ba6bb3eb..388c8c03db 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/AccountService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/AccountService.java @@ -1,5 +1,5 @@ -package com.baeldung.di.spring; - -public interface AccountService { - -} +package com.baeldung.di.spring; + +public interface AccountService { + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java similarity index 95% rename from spring-core/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java index 4a4baf7d92..6a3e4619f3 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/AccountServiceImpl.java @@ -1,8 +1,8 @@ -package com.baeldung.di.spring; - -import org.springframework.stereotype.Component; - -@Component -public class AccountServiceImpl implements AccountService { - -} +package com.baeldung.di.spring; + +import org.springframework.stereotype.Component; + +@Component +public class AccountServiceImpl implements AccountService { + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AudioBookService.java b/spring-di/src/main/java/com/baeldung/di/spring/AudioBookService.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/AudioBookService.java rename to spring-di/src/main/java/com/baeldung/di/spring/AudioBookService.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AudioBookServiceImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/AudioBookServiceImpl.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/AudioBookServiceImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/AudioBookServiceImpl.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AuthorService.java b/spring-di/src/main/java/com/baeldung/di/spring/AuthorService.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/AuthorService.java rename to spring-di/src/main/java/com/baeldung/di/spring/AuthorService.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/AuthorServiceImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/AuthorServiceImpl.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/AuthorServiceImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/AuthorServiceImpl.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/BookService.java b/spring-di/src/main/java/com/baeldung/di/spring/BookService.java similarity index 93% rename from spring-core/src/main/java/com/baeldung/di/spring/BookService.java rename to spring-di/src/main/java/com/baeldung/di/spring/BookService.java index 8e693e687d..6b25137ced 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/BookService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/BookService.java @@ -1,5 +1,5 @@ -package com.baeldung.di.spring; - -public interface BookService { - -} +package com.baeldung.di.spring; + +public interface BookService { + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/BookServiceImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/BookServiceImpl.java similarity index 95% rename from spring-core/src/main/java/com/baeldung/di/spring/BookServiceImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/BookServiceImpl.java index b4ea602234..7cbb7e9b89 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/BookServiceImpl.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/BookServiceImpl.java @@ -1,10 +1,10 @@ -package com.baeldung.di.spring; - -import org.springframework.beans.factory.annotation.Autowired; - -public class BookServiceImpl implements BookService { - - @Autowired(required = false) - private AuthorService authorService; - -} +package com.baeldung.di.spring; + +import org.springframework.beans.factory.annotation.Autowired; + +public class BookServiceImpl implements BookService { + + @Autowired(required = false) + private AuthorService authorService; + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/Foo.java b/spring-di/src/main/java/com/baeldung/di/spring/Foo.java similarity index 93% rename from spring-core/src/main/java/com/baeldung/di/spring/Foo.java rename to spring-di/src/main/java/com/baeldung/di/spring/Foo.java index 9d9b5d0888..6b2ba9b602 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/Foo.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/Foo.java @@ -1,4 +1,4 @@ -package com.baeldung.di.spring; - -public class Foo { -} +package com.baeldung.di.spring; + +public class Foo { +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/FooProcessor.java b/spring-di/src/main/java/com/baeldung/di/spring/FooProcessor.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/FooProcessor.java rename to spring-di/src/main/java/com/baeldung/di/spring/FooProcessor.java index 9baaaef7a3..74f4d3a92b 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/FooProcessor.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/FooProcessor.java @@ -1,6 +1,6 @@ -package com.baeldung.di.spring; - -public class FooProcessor { - - private Foo foo; +package com.baeldung.di.spring; + +public class FooProcessor { + + private Foo foo; } \ No newline at end of file diff --git a/spring-core/src/main/java/com/baeldung/di/spring/IService.java b/spring-di/src/main/java/com/baeldung/di/spring/IService.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/IService.java rename to spring-di/src/main/java/com/baeldung/di/spring/IService.java index 478eea0657..8c27f91589 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/IService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/IService.java @@ -1,5 +1,5 @@ -package com.baeldung.di.spring; - -public interface IService { - public String serve(); -} +package com.baeldung.di.spring; + +public interface IService { + public String serve(); +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/IndexApp.java b/spring-di/src/main/java/com/baeldung/di/spring/IndexApp.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/IndexApp.java rename to spring-di/src/main/java/com/baeldung/di/spring/IndexApp.java index a45970d6b2..d3ca2158cd 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/IndexApp.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/IndexApp.java @@ -1,19 +1,19 @@ -package com.baeldung.di.spring; - -public class IndexApp { - - private IService service; - - public String getServiceValue() { - return service.serve(); - } - - public IService getService() { - return service; - } - - public void setService(IService service) { - this.service = service; - } - -} +package com.baeldung.di.spring; + +public class IndexApp { + + private IService service; + + public String getServiceValue() { + return service.serve(); + } + + public IService getService() { + return service; + } + + public void setService(IService service) { + this.service = service; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/IndexService.java b/spring-di/src/main/java/com/baeldung/di/spring/IndexService.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/IndexService.java rename to spring-di/src/main/java/com/baeldung/di/spring/IndexService.java index ad241f5200..cbd4c28f3c 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/IndexService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/IndexService.java @@ -1,10 +1,10 @@ -package com.baeldung.di.spring; - -public class IndexService implements IService { - - @Override - public String serve() { - return "Hello World"; - } - -} +package com.baeldung.di.spring; + +public class IndexService implements IService { + + @Override + public String serve() { + return "Hello World"; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java b/spring-di/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java rename to spring-di/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java index f083504e8f..2cc7ff65ae 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/InstanceServiceFactory.java @@ -1,14 +1,14 @@ -package com.baeldung.di.spring; - -public class InstanceServiceFactory { - public IService getService(int number) { - switch (number) { - case 1: - return new MessageService("Foo"); - case 0: - return new IndexService(); - default: - throw new IllegalArgumentException("Unknown parameter " + number); - } - } -} +package com.baeldung.di.spring; + +public class InstanceServiceFactory { + public IService getService(int number) { + switch (number) { + case 1: + return new MessageService("Foo"); + case 0: + return new IndexService(); + default: + throw new IllegalArgumentException("Unknown parameter " + number); + } + } +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/MessageApp.java b/spring-di/src/main/java/com/baeldung/di/spring/MessageApp.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/MessageApp.java rename to spring-di/src/main/java/com/baeldung/di/spring/MessageApp.java index 1bf6c20b28..bb8188853a 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/MessageApp.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/MessageApp.java @@ -1,14 +1,14 @@ -package com.baeldung.di.spring; - -public class MessageApp { - - private IService iService; - - public MessageApp(IService iService) { - this.iService = iService; - } - - public String getServiceValue() { - return iService.serve(); - } -} +package com.baeldung.di.spring; + +public class MessageApp { + + private IService iService; + + public MessageApp(IService iService) { + this.iService = iService; + } + + public String getServiceValue() { + return iService.serve(); + } +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/MessageService.java b/spring-di/src/main/java/com/baeldung/di/spring/MessageService.java similarity index 94% rename from spring-core/src/main/java/com/baeldung/di/spring/MessageService.java rename to spring-di/src/main/java/com/baeldung/di/spring/MessageService.java index 9b6efaab2a..1bb548bdf6 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/MessageService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/MessageService.java @@ -1,16 +1,16 @@ -package com.baeldung.di.spring; - -public class MessageService implements IService { - - private String message; - - public MessageService(String message) { - this.message = message; - } - - @Override - public String serve() { - return message; - } - -} +package com.baeldung.di.spring; + +public class MessageService implements IService { + + private String message; + + public MessageService(String message) { + this.message = message; + } + + @Override + public String serve() { + return message; + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/PersonDao.java b/spring-di/src/main/java/com/baeldung/di/spring/PersonDao.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/PersonDao.java rename to spring-di/src/main/java/com/baeldung/di/spring/PersonDao.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/PersonDaoImpl.java b/spring-di/src/main/java/com/baeldung/di/spring/PersonDaoImpl.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/PersonDaoImpl.java rename to spring-di/src/main/java/com/baeldung/di/spring/PersonDaoImpl.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/SpringBeansConfig.java b/spring-di/src/main/java/com/baeldung/di/spring/SpringBeansConfig.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/SpringBeansConfig.java rename to spring-di/src/main/java/com/baeldung/di/spring/SpringBeansConfig.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/SpringMainConfig.java b/spring-di/src/main/java/com/baeldung/di/spring/SpringMainConfig.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/di/spring/SpringMainConfig.java rename to spring-di/src/main/java/com/baeldung/di/spring/SpringMainConfig.java index 75066fd539..374a7e8e32 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/SpringMainConfig.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/SpringMainConfig.java @@ -1,18 +1,18 @@ -package com.baeldung.di.spring; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Import; - -@Configuration -@Import({ SpringBeansConfig.class }) -@ComponentScan("com.baeldung.di.spring") -public class SpringMainConfig { - - @Bean - public BookService bookServiceGenerator() { - return new BookServiceImpl(); - } - -} +package com.baeldung.di.spring; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +@Configuration +@Import({ SpringBeansConfig.class }) +@ComponentScan("com.baeldung.di.spring") +public class SpringMainConfig { + + @Bean + public BookService bookServiceGenerator() { + return new BookServiceImpl(); + } + +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/SpringPersonService.java b/spring-di/src/main/java/com/baeldung/di/spring/SpringPersonService.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/di/spring/SpringPersonService.java rename to spring-di/src/main/java/com/baeldung/di/spring/SpringPersonService.java diff --git a/spring-core/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java b/spring-di/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java similarity index 96% rename from spring-core/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java rename to spring-di/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java index bd70898faf..6ef4c5e9ac 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/StaticServiceFactory.java @@ -1,14 +1,14 @@ -package com.baeldung.di.spring; - -public class StaticServiceFactory { - public static IService getService(int number) { - switch (number) { - case 1: - return new MessageService("Foo"); - case 0: - return new IndexService(); - default: - throw new IllegalArgumentException("Unknown parameter " + number); - } - } -} +package com.baeldung.di.spring; + +public class StaticServiceFactory { + public static IService getService(int number) { + switch (number) { + case 1: + return new MessageService("Foo"); + case 0: + return new IndexService(); + default: + throw new IllegalArgumentException("Unknown parameter " + number); + } + } +} diff --git a/spring-core/src/main/java/com/baeldung/di/spring/UserService.java b/spring-di/src/main/java/com/baeldung/di/spring/UserService.java similarity index 95% rename from spring-core/src/main/java/com/baeldung/di/spring/UserService.java rename to spring-di/src/main/java/com/baeldung/di/spring/UserService.java index 330d7f7448..5ff35cda95 100644 --- a/spring-core/src/main/java/com/baeldung/di/spring/UserService.java +++ b/spring-di/src/main/java/com/baeldung/di/spring/UserService.java @@ -1,20 +1,20 @@ -package com.baeldung.di.spring; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -@Component -public class UserService { - - @Autowired - private AccountService accountService; - - public AccountService getAccountService() { - return accountService; - } - - public void setAccountService(AccountService accountService) { - this.accountService = accountService; - } - -} +package com.baeldung.di.spring; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class UserService { + + @Autowired + private AccountService accountService; + + public AccountService getAccountService() { + return accountService; + } + + public void setAccountService(AccountService accountService) { + this.accountService = accountService; + } + +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java b/spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java new file mode 100644 index 0000000000..7c1e209383 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/AppConfig.java @@ -0,0 +1,10 @@ +package com.baeldung.methodinjections; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan(basePackages = "com.baeldung.methodinjections") + +public class AppConfig { +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/Grader.java b/spring-di/src/main/java/com/baeldung/methodinjections/Grader.java new file mode 100644 index 0000000000..10dc77484c --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/Grader.java @@ -0,0 +1,19 @@ +package com.baeldung.methodinjections; + +import java.util.Collection; + +import org.springframework.stereotype.Component; + +@Component +public class Grader { + + public String grade(Collection marks) { + + boolean result = marks.stream() + .anyMatch(mark -> mark < 45); + if (result) { + return "FAIL"; + } + return "PASS"; + } +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java b/spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java new file mode 100644 index 0000000000..752eb8893f --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/SchoolNotification.java @@ -0,0 +1,45 @@ +package com.baeldung.methodinjections; + +import java.util.ArrayList; +import java.util.Collection; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.config.ConfigurableBeanFactory; +import org.springframework.context.annotation.Scope; +import org.springframework.stereotype.Component; + +@Component("schoolNotification") +@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) +public class SchoolNotification { + @Autowired + Grader grader; + + private String name; + private Collection marks; + + public SchoolNotification(String name) { + this.name = name; + this.marks = new ArrayList(); + } + + public String addMark(Integer mark) { + this.marks.add(mark); + return this.grader.grade(this.marks); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Collection getMarks() { + return marks; + } + + public void setMarks(Collection marks) { + this.marks = marks; + } +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/Student.java b/spring-di/src/main/java/com/baeldung/methodinjections/Student.java new file mode 100644 index 0000000000..ceeebc3d0d --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/Student.java @@ -0,0 +1,27 @@ +package com.baeldung.methodinjections; + +import org.springframework.beans.factory.annotation.Lookup; +import org.springframework.stereotype.Component; + +@Component("studentBean") +public class Student { + + private String id; + + /** + * Injects a prototype bean SchoolNotification into Singleton student + */ + @Lookup + public SchoolNotification getNotification(String name) { + // spring overrides and returns a SchoolNotification instance + return null; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } +} diff --git a/spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java b/spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java new file mode 100644 index 0000000000..20d631b120 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/methodinjections/StudentServices.java @@ -0,0 +1,21 @@ +package com.baeldung.methodinjections; + +import java.util.HashMap; +import java.util.Map; + +import org.springframework.beans.factory.annotation.Lookup; +import org.springframework.stereotype.Component; + +@Component("studentService") +public abstract class StudentServices { + + private Map notes = new HashMap<>(); + + @Lookup + protected abstract SchoolNotification getNotification(String name); + + public String appendMark(String name, Integer mark) { + SchoolNotification notification = notes.computeIfAbsent(name, exists -> getNotification(name)); + return notification.addMark(mark); + } +} diff --git a/spring-di/src/main/java/org/baeldung/sample/App.java b/spring-di/src/main/java/com/baeldung/sample/App.java similarity index 92% rename from spring-di/src/main/java/org/baeldung/sample/App.java rename to spring-di/src/main/java/com/baeldung/sample/App.java index 17fc49fc8c..f2a017f3e5 100644 --- a/spring-di/src/main/java/org/baeldung/sample/App.java +++ b/spring-di/src/main/java/com/baeldung/sample/App.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.context.annotation.AnnotationConfigApplicationContext; diff --git a/spring-di/src/main/java/org/baeldung/sample/AppConfig.java b/spring-di/src/main/java/com/baeldung/sample/AppConfig.java similarity index 87% rename from spring-di/src/main/java/org/baeldung/sample/AppConfig.java rename to spring-di/src/main/java/com/baeldung/sample/AppConfig.java index 8a177d2611..c948011c69 100644 --- a/spring-di/src/main/java/org/baeldung/sample/AppConfig.java +++ b/spring-di/src/main/java/com/baeldung/sample/AppConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-di/src/main/java/com/baeldung/sample/Bar.java b/spring-di/src/main/java/com/baeldung/sample/Bar.java new file mode 100644 index 0000000000..42302b5563 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/sample/Bar.java @@ -0,0 +1,5 @@ +package com.baeldung.sample; + +public class Bar { + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/BarFormatter.java b/spring-di/src/main/java/com/baeldung/sample/BarFormatter.java similarity index 86% rename from spring-di/src/main/java/org/baeldung/sample/BarFormatter.java rename to spring-di/src/main/java/com/baeldung/sample/BarFormatter.java index 8396653970..e3e0733627 100644 --- a/spring-di/src/main/java/org/baeldung/sample/BarFormatter.java +++ b/spring-di/src/main/java/com/baeldung/sample/BarFormatter.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.stereotype.Component; diff --git a/spring-di/src/main/java/com/baeldung/sample/Foo.java b/spring-di/src/main/java/com/baeldung/sample/Foo.java new file mode 100644 index 0000000000..b25c9ecfb5 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/sample/Foo.java @@ -0,0 +1,5 @@ +package com.baeldung.sample; + +public class Foo { + +} diff --git a/spring-di/src/main/java/com/baeldung/sample/FooDAO.java b/spring-di/src/main/java/com/baeldung/sample/FooDAO.java new file mode 100644 index 0000000000..cc8f732bf9 --- /dev/null +++ b/spring-di/src/main/java/com/baeldung/sample/FooDAO.java @@ -0,0 +1,5 @@ +package com.baeldung.sample; + +public class FooDAO { + +} diff --git a/spring-di/src/main/java/org/baeldung/sample/FooFormatter.java b/spring-di/src/main/java/com/baeldung/sample/FooFormatter.java similarity index 86% rename from spring-di/src/main/java/org/baeldung/sample/FooFormatter.java rename to spring-di/src/main/java/com/baeldung/sample/FooFormatter.java index 68cb7f81f2..25a0b9059d 100644 --- a/spring-di/src/main/java/org/baeldung/sample/FooFormatter.java +++ b/spring-di/src/main/java/com/baeldung/sample/FooFormatter.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.stereotype.Component; diff --git a/spring-di/src/main/java/org/baeldung/sample/FooService.java b/spring-di/src/main/java/com/baeldung/sample/FooService.java similarity index 91% rename from spring-di/src/main/java/org/baeldung/sample/FooService.java rename to spring-di/src/main/java/com/baeldung/sample/FooService.java index 711711f205..6d7ed3d93b 100644 --- a/spring-di/src/main/java/org/baeldung/sample/FooService.java +++ b/spring-di/src/main/java/com/baeldung/sample/FooService.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; diff --git a/spring-di/src/main/java/org/baeldung/sample/Formatter.java b/spring-di/src/main/java/com/baeldung/sample/Formatter.java similarity index 65% rename from spring-di/src/main/java/org/baeldung/sample/Formatter.java rename to spring-di/src/main/java/com/baeldung/sample/Formatter.java index ab29c2b848..c5de59993c 100644 --- a/spring-di/src/main/java/org/baeldung/sample/Formatter.java +++ b/spring-di/src/main/java/com/baeldung/sample/Formatter.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; public interface Formatter { diff --git a/spring-di/src/main/java/org/baeldung/sample/FormatterType.java b/spring-di/src/main/java/com/baeldung/sample/FormatterType.java similarity index 93% rename from spring-di/src/main/java/org/baeldung/sample/FormatterType.java rename to spring-di/src/main/java/com/baeldung/sample/FormatterType.java index a00a9750bf..1ac6c6f4ad 100644 --- a/spring-di/src/main/java/org/baeldung/sample/FormatterType.java +++ b/spring-di/src/main/java/com/baeldung/sample/FormatterType.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.springframework.beans.factory.annotation.Qualifier; diff --git a/spring-di/src/main/java/org/baeldung/sample/Bar.java b/spring-di/src/main/java/org/baeldung/sample/Bar.java deleted file mode 100644 index 54e8d54418..0000000000 --- a/spring-di/src/main/java/org/baeldung/sample/Bar.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.sample; - -public class Bar { - -} diff --git a/spring-di/src/main/java/org/baeldung/sample/Foo.java b/spring-di/src/main/java/org/baeldung/sample/Foo.java deleted file mode 100644 index 562a00121a..0000000000 --- a/spring-di/src/main/java/org/baeldung/sample/Foo.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.sample; - -public class Foo { - -} diff --git a/spring-di/src/main/java/org/baeldung/sample/FooDAO.java b/spring-di/src/main/java/org/baeldung/sample/FooDAO.java deleted file mode 100644 index 151c0c38de..0000000000 --- a/spring-di/src/main/java/org/baeldung/sample/FooDAO.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.sample; - -public class FooDAO { - -} diff --git a/spring-di/src/main/resources/application.properties b/spring-di/src/main/resources/application.properties new file mode 100644 index 0000000000..11710b49aa --- /dev/null +++ b/spring-di/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.profiles.active=prod + diff --git a/spring-di/src/main/resources/baeldung.xml b/spring-di/src/main/resources/baeldung.xml new file mode 100644 index 0000000000..d84492f1d4 --- /dev/null +++ b/spring-di/src/main/resources/baeldung.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + diff --git a/spring-di/src/main/resources/beaninjectiontypes-context.xml b/spring-di/src/main/resources/beaninjectiontypes-context.xml new file mode 100644 index 0000000000..dfdea41cdc --- /dev/null +++ b/spring-di/src/main/resources/beaninjectiontypes-context.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/beans.xml b/spring-di/src/main/resources/beans.xml new file mode 100644 index 0000000000..4002fa63bd --- /dev/null +++ b/spring-di/src/main/resources/beans.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/classpathxmlapplicationcontext-example.xml b/spring-di/src/main/resources/classpathxmlapplicationcontext-example.xml new file mode 100644 index 0000000000..d0ba03cec8 --- /dev/null +++ b/spring-di/src/main/resources/classpathxmlapplicationcontext-example.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/classpathxmlapplicationcontext-internationalization.xml b/spring-di/src/main/resources/classpathxmlapplicationcontext-internationalization.xml new file mode 100644 index 0000000000..f68d623be7 --- /dev/null +++ b/spring-di/src/main/resources/classpathxmlapplicationcontext-internationalization.xml @@ -0,0 +1,14 @@ + + + + + + + dialog/dialog + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/com.baeldung.di.spring.properties b/spring-di/src/main/resources/com.baeldung.di.spring.properties new file mode 100644 index 0000000000..8b8b5b85c2 --- /dev/null +++ b/spring-di/src/main/resources/com.baeldung.di.spring.properties @@ -0,0 +1 @@ +message.value=Hello World \ No newline at end of file diff --git a/spring-di/src/main/resources/com.baeldung.di.spring.xml b/spring-di/src/main/resources/com.baeldung.di.spring.xml new file mode 100644 index 0000000000..81942453b2 --- /dev/null +++ b/spring-di/src/main/resources/com.baeldung.di.spring.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/constructordi.xml b/spring-di/src/main/resources/constructordi.xml new file mode 100644 index 0000000000..08f6013dc6 --- /dev/null +++ b/spring-di/src/main/resources/constructordi.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + diff --git a/spring-di/src/main/resources/dependencyinjectiontypes-context.xml b/spring-di/src/main/resources/dependencyinjectiontypes-context.xml new file mode 100644 index 0000000000..bd6b3c408d --- /dev/null +++ b/spring-di/src/main/resources/dependencyinjectiontypes-context.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/dialog/dialog_en.properties b/spring-di/src/main/resources/dialog/dialog_en.properties new file mode 100644 index 0000000000..cf65b8990e --- /dev/null +++ b/spring-di/src/main/resources/dialog/dialog_en.properties @@ -0,0 +1,3 @@ +hello=hello +you=you +thanks=thank {0} \ No newline at end of file diff --git a/spring-di/src/main/resources/dialog/dialog_zh_CN.properties b/spring-di/src/main/resources/dialog/dialog_zh_CN.properties new file mode 100644 index 0000000000..ab09c8b39f --- /dev/null +++ b/spring-di/src/main/resources/dialog/dialog_zh_CN.properties @@ -0,0 +1,3 @@ +hello=\u4f60\u597d +you=\u4f60 +thanks=\u8c22\u8c22{0} \ No newline at end of file diff --git a/spring-di/src/main/resources/factorybean-abstract-spring-ctx.xml b/spring-di/src/main/resources/factorybean-abstract-spring-ctx.xml new file mode 100644 index 0000000000..a82b884ee5 --- /dev/null +++ b/spring-di/src/main/resources/factorybean-abstract-spring-ctx.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/factorybean-spring-ctx.xml b/spring-di/src/main/resources/factorybean-spring-ctx.xml new file mode 100644 index 0000000000..3231fda676 --- /dev/null +++ b/spring-di/src/main/resources/factorybean-spring-ctx.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/injectiontypes.xml b/spring-di/src/main/resources/injectiontypes.xml new file mode 100644 index 0000000000..9dad1e300a --- /dev/null +++ b/spring-di/src/main/resources/injectiontypes.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/logback.xml b/spring-di/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-di/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/main/resources/setterdi.xml b/spring-di/src/main/resources/setterdi.xml new file mode 100644 index 0000000000..cf3b00d7f5 --- /dev/null +++ b/spring-di/src/main/resources/setterdi.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/spring-core/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java b/spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java b/spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/autowired/FieldAutowiredNameIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java b/spring-di/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/autowired/FieldQualifierAutowiredIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java b/spring-di/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/circulardependency/CircularDependencyIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/circulardependency/TestConfig.java b/spring-di/src/test/java/com/baeldung/circulardependency/TestConfig.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/circulardependency/TestConfig.java rename to spring-di/src/test/java/com/baeldung/circulardependency/TestConfig.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredName.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredQualifier.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestAutowiredType.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectName.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectName.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectName.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectQualifier.java diff --git a/spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectType.java b/spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java similarity index 100% rename from spring-core/src/main/java/com/baeldung/configuration/ApplicationContextTestInjectType.java rename to spring-di/src/test/java/com/baeldung/configuration/ApplicationContextTestInjectType.java diff --git a/spring-core/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java b/spring-di/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/constructordi/ConstructorDependencyInjectionIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/dependencyinjectiontypes/DependencyInjectionIntegrationTest.java b/spring-di/src/test/java/com/baeldung/dependencyinjectiontypes/DependencyInjectionIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/dependencyinjectiontypes/DependencyInjectionIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/dependencyinjectiontypes/DependencyInjectionIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/dependson/config/TestConfig.java b/spring-di/src/test/java/com/baeldung/dependson/config/TestConfig.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/dependson/config/TestConfig.java rename to spring-di/src/test/java/com/baeldung/dependson/config/TestConfig.java diff --git a/spring-core/src/test/java/com/baeldung/dependson/processor/FileProcessorIntegrationTest.java b/spring-di/src/test/java/com/baeldung/dependson/processor/FileProcessorIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/dependson/processor/FileProcessorIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/dependson/processor/FileProcessorIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java b/spring-di/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java similarity index 96% rename from spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java index 4bfb3c5de4..b0c566e4d7 100644 --- a/spring-core/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java +++ b/spring-di/src/test/java/com/baeldung/di/spring/BeanInjectionIntegrationTest.java @@ -1,31 +1,31 @@ -package com.baeldung.di.spring; - -import static org.junit.Assert.*; -import org.junit.Before; -import org.junit.Test; -import org.springframework.context.ApplicationContext; -import org.springframework.context.support.ClassPathXmlApplicationContext; - -public class BeanInjectionIntegrationTest { - - private ApplicationContext applicationContext; - - @Before - public void setUp() throws Exception { - applicationContext = new ClassPathXmlApplicationContext("com.baeldung.di.spring.xml"); - } - - @Test - public void singletonBean_getBean_returnsSingleInstance() { - final IndexApp indexApp1 = applicationContext.getBean("indexApp", IndexApp.class); - final IndexApp indexApp2 = applicationContext.getBean("indexApp", IndexApp.class); - assertEquals(indexApp1, indexApp2); - } - - @Test - public void getBean_returnsInstance() { - final IndexApp indexApp = applicationContext.getBean("indexApp", IndexApp.class); - assertNotNull(indexApp); - } - -} +package com.baeldung.di.spring; + +import static org.junit.Assert.*; +import org.junit.Before; +import org.junit.Test; +import org.springframework.context.ApplicationContext; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class BeanInjectionIntegrationTest { + + private ApplicationContext applicationContext; + + @Before + public void setUp() throws Exception { + applicationContext = new ClassPathXmlApplicationContext("com.baeldung.di.spring.xml"); + } + + @Test + public void singletonBean_getBean_returnsSingleInstance() { + final IndexApp indexApp1 = applicationContext.getBean("indexApp", IndexApp.class); + final IndexApp indexApp2 = applicationContext.getBean("indexApp", IndexApp.class); + assertEquals(indexApp1, indexApp2); + } + + @Test + public void getBean_returnsInstance() { + final IndexApp indexApp = applicationContext.getBean("indexApp", IndexApp.class); + assertNotNull(indexApp); + } + +} diff --git a/spring-core/src/test/java/com/baeldung/di/spring/SpringUnitTest.java b/spring-di/src/test/java/com/baeldung/di/spring/SpringUnitTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/di/spring/SpringUnitTest.java rename to spring-di/src/test/java/com/baeldung/di/spring/SpringUnitTest.java diff --git a/spring-core/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java b/spring-di/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/inject/FieldByNameInjectIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java b/spring-di/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/inject/FieldInjectIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java b/spring-di/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/inject/FieldQualifierInjectIntegrationTest.java diff --git a/spring-core/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java b/spring-di/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java similarity index 100% rename from spring-core/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/methodinjections/StudentIntegrationTest.java diff --git a/spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java b/spring-di/src/test/java/com/baeldung/sample/FooServiceIntegrationTest.java similarity index 96% rename from spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java rename to spring-di/src/test/java/com/baeldung/sample/FooServiceIntegrationTest.java index 6b518395a1..d42b98fc76 100644 --- a/spring-di/src/test/java/org/baeldung/sample/FooServiceIntegrationTest.java +++ b/spring-di/src/test/java/com/baeldung/sample/FooServiceIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.sample; +package com.baeldung.sample; import org.junit.Assert; import org.junit.Test; diff --git a/spring-di/src/test/resources/beanfactory-example.xml b/spring-di/src/test/resources/beanfactory-example.xml new file mode 100644 index 0000000000..7b3d4f29ed --- /dev/null +++ b/spring-di/src/test/resources/beanfactory-example.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/spring-di/src/test/resources/data/employees.dat b/spring-di/src/test/resources/data/employees.dat new file mode 100644 index 0000000000..9c28fdf82f --- /dev/null +++ b/spring-di/src/test/resources/data/employees.dat @@ -0,0 +1 @@ +Joe Employee,Jan Employee,James T. Employee \ No newline at end of file diff --git a/spring-di/src/test/resources/input.txt b/spring-di/src/test/resources/input.txt new file mode 100644 index 0000000000..811232fa1f --- /dev/null +++ b/spring-di/src/test/resources/input.txt @@ -0,0 +1 @@ +This file is merely for testing. \ No newline at end of file diff --git a/spring-di/src/test/resources/output.txt b/spring-di/src/test/resources/output.txt new file mode 100644 index 0000000000..34e1e27d5a --- /dev/null +++ b/spring-di/src/test/resources/output.txt @@ -0,0 +1 @@ +Should be copied to OutputStream. \ No newline at end of file From e093daf12d0ce029b37a3527418d32685691b415 Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Mon, 16 Sep 2019 14:12:33 +0300 Subject: [PATCH 205/396] changed the readme article links to https and removed the gitignore file (#7780) --- .gitignore | 1 + .../core-java-lang-oop-2/README.md | 4 +-- .../core-java-lang-oop-3/.gitignore | 26 ------------------- .../core-java-lang-oop-3/README.md | 8 +++--- .../core-java-lang-oop/README.md | 20 +++++++------- 5 files changed, 17 insertions(+), 42 deletions(-) delete mode 100644 core-java-modules/core-java-lang-oop-3/.gitignore diff --git a/.gitignore b/.gitignore index 2edea19340..be3bc420c5 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ bin/ *.class # Package Files # +*.jar *.war *.ear diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md index 7fee77d4bb..c43c9f02dc 100644 --- a/core-java-modules/core-java-lang-oop-2/README.md +++ b/core-java-modules/core-java-lang-oop-2/README.md @@ -10,6 +10,6 @@ - [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword) - [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces) - [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) -- [Immutable Objects in Java](http://www.baeldung.com/java-immutable-object) -- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition) +- [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object) +- [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition) - [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) diff --git a/core-java-modules/core-java-lang-oop-3/.gitignore b/core-java-modules/core-java-lang-oop-3/.gitignore deleted file mode 100644 index 3de4cc647e..0000000000 --- a/core-java-modules/core-java-lang-oop-3/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -*.class - -0.* - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* -.resourceCache - -# Packaged files # -*.jar -*.war -*.ear - -# Files generated by integration tests -*.txt -backup-pom.xml -/bin/ -/temp - -#IntelliJ specific -.idea/ -*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md index 57df2c1769..15876d124f 100644 --- a/core-java-modules/core-java-lang-oop-3/README.md +++ b/core-java-modules/core-java-lang-oop-3/README.md @@ -3,9 +3,9 @@ ## Core Java Lang OOP 3 Cookbooks and Examples ### Relevant Articles: -- [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference) -- [Access Modifiers in Java](http://www.baeldung.com/java-access-modifiers) -- [Guide to the super Java Keyword](http://www.baeldung.com/java-super) -- [Guide to the this Java Keyword](http://www.baeldung.com/java-this) +- [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference) +- [Access Modifiers in Java](https://www.baeldung.com/java-access-modifiers) +- [Guide to the super Java Keyword](https://www.baeldung.com/java-super) +- [Guide to the this Java Keyword](https://www.baeldung.com/java-this) - [Java Public Access Modifier](https://www.baeldung.com/java-public-keyword) - [Composition, Aggregation and Association in Java](https://www.baeldung.com/java-composition-aggregation-association) \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md index 1751da8b3e..2e7fa4d689 100644 --- a/core-java-modules/core-java-lang-oop/README.md +++ b/core-java-modules/core-java-lang-oop/README.md @@ -3,13 +3,13 @@ ## Core Java Lang OOP Cookbooks and Examples ### Relevant Articles: -- [Guide to hashCode() in Java](http://www.baeldung.com/java-hashcode) -- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static) -- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism) -- [Method Overloading and Overriding in Java](http://www.baeldung.com/java-method-overload-override) -- [How to Make a Deep Copy of an Object in Java](http://www.baeldung.com/java-deep-copy) -- [Guide to Inheritance in Java](http://www.baeldung.com/java-inheritance) -- [Object Type Casting in Java](http://www.baeldung.com/java-type-casting) -- [The “final” Keyword in Java](http://www.baeldung.com/java-final) -- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure) -- [Variable and Method Hiding in Java](http://www.baeldung.com/java-variable-method-hiding) +- [Guide to hashCode() in Java](https://www.baeldung.com/java-hashcode) +- [A Guide to the Static Keyword in Java](https://www.baeldung.com/java-static) +- [Polymorphism in Java](https://www.baeldung.com/java-polymorphism) +- [Method Overloading and Overriding in Java](https://www.baeldung.com/java-method-overload-override) +- [How to Make a Deep Copy of an Object in Java](https://www.baeldung.com/java-deep-copy) +- [Guide to Inheritance in Java](https://www.baeldung.com/java-inheritance) +- [Object Type Casting in Java](https://www.baeldung.com/java-type-casting) +- [The “final” Keyword in Java](https://www.baeldung.com/java-final) +- [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure) +- [Variable and Method Hiding in Java](https://www.baeldung.com/java-variable-method-hiding) From 66f4d44c60ec3c4314739eb6eb544dcf61628dbb Mon Sep 17 00:00:00 2001 From: Amy DeGregorio Date: Mon, 16 Sep 2019 09:37:38 -0400 Subject: [PATCH 206/396] BAEL-3222 Example Code and update to spring-boot-admin examples (#7804) --- spring-boot-admin/pom.xml | 2 +- .../spring-boot-admin-client/pom.xml | 4 +- .../src/main/resources/application.properties | 20 ++-- .../spring-boot-admin-server/pom.xml | 18 ++-- .../SpringBootAdminServerApplication.java | 2 +- .../configs/HazelcastConfig.java | 37 ++++++-- .../configs/NotifierConfiguration.java | 34 ++++--- .../configs/WebSecurityConfig.java | 63 +++++++++---- .../src/main/resources/application.properties | 17 ++-- .../NotifierConfigurationIntegrationTest.java | 8 +- spring-boot-management/pom.xml | 91 ++++++++++--------- .../logging/LoggingApplication.java | 11 +++ .../management/logging/LoggingController.java | 24 +++++ .../management/logging/SecurityConfig.java | 14 +++ .../src/main/resources/application.properties | 21 ++++- .../src/main/resources/logback.xml | 13 +++ 16 files changed, 260 insertions(+), 119 deletions(-) create mode 100644 spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java create mode 100644 spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java create mode 100644 spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java create mode 100644 spring-boot-management/src/main/resources/logback.xml diff --git a/spring-boot-admin/pom.xml b/spring-boot-admin/pom.xml index 23852dee57..b2ced767eb 100644 --- a/spring-boot-admin/pom.xml +++ b/spring-boot-admin/pom.xml @@ -30,7 +30,7 @@ - 1.5.8.RELEASE + 2.1.7.RELEASE \ No newline at end of file diff --git a/spring-boot-admin/spring-boot-admin-client/pom.xml b/spring-boot-admin/spring-boot-admin-client/pom.xml index 7563a01172..aa2daf8d45 100644 --- a/spring-boot-admin/spring-boot-admin-client/pom.xml +++ b/spring-boot-admin/spring-boot-admin-client/pom.xml @@ -18,7 +18,7 @@ org.springframework.boot - spring-boot-starter + spring-boot-starter-web org.springframework.boot @@ -59,7 +59,7 @@ - 1.5.4 + 2.1.6 2.0.4.RELEASE diff --git a/spring-boot-admin/spring-boot-admin-client/src/main/resources/application.properties b/spring-boot-admin/spring-boot-admin-client/src/main/resources/application.properties index 58c178ecd9..ff4b1e3255 100644 --- a/spring-boot-admin/spring-boot-admin-client/src/main/resources/application.properties +++ b/spring-boot-admin/spring-boot-admin-client/src/main/resources/application.properties @@ -1,16 +1,20 @@ #basic auth creddentials -security.user.name=client -security.user.password=client +spring.security.user.name=client +spring.security.user.password=client #configs to connect to a secured server -spring.boot.admin.url=http://localhost:8080 -spring.boot.admin.username=admin -spring.boot.admin.password=admin +spring.boot.admin.client.url=http://localhost:8080 +#spring.boot.admin.client.instance.service-base-url=http://localhost:8081 +spring.boot.admin.client.username=admin +spring.boot.admin.client.password=admin #configs to give secured server info -spring.boot.admin.client.metadata.user.name=${security.user.name} -spring.boot.admin.client.metadata.user.password=${security.user.password} +spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name} +spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password} #app config spring.application.name=spring-boot-admin-client -server.port=8081 \ No newline at end of file +server.port=8081 + +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=always \ No newline at end of file diff --git a/spring-boot-admin/spring-boot-admin-server/pom.xml b/spring-boot-admin/spring-boot-admin-server/pom.xml index d429d9289f..142cf420f4 100644 --- a/spring-boot-admin/spring-boot-admin-server/pom.xml +++ b/spring-boot-admin/spring-boot-admin-server/pom.xml @@ -18,18 +18,14 @@ org.springframework.boot - spring-boot-starter + spring-boot-starter-web + de.codecentric - spring-boot-admin-server - ${spring-boot-admin-server.version} - - - de.codecentric - spring-boot-admin-server-ui + spring-boot-admin-starter-server ${spring-boot-admin-server.version} @@ -37,7 +33,7 @@ de.codecentric spring-boot-admin-server-ui-login - ${spring-boot-admin-server.version} + ${spring-boot-admin-server-ui-login.version} org.springframework.boot @@ -47,6 +43,7 @@ com.hazelcast hazelcast + de.codecentric @@ -82,8 +79,9 @@ - 1.5.4 - 1.5.4 + 2.1.6 + 2.1.6 + 1.5.7 2.0.4.RELEASE diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java index d1fb4e769b..e934086cf4 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/SpringBootAdminServerApplication.java @@ -1,6 +1,6 @@ package com.baeldung.springbootadminserver; -import de.codecentric.boot.admin.config.EnableAdminServer; +import de.codecentric.boot.admin.server.config.EnableAdminServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java index b19b7820af..d38b0e933c 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/HazelcastConfig.java @@ -2,8 +2,14 @@ package com.baeldung.springbootadminserver.configs; import com.hazelcast.config.Config; import com.hazelcast.config.EvictionPolicy; -import com.hazelcast.config.ListConfig; +import com.hazelcast.config.InMemoryFormat; import com.hazelcast.config.MapConfig; +import com.hazelcast.config.MergePolicyConfig; +import com.hazelcast.config.TcpIpConfig; +import com.hazelcast.map.merge.PutIfAbsentMapMergePolicy; + +import java.util.Collections; + import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -12,13 +18,30 @@ public class HazelcastConfig { @Bean public Config hazelcast() { - return new Config() - .setProperty("hazelcast.jmx", "true") - .addMapConfig(new MapConfig("spring-boot-admin-application-store") + MapConfig eventStoreMap = new MapConfig("spring-boot-admin-event-store").setInMemoryFormat(InMemoryFormat.OBJECT) .setBackupCount(1) - .setEvictionPolicy(EvictionPolicy.NONE)) - .addListConfig(new ListConfig("spring-boot-admin-event-store") + .setEvictionPolicy(EvictionPolicy.NONE) + .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100)); + + MapConfig sentNotificationsMap = new MapConfig("spring-boot-admin-application-store").setInMemoryFormat(InMemoryFormat.OBJECT) .setBackupCount(1) - .setMaxSize(1000)); + .setEvictionPolicy(EvictionPolicy.LRU) + .setMergePolicyConfig(new MergePolicyConfig(PutIfAbsentMapMergePolicy.class.getName(), 100)); + + Config config = new Config(); + config.addMapConfig(eventStoreMap); + config.addMapConfig(sentNotificationsMap); + config.setProperty("hazelcast.jmx", "true"); + + config.getNetworkConfig() + .getJoin() + .getMulticastConfig() + .setEnabled(false); + TcpIpConfig tcpIpConfig = config.getNetworkConfig() + .getJoin() + .getTcpIpConfig(); + tcpIpConfig.setEnabled(true); + tcpIpConfig.setMembers(Collections.singletonList("127.0.0.1")); + return config; } } diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java index 10a31464ab..d43f4b430a 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java @@ -1,42 +1,40 @@ package com.baeldung.springbootadminserver.configs; -import de.codecentric.boot.admin.notify.LoggingNotifier; -import de.codecentric.boot.admin.notify.RemindingNotifier; -import de.codecentric.boot.admin.notify.filter.FilteringNotifier; +import java.time.Duration; + +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.Scheduled; -import java.util.concurrent.TimeUnit; +import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; +import de.codecentric.boot.admin.server.notify.LoggingNotifier; +import de.codecentric.boot.admin.server.notify.RemindingNotifier; +import de.codecentric.boot.admin.server.notify.filter.FilteringNotifier; @Configuration -@EnableScheduling public class NotifierConfiguration { + @Autowired + private InstanceRepository repository; - // @Autowired private Notifier notifier; + // @Autowired private Notifier notifier; @Bean public LoggingNotifier notifier() { - return new LoggingNotifier(); + return new LoggingNotifier(repository); } @Bean public FilteringNotifier filteringNotifier() { - return new FilteringNotifier(notifier()); + return new FilteringNotifier(notifier(), repository); } - @Bean @Primary + @Bean(initMethod = "start", destroyMethod = "stop") public RemindingNotifier remindingNotifier() { - RemindingNotifier remindingNotifier = new RemindingNotifier(filteringNotifier()); - remindingNotifier.setReminderPeriod(TimeUnit.MINUTES.toMillis(5)); + RemindingNotifier remindingNotifier = new RemindingNotifier(filteringNotifier(), repository); + remindingNotifier.setReminderPeriod(Duration.ofMinutes(5)); + remindingNotifier.setCheckReminderInverval(Duration.ofSeconds(60)); return remindingNotifier; } - - @Scheduled(fixedRate = 60_000L) - public void remind() { - remindingNotifier().sendReminders(); - } } diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java index 4a7c8330b7..ee37d2f0b3 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java @@ -1,33 +1,56 @@ package com.baeldung.springbootadminserver.configs; +import java.util.UUID; + import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; +import org.springframework.security.web.csrf.CookieCsrfTokenRepository; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +import de.codecentric.boot.admin.server.config.AdminServerProperties; @Configuration public class WebSecurityConfig extends WebSecurityConfigurerAdapter { + private final AdminServerProperties adminServer; + + public WebSecurityConfig(AdminServerProperties adminServer) { + this.adminServer = adminServer; + } @Override protected void configure(HttpSecurity http) throws Exception { - http - .formLogin() - .loginPage("/login.html") - .loginProcessingUrl("/login") - .permitAll(); - http - .logout() - .logoutUrl("/logout"); - http - .csrf() - .disable(); - http - .authorizeRequests() - .antMatchers("/login.html", "/**/*.css", "/img/**", "/third-party/**") - .permitAll(); - http - .authorizeRequests() - .antMatchers("/**") - .authenticated(); - http.httpBasic(); + SavedRequestAwareAuthenticationSuccessHandler successHandler = new SavedRequestAwareAuthenticationSuccessHandler(); + successHandler.setTargetUrlParameter("redirectTo"); + successHandler.setDefaultTargetUrl(this.adminServer.getContextPath() + "/"); + + http.authorizeRequests() + .antMatchers(this.adminServer.getContextPath() + "/assets/**") + .permitAll() + .antMatchers(this.adminServer.getContextPath() + "/login") + .permitAll() + .anyRequest() + .authenticated() + .and() + .formLogin() + .loginPage(this.adminServer.getContextPath() + "/login") + .successHandler(successHandler) + .and() + .logout() + .logoutUrl(this.adminServer.getContextPath() + "/logout") + .and() + .httpBasic() + .and() + .csrf() + .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()) + .ignoringRequestMatchers(new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances", HttpMethod.POST.toString()), new AntPathRequestMatcher(this.adminServer.getContextPath() + "/instances/*", HttpMethod.DELETE.toString()), + new AntPathRequestMatcher(this.adminServer.getContextPath() + "/actuator/**")) + .and() + .rememberMe() + .key(UUID.randomUUID() + .toString()) + .tokenValiditySeconds(1209600); } } diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties b/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties index 362f6428e8..ba7a7de2a0 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties +++ b/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties @@ -1,16 +1,19 @@ spring.application.name=spring-boot-admin-server -security.user.name=admin -security.user.password=admin +spring.security.user.name=admin +spring.security.user.password=admin #configs to connect to self register the admin server as a client -spring.boot.admin.url=http://localhost:8080 -spring.boot.admin.username=${security.user.name} -spring.boot.admin.password=${security.user.password} +spring.boot.admin.client.url=http://localhost:8080 +spring.boot.admin.client.username=${spring.security.user.name} +spring.boot.admin.client.password=${spring.security.user.password} #configs to give secured server info -spring.boot.admin.client.metadata.user.name=${security.user.name} -spring.boot.admin.client.metadata.user.password=${security.user.password} +spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name} +spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password} + +management.endpoints.web.exposure.include=* +management.endpoint.health.show-details=always #mail notifications #spring.mail.host=smtp.gmail.com diff --git a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java index 465d079ac3..fc8acc4e4d 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java +++ b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java @@ -1,9 +1,11 @@ package com.baeldung.springbootadminserver; import com.baeldung.springbootadminserver.configs.NotifierConfiguration; -import de.codecentric.boot.admin.notify.Notifier; -import de.codecentric.boot.admin.notify.RemindingNotifier; -import de.codecentric.boot.admin.notify.filter.FilteringNotifier; + +import de.codecentric.boot.admin.server.notify.Notifier; +import de.codecentric.boot.admin.server.notify.RemindingNotifier; +import de.codecentric.boot.admin.server.notify.filter.FilteringNotifier; + import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; diff --git a/spring-boot-management/pom.xml b/spring-boot-management/pom.xml index 2b3e8f5d06..ca483d2f61 100644 --- a/spring-boot-management/pom.xml +++ b/spring-boot-management/pom.xml @@ -1,47 +1,56 @@ - - 4.0.0 - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 - - com.baeldung - spring-boot-management - 0.0.1-SNAPSHOT - spring-boot-management + + 4.0.0 + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + com.baeldung + spring-boot-management + 0.0.1-SNAPSHOT + spring-boot-management - - 1.8 - + + com.baeldung.spring.boot.management.logging.LoggingApplication + 1.8 + 2.1.6 + - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-web - + + + org.springframework.boot + spring-boot-starter-actuator + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-security + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin-starter-client.version} + - - org.springframework.boot - spring-boot-starter-test - test - - + + org.springframework.boot + spring-boot-starter-test + test + + - - - - org.springframework.boot - spring-boot-maven-plugin - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + + diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java new file mode 100644 index 0000000000..6371ac4c64 --- /dev/null +++ b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java @@ -0,0 +1,11 @@ +package com.baeldung.spring.boot.management.logging; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LoggingApplication { + public static void main(String[] args) { + SpringApplication.run(LoggingApplication.class); + } +} diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java new file mode 100644 index 0000000000..5bd15be10c --- /dev/null +++ b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java @@ -0,0 +1,24 @@ +package com.baeldung.spring.boot.management.logging; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/log") +public class LoggingController { + private Log log = LogFactory.getLog(LoggingController.class); + + @GetMapping + public String log() { + log.trace("This is a TRACE level message"); + log.debug("This is a DEBUG level message"); + log.info("This is an INFO level message"); + log.warn("This is a WARN level message"); + log.error("This is an ERROR level message"); + + return "See the log for details"; + } +} diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java new file mode 100644 index 0000000000..45cc1ebb33 --- /dev/null +++ b/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.boot.management.logging; + +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +public class SecurityConfig extends WebSecurityConfigurerAdapter { + @Override + protected void configure(HttpSecurity http) throws Exception { + http.csrf() + .ignoringAntMatchers("/actuator/**"); + } +} diff --git a/spring-boot-management/src/main/resources/application.properties b/spring-boot-management/src/main/resources/application.properties index 835ca64eac..338251cf9b 100644 --- a/spring-boot-management/src/main/resources/application.properties +++ b/spring-boot-management/src/main/resources/application.properties @@ -1,3 +1,22 @@ -management.endpoints.web.exposure.include=httptrace +management.endpoints.web.exposure.include=httptrace,loggers,health,info,metrics management.trace.http.include=RESPONSE_HEADERS +management.endpoint.loggers.enabled=true + +#basic auth creddentials +spring.security.user.name=client +spring.security.user.password=client + +#configs to connect to a secured server +spring.boot.admin.client.url=http://localhost:8080 +spring.boot.admin.client.username=admin +spring.boot.admin.client.password=admin + +#configs to give secured server info +spring.boot.admin.client.instance.metadata.user.name=${spring.security.user.name} +spring.boot.admin.client.instance.metadata.user.password=${spring.security.user.password} + +#app config +spring.application.name=spring-boot-management +server.port=8081 + diff --git a/spring-boot-management/src/main/resources/logback.xml b/spring-boot-management/src/main/resources/logback.xml new file mode 100644 index 0000000000..36314cbeeb --- /dev/null +++ b/spring-boot-management/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + \ No newline at end of file From c639d041519df5b29d7938ad80c4cbf5aa83f1f3 Mon Sep 17 00:00:00 2001 From: psevestre Date: Tue, 17 Sep 2019 02:16:30 -0300 Subject: [PATCH 207/396] [BAEL-3164] Update SpringBoot dependency (#7814) * [BAEL-3164] Add spring-boot-jdbi module * [BAEL-3164] Remove extra files * [BAEL-3164] Update springboot main dependency --- persistence-modules/spring-boot-jdbi/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-boot-jdbi/pom.xml b/persistence-modules/spring-boot-jdbi/pom.xml index 26a0b94275..3f9bc8ab10 100644 --- a/persistence-modules/spring-boot-jdbi/pom.xml +++ b/persistence-modules/spring-boot-jdbi/pom.xml @@ -27,7 +27,7 @@ org.springframework.boot spring-boot-dependencies - 2.1.7.RELEASE + 2.1.8.RELEASE pom import From 6bab705944217661c11aeac24386935905def018 Mon Sep 17 00:00:00 2001 From: Michael Sievers Date: Tue, 17 Sep 2019 08:09:08 +0200 Subject: [PATCH 208/396] [BAEL-3077] Update comments in unit tests to align with article snippets --- .../mapper/DeliveryAddressMapperUnitTest.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java index e2c12fcba3..7d1e432546 100644 --- a/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java +++ b/mapstruct/src/test/java/com/baeldung/mapper/DeliveryAddressMapperUnitTest.java @@ -17,48 +17,51 @@ public class DeliveryAddressMapperUnitTest { @Test public void testGivenCustomerAndAddress_mapsToDeliveryAddress() { - // given + // given a customer Customer customer = new Customer().setFirstName("Max") .setLastName("Powers"); + // and some address Address homeAddress = new Address().setStreet("123 Some Street") .setCounty("Nevada") .setPostalcode("89123"); - // when + // when calling DeliveryAddressMapper::from DeliveryAddress deliveryAddress = deliveryAddressMapper.from(customer, homeAddress); - // then + // then a new DeliveryAddress is created, based on the given customer and his home address assertEquals(deliveryAddress.getForename(), customer.getFirstName()); assertEquals(deliveryAddress.getSurname(), customer.getLastName()); assertEquals(deliveryAddress.getStreet(), homeAddress.getStreet()); assertEquals(deliveryAddress.getCounty(), homeAddress.getCounty()); assertEquals(deliveryAddress.getPostalcode(), homeAddress.getPostalcode()); + } @Test public void testGivenDeliveryAddressAndSomeOtherAddress_updatesDeliveryAddress() { - // given - Customer customer = new Customer().setFirstName("Max") - .setLastName("Powers"); - - DeliveryAddress deliveryAddress = new DeliveryAddress().setStreet("123 Some Street") + // given a delivery address + DeliveryAddress deliveryAddress = new DeliveryAddress().setForename("Max") + .setSurname("Powers") + .setStreet("123 Some Street") .setCounty("Nevada") .setPostalcode("89123"); - Address otherAddress = new Address().setStreet("456 Some other street") + // and some new address + Address newAddress = new Address().setStreet("456 Some other street") .setCounty("Arizona") .setPostalcode("12345"); - // when - DeliveryAddress updatedDeliveryAddress = deliveryAddressMapper.updateAddress(deliveryAddress, otherAddress); + // when calling DeliveryAddressMapper::updateAddress + DeliveryAddress updatedDeliveryAddress = deliveryAddressMapper.updateAddress(deliveryAddress, newAddress); - // then + // then the *existing* delivery address is updated assertSame(deliveryAddress, updatedDeliveryAddress); - assertEquals(deliveryAddress.getStreet(), otherAddress.getStreet()); - assertEquals(deliveryAddress.getCounty(), otherAddress.getCounty()); - assertEquals(deliveryAddress.getPostalcode(), otherAddress.getPostalcode()); + assertEquals(deliveryAddress.getStreet(), newAddress.getStreet()); + assertEquals(deliveryAddress.getCounty(), newAddress.getCounty()); + assertEquals(deliveryAddress.getPostalcode(), newAddress.getPostalcode()); + } } From b3b7e78ce6aa895761dfe0a314f3f45dc6d18793 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Tue, 17 Sep 2019 09:07:47 +0200 Subject: [PATCH 209/396] review updates --- .../interpolation/MyMessageInterpolator.java | 3 ++- .../baeldung/interpolation/ValidationExamples.java | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java index 8251138b9b..efa3d62b88 100644 --- a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/MyMessageInterpolator.java @@ -17,12 +17,13 @@ public class MyMessageInterpolator implements MessageInterpolator { @Override public String interpolate(String messageTemplate, Context context) { - logger.debug("Selecting the language " + Locale.getDefault() + " for the error message."); + messageTemplate = messageTemplate.toUpperCase(); return defaultInterpolator.interpolate(messageTemplate, context, Locale.getDefault()); } @Override public String interpolate(String messageTemplate, Context context, Locale locale) { + messageTemplate = messageTemplate.toUpperCase(); return defaultInterpolator.interpolate(messageTemplate, context, locale); } } diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java index d353e4f7f2..30d770205e 100644 --- a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java @@ -10,21 +10,21 @@ public class ValidationExamples { private static final Formatter formatter = new Formatter(); @Size( - min = 5, - max = 14, - message = "The author email '${validatedValue}' must be between {min} and {max} characters long" + min = 5, + max = 14, + message = "The author email '${validatedValue}' must be between {min} and {max} characters long" ) private String authorEmail; @Min( - value = 1, - message = "There must be at least {value} test{value > 1 ? 's' : ''} int the test case" + value = 1, + message = "There must be at least {value} test{value > 1 ? 's' : ''} int the test case" ) private int testCount; @DecimalMin( - value = "50", - message = "The code coverage ${formatter.format('%1$.2f', validatedValue)} must be higher than {value}%" + value = "50", + message = "The code coverage ${formatter.format('%1$.2f', validatedValue)} must be higher than {value}%" ) private double codeCoverage; From 1b85cbaafda38d84abf46828d716e1e8dce03847 Mon Sep 17 00:00:00 2001 From: Lukasz Rys <> Date: Tue, 17 Sep 2019 09:21:43 +0200 Subject: [PATCH 210/396] [ BAEL-1869 ] : Restroe indexManager, fix view name to be equal to the snippet --- .../configuration/ReactiveCouchbaseConfiguration.java | 9 +++++++++ .../domain/repository/view/ViewPersonRepository.java | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java index 2f3b5486d8..a51b19ee22 100644 --- a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/configuration/ReactiveCouchbaseConfiguration.java @@ -2,7 +2,11 @@ package com.baeldung.couchbase.configuration; import com.couchbase.client.java.env.CouchbaseEnvironment; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; + +import org.springframework.context.annotation.Bean; import org.springframework.data.couchbase.config.AbstractReactiveCouchbaseConfiguration; +import org.springframework.data.couchbase.config.BeanNames; +import org.springframework.data.couchbase.repository.support.IndexManager; import java.util.List; @@ -36,4 +40,9 @@ public abstract class ReactiveCouchbaseConfiguration extends AbstractReactiveCou .bootstrapHttpDirectPort(couchbaseProperties.getPort()) .build(); } + + @Bean(name = BeanNames.COUCHBASE_INDEX_MANAGER) + public IndexManager couchbaseIndexManager() { + return new IndexManager(true, true, false); + } } diff --git a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java index 28a7ec1b78..06c47c2393 100644 --- a/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java +++ b/spring-5-data-reactive/src/main/java/com/baeldung/couchbase/domain/repository/view/ViewPersonRepository.java @@ -13,7 +13,7 @@ import java.util.UUID; @ViewIndexed(designDoc = ViewPersonRepository.DESIGN_DOCUMENT) public interface ViewPersonRepository extends ReactiveCrudRepository { - String DESIGN_DOCUMENT = "persons"; + String DESIGN_DOCUMENT = "person"; @View(designDocument = ViewPersonRepository.DESIGN_DOCUMENT) Flux findByFirstName(String firstName); From 76c48c308ec5e209ce03c48af535b7debda940ed Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 17 Sep 2019 15:03:20 +0100 Subject: [PATCH 211/396] [BAEL-3193] - changes made to clean up code (#7760) * [BAEL-3193] - changes made to clean up code * Fixed missing linkedList import * [BAEL-3193] - changing the default value in the findMax function --- .../bucketsort/IntegerBucketSorter.java | 34 +++++++++---------- .../algorithms/bucketsort/Sorter.java | 0 .../IntegerBucketSorterUnitTest.java | 0 3 files changed, 16 insertions(+), 18 deletions(-) rename {algorithms-miscellaneous-3 => algorithms-sorting}/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java (57%) rename {algorithms-miscellaneous-3 => algorithms-sorting}/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java (100%) rename {algorithms-miscellaneous-3 => algorithms-sorting}/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java (100%) diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java similarity index 57% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java rename to algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java index 4d885a6b3a..002d4997f4 100644 --- a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java +++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorter.java @@ -2,6 +2,7 @@ package com.baeldung.bucketsort; import java.util.ArrayList; import java.util.Comparator; +import java.util.LinkedList; import java.util.List; public class IntegerBucketSorter implements Sorter { @@ -28,43 +29,40 @@ public class IntegerBucketSorter implements Sorter { } private List concatenateSortedBuckets(List> buckets){ - List sortedArray = new ArrayList<>(); - int index = 0; + List sortedArray = new LinkedList<>(); for(List bucket : buckets){ - for(int number : bucket){ - sortedArray.add(index++, number); - } + sortedArray.addAll(bucket); } return sortedArray; } private List> splitIntoUnsortedBuckets(List initialList){ - final int[] codes = createHashes(initialList); + final int max = findMax(initialList); + final int numberOfBuckets = (int) Math.sqrt(initialList.size()); - List> buckets = new ArrayList<>(codes[1]); - for(int i = 0; i < codes[1]; i++) buckets.add(new ArrayList<>()); + List> buckets = new ArrayList<>(); + for(int i = 0; i < numberOfBuckets; i++) buckets.add(new ArrayList<>()); //distribute the data for (int i : initialList) { - buckets.get(hash(i, codes)).add(i); + buckets.get(hash(i, max, numberOfBuckets)).add(i); } return buckets; } - private int[] createHashes(List input){ - int m = input.get(0); - for (int i = 1; i < input.size(); i++) { - if (m < input.get(i)) { - m = input.get(i); - } + private int findMax(List input){ + int m = Integer.MIN_VALUE; + for (int i : input){ + m = Math.max(i, m); } - return new int[]{m, (int) Math.sqrt(input.size())}; + return m; } - private static int hash(int i, int[] code) { - return (int) ((double) i / code[0] * (code[1] - 1)); + private static int hash(int i, int max, int numberOfBuckets) { + return (int) ((double) i / max * (numberOfBuckets - 1)); } + } diff --git a/algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java similarity index 100% rename from algorithms-miscellaneous-3/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java rename to algorithms-sorting/src/main/java/com/baeldung/algorithms/bucketsort/Sorter.java diff --git a/algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java b/algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java similarity index 100% rename from algorithms-miscellaneous-3/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java rename to algorithms-sorting/src/test/java/com/baeldung/algorithms/bucketsort/IntegerBucketSorterUnitTest.java From 98ed71e98e9ff1a090286f5d6fad316b22414ca7 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 17 Sep 2019 16:00:48 +0100 Subject: [PATCH 212/396] [BAEL-17486] adding readme descriptions (#7788) * [BAEL-17486] adding readme descriptions * updated template * updated link in spring-5-reactive readme * Updated descriptions --- spring-5-data-reactive/README.md | 2 ++ spring-5-mvc/README.md | 4 ++++ spring-5-reactive-2/README.md | 3 +++ spring-5-reactive-client/README.md | 2 ++ spring-5-reactive-oauth/README.md | 4 ++++ spring-5-reactive-security/README.md | 2 ++ spring-5-reactive/README.md | 3 +++ spring-5-security-oauth/README.md | 4 ++++ spring-5-security/README.md | 4 ++++ spring-5-webflux/README.md | 4 ++++ 10 files changed, 32 insertions(+) diff --git a/spring-5-data-reactive/README.md b/spring-5-data-reactive/README.md index 4c2347dc77..982704e11c 100644 --- a/spring-5-data-reactive/README.md +++ b/spring-5-data-reactive/README.md @@ -1,5 +1,7 @@ ## Spring Data Reactive Project +This module contains articles about reactive Spring 5 Data + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-5-mvc/README.md b/spring-5-mvc/README.md index 063945281f..2b57df3b71 100644 --- a/spring-5-mvc/README.md +++ b/spring-5-mvc/README.md @@ -1,3 +1,7 @@ +## Spring 5 MVC + +This module contains articles about Spring 5 model-view-controller (MVC) pattern + ### Relevant Articles: - [Spring Boot and Kotlin](http://www.baeldung.com/spring-boot-kotlin) - [Spring MVC Streaming and SSE Request Processing](https://www.baeldung.com/spring-mvc-sse-streams) diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md index 7aec8f94bf..a8204932f7 100644 --- a/spring-5-reactive-2/README.md +++ b/spring-5-reactive-2/README.md @@ -1,2 +1,5 @@ ## Spring 5 Reactive Project + +This module contains articles about reactive Spring 5 + - [Spring WebClient vs. RestTemplate](https://www.baeldung.com/spring-webclient-resttemplate) diff --git a/spring-5-reactive-client/README.md b/spring-5-reactive-client/README.md index 0df2bdd339..90d12cad1c 100644 --- a/spring-5-reactive-client/README.md +++ b/spring-5-reactive-client/README.md @@ -1,5 +1,7 @@ ## Spring REST Example Project +This module contains articles about reactive Spring 5 WebClient + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-5-reactive-oauth/README.md b/spring-5-reactive-oauth/README.md index ec5176670b..3fddbf4a36 100644 --- a/spring-5-reactive-oauth/README.md +++ b/spring-5-reactive-oauth/README.md @@ -1,3 +1,7 @@ +## Spring 5 Reactive OAuth + +This module contains articles about reactive Spring 5 OAuth + ### Relevant Articles: - [Spring Security OAuth Login with WebFlux](https://www.baeldung.com/spring-oauth-login-webflux) diff --git a/spring-5-reactive-security/README.md b/spring-5-reactive-security/README.md index 845d07cd7f..ebb107645b 100644 --- a/spring-5-reactive-security/README.md +++ b/spring-5-reactive-security/README.md @@ -1,5 +1,7 @@ ## Spring 5 Reactive Security Examples +This module contains articles about reactive Spring Security 5 + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index 538a15c879..b782f817ad 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -1,5 +1,7 @@ ## Spring 5 Reactive Project +This module contains articles about reactive Spring 5 + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring @@ -20,3 +22,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) - [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) - [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) +- [more...](/spring-5-reactive-2) diff --git a/spring-5-security-oauth/README.md b/spring-5-security-oauth/README.md index a5cec370c7..4e080fc517 100644 --- a/spring-5-security-oauth/README.md +++ b/spring-5-security-oauth/README.md @@ -1,3 +1,7 @@ +## Spring 5 Security OAuth + +This module contains articles about Spring 5 OAuth Security + ## Relevant articles: - [Spring Security 5 – OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login) diff --git a/spring-5-security/README.md b/spring-5-security/README.md index 37dc8b0f28..23b46f4dc9 100644 --- a/spring-5-security/README.md +++ b/spring-5-security/README.md @@ -1,3 +1,7 @@ +## Spring 5 Security + +This module contains articles about Spring Security 5 + ## Relevant articles: - [Extra Login Fields with Spring Security](http://www.baeldung.com/spring-security-extra-login-fields) diff --git a/spring-5-webflux/README.md b/spring-5-webflux/README.md index 87d9ae0dd3..55ab0b8af4 100644 --- a/spring-5-webflux/README.md +++ b/spring-5-webflux/README.md @@ -1,3 +1,7 @@ +## Spring 5 WebFlux + +This module contains articles about Spring 5 WebFlux + ## Relevant articles: - [Spring Boot Reactor Netty Configuration](https://www.baeldung.com/spring-boot-reactor-netty) From 2140022058e25dc6ef986ff310ae3c132025ba57 Mon Sep 17 00:00:00 2001 From: Juan Moreno Date: Tue, 17 Sep 2019 22:35:11 -0300 Subject: [PATCH 213/396] BAEL 2338 - Updated code for the article Convert XML to HTML in Java (#7813) * FEAT Added close handling to resources & extra security configurations * UPDATE Added extra security configuration * UPDATE Closed input stream & rename local variables to avoid shadowing --- .../freemarker/FreemarkerTransformer.java | 9 +- .../xmlhtml/jaxp/JaxpTransformer.java | 17 +-- .../xmlhtml/mustache/MustacheTransformer.java | 11 +- .../xmlhtml/stax/StaxTransformer.java | 110 ++++++++++-------- 4 files changed, 80 insertions(+), 67 deletions(-) diff --git a/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java index 61528dbfad..04e9b2e8cf 100644 --- a/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java +++ b/xml/src/main/java/com/baeldung/xmlhtml/freemarker/FreemarkerTransformer.java @@ -24,7 +24,7 @@ public class FreemarkerTransformer { this.templateFile = templateFile; } - public String html() throws IOException, XMLStreamException, TemplateException { + public String html() throws IOException, TemplateException { Configuration cfg = new Configuration(Configuration.VERSION_2_3_29); cfg.setDirectoryForTemplateLoading(new File(templateDirectory)); cfg.setDefaultEncoding(StandardCharsets.UTF_8.toString()); @@ -33,8 +33,9 @@ public class FreemarkerTransformer { cfg.setWrapUncheckedExceptions(true); cfg.setFallbackOnNullLoopVariable(false); Template temp = cfg.getTemplate(templateFile); - Writer output = new StringWriter(); - temp.process(staxTransformer.buildMap(), output); - return output.toString(); + try (Writer output = new StringWriter()) { + temp.process(staxTransformer.getMap(), output); + return output.toString(); + } } } diff --git a/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java index be3dde3805..3c288122a3 100644 --- a/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java +++ b/xml/src/main/java/com/baeldung/xmlhtml/jaxp/JaxpTransformer.java @@ -27,12 +27,13 @@ public class JaxpTransformer { // 1- Build the doc from the XML file factory = DocumentBuilderFactory.newInstance(); factory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + factory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true); input = factory .newDocumentBuilder() .parse(resourcePath); } - public String html() throws ParserConfigurationException, TransformerException { + public String html() throws ParserConfigurationException, TransformerException, IOException { Element xml = input.getDocumentElement(); Document doc = factory .newDocumentBuilder() @@ -48,19 +49,19 @@ public class JaxpTransformer { Element body = buildBody(map, doc); html.appendChild(body); doc.appendChild(html); - Writer output = applyTransformation(doc); - return String.format("%n%s", output.toString()); + return String.format("%n%s", applyTransformation(doc)); } - private Writer applyTransformation(Document doc) throws TransformerException { + private String applyTransformation(Document doc) throws TransformerException, IOException { TransformerFactory transformerFactory = TransformerFactory.newInstance(); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); transformerFactory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); - Writer output = new StringWriter(); - Transformer transformer = transformerFactory.newTransformer(); - transformer.transform(new DOMSource(doc), new StreamResult(output)); - return output; + try (Writer output = new StringWriter()) { + Transformer transformer = transformerFactory.newTransformer(); + transformer.transform(new DOMSource(doc), new StreamResult(output)); + return output.toString(); + } } private Map buildMap(Element xml) { diff --git a/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java index ce3bf3cada..88e93463db 100644 --- a/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java +++ b/xml/src/main/java/com/baeldung/xmlhtml/mustache/MustacheTransformer.java @@ -19,12 +19,13 @@ public class MustacheTransformer { this.templateFile = templateFile; } - public String html() throws IOException, XMLStreamException { + public String html() throws IOException { MustacheFactory mf = new DefaultMustacheFactory(); Mustache mustache = mf.compile(templateFile); - Writer output = new StringWriter(); - mustache.execute(output, staxTransformer.buildMap()); - output.flush(); - return output.toString(); + try (Writer output = new StringWriter()) { + mustache.execute(output, staxTransformer.getMap()); + output.flush(); + return output.toString(); + } } } diff --git a/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java b/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java index 67b3c1c9ce..d7762f3c1f 100644 --- a/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java +++ b/xml/src/main/java/com/baeldung/xmlhtml/stax/StaxTransformer.java @@ -2,7 +2,7 @@ package com.baeldung.xmlhtml.stax; import javax.xml.stream.*; import java.io.FileInputStream; -import java.io.FileNotFoundException; +import java.io.IOException; import java.io.StringWriter; import java.io.Writer; import java.util.HashMap; @@ -10,80 +10,90 @@ import java.util.Map; public class StaxTransformer { - private XMLStreamReader input; + private Map map; - public StaxTransformer(String resourcePath) throws FileNotFoundException, XMLStreamException { + public StaxTransformer(String resourcePath) throws IOException, XMLStreamException { XMLInputFactory factory = XMLInputFactory.newInstance(); factory.setProperty(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); factory.setProperty(XMLInputFactory.SUPPORT_DTD, Boolean.FALSE); - input = factory.createXMLStreamReader(new FileInputStream(resourcePath)); + XMLStreamReader input = null; + try (FileInputStream file = new FileInputStream(resourcePath)) { + input = factory.createXMLStreamReader(file); + map = buildMap(input); + } finally { + if (input != null) { + input.close(); + } + } } - public String html() throws XMLStreamException { - Map map = buildMap(); - Writer output = new StringWriter(); - XMLStreamWriter writer = XMLOutputFactory - .newInstance() - .createXMLStreamWriter(output); - //Head - writer.writeDTD(""); - writer.writeCharacters(String.format("%n")); - writer.writeStartElement("html"); - writer.writeAttribute("lang", "en"); - writer.writeCharacters(String.format("%n")); - writer.writeStartElement("head"); - writer.writeCharacters(String.format("%n")); - writer.writeDTD(""); - writer.writeCharacters(String.format("%n")); - writer.writeStartElement("title"); - writer.writeCharacters(map.get("heading")); - writer.writeEndElement(); - writer.writeCharacters(String.format("%n")); - writer.writeEndElement(); - writer.writeCharacters(String.format("%n")); - //Body - writer.writeStartElement("body"); - writer.writeCharacters(String.format("%n")); - writer.writeStartElement("p"); - writer.writeCharacters(map.get("from")); - writer.writeEndElement(); - writer.writeCharacters(String.format("%n")); - writer.writeStartElement("p"); - writer.writeCharacters(map.get("content")); - writer.writeEndElement(); - writer.writeCharacters(String.format("%n")); - writer.writeEndElement(); - writer.writeCharacters(String.format("%n")); - writer.writeEndDocument(); - writer.writeCharacters(String.format("%n")); - writer.flush(); - writer.close(); - return output.toString(); + public String html() throws XMLStreamException, IOException { + try (Writer output = new StringWriter()) { + XMLStreamWriter writer = XMLOutputFactory + .newInstance() + .createXMLStreamWriter(output); + //Head + writer.writeDTD(""); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("html"); + writer.writeAttribute("lang", "en"); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("head"); + writer.writeCharacters(String.format("%n")); + writer.writeDTD(""); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("title"); + writer.writeCharacters(map.get("heading")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + //Body + writer.writeStartElement("body"); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("p"); + writer.writeCharacters(map.get("from")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeStartElement("p"); + writer.writeCharacters(map.get("content")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeEndElement(); + writer.writeCharacters(String.format("%n")); + writer.writeEndDocument(); + writer.writeCharacters(String.format("%n")); + writer.flush(); + return output.toString(); + } } - public Map buildMap() throws XMLStreamException { - Map map = new HashMap<>(); + private Map buildMap(XMLStreamReader input) throws XMLStreamException { + Map tempMap = new HashMap<>(); while (input.hasNext()) { input.next(); if (input.isStartElement()) { if (input .getLocalName() .equals("heading")) { - map.put("heading", input.getElementText()); + tempMap.put("heading", input.getElementText()); } if (input .getLocalName() .equals("from")) { - map.put("from", String.format("from: %s", input.getElementText())); + tempMap.put("from", String.format("from: %s", input.getElementText())); } if (input .getLocalName() .equals("content")) { - map.put("content", input.getElementText()); + tempMap.put("content", input.getElementText()); } } } - input.close(); + return tempMap; + } + + public Map getMap() { return map; } } From a958de4d3f06b5d2061b51e9042d37cb6dcc576b Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Thu, 19 Sep 2019 17:35:06 +0100 Subject: [PATCH 214/396] [BAEL-17490] README descriptions 6 --- spring-boot-data/README.md | 4 +++ .../{README.MD => README.md} | 4 +++ spring-boot-ops-2/{README.MD => README.md} | 4 +++ spring-boot-ops/README.md | 5 ++++ spring-boot-parent/README.md | 4 +++ spring-boot-property-exp/README.md | 27 ++++++++++++------- spring-boot-rest/README.md | 24 ++++++++++++----- spring-boot-security/README.md | 16 ++++++++--- spring-boot-testing/{README.MD => README.md} | 5 ++++ spring-boot-vue/README.md | 4 +++ 10 files changed, 77 insertions(+), 20 deletions(-) rename spring-boot-libraries/{README.MD => README.md} (74%) rename spring-boot-ops-2/{README.MD => README.md} (71%) rename spring-boot-testing/{README.MD => README.md} (86%) diff --git a/spring-boot-data/README.md b/spring-boot-data/README.md index 6f0b8c8123..513c5fed18 100644 --- a/spring-boot-data/README.md +++ b/spring-boot-data/README.md @@ -1,3 +1,7 @@ +## Spring Boot Data + +This module contains articles about Spring Boot with Spring Data + ## Relevant Articles: - [Formatting JSON Dates in Spring Boot](https://www.baeldung.com/spring-boot-formatting-json-dates) diff --git a/spring-boot-libraries/README.MD b/spring-boot-libraries/README.md similarity index 74% rename from spring-boot-libraries/README.MD rename to spring-boot-libraries/README.md index f3706e0fa4..f0bc3c9e89 100644 --- a/spring-boot-libraries/README.MD +++ b/spring-boot-libraries/README.md @@ -1,3 +1,7 @@ +## Spring Boot Libraries + +This module contains articles about various Spring Boot libraries + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-boot-ops-2/README.MD b/spring-boot-ops-2/README.md similarity index 71% rename from spring-boot-ops-2/README.MD rename to spring-boot-ops-2/README.md index b4218dc395..fa48cfd4da 100644 --- a/spring-boot-ops-2/README.MD +++ b/spring-boot-ops-2/README.md @@ -1,3 +1,7 @@ +## Spring Boot Operations + +This module contains articles about Spring Boot Operations + ### Relevant Articles - [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat) diff --git a/spring-boot-ops/README.md b/spring-boot-ops/README.md index 5be5c974d3..a40732d336 100644 --- a/spring-boot-ops/README.md +++ b/spring-boot-ops/README.md @@ -1,3 +1,7 @@ +## Spring Boot Operations + +This module contains articles about Spring Boot Operations + ### Relevant Articles: - [Deploy a Spring Boot WAR into a Tomcat Server](http://www.baeldung.com/spring-boot-war-tomcat-deploy) - [Spring Boot Dependency Management with a Custom Parent](http://www.baeldung.com/spring-boot-dependency-management-custom-parent) @@ -12,3 +16,4 @@ - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar) - [EnvironmentPostProcessor in Spring Boot](https://www.baeldung.com/spring-boot-environmentpostprocessor) + - [more...](/spring-boot-ops-2) \ No newline at end of file diff --git a/spring-boot-parent/README.md b/spring-boot-parent/README.md index c3bb4c700d..b48a286d62 100644 --- a/spring-boot-parent/README.md +++ b/spring-boot-parent/README.md @@ -1,3 +1,7 @@ +## Spring Boot Parent + +This module contains articles about Spring Boot Starter Parent + ### Relevant Articles - [The Spring Boot Starter Parent](https://www.baeldung.com/spring-boot-starter-parent) diff --git a/spring-boot-property-exp/README.md b/spring-boot-property-exp/README.md index 70cf6bdfac..e880837dc0 100644 --- a/spring-boot-property-exp/README.md +++ b/spring-boot-property-exp/README.md @@ -1,18 +1,27 @@ -## The Module Holds Sources for the Following Articles +## Spring Boot Property Expansion + +This Module contains articles about Spring Boot Property Expansion + +### Relevant Articles + - [Automatic Property Expansion with Spring Boot](http://www.baeldung.com/spring-boot-auto-property-expansion) -### Module property-exp-default-config - This module contains both a standard Maven Spring Boot build and the Gradle build which is Maven compatible. +## SubModules - In order to execute the Maven example, run the following command: +### property-exp-default-config + +This module contains both a standard Maven Spring Boot build and the Gradle build which is Maven compatible. - `mvn spring-boot:run` +In order to execute the Maven example, run the following command: - To execute the Gradle example: +`mvn spring-boot:run` + +To execute the Gradle example: `gradle bootRun` - ### Module property-exp-custom-config - This project is not using the standard Spring Boot parent and is configured manually. Run the following command: +### property-exp-custom-config - `mvn exec:java` +This project is not using the standard Spring Boot parent and is configured manually. Run the following command: + +`mvn exec:java` diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md index 6f365bd465..b3365d932e 100644 --- a/spring-boot-rest/README.md +++ b/spring-boot-rest/README.md @@ -1,4 +1,19 @@ -Module for the articles that are part of the Spring REST E-book: +## Spring Boot REST + +This module contains articles about Spring Boot RESTful APIs. + +### Relevant Articles + +- [HATEOAS for a Spring REST Service](http://www.baeldung.com/rest-api-discoverability-with-spring) +- [Versioning a REST API](http://www.baeldung.com/rest-versioning) +- [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring) +- [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types) +- [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections) +- [Spring Boot Consuming and Producing JSON](https://www.baeldung.com/spring-boot-json) + +### E-book + +These articles are part of the Spring REST E-book: 1. [Bootstrap a Web Application with Spring 5](https://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration) 2. [Build a REST API with Spring and Java Config](http://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration) @@ -11,9 +26,4 @@ Module for the articles that are part of the Spring REST E-book: 9. [REST Pagination in Spring](http://www.baeldung.com/rest-api-pagination-in-spring) 10. [Test a REST API with Java](http://www.baeldung.com/integration-testing-a-rest-api) -- [HATEOAS for a Spring REST Service](http://www.baeldung.com/rest-api-discoverability-with-spring) -- [Versioning a REST API](http://www.baeldung.com/rest-versioning) -- [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring) -- [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types) -- [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections) -- [Spring Boot Consuming and Producing JSON](https://www.baeldung.com/spring-boot-json) + diff --git a/spring-boot-security/README.md b/spring-boot-security/README.md index 30a3218672..be40010091 100644 --- a/spring-boot-security/README.md +++ b/spring-boot-security/README.md @@ -1,3 +1,13 @@ +## Spring Boot Security + +This module contains articles about Spring Boot Security + +### Relevant Articles: + +- [Spring Boot Security Auto-Configuration](http://www.baeldung.com/spring-boot-security-autoconfiguration) +- [Spring Security for Spring Boot Integration Tests](https://www.baeldung.com/spring-security-integration-tests) +- [Introduction to Spring Security Taglibs](https://www.baeldung.com/spring-security-taglibs) + ### Spring Boot Security Auto-Configuration - mvn clean install @@ -5,9 +15,7 @@ - uncomment security properties for easy testing. If not random will be generated. ### CURL commands + - curl -X POST -u baeldung-admin:baeldung -d grant_type=client_credentials -d username=baeldung-admin -d password=baeldung http://localhost:8080/oauth/token -### Relevant Articles: -- [Spring Boot Security Auto-Configuration](http://www.baeldung.com/spring-boot-security-autoconfiguration) -- [Spring Security for Spring Boot Integration Tests](https://www.baeldung.com/spring-security-integration-tests) -- [Introduction to Spring Security Taglibs](https://www.baeldung.com/spring-security-taglibs) + diff --git a/spring-boot-testing/README.MD b/spring-boot-testing/README.md similarity index 86% rename from spring-boot-testing/README.MD rename to spring-boot-testing/README.md index 7a4c4f53a1..0b2533e6bc 100644 --- a/spring-boot-testing/README.MD +++ b/spring-boot-testing/README.md @@ -1,4 +1,9 @@ +## Spring Boot Testing + +This module contains articles about Spring Boot testing + ### The Course + The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: diff --git a/spring-boot-vue/README.md b/spring-boot-vue/README.md index e68f961e51..5de138826c 100644 --- a/spring-boot-vue/README.md +++ b/spring-boot-vue/README.md @@ -1,2 +1,6 @@ +## Spring Boot Vue + +This module contains articles about Spring Boot with Vue.js + ### Relevant Articles: - [Vue.js Frontend with a Spring Boot Backend](http://www.baeldung.com/spring-boot-vue-js) From a4686004be0653836f0996a50bb6fd195feac2c6 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Thu, 19 Sep 2019 17:55:15 +0100 Subject: [PATCH 215/396] [BAEL-17491] README descriptions 7 --- spring-cloud-bus/README.md | 4 ++++ spring-cloud-cli/README.md | 4 ++-- spring-cloud-data-flow/README.MD | 2 -- spring-cloud-data-flow/README.md | 4 ++++ spring-cloud/README.md | 3 +++ spring-core-2/README.md | 4 ++++ spring-core/README.md | 5 +++++ spring-cucumber/README.md | 4 ++++ spring-data-rest-querydsl/README.md | 4 ++++ spring-data-rest/README.md | 28 ++++++++++++++++------------ spring-dispatcher-servlet/README.md | 4 ++++ 11 files changed, 50 insertions(+), 16 deletions(-) delete mode 100644 spring-cloud-data-flow/README.MD create mode 100644 spring-cloud-data-flow/README.md create mode 100644 spring-cloud/README.md diff --git a/spring-cloud-bus/README.md b/spring-cloud-bus/README.md index c5410ca4e2..82f2dbba63 100644 --- a/spring-cloud-bus/README.md +++ b/spring-cloud-bus/README.md @@ -1,3 +1,7 @@ +## Spring Cloud Bus + +This modules contains articles about Spring Cloud Bus + ### Relevant articles - [Spring Cloud Bus](http://www.baeldung.com/spring-cloud-bus) diff --git a/spring-cloud-cli/README.md b/spring-cloud-cli/README.md index 7f29be3f07..99df3ddbad 100644 --- a/spring-cloud-cli/README.md +++ b/spring-cloud-cli/README.md @@ -1,6 +1,6 @@ -========= - ## Spring Cloud CLI +This module contains articles about Spring Cloud CLI + ### Relevant Articles: - [Introduction to Spring Cloud CLI](http://www.baeldung.com/spring-cloud-cli) diff --git a/spring-cloud-data-flow/README.MD b/spring-cloud-data-flow/README.MD deleted file mode 100644 index f2ab96de2c..0000000000 --- a/spring-cloud-data-flow/README.MD +++ /dev/null @@ -1,2 +0,0 @@ - -This is an aggregator module for Spring Cloud Data Flow modules. diff --git a/spring-cloud-data-flow/README.md b/spring-cloud-data-flow/README.md new file mode 100644 index 0000000000..40e1db6840 --- /dev/null +++ b/spring-cloud-data-flow/README.md @@ -0,0 +1,4 @@ +## Spring Cloud Data Flow + +This module contains modules about Spring Cloud Data Flow + diff --git a/spring-cloud/README.md b/spring-cloud/README.md new file mode 100644 index 0000000000..1cc9d9d3cf --- /dev/null +++ b/spring-cloud/README.md @@ -0,0 +1,3 @@ +## Spring Cloud + +This module contains modules about Spring Cloud \ No newline at end of file diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 113bbe9c83..4a53c60b0d 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -1,3 +1,7 @@ +## Spring Core + +This module contains articles about Core Spring Functionality + ## Relevant Articles: - [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean) diff --git a/spring-core/README.md b/spring-core/README.md index 3ff3f1ea41..018012a927 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -1,3 +1,7 @@ +## Spring Core + +This module contains articles about Core Spring Functionality + ### Relevant Articles: - [Wiring in Spring: @Autowired, @Resource and @Inject](http://www.baeldung.com/spring-annotations-resource-inject-autowire) - [Constructor Injection in Spring with Lombok](http://www.baeldung.com/spring-injection-lombok) @@ -9,4 +13,5 @@ - [Spring Application Context Events](https://www.baeldung.com/spring-context-events) - [What is a Spring Bean?](https://www.baeldung.com/spring-bean) - [Spring PostConstruct and PreDestroy Annotations](https://www.baeldung.com/spring-postconstruct-predestroy) +- [more...](/spring-core-2) diff --git a/spring-cucumber/README.md b/spring-cucumber/README.md index 1e506f3a09..0638ff777a 100644 --- a/spring-cucumber/README.md +++ b/spring-cucumber/README.md @@ -1,2 +1,6 @@ +## Spring Cucumber + +This module contains articles about Spring testing with Cucumber + ### Relevant Articles: - [Cucumber Spring Integration](http://www.baeldung.com/cucumber-spring-integration) diff --git a/spring-data-rest-querydsl/README.md b/spring-data-rest-querydsl/README.md index 03b5fee06a..88efaff35e 100644 --- a/spring-data-rest-querydsl/README.md +++ b/spring-data-rest-querydsl/README.md @@ -1,2 +1,6 @@ +## Spring Data REST Querydsl + +This module contains articles about Spring Data REST Querydsl + ### Relevant Articles: - [REST Query Language Over Multiple Tables with Querydsl Web Support](http://www.baeldung.com/rest-querydsl-multiple-tables) diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md index 4b89a24bbc..b12590e5e5 100644 --- a/spring-data-rest/README.md +++ b/spring-data-rest/README.md @@ -1,9 +1,21 @@ +## Spring Data REST + +This module contains articles about Spring Data REST + +### Relevant Articles: +- [Introduction to Spring Data REST](http://www.baeldung.com/spring-data-rest-intro) +- [Guide to Spring Data REST Validators](http://www.baeldung.com/spring-data-rest-validators) +- [Working with Relationships in Spring Data REST](http://www.baeldung.com/spring-data-rest-relationships) +- [AngularJS CRUD Application with Spring Data REST](http://www.baeldung.com/angularjs-crud-with-spring-data-rest) +- [Projections and Excerpts in Spring Data REST](http://www.baeldung.com/spring-data-rest-projections-excerpts) +- [Spring Data REST Events with @RepositoryEventHandler](http://www.baeldung.com/spring-data-rest-events) +- [Customizing HTTP Endpoints in Spring Data REST](https://www.baeldung.com/spring-data-rest-customize-http-endpoints) +- [Spring Boot with SQLite](https://www.baeldung.com/spring-boot-sqlite) +- [Spring Data Web Support](https://www.baeldung.com/spring-data-web-support) + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring -# About this project -This project contains examples from the [Introduction to Spring Data REST](http://www.baeldung.com/spring-data-rest-intro) article from Baeldung. - # Running the project The application uses [Spring Boot](http://projects.spring.io/spring-boot/), so it is easy to run. You can start it any of a few ways: * Run the `main` method from `SpringDataRestApplication` @@ -13,12 +25,4 @@ The application uses [Spring Boot](http://projects.spring.io/spring-boot/), so i # Viewing the running application To view the running application, visit [http://localhost:8080](http://localhost:8080) in your browser -### Relevant Articles: -- [Guide to Spring Data REST Validators](http://www.baeldung.com/spring-data-rest-validators) -- [Working with Relationships in Spring Data REST](http://www.baeldung.com/spring-data-rest-relationships) -- [AngularJS CRUD Application with Spring Data REST](http://www.baeldung.com/angularjs-crud-with-spring-data-rest) -- [Projections and Excerpts in Spring Data REST](http://www.baeldung.com/spring-data-rest-projections-excerpts) -- [Spring Data REST Events with @RepositoryEventHandler](http://www.baeldung.com/spring-data-rest-events) -- [Customizing HTTP Endpoints in Spring Data REST](https://www.baeldung.com/spring-data-rest-customize-http-endpoints) -- [Spring Boot with SQLite](https://www.baeldung.com/spring-boot-sqlite) -- [Spring Data Web Support](https://www.baeldung.com/spring-data-web-support) + diff --git a/spring-dispatcher-servlet/README.md b/spring-dispatcher-servlet/README.md index a93993679f..3954d4df5a 100644 --- a/spring-dispatcher-servlet/README.md +++ b/spring-dispatcher-servlet/README.md @@ -1,3 +1,7 @@ +## Spring DispatcherServlet + +This module contains articles about Spring DispatcherServlet + ## Relevant articles: - [An Intro to the Spring DispatcherServlet](http://www.baeldung.com/spring-dispatcherservlet) From 5e1c8406fd67f09d4f852057245e7e2d9a755fa0 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Thu, 19 Sep 2019 17:57:14 +0100 Subject: [PATCH 216/396] minor edits --- spring-cloud-bus/README.md | 2 +- spring-core-2/README.md | 2 +- spring-core/README.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/spring-cloud-bus/README.md b/spring-cloud-bus/README.md index 82f2dbba63..9c33353a24 100644 --- a/spring-cloud-bus/README.md +++ b/spring-cloud-bus/README.md @@ -1,6 +1,6 @@ ## Spring Cloud Bus -This modules contains articles about Spring Cloud Bus +This module contains articles about Spring Cloud Bus ### Relevant articles diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 4a53c60b0d..2f2ca7b351 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -1,6 +1,6 @@ ## Spring Core -This module contains articles about Core Spring Functionality +This module contains articles about core Spring functionality ## Relevant Articles: diff --git a/spring-core/README.md b/spring-core/README.md index 018012a927..c3c770a856 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -1,6 +1,6 @@ ## Spring Core -This module contains articles about Core Spring Functionality +This module contains articles about core Spring functionality ### Relevant Articles: - [Wiring in Spring: @Autowired, @Resource and @Inject](http://www.baeldung.com/spring-annotations-resource-inject-autowire) From 4e063a1120afb7aec6dc9b6ff5548472bc665c5c Mon Sep 17 00:00:00 2001 From: Nikunj Gandhi Date: Thu, 19 Sep 2019 15:26:45 -0400 Subject: [PATCH 217/396] BAEL-3214 | Code review related changes - 1 --- .../filewriter/FileWriterExample.java | 37 ---------------- .../filewriter/FileWriterExampleUnitTest.java | 42 ++++++++----------- 2 files changed, 17 insertions(+), 62 deletions(-) delete mode 100644 core-java-modules/core-java-io-2/src/main/java/com/baeldung/filewriter/FileWriterExample.java diff --git a/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filewriter/FileWriterExample.java b/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filewriter/FileWriterExample.java deleted file mode 100644 index d60f0800ec..0000000000 --- a/core-java-modules/core-java-io-2/src/main/java/com/baeldung/filewriter/FileWriterExample.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.baeldung.filewriter; - -import java.io.BufferedWriter; -import java.io.FileWriter; -import java.io.IOException; -import java.util.List; - -public class FileWriterExample { - - public void writeString(String fileName, String strToWrite) throws IOException { - try (FileWriter fileWriter = new FileWriter(fileName)) { - fileWriter.write(strToWrite); - } - } - - public void appendString(String fileName, String stringToAppend) throws IOException { - try (FileWriter fileWriter = new FileWriter(fileName, true)) { - fileWriter.append(stringToAppend); - } - } - - public void writeCharArray(String fileName, char[] charArrToWrite) throws IOException { - try (FileWriter fileWriter = new FileWriter(fileName)) { - fileWriter.write(charArrToWrite); - } - } - - public void writeWithBufferedWriter(String fileName, List stringsToWrite) throws IOException { - try (FileWriter fileWriter = new FileWriter(fileName); BufferedWriter bufferedWriter = new BufferedWriter(fileWriter)) { - for (String stringToWrite : stringsToWrite) { - bufferedWriter.write(stringToWrite); - } - } - - } - -} diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java index a1fdb5459e..5a8dfcc381 100644 --- a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java @@ -1,12 +1,9 @@ package com.baeldung.filewriter; +import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.stream.IntStream; import org.junit.After; import org.junit.Assert; @@ -15,11 +12,6 @@ import org.junit.Test; public class FileWriterExampleUnitTest { private static final String FILE_NAME = "src/test/resources/FileWriterTest.txt"; - private static final String STRING_TO_WRITE = "Hello Folks!"; - private static final String STRING_TO_APPEND = "Hello Folks Again!"; - private static final char[] CHAR_ARRAY_TO_WRITE = STRING_TO_WRITE.toCharArray(); - - private FileWriterExample fileWriterExample = new FileWriterExample(); @After public void tearDown() throws IOException { @@ -28,30 +20,30 @@ public class FileWriterExampleUnitTest { @Test public void testWriteString() throws IOException { - fileWriterExample.writeString(FILE_NAME, STRING_TO_WRITE); - Assert.assertEquals(STRING_TO_WRITE, new String(Files.readAllBytes(Path.of(FILE_NAME)))); + try (FileWriter fileWriter = new FileWriter(FILE_NAME)) { + fileWriter.write("Hello Folks!"); + } + Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of(FILE_NAME)))); } @Test public void testAppendString() throws IOException { - fileWriterExample.writeString(FILE_NAME, STRING_TO_WRITE); - fileWriterExample.appendString(FILE_NAME, STRING_TO_APPEND); - Assert.assertEquals(STRING_TO_WRITE + STRING_TO_APPEND, new String(Files.readAllBytes(Path.of(FILE_NAME)))); + try (FileWriter fileWriter = new FileWriter(FILE_NAME)) { + fileWriter.write("Hello Folks!"); + } + // using another try with resources to reopen the file in append mode + try (FileWriter fileWriter = new FileWriter(FILE_NAME, true)) { + fileWriter.write("Hello Folks Again!"); + } + + Assert.assertEquals("Hello Folks!" + "Hello Folks Again!", new String(Files.readAllBytes(Path.of(FILE_NAME)))); } @Test public void testWriteCharArray() throws IOException { - fileWriterExample.writeCharArray(FILE_NAME, CHAR_ARRAY_TO_WRITE); - Assert.assertEquals(STRING_TO_WRITE, new String(Files.readAllBytes(Path.of(FILE_NAME)))); - } - - @Test - public void testWriteWithBufferedWriter() throws IOException{ - final List stringsToWrite = new ArrayList<>(); - for(int i=0 ; i < 10000;i++) { - stringsToWrite.add("Random string "+i); + try (FileWriter fileWriter = new FileWriter(FILE_NAME)) { + fileWriter.write("Hello Folks!".toCharArray()); } - fileWriterExample.writeWithBufferedWriter(FILE_NAME, stringsToWrite); - Assert.assertNotNull(new String(Files.readAllBytes(Path.of(FILE_NAME)))); + Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of(FILE_NAME)))); } } From 52934fdb209d773c3360067b397ab38406473a01 Mon Sep 17 00:00:00 2001 From: Nikunj Gandhi Date: Thu, 19 Sep 2019 15:31:48 -0400 Subject: [PATCH 218/396] BAEL-3214 | Code review related changes - 2 --- .../filewriter/FileWriterExampleUnitTest.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java index 5a8dfcc381..f94a73b023 100644 --- a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/filewriter/FileWriterExampleUnitTest.java @@ -11,39 +11,37 @@ import org.junit.Test; public class FileWriterExampleUnitTest { - private static final String FILE_NAME = "src/test/resources/FileWriterTest.txt"; - @After public void tearDown() throws IOException { - Files.delete(Path.of(FILE_NAME)); + Files.delete(Path.of("src/test/resources/FileWriterTest.txt")); } @Test public void testWriteString() throws IOException { - try (FileWriter fileWriter = new FileWriter(FILE_NAME)) { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { fileWriter.write("Hello Folks!"); } - Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of(FILE_NAME)))); + Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); } @Test public void testAppendString() throws IOException { - try (FileWriter fileWriter = new FileWriter(FILE_NAME)) { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { fileWriter.write("Hello Folks!"); } // using another try with resources to reopen the file in append mode - try (FileWriter fileWriter = new FileWriter(FILE_NAME, true)) { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt", true)) { fileWriter.write("Hello Folks Again!"); } - Assert.assertEquals("Hello Folks!" + "Hello Folks Again!", new String(Files.readAllBytes(Path.of(FILE_NAME)))); + Assert.assertEquals("Hello Folks!" + "Hello Folks Again!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); } @Test public void testWriteCharArray() throws IOException { - try (FileWriter fileWriter = new FileWriter(FILE_NAME)) { + try (FileWriter fileWriter = new FileWriter("src/test/resources/FileWriterTest.txt")) { fileWriter.write("Hello Folks!".toCharArray()); } - Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of(FILE_NAME)))); + Assert.assertEquals("Hello Folks!", new String(Files.readAllBytes(Path.of("src/test/resources/FileWriterTest.txt")))); } } From 9baee5bc6e88df25304a9b10b2f66331c5fe108f Mon Sep 17 00:00:00 2001 From: Mike Baranski Date: Thu, 19 Sep 2019 23:53:16 -0400 Subject: [PATCH 219/396] [BAEL-3058] Demonstrate named query (#7772) * [BAEL-3058] Demonstrate named query * [BAEL-3058] Demonstrate the wrong way to do it, change to Junit 4 style test with annotations * Fix tab -> space and indentation * Moved hibernate-parameters to persistence-modules directory per request * Update persistence-modules/hibernate-parameters/pom.xml Co-Authored-By: KevinGilmore * Update persistence-modules/hibernate-parameters/pom.xml Co-Authored-By: KevinGilmore * Update persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/NamedParameterUnitTest.java Co-Authored-By: KevinGilmore * Update persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/NamedParameterUnitTest.java Co-Authored-By: KevinGilmore * Set version and add jar packaging --- .../hibernate-parameters/pom.xml | 52 ++++++++++++++ .../hibernate_parameters/Event.hbm.xml | 15 ++++ .../baeldung/hibernate_parameters/Event.java | 30 ++++++++ .../NamedParameterUnitTest.java | 72 +++++++++++++++++++ .../src/test/resources/hibernate.cfg.xml | 28 ++++++++ persistence-modules/pom.xml | 1 + 6 files changed, 198 insertions(+) create mode 100644 persistence-modules/hibernate-parameters/pom.xml create mode 100644 persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.hbm.xml create mode 100644 persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.java create mode 100644 persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/NamedParameterUnitTest.java create mode 100644 persistence-modules/hibernate-parameters/src/test/resources/hibernate.cfg.xml diff --git a/persistence-modules/hibernate-parameters/pom.xml b/persistence-modules/hibernate-parameters/pom.xml new file mode 100644 index 0000000000..b744e181da --- /dev/null +++ b/persistence-modules/hibernate-parameters/pom.xml @@ -0,0 +1,52 @@ + + + 4.0.0 + com.baeldung + hibernate-parameters + 0.1-SNAPSHOT + hibernate-parameters + jar + Hibernate tutorial illustrating the use of named parameters + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + org.hibernate + hibernate-core + 5.4.4.Final + + + + com.h2database + h2 + 1.4.196 + + + + + + + false + src/test/java + + **/*.xml + + + + src/test/resources + + + + + + true + + + diff --git a/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.hbm.xml b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.hbm.xml new file mode 100644 index 0000000000..4055718776 --- /dev/null +++ b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.hbm.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + diff --git a/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.java b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.java new file mode 100644 index 0000000000..f44b1bfd8a --- /dev/null +++ b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/Event.java @@ -0,0 +1,30 @@ +package com.baeldung.hibernate_parameters; + +public class Event { + private Long id; + + private String title; + + public Event() { + } + + public Event(String title) { + this.title = title; + } + + public Long getId() { + return id; + } + + private void setId(Long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/NamedParameterUnitTest.java b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/NamedParameterUnitTest.java new file mode 100644 index 0000000000..23854dc393 --- /dev/null +++ b/persistence-modules/hibernate-parameters/src/test/java/com/baeldung/hibernate_parameters/NamedParameterUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.hibernate_parameters; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.query.Query; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +public class NamedParameterUnitTest { + private SessionFactory sessionFactory; + + @Before + public void setUp() throws Exception { + final StandardServiceRegistry registry = new StandardServiceRegistryBuilder() + .configure() + .build(); + try { + sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory(); + Session session = sessionFactory.openSession(); + session.beginTransaction(); + session.save(new Event("Event 1")); + session.save(new Event("Event 2")); + session.getTransaction().commit(); + session.close(); + } catch (Exception e) { + StandardServiceRegistryBuilder.destroy(registry); + } + } + + @After + public void tearDown() throws Exception { + if (sessionFactory != null) { + sessionFactory.close(); + } + } + + @Test + public void whenNamedParameterProvided_thenCorrect() { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class); + + // This binds the value "Event1" to the parameter :eventTitle + query.setParameter("eventTitle", "Event 1"); + + assertEquals(1, query.list().size()); + session.getTransaction().commit(); + session.close(); + } + + @Test(expected = org.hibernate.QueryException.class) + public void whenNamedParameterMissing_thenThrowsQueryException() { + Session session = sessionFactory.openSession(); + session.beginTransaction(); + Query query = session.createQuery("from Event E WHERE E.title = :eventTitle", Event.class); + + try { + query.list(); + fail("We are expecting an exception!"); + } finally { + session.getTransaction().commit(); + session.close(); + } + } +} diff --git a/persistence-modules/hibernate-parameters/src/test/resources/hibernate.cfg.xml b/persistence-modules/hibernate-parameters/src/test/resources/hibernate.cfg.xml new file mode 100644 index 0000000000..480baae4c1 --- /dev/null +++ b/persistence-modules/hibernate-parameters/src/test/resources/hibernate.cfg.xml @@ -0,0 +1,28 @@ + + + + + + + org.h2.Driver + jdbc:h2:mem:db1;DB_CLOSE_DELAY=-1;MVCC=TRUE + sa + + + 1 + + org.hibernate.dialect.H2Dialect + + org.hibernate.cache.internal.NoCacheProvider + + true + + create + + + + + + \ No newline at end of file diff --git a/persistence-modules/pom.xml b/persistence-modules/pom.xml index 0c22267192..932b62a235 100644 --- a/persistence-modules/pom.xml +++ b/persistence-modules/pom.xml @@ -23,6 +23,7 @@ hibernate5 hibernate-ogm hibernate-mapping + hibernate-parameters influxdb java-cassandra java-cockroachdb From c1caed8ddeaa1276210b144b8717d6f655601f36 Mon Sep 17 00:00:00 2001 From: Antonio Moreno Date: Fri, 20 Sep 2019 04:56:39 +0100 Subject: [PATCH 220/396] moving basicmethods from oop-2 to oop-3 (#7827) --- .../src/main/java/com/baeldung/basicmethods/PersonName.java | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-oop-3}/src/main/java/com/baeldung/basicmethods/PersonName.java (100%) diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/basicmethods/PersonName.java b/core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/basicmethods/PersonName.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/basicmethods/PersonName.java rename to core-java-modules/core-java-lang-oop-3/src/main/java/com/baeldung/basicmethods/PersonName.java From ac8c5efb74dabcb017494d59ec6aad9d4ecf4a84 Mon Sep 17 00:00:00 2001 From: Alfred Samanga Date: Fri, 20 Sep 2019 08:08:12 +0200 Subject: [PATCH 221/396] BAEL-3321 Flogger fluent logging (#7824) * Added Flogger maven dependency * Implemented Flogger logging examples * Finished implementing Flogger logging examples * Changed Flogger Test to Integration tests --- logging-modules/flogger/pom.xml | 27 +++++++ .../com/baeldung/flogger/FloggerExamples.java | 17 +++++ .../flogger/FloggerIntegrationTest.java | 73 +++++++++++++++++++ logging-modules/pom.xml | 1 + 4 files changed, 118 insertions(+) create mode 100644 logging-modules/flogger/pom.xml create mode 100644 logging-modules/flogger/src/main/java/com/baeldung/flogger/FloggerExamples.java create mode 100644 logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java diff --git a/logging-modules/flogger/pom.xml b/logging-modules/flogger/pom.xml new file mode 100644 index 0000000000..2b96332bf6 --- /dev/null +++ b/logging-modules/flogger/pom.xml @@ -0,0 +1,27 @@ + + + + logging-modules + com.baeldung + 1.0.0-SNAPSHOT + + 4.0.0 + + flogger + + + + com.google.flogger + flogger + 0.4 + + + com.google.flogger + flogger-system-backend + 0.4 + runtime + + + \ No newline at end of file diff --git a/logging-modules/flogger/src/main/java/com/baeldung/flogger/FloggerExamples.java b/logging-modules/flogger/src/main/java/com/baeldung/flogger/FloggerExamples.java new file mode 100644 index 0000000000..252d2d38e4 --- /dev/null +++ b/logging-modules/flogger/src/main/java/com/baeldung/flogger/FloggerExamples.java @@ -0,0 +1,17 @@ +package com.baeldung.flogger; + +import com.google.common.flogger.FluentLogger; +import com.google.common.flogger.LoggerConfig; + +import java.util.logging.Level; + +public class FloggerExamples { + + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + + public static void main(String[] args) { + LoggerConfig.of(logger).setLevel(Level.FINE); + Exception exception = new Exception("This is a test exception."); + logger.atInfo().withCause(exception).log("Log message with: %s", "Alfred"); + } +} diff --git a/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java new file mode 100644 index 0000000000..69460dc045 --- /dev/null +++ b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java @@ -0,0 +1,73 @@ +package com.baeldung.flogger; + +import com.google.common.flogger.FluentLogger; +import com.google.common.flogger.LoggerConfig; +import com.google.common.flogger.StackSize; +import org.junit.Test; + +import java.util.concurrent.TimeUnit; +import java.util.logging.Level; +import java.util.stream.IntStream; + +import static com.google.common.flogger.LazyArgs.lazy; + +public class FloggerIntegrationTest { + private static final FluentLogger logger = FluentLogger.forEnclosingClass(); + + @Test + public void givenAnInterval_shouldLogAfterEveryInterval() { + IntStream.range(0, 100).forEach(value -> { + logger.atInfo().every(40).log("This log shows [every 40 iterations] => %d", value); + }); + } + + @Test + public void givenATimeInterval_shouldLogAfterEveryTimeInterval() { + IntStream.range(0, 1_000_0000).forEach(value -> { + logger.atInfo().atMostEvery(10, TimeUnit.SECONDS).log("This log shows [every 10 seconds] => %d", value); + }); + } + + @Test + public void givenASimpleOperation_shouldLogTheResult() { + int result = 45 / 3; + logger.atInfo().log("The result is %d", result); + } + + @Test + public void givenCodeThatThrowsAndException_shouldLogTheException() { + try { + int result = 45 / 0; + } catch (RuntimeException re) { + logger.atInfo().withStackTrace(StackSize.FULL).withCause(re).log("Message"); + } + } + + @Test + public void givenALoggingConfiguration_shouldLogAtTheConfiguredLevel() { + LoggerConfig.of(logger).setLevel(Level.FINE); + logger.atInfo().log("Info Message"); + logger.atWarning().log("Warning Message"); + logger.atSevere().log("Severe Message"); + logger.atFinest().log("Finest Message"); + logger.atFine().log("Fine Message"); + logger.atFiner().log("Finer Message"); + logger.atConfig().log("Config Message"); + } + + @Test + public void givenALongRunningMethodForStats_shouldCallTheMethodLazily() { + //Wrong way of doing it + logger.atFine().log("stats=%s", collectSummaries()); + + // Almost no work done at the log site and structure is preserved. + logger.atFine().log("stats=%s", lazy(() -> collectSummaries())); + } + + public static String collectSummaries() { + //compute summaries in a long-running process + int items = 110; + int s = 30; + return String.format("%d seconds elapsed so far. %d items pending processing", s, items); + } +} diff --git a/logging-modules/pom.xml b/logging-modules/pom.xml index a303e50ff1..927afb6ca9 100644 --- a/logging-modules/pom.xml +++ b/logging-modules/pom.xml @@ -18,6 +18,7 @@ log4j2 logback log-mdc + flogger From 7d65b1fb241e189585bd2133bdcf7e1e3b8502cd Mon Sep 17 00:00:00 2001 From: Devender Kumar <47500074+kumar-devender@users.noreply.github.com> Date: Fri, 20 Sep 2019 08:09:27 +0200 Subject: [PATCH 222/396] BAEL-3286 added component scan filter example (#7786) * BAEL-3286 added component scan filter example * BAEL-3286 added component scan filter example * Fix alingemnt * Remove unused class * Corrected formatting * formatted code --- spring-boot-di/pom.xml | 92 ++++++++++--------- .../filter/annotation/Animal.java | 10 ++ .../ComponentScanAnnotationFilterApp.java | 21 +++++ .../filter/annotation/Elephant.java | 4 + .../componentscan/filter/aspectj/Cat.java | 3 + .../aspectj/ComponentScanCustomFilterApp.java | 24 +++++ .../filter/aspectj/Elephant.java | 3 + .../componentscan/filter/aspectj/Loin.java | 3 + .../filter/assignable/Animal.java | 3 + .../componentscan/filter/assignable/Cat.java | 3 + .../ComponentScanAssignableTypeFilterApp.java | 21 +++++ .../filter/assignable/Elephant.java | 3 + .../componentscan/filter/custom/Cat.java | 3 + .../custom/ComponentScanCustomFilter.java | 22 +++++ .../custom/ComponentScanCustomFilterApp.java | 21 +++++ .../componentscan/filter/custom/Loin.java | 3 + .../componentscan/filter/custom/Pet.java | 3 + .../componentscan/filter/regex/Cat.java | 3 + .../regex/ComponentScanRegexFilterApp.java | 20 ++++ .../componentscan/filter/regex/Elephant.java | 3 + .../componentscan/filter/regex/Loin.java | 3 + 21 files changed, 227 insertions(+), 44 deletions(-) create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanCustomFilterApp.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java diff --git a/spring-boot-di/pom.xml b/spring-boot-di/pom.xml index b07d7c6385..c0faf44335 100644 --- a/spring-boot-di/pom.xml +++ b/spring-boot-di/pom.xml @@ -1,55 +1,59 @@ - 4.0.0 - spring-boot-di - spring-boot-di - jar - Module For Spring Boot DI + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 + spring-boot-di + spring-boot-di + jar + Module For Spring Boot DI - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + - + + + org.aspectj + aspectjweaver + - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-tomcat - provided - + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + provided + - - org.apache.tomcat.embed - tomcat-embed-jasper - provided - + + org.apache.tomcat.embed + tomcat-embed-jasper + provided + - + - - - - org.springframework.boot - spring-boot-maven-plugin - - com.baeldung.SpringBootDiApplication - JAR - - - - + + + + org.springframework.boot + spring-boot-maven-plugin + + com.baeldung.SpringBootDiApplication + JAR + + + + - - com.baeldung.SpringBootDiApplication - + + com.baeldung.SpringBootDiApplication + diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java new file mode 100644 index 0000000000..73bd0e3673 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java @@ -0,0 +1,10 @@ +package com.baeldung.componentscan.filter.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +public @interface Animal { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java new file mode 100644 index 0000000000..7e89870d4b --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java @@ -0,0 +1,21 @@ +package com.baeldung.componentscan.filter.annotation; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +import java.util.Arrays; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Animal.class)) +public class ComponentScanAnnotationFilterApp { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = new AnnotationConfigApplicationContext(ComponentScanAnnotationFilterApp.class); + Arrays.stream(applicationContext.getBeanDefinitionNames()) + .forEach(System.out::println); + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java new file mode 100644 index 0000000000..8ad8111d6b --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java @@ -0,0 +1,4 @@ +package com.baeldung.componentscan.filter.annotation; + +@Animal +public class Elephant { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java new file mode 100644 index 0000000000..b34a2d7112 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.aspectj; + +public class Cat { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanCustomFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanCustomFilterApp.java new file mode 100644 index 0000000000..3674c09531 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanCustomFilterApp.java @@ -0,0 +1,24 @@ +package com.baeldung.componentscan.filter.aspectj; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +import java.util.Arrays; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, + pattern = "com.baeldung.componentscan.filter.aspectj.* " + + "&& !(com.baeldung.componentscan.filter.aspectj.L* " + + "|| com.baeldung.componentscan.filter.aspectj.E*)")) +public class ComponentScanCustomFilterApp { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = new AnnotationConfigApplicationContext(ComponentScanCustomFilterApp.class); + Arrays.stream(applicationContext.getBeanDefinitionNames()) + .forEach(System.out::println); + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java new file mode 100644 index 0000000000..30abc9dcd4 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.aspectj; + +public class Elephant { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java new file mode 100644 index 0000000000..cf442e981e --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.aspectj; + +public class Loin { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java new file mode 100644 index 0000000000..77cf2e72f0 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.assignable; + +public interface Animal { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java new file mode 100644 index 0000000000..262ae154f8 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.assignable; + +public class Cat implements Animal { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java new file mode 100644 index 0000000000..a5fa2b0942 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java @@ -0,0 +1,21 @@ +package com.baeldung.componentscan.filter.assignable; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +import java.util.Arrays; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Animal.class)) +public class ComponentScanAssignableTypeFilterApp { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = new AnnotationConfigApplicationContext(ComponentScanAssignableTypeFilterApp.class); + Arrays.stream(applicationContext.getBeanDefinitionNames()) + .forEach(System.out::println); + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java new file mode 100644 index 0000000000..815e0d762a --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.assignable; + +public class Elephant implements Animal { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java new file mode 100644 index 0000000000..282d6bb641 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.custom; + +public class Cat extends Pet { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java new file mode 100644 index 0000000000..ebaccf7838 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java @@ -0,0 +1,22 @@ +package com.baeldung.componentscan.filter.custom; + +import org.springframework.core.type.ClassMetadata; +import org.springframework.core.type.classreading.MetadataReader; +import org.springframework.core.type.classreading.MetadataReaderFactory; +import org.springframework.core.type.filter.TypeFilter; + +import java.io.IOException; + +public class ComponentScanCustomFilter implements TypeFilter { + + @Override + public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) + throws IOException { + ClassMetadata classMetadata = metadataReader.getClassMetadata(); + String superClass = classMetadata.getSuperClassName(); + if (Pet.class.getName().equalsIgnoreCase(superClass)) { + return true; + } + return false; + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java new file mode 100644 index 0000000000..1a4f5dbf4e --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java @@ -0,0 +1,21 @@ +package com.baeldung.componentscan.filter.custom; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +import java.util.Arrays; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = ComponentScanCustomFilter.class)) +public class ComponentScanCustomFilterApp { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = new AnnotationConfigApplicationContext(ComponentScanCustomFilterApp.class); + Arrays.stream(applicationContext.getBeanDefinitionNames()) + .forEach(System.out::println); + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java new file mode 100644 index 0000000000..0e2f9e0692 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.custom; + +public class Loin { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java new file mode 100644 index 0000000000..9b4497221d --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.custom; + +public class Pet { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java new file mode 100644 index 0000000000..87341cae9d --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.regex; + +public class Cat { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java new file mode 100644 index 0000000000..36e94446b2 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java @@ -0,0 +1,20 @@ +package com.baeldung.componentscan.filter.regex; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +import java.util.Arrays; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*[t]")) +public class ComponentScanRegexFilterApp { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = new AnnotationConfigApplicationContext(ComponentScanRegexFilterApp.class); + Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println); + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java new file mode 100644 index 0000000000..314dca5b77 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.regex; + +public class Elephant { } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java new file mode 100644 index 0000000000..1b75fc1b43 --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java @@ -0,0 +1,3 @@ +package com.baeldung.componentscan.filter.regex; + +public class Loin { } From f2cac1ab7c182b58c60dfacd74e539f6067f47d4 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Fri, 20 Sep 2019 19:00:34 +0530 Subject: [PATCH 223/396] [BAEL-13506] - Split or move core-java-8 module (#7790) --- algorithms-miscellaneous-3/README.md | 1 + algorithms-miscellaneous-3/pom.xml | 17 +++ .../baeldung/counter/CounterStatistics.java | 0 .../com/baeldung/counter/CounterUnitTest.java | 0 .../com/baeldung/counter/CounterUtil.java | 0 core-java-modules/core-java-8/README.md | 41 ++----- core-java-modules/core-java-8/pom.xml | 17 --- .../core-java-annotations/README.md | 11 ++ .../core-java-annotations/pom.xml | 72 +++++++++++++ .../annotations/ClassWithAnnotation.java | 0 .../ClassWithDeprecatedMethod.java | 0 .../annotations/ClassWithSafeVarargs.java | 0 .../ClassWithSuppressWarnings.java | 0 .../com/baeldung/annotations/IntConsumer.java | 0 .../com/baeldung/annotations/Interval.java | 0 .../baeldung/annotations/IntervalUsage.java | 0 .../com/baeldung/annotations/Intervals.java | 0 .../baeldung/annotations/MyAnnotation.java | 0 .../annotations/MyAnnotationTarget.java | 0 .../com/baeldung/annotations/MyOperation.java | 0 .../baeldung/annotations/MyOperationImpl.java | 0 .../com/baeldung/customannotations/Init.java | 0 .../customannotations/JsonElement.java | 0 .../customannotations/JsonSerializable.java | 0 .../JsonSerializationException.java | 0 .../ObjectToJsonConverter.java | 0 .../baeldung/customannotations/Person.java | 0 .../src/main/resources/logback.xml | 13 +++ .../JsonSerializerUnitTest.java | 0 .../src/test/resources/.gitignore | 13 +++ .../core-java-datetime/README.md | 7 ++ core-java-modules/core-java-datetime/pom.xml | 101 ++++++++++++++++++ .../src/main/resources/logback.xml | 13 +++ .../com/baeldung/time/InstantUnitTest.java | 0 .../time/InstantWithJMockUnitTest.java | 0 .../baeldung/time/LocalDateTimeUnitTest.java | 0 .../time/LocalDateTimeWithJMockUnitTest.java | 0 .../src/test/resources/.gitignore | 13 +++ .../core-java-function/README.md | 6 ++ core-java-modules/core-java-function/pom.xml | 49 +++++++++ .../src/main/resources/logback.xml | 13 +++ .../java8/Java8PredicateChainUnitTest.java | 0 .../src/test/resources/.gitignore | 13 +++ core-java-modules/core-java-lambdas/README.md | 1 + .../com/baeldung/doublecolon/Computer.java | 0 .../baeldung/doublecolon/ComputerUtils.java | 4 +- .../com/baeldung/doublecolon/MacbookPro.java | 0 .../function/ComputerPredicate.java | 0 .../doublecolon/function/TriFunction.java | 0 .../doublecolon/ComputerUtilsUnitTest.java | 0 core-java-modules/core-java-lang-2/README.md | 1 + core-java-modules/core-java-lang-2/pom.xml | 17 +++ .../baeldung/primitive/BenchmarkRunner.java | 0 .../primitive/BooleanPrimitiveLookup.java | 0 .../primitive/BooleanWrapperLookup.java | 0 .../primitive/BytePrimitiveLookup.java | 0 .../baeldung/primitive/ByteWrapperLookup.java | 0 .../primitive/CharPrimitiveLookup.java | 0 .../primitive/CharacterWrapperLookup.java | 0 .../primitive/DoublePrimitiveLookup.java | 0 .../primitive/DoubleWrapperLookup.java | 0 .../primitive/FloatPrimitiveLookup.java | 0 .../primitive/FloatWrapperLookup.java | 0 .../primitive/IntPrimitiveLookup.java | 0 .../primitive/IntegerWrapperLookup.java | 0 .../primitive/LongPrimitiveLookup.java | 0 .../baeldung/primitive/LongWrapperLookup.java | 0 .../java/com/baeldung/primitive/Lookup.java | 0 .../primitive/ShortPrimitiveLookup.java | 0 .../primitive/ShortWrapperLookup.java | 0 .../core-java-lang-math/README.md | 7 ++ core-java-modules/core-java-lang-math/pom.xml | 49 +++++++++ .../src/main/resources/logback.xml | 13 +++ .../java8/UnsignedArithmeticUnitTest.java | 0 .../baeldung/math/MathNewMethodsUnitTest.java | 0 .../src/test/resources/.gitignore | 13 +++ .../core-java-lang-oop-2/README.md | 1 + .../application/Application.java | 0 .../model/Alarm.java | 0 .../model/Car.java | 0 .../model/Motorbike.java | 0 .../model/MultiAlarmCar.java | 0 .../model/Vehicle.java | 0 .../StaticDefaulInterfaceMethodUnitTest.java | 0 .../core-java-optional/README.md | 2 + core-java-modules/core-java-optional/pom.xml | 17 +++ .../java/com/baeldung/optional/Modem.java | 0 .../baeldung/optional/OrElseAndOrElseGet.java | 0 .../OrElseAndOrElseGetBenchmarkRunner.java | 0 .../java/com/baeldung/optional/Person.java | 0 .../optional/OptionalChainingUnitTest.java | 0 .../java8/optional/OptionalUnitTest.java | 0 .../optional/OrElseAndOrElseGetUnitTest.java | 0 core-java-modules/core-java-streams/README.md | 9 ++ core-java-modules/core-java-streams/pom.xml | 54 ++++++++++ .../com/baeldung/forEach/ReverseList.java | 0 .../src/main/resources/logback.xml | 13 +++ .../collectors/Java8CollectorsUnitTest.java | 0 .../StreamForEachIfElseUnitTest.java | 0 .../src/test/resources/.gitignore | 13 +++ core-java-modules/core-java-text/README.md | 6 ++ core-java-modules/core-java-text/pom.xml | 32 ++++++ .../src/main/resources/logback.xml | 13 +++ .../src/test/resources/.gitignore | 13 +++ patterns/design-patterns-creational/README.md | 1 + .../baeldung/reducingIfElse/AddCommand.java | 0 .../com/baeldung/reducingIfElse/AddRule.java | 0 .../com/baeldung/reducingIfElse/Addition.java | 0 .../baeldung/reducingIfElse/Calculator.java | 0 .../com/baeldung/reducingIfElse/Command.java | 0 .../com/baeldung/reducingIfElse/Division.java | 0 .../baeldung/reducingIfElse/Expression.java | 0 .../com/baeldung/reducingIfElse/Modulo.java | 0 .../reducingIfElse/Multiplication.java | 0 .../baeldung/reducingIfElse/Operation.java | 0 .../com/baeldung/reducingIfElse/Operator.java | 0 .../reducingIfElse/OperatorFactory.java | 0 .../com/baeldung/reducingIfElse/Result.java | 0 .../com/baeldung/reducingIfElse/Rule.java | 0 .../baeldung/reducingIfElse/RuleEngine.java | 0 .../baeldung/reducingIfElse/Subtraction.java | 0 .../reduceIfelse/CalculatorUnitTest.java | 0 .../reduceIfelse/RuleEngineUnitTest.java | 0 pom.xml | 12 +++ 124 files changed, 640 insertions(+), 51 deletions(-) rename {core-java-modules/core-java-8 => algorithms-miscellaneous-3}/src/test/java/com/baeldung/counter/CounterStatistics.java (100%) rename {core-java-modules/core-java-8 => algorithms-miscellaneous-3}/src/test/java/com/baeldung/counter/CounterUnitTest.java (100%) rename {core-java-modules/core-java-8 => algorithms-miscellaneous-3}/src/test/java/com/baeldung/counter/CounterUtil.java (100%) create mode 100644 core-java-modules/core-java-annotations/README.md create mode 100644 core-java-modules/core-java-annotations/pom.xml rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/IntConsumer.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/Interval.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/IntervalUsage.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/Intervals.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/MyAnnotation.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/MyOperation.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/annotations/MyOperationImpl.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/customannotations/Init.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/customannotations/JsonElement.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/customannotations/JsonSerializable.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/customannotations/JsonSerializationException.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java (100%) rename core-java-modules/{core-java-8 => core-java-annotations}/src/main/java/com/baeldung/customannotations/Person.java (100%) create mode 100644 core-java-modules/core-java-annotations/src/main/resources/logback.xml rename core-java-modules/{core-java-8 => core-java-annotations}/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java (100%) create mode 100644 core-java-modules/core-java-annotations/src/test/resources/.gitignore create mode 100644 core-java-modules/core-java-datetime/README.md create mode 100644 core-java-modules/core-java-datetime/pom.xml create mode 100644 core-java-modules/core-java-datetime/src/main/resources/logback.xml rename core-java-modules/{core-java-8 => core-java-datetime}/src/test/java/com/baeldung/time/InstantUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-datetime}/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-datetime}/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-datetime}/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java (100%) create mode 100644 core-java-modules/core-java-datetime/src/test/resources/.gitignore create mode 100644 core-java-modules/core-java-function/README.md create mode 100644 core-java-modules/core-java-function/pom.xml create mode 100644 core-java-modules/core-java-function/src/main/resources/logback.xml rename core-java-modules/{core-java-8 => core-java-function}/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java (100%) create mode 100644 core-java-modules/core-java-function/src/test/resources/.gitignore rename core-java-modules/{core-java-8 => core-java-lambdas}/src/main/java/com/baeldung/doublecolon/Computer.java (100%) rename core-java-modules/{core-java-8 => core-java-lambdas}/src/main/java/com/baeldung/doublecolon/ComputerUtils.java (100%) rename core-java-modules/{core-java-8 => core-java-lambdas}/src/main/java/com/baeldung/doublecolon/MacbookPro.java (100%) rename core-java-modules/{core-java-8 => core-java-lambdas}/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java (100%) rename core-java-modules/{core-java-8 => core-java-lambdas}/src/main/java/com/baeldung/doublecolon/function/TriFunction.java (100%) rename core-java-modules/{core-java-8 => core-java-lambdas}/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/BenchmarkRunner.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/LongWrapperLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/Lookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-2}/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java (100%) create mode 100644 core-java-modules/core-java-lang-math/README.md create mode 100644 core-java-modules/core-java-lang-math/pom.xml create mode 100644 core-java-modules/core-java-lang-math/src/main/resources/logback.xml rename core-java-modules/{core-java-8 => core-java-lang-math}/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-math}/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java (100%) create mode 100644 core-java-modules/core-java-lang-math/src/test/resources/.gitignore rename core-java-modules/{core-java-8 => core-java-lang-oop-2}/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-oop-2}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-oop-2}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-oop-2}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-oop-2}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-oop-2}/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java (100%) rename core-java-modules/{core-java-8 => core-java-lang-oop-2}/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-optional}/src/main/java/com/baeldung/optional/Modem.java (100%) rename core-java-modules/{core-java-8 => core-java-optional}/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java (100%) rename core-java-modules/{core-java-8 => core-java-optional}/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java (100%) rename core-java-modules/{core-java-8 => core-java-optional}/src/main/java/com/baeldung/optional/Person.java (100%) rename core-java-modules/{core-java-8 => core-java-optional}/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-optional}/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-optional}/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java (100%) create mode 100644 core-java-modules/core-java-streams/README.md create mode 100644 core-java-modules/core-java-streams/pom.xml rename core-java-modules/{core-java-8-2 => core-java-streams}/src/main/java/com/baeldung/forEach/ReverseList.java (100%) create mode 100644 core-java-modules/core-java-streams/src/main/resources/logback.xml rename core-java-modules/{core-java-8 => core-java-streams}/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java (100%) rename core-java-modules/{core-java-8 => core-java-streams}/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java (100%) create mode 100644 core-java-modules/core-java-streams/src/test/resources/.gitignore create mode 100644 core-java-modules/core-java-text/README.md create mode 100644 core-java-modules/core-java-text/pom.xml create mode 100644 core-java-modules/core-java-text/src/main/resources/logback.xml create mode 100644 core-java-modules/core-java-text/src/test/resources/.gitignore rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/AddCommand.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/AddRule.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Addition.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Calculator.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Command.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Division.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Expression.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Modulo.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Multiplication.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Operation.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Operator.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Result.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Rule.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/main/java/com/baeldung/reducingIfElse/Subtraction.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java (100%) rename {core-java-modules/core-java-8 => patterns/design-patterns-creational}/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java (100%) diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-miscellaneous-3/README.md index ce0fde0415..843407f047 100644 --- a/algorithms-miscellaneous-3/README.md +++ b/algorithms-miscellaneous-3/README.md @@ -8,3 +8,4 @@ - [Checking if a Java Graph has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle) - [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique) - [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle) +- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency) \ No newline at end of file diff --git a/algorithms-miscellaneous-3/pom.xml b/algorithms-miscellaneous-3/pom.xml index 5999d33c86..67923d37d7 100644 --- a/algorithms-miscellaneous-3/pom.xml +++ b/algorithms-miscellaneous-3/pom.xml @@ -54,6 +54,21 @@ 1.1.0 test + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator.version} + + + org.openjdk.jmh + jmh-generator-bytecode + ${jmh-generator.version} + @@ -73,5 +88,7 @@ 4.3 28.0-jre 2.6.0 + 1.19 + 1.19 \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterStatistics.java rename to algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterStatistics.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUnitTest.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUnitTest.java rename to algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java b/algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/counter/CounterUtil.java rename to algorithms-miscellaneous-3/src/test/java/com/baeldung/counter/CounterUtil.java diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md index aee7121fb3..6d69d30d00 100644 --- a/core-java-modules/core-java-8/README.md +++ b/core-java-modules/core-java-8/README.md @@ -3,35 +3,12 @@ ## Core Java 8 Cookbooks and Examples ### Relevant Articles: -- [Guide to Java 8’s Collectors](http://www.baeldung.com/java-8-collectors) -- [New Features in Java 8](http://www.baeldung.com/java-8-new-features) -- [The Double Colon Operator in Java 8](http://www.baeldung.com/java-8-double-colon-operator) -- [Guide to Java 8 groupingBy Collector](http://www.baeldung.com/java-groupingby-collector) -- [Strategy Design Pattern in Java 8](http://www.baeldung.com/java-strategy-pattern) -- [Guide to Java 8 Comparator.comparing()](http://www.baeldung.com/java-8-comparator-comparing) -- [Guide To Java 8 Optional](http://www.baeldung.com/java-optional) -- [Guide to the Java 8 forEach](http://www.baeldung.com/foreach-java) -- [The Difference Between map() and flatMap()](http://www.baeldung.com/java-difference-map-and-flatmap) -- [Static and Default Methods in Interfaces in Java](http://www.baeldung.com/java-static-default-methods) -- [Efficient Word Frequency Calculator in Java](http://www.baeldung.com/java-word-frequency) -- [Introduction to Spliterator in Java](http://www.baeldung.com/java-spliterator) -- [Java 8 Math New Methods](http://www.baeldung.com/java-8-math) -- [Overview of Java Built-in Annotations](http://www.baeldung.com/java-default-annotations) -- [Finding Min/Max in an Array with Java](http://www.baeldung.com/java-array-min-max) -- [Internationalization and Localization in Java 8](http://www.baeldung.com/java-8-localization) -- [Java Optional – orElse() vs orElseGet()](http://www.baeldung.com/java-optional-or-else-vs-or-else-get) -- [Java 8 Unsigned Arithmetic Support](http://www.baeldung.com/java-unsigned-arithmetic) -- [Generalized Target-Type Inference in Java](http://www.baeldung.com/java-generalized-target-type-inference) -- [Overriding System Time for Testing in Java](http://www.baeldung.com/java-override-system-time) -- [Set the Time Zone of a Date in Java](https://www.baeldung.com/java-set-date-time-zone) -- [An Overview of Regular Expressions Performance in Java](https://www.baeldung.com/java-regex-performance) -- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects) -- [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic) -- [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements) -- [Java @Override Annotation](https://www.baeldung.com/java-override) -- [Java @SuppressWarnings Annotation](https://www.baeldung.com/java-suppresswarnings) -- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs) -- [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated) -- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain) -- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation) -- [The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach) +- [New Features in Java 8](https://www.baeldung.com/java-8-new-features) +- [Guide to Java 8 groupingBy Collector](https://www.baeldung.com/java-groupingby-collector) +- [Strategy Design Pattern in Java 8](https://www.baeldung.com/java-strategy-pattern) +- [Guide to Java 8 Comparator.comparing()](https://www.baeldung.com/java-8-comparator-comparing) +- [Guide to the Java 8 forEach](https://www.baeldung.com/foreach-java) +- [Introduction to Spliterator in Java](https://www.baeldung.com/java-spliterator) +- [Finding Min/Max in an Array with Java](https://www.baeldung.com/java-array-min-max) +- [Internationalization and Localization in Java 8](https://www.baeldung.com/java-8-localization) +- [Generalized Target-Type Inference in Java](https://www.baeldung.com/java-generalized-target-type-inference) diff --git a/core-java-modules/core-java-8/pom.xml b/core-java-modules/core-java-8/pom.xml index 6e547b7fad..9ef3cd1201 100644 --- a/core-java-modules/core-java-8/pom.xml +++ b/core-java-modules/core-java-8/pom.xml @@ -116,12 +116,6 @@ ${powermock.version} test - - org.jmockit - jmockit - ${jmockit.version} - test - @@ -150,16 +144,6 @@ - - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar - - true - - @@ -176,7 +160,6 @@ 3.6.1 1.8.9 2.0.0-RC.4 - 1.44 1.7.0 1.19 1.19 diff --git a/core-java-modules/core-java-annotations/README.md b/core-java-modules/core-java-annotations/README.md new file mode 100644 index 0000000000..a125e8abd5 --- /dev/null +++ b/core-java-modules/core-java-annotations/README.md @@ -0,0 +1,11 @@ +========= + +## Core Java 8 Cookbooks and Examples + +### Relevant Articles: +- [Java @Override Annotation](https://www.baeldung.com/java-override) +- [Java @SuppressWarnings Annotation](https://www.baeldung.com/java-suppresswarnings) +- [Java @SafeVarargs Annotation](https://www.baeldung.com/java-safevarargs) +- [Java @Deprecated Annotation](https://www.baeldung.com/java-deprecated) +- [Overview of Java Built-in Annotations](https://www.baeldung.com/java-default-annotations) +- [Creating a Custom Annotation in Java](https://www.baeldung.com/java-custom-annotation) \ No newline at end of file diff --git a/core-java-modules/core-java-annotations/pom.xml b/core-java-modules/core-java-annotations/pom.xml new file mode 100644 index 0000000000..7d7d7d4f7e --- /dev/null +++ b/core-java-modules/core-java-annotations/pom.xml @@ -0,0 +1,72 @@ + + 4.0.0 + com.baeldung + core-java-annotations + 0.1.0-SNAPSHOT + core-java-annotations + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator.version} + + + org.openjdk.jmh + jmh-generator-bytecode + ${jmh-generator.version} + + + + + core-java-annotations + + + src/main/resources + true + + + + + + + 3.6.1 + 1.8.9 + 1.19 + 1.19 + + 2.22.1 + + diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithAnnotation.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithDeprecatedMethod.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSafeVarargs.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/ClassWithSuppressWarnings.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntConsumer.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntConsumer.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntConsumer.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Interval.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Interval.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Interval.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Interval.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntervalUsage.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/IntervalUsage.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/IntervalUsage.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Intervals.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/Intervals.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/Intervals.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotation.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotation.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotation.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyAnnotationTarget.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperation.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperation.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperation.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperationImpl.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/annotations/MyOperationImpl.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/annotations/MyOperationImpl.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Init.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Init.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Init.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Init.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonElement.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonElement.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonElement.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonElement.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializable.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializable.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializable.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializable.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializationException.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializationException.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/JsonSerializationException.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/JsonSerializationException.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/ObjectToJsonConverter.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Person.java b/core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Person.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/customannotations/Person.java rename to core-java-modules/core-java-annotations/src/main/java/com/baeldung/customannotations/Person.java diff --git a/core-java-modules/core-java-annotations/src/main/resources/logback.xml b/core-java-modules/core-java-annotations/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-annotations/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java b/core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java rename to core-java-modules/core-java-annotations/src/test/java/com/baeldung/customannotations/JsonSerializerUnitTest.java diff --git a/core-java-modules/core-java-annotations/src/test/resources/.gitignore b/core-java-modules/core-java-annotations/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-annotations/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-datetime/README.md b/core-java-modules/core-java-datetime/README.md new file mode 100644 index 0000000000..71aea2e9db --- /dev/null +++ b/core-java-modules/core-java-datetime/README.md @@ -0,0 +1,7 @@ +========= + +## Core Java 8 Cookbooks and Examples + +### Relevant Articles: +- [Set the Time Zone of a Date in Java](https://www.baeldung.com/java-set-date-time-zone) +- [Overriding System Time for Testing in Java](https://www.baeldung.com/java-override-system-time) \ No newline at end of file diff --git a/core-java-modules/core-java-datetime/pom.xml b/core-java-modules/core-java-datetime/pom.xml new file mode 100644 index 0000000000..e2f86c7254 --- /dev/null +++ b/core-java-modules/core-java-datetime/pom.xml @@ -0,0 +1,101 @@ + + 4.0.0 + com.baeldung + core-java-datetime + 0.1.0-SNAPSHOT + core-java-datetime + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj.version} + test + + + joda-time + joda-time + ${joda.version} + + + org.aspectj + aspectjrt + ${asspectj.version} + + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + + + org.jmockit + jmockit + ${jmockit.version} + test + + + + + core-java-datetime + + + src/main/resources + true + + + + + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + + true + + + + + + + + 3.6.1 + 2.10 + + 3.6.1 + 1.8.9 + 2.0.0-RC.4 + 1.44 + + 2.22.1 + + diff --git a/core-java-modules/core-java-datetime/src/main/resources/logback.xml b/core-java-modules/core-java-datetime/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-datetime/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java b/core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/InstantUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantUnitTest.java rename to core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/InstantUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java b/core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java rename to core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/InstantWithJMockUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java b/core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java rename to core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java b/core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java rename to core-java-modules/core-java-datetime/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java diff --git a/core-java-modules/core-java-datetime/src/test/resources/.gitignore b/core-java-modules/core-java-datetime/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-datetime/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-function/README.md b/core-java-modules/core-java-function/README.md new file mode 100644 index 0000000000..677f148bdb --- /dev/null +++ b/core-java-modules/core-java-function/README.md @@ -0,0 +1,6 @@ +========= + +## Core Java 8 Cookbooks and Examples + +### Relevant Articles: +- [Java 8 Predicate Chain](https://www.baeldung.com/java-predicate-chain) \ No newline at end of file diff --git a/core-java-modules/core-java-function/pom.xml b/core-java-modules/core-java-function/pom.xml new file mode 100644 index 0000000000..5ed7ca68c2 --- /dev/null +++ b/core-java-modules/core-java-function/pom.xml @@ -0,0 +1,49 @@ + + 4.0.0 + com.baeldung + core-java-function + 0.1.0-SNAPSHOT + core-java-function + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + core-java-function + + + src/main/resources + true + + + + + + + 3.6.1 + 1.8.9 + + 2.22.1 + + diff --git a/core-java-modules/core-java-function/src/main/resources/logback.xml b/core-java-modules/core-java-function/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-function/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java b/core-java-modules/core-java-function/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java rename to core-java-modules/core-java-function/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java diff --git a/core-java-modules/core-java-function/src/test/resources/.gitignore b/core-java-modules/core-java-function/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-function/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-lambdas/README.md b/core-java-modules/core-java-lambdas/README.md index 98fff64d68..832d4783f2 100644 --- a/core-java-modules/core-java-lambdas/README.md +++ b/core-java-modules/core-java-lambdas/README.md @@ -6,3 +6,4 @@ - [Lambda Expressions and Functional Interfaces: Tips and Best Practices](http://www.baeldung.com/java-8-lambda-expressions-tips) - [Exceptions in Java 8 Lambda Expressions](http://www.baeldung.com/java-lambda-exceptions) - [Method References in Java](https://www.baeldung.com/java-method-references) +- [The Double Colon Operator in Java 8](https://www.baeldung.com/java-8-double-colon-operator) \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/Computer.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/Computer.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/Computer.java rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/Computer.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/ComputerUtils.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/ComputerUtils.java index 317808d893..ea274072ea 100644 --- a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/ComputerUtils.java +++ b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/ComputerUtils.java @@ -1,10 +1,10 @@ package com.baeldung.doublecolon; -import com.baeldung.doublecolon.function.ComputerPredicate; - import java.util.ArrayList; import java.util.List; +import com.baeldung.doublecolon.function.ComputerPredicate; + public class ComputerUtils { static final ComputerPredicate after2010Predicate = (c) -> (c.getAge() > 2010); diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/MacbookPro.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/MacbookPro.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/MacbookPro.java rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/MacbookPro.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/ComputerPredicate.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/TriFunction.java b/core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/TriFunction.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/doublecolon/function/TriFunction.java rename to core-java-modules/core-java-lambdas/src/main/java/com/baeldung/doublecolon/function/TriFunction.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java rename to core-java-modules/core-java-lambdas/src/test/java/com/baeldung/doublecolon/ComputerUtilsUnitTest.java diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md index 88a48661a0..d925e81d87 100644 --- a/core-java-modules/core-java-lang-2/README.md +++ b/core-java-modules/core-java-lang-2/README.md @@ -3,3 +3,4 @@ ## Core Java Lang Cookbooks and Examples ### Relevant Articles: +- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects) \ No newline at end of file diff --git a/core-java-modules/core-java-lang-2/pom.xml b/core-java-modules/core-java-lang-2/pom.xml index 4b02e06be4..fb4a5bd009 100644 --- a/core-java-modules/core-java-lang-2/pom.xml +++ b/core-java-modules/core-java-lang-2/pom.xml @@ -15,6 +15,21 @@ + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator.version} + + + org.openjdk.jmh + jmh-generator-bytecode + ${jmh-generator.version} + @@ -28,6 +43,8 @@ + 1.19 + 1.19 diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BenchmarkRunner.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BenchmarkRunner.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BenchmarkRunner.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BenchmarkRunner.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanPrimitiveLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BooleanWrapperLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/BytePrimitiveLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ByteWrapperLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharPrimitiveLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/CharacterWrapperLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoublePrimitiveLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/DoubleWrapperLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatPrimitiveLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/FloatWrapperLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntPrimitiveLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/IntegerWrapperLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongPrimitiveLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongWrapperLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/LongWrapperLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/LongWrapperLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/Lookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/Lookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/Lookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/Lookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortPrimitiveLookup.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java b/core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java rename to core-java-modules/core-java-lang-2/src/main/java/com/baeldung/primitive/ShortWrapperLookup.java diff --git a/core-java-modules/core-java-lang-math/README.md b/core-java-modules/core-java-lang-math/README.md new file mode 100644 index 0000000000..cfa3052f43 --- /dev/null +++ b/core-java-modules/core-java-lang-math/README.md @@ -0,0 +1,7 @@ +========= + +## Core Java 8 Cookbooks and Examples + +### Relevant Articles: +- [Java 8 Math New Methods](https://www.baeldung.com/java-8-math) +- [Java 8 Unsigned Arithmetic Support](https://www.baeldung.com/java-unsigned-arithmetic) diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml new file mode 100644 index 0000000000..f3e5132e5b --- /dev/null +++ b/core-java-modules/core-java-lang-math/pom.xml @@ -0,0 +1,49 @@ + + 4.0.0 + com.baeldung + core-java-lang-math + 0.1.0-SNAPSHOT + core-java-lang-math + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + core-java-lang-math + + + src/main/resources + true + + + + + + + 3.6.1 + 1.8.9 + + 2.22.1 + + diff --git a/core-java-modules/core-java-lang-math/src/main/resources/logback.xml b/core-java-modules/core-java-lang-math/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java rename to core-java-modules/core-java-lang-math/src/test/java/com/baeldung/java8/UnsignedArithmeticUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java rename to core-java-modules/core-java-lang-math/src/test/java/com/baeldung/math/MathNewMethodsUnitTest.java diff --git a/core-java-modules/core-java-lang-math/src/test/resources/.gitignore b/core-java-modules/core-java-lang-math/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-lang-math/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md index c43c9f02dc..096e4ee002 100644 --- a/core-java-modules/core-java-lang-oop-2/README.md +++ b/core-java-modules/core-java-lang-oop-2/README.md @@ -13,3 +13,4 @@ - [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object) - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition) - [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) +- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods) \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/application/Application.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Alarm.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Car.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Motorbike.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/MultiAlarmCar.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java b/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java rename to core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/defaultstaticinterfacemethods/model/Vehicle.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java b/core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java rename to core-java-modules/core-java-lang-oop-2/src/test/java/com/baeldung/defaultistaticinterfacemethods/test/StaticDefaulInterfaceMethodUnitTest.java diff --git a/core-java-modules/core-java-optional/README.md b/core-java-modules/core-java-optional/README.md index b6848b5d33..22ac8736fa 100644 --- a/core-java-modules/core-java-optional/README.md +++ b/core-java-modules/core-java-optional/README.md @@ -4,3 +4,5 @@ ### Relevant Articles: - [Java Optional as Return Type](https://www.baeldung.com/java-optional-return) +- [Guide To Java 8 Optional](https://www.baeldung.com/java-optional) +- [Java Optional – orElse() vs orElseGet()](https://www.baeldung.com/java-optional-or-else-vs-or-else-get) \ No newline at end of file diff --git a/core-java-modules/core-java-optional/pom.xml b/core-java-modules/core-java-optional/pom.xml index ca6158ef5a..d5ccd43e55 100644 --- a/core-java-modules/core-java-optional/pom.xml +++ b/core-java-modules/core-java-optional/pom.xml @@ -27,6 +27,21 @@ jackson-databind ${jackson.version} + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator.version} + + + org.openjdk.jmh + jmh-generator-bytecode + ${jmh-generator.version} + @@ -49,5 +64,7 @@ 1.8 1.8 5.4.0.Final + 1.19 + 1.19 \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Modem.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Modem.java rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Modem.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGet.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/OrElseAndOrElseGetBenchmarkRunner.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java b/core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Person.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/optional/Person.java rename to core-java-modules/core-java-optional/src/main/java/com/baeldung/optional/Person.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java rename to core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalChainingUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java rename to core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OptionalUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java b/core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java rename to core-java-modules/core-java-optional/src/test/java/com/baeldung/java8/optional/OrElseAndOrElseGetUnitTest.java diff --git a/core-java-modules/core-java-streams/README.md b/core-java-modules/core-java-streams/README.md new file mode 100644 index 0000000000..e97641c221 --- /dev/null +++ b/core-java-modules/core-java-streams/README.md @@ -0,0 +1,9 @@ +========= + +## Core Java 8 Cookbooks and Examples + +### Relevant Articles: +- [The Difference Between map() and flatMap()](https://www.baeldung.com/java-difference-map-and-flatmap) +- [How to Use if/else Logic in Java 8 Streams](https://www.baeldung.com/java-8-streams-if-else-logic) +- [The Difference Between Collection.stream().forEach() and Collection.forEach()](https://www.baeldung.com/java-collection-stream-foreach) +- [Guide to Java 8’s Collectors](https://www.baeldung.com/java-8-collectors) \ No newline at end of file diff --git a/core-java-modules/core-java-streams/pom.xml b/core-java-modules/core-java-streams/pom.xml new file mode 100644 index 0000000000..4ff8e8aaba --- /dev/null +++ b/core-java-modules/core-java-streams/pom.xml @@ -0,0 +1,54 @@ + + 4.0.0 + com.baeldung + core-java-streams + 0.1.0-SNAPSHOT + core-java-streams + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + core-java-streams + + + src/main/resources + true + + + + + + + 3.6.1 + + 2.22.1 + + diff --git a/core-java-modules/core-java-8-2/src/main/java/com/baeldung/forEach/ReverseList.java b/core-java-modules/core-java-streams/src/main/java/com/baeldung/forEach/ReverseList.java similarity index 100% rename from core-java-modules/core-java-8-2/src/main/java/com/baeldung/forEach/ReverseList.java rename to core-java-modules/core-java-streams/src/main/java/com/baeldung/forEach/ReverseList.java diff --git a/core-java-modules/core-java-streams/src/main/resources/logback.xml b/core-java-modules/core-java-streams/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-streams/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java b/core-java-modules/core-java-streams/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java rename to core-java-modules/core-java-streams/src/test/java/com/baeldung/collectors/Java8CollectorsUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java b/core-java-modules/core-java-streams/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java rename to core-java-modules/core-java-streams/src/test/java/com/baeldung/stream/conditional/StreamForEachIfElseUnitTest.java diff --git a/core-java-modules/core-java-streams/src/test/resources/.gitignore b/core-java-modules/core-java-streams/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-streams/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-text/README.md b/core-java-modules/core-java-text/README.md new file mode 100644 index 0000000000..5a6db4e8fd --- /dev/null +++ b/core-java-modules/core-java-text/README.md @@ -0,0 +1,6 @@ +========= + +## Core Java 8 Cookbooks and Examples + +### Relevant Articles: +- [An Overview of Regular Expressions Performance in Java](https://www.baeldung.com/java-regex-performance) \ No newline at end of file diff --git a/core-java-modules/core-java-text/pom.xml b/core-java-modules/core-java-text/pom.xml new file mode 100644 index 0000000000..f831ec5f40 --- /dev/null +++ b/core-java-modules/core-java-text/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + com.baeldung + core-java-text + 0.1.0-SNAPSHOT + core-java-text + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + + core-java-text + + + src/main/resources + true + + + + + + + diff --git a/core-java-modules/core-java-text/src/main/resources/logback.xml b/core-java-modules/core-java-text/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-modules/core-java-text/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-text/src/test/resources/.gitignore b/core-java-modules/core-java-text/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-modules/core-java-text/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file diff --git a/patterns/design-patterns-creational/README.md b/patterns/design-patterns-creational/README.md index 0c00dc7b3a..99b9b39787 100644 --- a/patterns/design-patterns-creational/README.md +++ b/patterns/design-patterns-creational/README.md @@ -6,3 +6,4 @@ - [Double-Checked Locking with Singleton](https://www.baeldung.com/java-singleton-double-checked-locking) - [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) - [Automatic Generation of the Builder Pattern with FreeBuilder](https://www.baeldung.com/java-builder-pattern-freebuilder) +- [How to Replace Many if Statements in Java](https://www.baeldung.com/java-replace-if-statements) \ No newline at end of file diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/AddCommand.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddCommand.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/AddCommand.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/AddRule.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/AddRule.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/AddRule.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Addition.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Addition.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Addition.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Calculator.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Calculator.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Calculator.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Command.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Command.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Command.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Division.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Division.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Division.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Expression.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Expression.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Expression.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Modulo.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Modulo.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Modulo.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Multiplication.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Multiplication.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Multiplication.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Operation.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operation.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Operation.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Operator.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Operator.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Operator.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/OperatorFactory.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Result.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Result.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Result.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Rule.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Rule.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Rule.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/RuleEngine.java diff --git a/core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java b/patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Subtraction.java similarity index 100% rename from core-java-modules/core-java-8/src/main/java/com/baeldung/reducingIfElse/Subtraction.java rename to patterns/design-patterns-creational/src/main/java/com/baeldung/reducingIfElse/Subtraction.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/reduceIfelse/CalculatorUnitTest.java diff --git a/core-java-modules/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java b/patterns/design-patterns-creational/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java similarity index 100% rename from core-java-modules/core-java-8/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java rename to patterns/design-patterns-creational/src/test/java/com/baeldung/reduceIfelse/RuleEngineUnitTest.java diff --git a/pom.xml b/pom.xml index f804def032..1daffc5786 100644 --- a/pom.xml +++ b/pom.xml @@ -389,6 +389,12 @@ core-java-modules/core-java-8 core-java-modules/core-java-8-2 + core-java-modules/core-java-annotations + core-java-modules/core-java-streams + core-java-modules/core-java-function + core-java-modules/core-java-lang-math + core-java-modules/core-java-datetime + core-java-modules/core-java-text core-java-modules/core-java-lambdas @@ -1122,6 +1128,12 @@ core-java-modules/core-java-8 core-java-modules/core-java-8-2 + core-java-modules/core-java-annotations + core-java-modules/core-java-streams + core-java-modules/core-java-function + core-java-modules/core-java-lang-math + core-java-modules/core-java-datetime + core-java-modules/core-java-text core-java-modules/core-java-arrays From 87e98c90856ae44f34335c850f8dcbaa98621e89 Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Fri, 20 Sep 2019 16:47:19 +0300 Subject: [PATCH 224/396] Split or move core-java-modules/core-java-arrays module (#7784) --- .../core-java-arrays-2/.gitignore | 25 ------------------- .../core-java-arrays-2/README.MD | 6 ++++- .../array/AddElementToEndOfArray.java | 0 .../array/RemoveElementFromAnArray.java | 0 .../array/conversions/FloatToByteArray.java | 0 .../array/operations/ArrayOperations.java | 11 +++----- .../array/AddElementToEndOfArrayUnitTest.java | 0 .../RemoveElementFromAnArrayUnitTest.java | 7 ++---- .../conversions/FloatToByteArrayUnitTest.java | 8 +++--- .../operations/ArrayOperationsUnitTest.java | 8 +++--- .../operations/IntersectionUnitTest.java | 4 +-- core-java-modules/core-java-arrays/.gitignore | 25 ------------------- core-java-modules/core-java-arrays/README.md | 20 ++++++--------- 13 files changed, 26 insertions(+), 88 deletions(-) delete mode 100644 core-java-modules/core-java-arrays-2/.gitignore rename core-java-modules/{core-java-arrays => core-java-arrays-2}/src/main/java/com/baeldung/array/AddElementToEndOfArray.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-2}/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-2}/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-2}/src/main/java/com/baeldung/array/operations/ArrayOperations.java (97%) rename core-java-modules/{core-java-arrays => core-java-arrays-2}/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-2}/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java (91%) rename core-java-modules/{core-java-arrays => core-java-arrays-2}/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java (80%) rename core-java-modules/{core-java-arrays => core-java-arrays-2}/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java (100%) rename core-java-modules/{core-java-arrays => core-java-arrays-2}/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java (91%) delete mode 100644 core-java-modules/core-java-arrays/.gitignore diff --git a/core-java-modules/core-java-arrays-2/.gitignore b/core-java-modules/core-java-arrays-2/.gitignore deleted file mode 100644 index 374c8bf907..0000000000 --- a/core-java-modules/core-java-arrays-2/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -*.class - -0.* - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* -.resourceCache - -# Packaged files # -*.jar -*.war -*.ear - -# Files generated by integration tests -backup-pom.xml -/bin/ -/temp - -#IntelliJ specific -.idea/ -*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-arrays-2/README.MD b/core-java-modules/core-java-arrays-2/README.MD index f272f4d299..280fb33dc3 100644 --- a/core-java-modules/core-java-arrays-2/README.MD +++ b/core-java-modules/core-java-arrays-2/README.MD @@ -1,5 +1,9 @@ ## Relevant Articles - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) -- [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array) - [Looping Diagonally Through a 2d Java Array](https://www.baeldung.com/java-loop-diagonal-array) +- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) +- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array) +- [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) +- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) +- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/AddElementToEndOfArray.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/AddElementToEndOfArray.java rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/AddElementToEndOfArray.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/RemoveElementFromAnArray.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java similarity index 100% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/conversions/FloatToByteArray.java diff --git a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java similarity index 97% rename from core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java rename to core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java index d8cc0afd61..94a00f7aba 100644 --- a/core-java-modules/core-java-arrays/src/main/java/com/baeldung/array/operations/ArrayOperations.java +++ b/core-java-modules/core-java-arrays-2/src/main/java/com/baeldung/array/operations/ArrayOperations.java @@ -1,19 +1,14 @@ package com.baeldung.array.operations; +import org.apache.commons.lang3.ArrayUtils; + import java.lang.reflect.Array; -import java.util.Arrays; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.Random; -import java.util.Set; +import java.util.*; import java.util.function.Function; import java.util.function.IntPredicate; import java.util.function.Predicate; import java.util.stream.Stream; -import org.apache.commons.lang3.ArrayUtils; - public class ArrayOperations { // Get the first and last item of an array diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/AddElementToEndOfArrayUnitTest.java diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java similarity index 91% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java index ea52cd17d9..567b870ef1 100644 --- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java +++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/RemoveElementFromAnArrayUnitTest.java @@ -1,13 +1,10 @@ package com.baeldung.array; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - import org.apache.commons.lang3.ArrayUtils; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.*; + class RemoveElementFromAnArrayUnitTest { private final RemoveElementFromAnArray sut = new RemoveElementFromAnArray(); diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java similarity index 80% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java index a2cd273f21..7656783052 100644 --- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java +++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/conversions/FloatToByteArrayUnitTest.java @@ -1,12 +1,10 @@ package com.baeldung.array.conversions; -import static com.baeldung.array.conversions.FloatToByteArray.byteArrayToFloat; -import static com.baeldung.array.conversions.FloatToByteArray.byteArrayToFloatWithByteBuffer; -import static com.baeldung.array.conversions.FloatToByteArray.floatToByteArray; -import static com.baeldung.array.conversions.FloatToByteArray.floatToByteArrayWithByteBuffer; +import org.junit.Test; + +import static com.baeldung.array.conversions.FloatToByteArray.*; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; -import org.junit.Test; public class FloatToByteArrayUnitTest { diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java similarity index 100% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java index a9c6d97d9f..d72681ca05 100644 --- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java +++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/ArrayOperationsUnitTest.java @@ -1,13 +1,13 @@ package com.baeldung.array.operations; -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Arrays; - import org.assertj.core.api.Condition; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + public class ArrayOperationsUnitTest { private Integer[] defaultObjectArray; diff --git a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java similarity index 91% rename from core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java index 3c61060ea8..1560cc5701 100644 --- a/core-java-modules/core-java-arrays/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java +++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/operations/IntersectionUnitTest.java @@ -2,9 +2,7 @@ package com.baeldung.array.operations; import org.junit.jupiter.api.Test; -import static com.baeldung.array.operations.ArrayOperations.intersectionMultiSet; -import static com.baeldung.array.operations.ArrayOperations.intersectionSet; -import static com.baeldung.array.operations.ArrayOperations.intersectionSimple; +import static com.baeldung.array.operations.ArrayOperations.*; import static org.assertj.core.api.Assertions.assertThat; class IntersectionUnitTest { diff --git a/core-java-modules/core-java-arrays/.gitignore b/core-java-modules/core-java-arrays/.gitignore deleted file mode 100644 index 374c8bf907..0000000000 --- a/core-java-modules/core-java-arrays/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -*.class - -0.* - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* -.resourceCache - -# Packaged files # -*.jar -*.war -*.ear - -# Files generated by integration tests -backup-pom.xml -/bin/ -/temp - -#IntelliJ specific -.idea/ -*.iml \ No newline at end of file diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 45feff3edc..088e927910 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -3,17 +3,13 @@ ## Core Java Arrays Cookbooks and Examples ### Relevant Articles: -- [How to Copy an Array in Java](http://www.baeldung.com/java-array-copy) -- [Check if a Java Array Contains a Value](http://www.baeldung.com/java-array-contains-value) -- [Initializing Arrays in Java](http://www.baeldung.com/java-initialize-array) -- [Guide to the java.util.Arrays Class](http://www.baeldung.com/java-util-arrays) -- [Multi-Dimensional Arrays In Java](http://www.baeldung.com/java-jagged-arrays) -- [Find Sum and Average in a Java Array](http://www.baeldung.com/java-array-sum-average) +- [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) +- [Check if a Java Array Contains a Value](https://www.baeldung.com/java-array-contains-value) +- [Initializing Arrays in Java](https://www.baeldung.com/java-initialize-array) +- [Guide to the java.util.Arrays Class](https://www.baeldung.com/java-util-arrays) +- [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) +- [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) -- [How to Invert an Array in Java](http://www.baeldung.com/java-invert-array) -- [Array Operations in Java](http://www.baeldung.com/java-common-array-operations) -- [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) +- [How to Invert an Array in Java](https://www.baeldung.com/java-invert-array) - [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays) -- [Convert a Float to a Byte Array in Java](https://www.baeldung.com/java-convert-float-to-byte-array) -- [Converting Between Stream and Array in Java](https://www.baeldung.com/java-stream-to-array) -- [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) +- [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array) From 8acac28de3cac1e79797b5c09de04c1efd5f8b5b Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 20 Sep 2019 15:08:28 +0100 Subject: [PATCH 225/396] [BAEL-17488] - README descriptions 4 (#7830) * [BAEL-17488] - README descriptions 4 * [BAEL-17488] - README descriptions 4 * minor changes --- spring-boot-admin/README.md | 4 +++ spring-boot-angular-ecommerce/README.md | 4 +++ spring-boot-angular/README.md | 4 +++ .../{README.MD => README.md} | 4 +++ spring-boot-bootstrap/README.md | 4 +++ spring-boot-camel/README.md | 26 ++++++++++++------- spring-boot-cli/README.md | 4 +-- spring-boot-client/README.MD | 4 +++ spring-boot-crud/README.md | 4 +++ spring-boot-ctx-fluent/README.md | 3 +++ 10 files changed, 50 insertions(+), 11 deletions(-) rename spring-boot-autoconfiguration/{README.MD => README.md} (75%) diff --git a/spring-boot-admin/README.md b/spring-boot-admin/README.md index 73ce857059..61010819fd 100644 --- a/spring-boot-admin/README.md +++ b/spring-boot-admin/README.md @@ -1,3 +1,7 @@ +## Spring Boot Admin + +This module contains articles about Spring Boot Admin + ## 1. Spring Boot Admin Server * mvn clean install diff --git a/spring-boot-angular-ecommerce/README.md b/spring-boot-angular-ecommerce/README.md index c6564643e2..9b592de9cc 100644 --- a/spring-boot-angular-ecommerce/README.md +++ b/spring-boot-angular-ecommerce/README.md @@ -1,2 +1,6 @@ +## Spring Boot Angular Ecommerce + +This module contains articles about Spring Boot with Angular in regards to ecommerce applications. + ### Relevant Articles: - [A Simple E-Commerce Implementation with Spring](https://www.baeldung.com/spring-angular-ecommerce) diff --git a/spring-boot-angular/README.md b/spring-boot-angular/README.md index cfc1ea69f4..a1904c2c17 100644 --- a/spring-boot-angular/README.md +++ b/spring-boot-angular/README.md @@ -1,3 +1,7 @@ +## Spring Boot Angular + +This module contains articles about Spring Boot with Angular + ### Relevant Articles: - [Building a Web Application with Spring Boot and Angular](https://www.baeldung.com/spring-boot-angular-web) diff --git a/spring-boot-autoconfiguration/README.MD b/spring-boot-autoconfiguration/README.md similarity index 75% rename from spring-boot-autoconfiguration/README.MD rename to spring-boot-autoconfiguration/README.md index dc9cad539a..920c378139 100644 --- a/spring-boot-autoconfiguration/README.MD +++ b/spring-boot-autoconfiguration/README.md @@ -1,3 +1,7 @@ +## Spring Boot Auto Configuration + +This module contains articles about Spring Boot Auto Configuration + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-boot-bootstrap/README.md b/spring-boot-bootstrap/README.md index 6a88f25bd7..82ec384c86 100644 --- a/spring-boot-bootstrap/README.md +++ b/spring-boot-bootstrap/README.md @@ -1,3 +1,7 @@ +## Spring Boot Bootstrap + +This module contains articles about bootstrapping Spring Boot applications. + ### Relevant Articles: - [Spring Boot Tutorial – Bootstrap a Simple Application](http://www.baeldung.com/spring-boot-start) - [Thin JARs with Spring Boot](http://www.baeldung.com/spring-boot-thin-jar) diff --git a/spring-boot-camel/README.md b/spring-boot-camel/README.md index 0e85db4a7f..194b7ea9c7 100644 --- a/spring-boot-camel/README.md +++ b/spring-boot-camel/README.md @@ -1,18 +1,26 @@ -Example for the Article on Camel API with SpringBoot +## Spring Boot Camel -to start up, run: - mvn spring-boot:run +This module contains articles about Spring Boot with Apache Camel + +### Example for the Article on Camel API with SpringBoot + +To start, run: + +`mvn spring-boot:run` -them, do a POST http request to: - http://localhost:8080/camel/api/bean +Then, make a POST http request to: -with the HEADER: Content-Type: application/json, +`http://localhost:8080/camel/api/bean` -and a BODY Payload like {"id": 1,"name": "World"} +Include the HEADER: Content-Type: application/json, -and we will get a return code of 201 and the response: Hello, World - if the transform() method from Application class is uncommented and the process() method is commented +and a BODY Payload like: -or return code of 201 and the response: {"id": 10,"name": "Hello, World"} - if the transform() method from Application class is commented and the process() method is uncommented +`{"id": 1,"name": "World"}` + +We will get a return code of 201 and the response: `Hello, World` - if the transform() method from Application class is uncommented and the process() method is commented + +or return code of 201 and the response: `{"id": 10,"name": "Hello, World"}` - if the transform() method from Application class is commented and the process() method is uncommented ## Relevant articles: diff --git a/spring-boot-cli/README.md b/spring-boot-cli/README.md index 85323da9b4..8c8a0c99c1 100644 --- a/spring-boot-cli/README.md +++ b/spring-boot-cli/README.md @@ -1,6 +1,6 @@ -========= - ## Spring Boot CLI +This module contains articles about Spring Boot CLI + ### Relevant Articles: - [Introduction to Spring Boot CLI](http://www.baeldung.com/spring-boot-cli) diff --git a/spring-boot-client/README.MD b/spring-boot-client/README.MD index 8db48089a5..c8b9e1cd6e 100644 --- a/spring-boot-client/README.MD +++ b/spring-boot-client/README.MD @@ -1,3 +1,7 @@ +## Spring Boot Client + +This module contains articles about Spring Boot Clients + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-boot-crud/README.md b/spring-boot-crud/README.md index ab2cbe1e3a..6b0032deb3 100644 --- a/spring-boot-crud/README.md +++ b/spring-boot-crud/README.md @@ -1,3 +1,7 @@ +## Spring boot CRUD + +This module contains articles about Spring Boot CRUD Operations + ### Relevant Articles: - [Spring Boot CRUD Application with Thymeleaf](https://www.baeldung.com/spring-boot-crud-thymeleaf) - [Using a Spring Boot Application as a Dependency](https://www.baeldung.com/spring-boot-dependency) diff --git a/spring-boot-ctx-fluent/README.md b/spring-boot-ctx-fluent/README.md index 0b4b9c1271..646ad0f7d1 100644 --- a/spring-boot-ctx-fluent/README.md +++ b/spring-boot-ctx-fluent/README.md @@ -1,3 +1,6 @@ +## Spring Boot Context Fluent + +This module contains articles about Spring Boot Fluent Builder ### Relevant Articles: From 27654ee87523320356ee48d8df2d91bf14c11c13 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Fri, 20 Sep 2019 15:45:21 +0100 Subject: [PATCH 226/396] Added prev/next links --- spring-boot-ops-2/README.md | 1 + spring-boot-ops/README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-boot-ops-2/README.md b/spring-boot-ops-2/README.md index fa48cfd4da..0925b099b1 100644 --- a/spring-boot-ops-2/README.md +++ b/spring-boot-ops-2/README.md @@ -6,3 +6,4 @@ This module contains articles about Spring Boot Operations - [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat) - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs) +- More articles: [[<-- prev]](/spring-boot-ops) diff --git a/spring-boot-ops/README.md b/spring-boot-ops/README.md index a40732d336..58e63bcdc7 100644 --- a/spring-boot-ops/README.md +++ b/spring-boot-ops/README.md @@ -16,4 +16,4 @@ This module contains articles about Spring Boot Operations - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar) - [EnvironmentPostProcessor in Spring Boot](https://www.baeldung.com/spring-boot-environmentpostprocessor) - - [more...](/spring-boot-ops-2) \ No newline at end of file + - More articles: [[next -->]](/spring-boot-ops-2) \ No newline at end of file From f58a1aaf0f1a7f15b06dd3d766572f5e1590e7d7 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Fri, 20 Sep 2019 15:48:38 +0100 Subject: [PATCH 227/396] Added next/prev links --- spring-core-2/README.md | 1 + spring-core/README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 2f2ca7b351..936c93b460 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -8,3 +8,4 @@ This module contains articles about core Spring functionality - [Exploring the Spring BeanFactory API](http://www.baeldung.com/spring-beanfactory) - [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) - [Spring – Injecting Collections](http://www.baeldung.com/spring-injecting-collections) +- More articles: [[<-- prev]](/spring-core) diff --git a/spring-core/README.md b/spring-core/README.md index c3c770a856..f90e84121d 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -13,5 +13,5 @@ This module contains articles about core Spring functionality - [Spring Application Context Events](https://www.baeldung.com/spring-context-events) - [What is a Spring Bean?](https://www.baeldung.com/spring-bean) - [Spring PostConstruct and PreDestroy Annotations](https://www.baeldung.com/spring-postconstruct-predestroy) -- [more...](/spring-core-2) +- More articles: [[next -->]](/spring-core-2) From 6809fb56d40b463d0a6084161e740aea4e3cf1dc Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Fri, 20 Sep 2019 16:14:46 +0100 Subject: [PATCH 228/396] [BAEL-17476] - Add README descriptions 9 --- spring-jinq/README.md | 4 ++++ spring-jms/README.md | 4 ++++ spring-jooq/README.md | 4 ++++ spring-kafka/README.md | 8 +++++--- spring-katharsis/README.md | 14 +++++++++----- spring-ldap/README.md | 4 +++- spring-mobile/README.md | 4 ++++ spring-mockito/README.md | 5 ++--- spring-mvc-forms-jsp/README.md | 4 +++- spring-mvc-forms-thymeleaf/README.md | 4 ++++ 10 files changed, 42 insertions(+), 13 deletions(-) diff --git a/spring-jinq/README.md b/spring-jinq/README.md index 10d7903f49..b2fea32123 100644 --- a/spring-jinq/README.md +++ b/spring-jinq/README.md @@ -1,3 +1,7 @@ +## Spring Jinq + +This module contains articles about Spring with Jinq + ## Relevant articles: - [Introduction to Jinq with Spring](http://www.baeldung.com/spring-jinq) diff --git a/spring-jms/README.md b/spring-jms/README.md index 55e74f18ff..ef768d086f 100644 --- a/spring-jms/README.md +++ b/spring-jms/README.md @@ -1,2 +1,6 @@ +## Spring JMS + +This module contains articles about Spring with JMS + ### Relevant Articles: - [Getting Started with Spring JMS](http://www.baeldung.com/spring-jms) diff --git a/spring-jooq/README.md b/spring-jooq/README.md index 2777aa450c..36397fa7ed 100644 --- a/spring-jooq/README.md +++ b/spring-jooq/README.md @@ -1,3 +1,7 @@ +## Spring jOOQ + +This module contains articles about Spring with jOOQ + ### Relevant Articles: - [Spring Boot Support for jOOQ](http://www.baeldung.com/spring-boot-support-for-jooq) - [Introduction to jOOQ with Spring](http://www.baeldung.com/jooq-with-spring) diff --git a/spring-kafka/README.md b/spring-kafka/README.md index 291bbca6f6..c04dda0a2f 100644 --- a/spring-kafka/README.md +++ b/spring-kafka/README.md @@ -1,10 +1,12 @@ +## Spring Kafka + +This module contains articles about Spring with Kafka + ### Relevant articles - [Intro to Apache Kafka with Spring](http://www.baeldung.com/spring-kafka) - - -# Spring Kafka +### Intro This is a simple Spring Boot app to demonstrate sending and receiving of messages in Kafka using spring-kafka. diff --git a/spring-katharsis/README.md b/spring-katharsis/README.md index 2082de2dda..c9391f7e22 100644 --- a/spring-katharsis/README.md +++ b/spring-katharsis/README.md @@ -1,9 +1,13 @@ -========= +## Spring Katharsis -## Java Web Application - -###The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring +This module contains articles about Spring with Katharsis ### Relevant Articles: + - [JSON API in a Spring Application](http://www.baeldung.com/json-api-java-spring-web-app) + +### The Course + +The "REST With Spring" Classes: http://bit.ly/restwithspring + + diff --git a/spring-ldap/README.md b/spring-ldap/README.md index b8163ab44d..3f592ab365 100644 --- a/spring-ldap/README.md +++ b/spring-ldap/README.md @@ -1,4 +1,6 @@ -## Spring LDAP Example Project +## Spring LDAP + +This module contains articles about Spring LDAP ### Relevant articles diff --git a/spring-mobile/README.md b/spring-mobile/README.md index e3d23bcda6..d4473c8c54 100644 --- a/spring-mobile/README.md +++ b/spring-mobile/README.md @@ -1,3 +1,7 @@ +## Spring Mobile + +This module contains articles about Spring Mobile + ## Relevant articles: - [A Guide to Spring Mobile](http://www.baeldung.com/spring-mobile) diff --git a/spring-mockito/README.md b/spring-mockito/README.md index 969954c15e..7d7945a2fe 100644 --- a/spring-mockito/README.md +++ b/spring-mockito/README.md @@ -1,7 +1,6 @@ -========= - -## Mockito Mocks into Spring Beans +## Spring Mockito +This module contains articles about Spring with Mockito ### Relevant Articles: - [Injecting Mockito Mocks into Spring Beans](http://www.baeldung.com/injecting-mocks-in-spring) diff --git a/spring-mvc-forms-jsp/README.md b/spring-mvc-forms-jsp/README.md index 588828c9cf..941191858d 100644 --- a/spring-mvc-forms-jsp/README.md +++ b/spring-mvc-forms-jsp/README.md @@ -1,4 +1,6 @@ -## Spring MVC Forms Tutorials +## Spring MVC Forms JSP + +This module contains articles about Spring MVC Forms using JSP ### Relevant Articles - [MaxUploadSizeExceededException in Spring](http://www.baeldung.com/spring-maxuploadsizeexceeded) diff --git a/spring-mvc-forms-thymeleaf/README.md b/spring-mvc-forms-thymeleaf/README.md index 22f12afbca..7e011bdc60 100644 --- a/spring-mvc-forms-thymeleaf/README.md +++ b/spring-mvc-forms-thymeleaf/README.md @@ -1,3 +1,7 @@ +## Spring MVC Forms Thymeleaf + +This module contains articles about Spring MVC Forms using Thymeleaf + ### Relevant articles - [Session Attributes in Spring MVC](http://www.baeldung.com/spring-mvc-session-attributes) From ae690b025e7a4f2761583ccdde587dc4b21cbb57 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Fri, 20 Sep 2019 16:31:59 +0100 Subject: [PATCH 229/396] [BAEL-17494] - Added readme descriptions 10 --- spring-mvc-java/README.md | 5 ++-- spring-mvc-kotlin/README.md | 4 ++++ spring-mvc-simple-2/README.md | 5 ++++ spring-mvc-simple/README.md | 5 ++++ spring-mvc-velocity/README.md | 4 ++++ spring-mvc-webflow/README.md | 8 +++---- spring-mvc-xml/README.md | 14 ++++++----- spring-protobuf/README.md | 4 ++++ spring-quartz/README.md | 43 +++++++++++++++++----------------- spring-security-cors/README.md | 4 ++++ 10 files changed, 62 insertions(+), 34 deletions(-) diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index e67d4f30a1..e946fab3f2 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -1,8 +1,9 @@ -========= +## Spring MVC with Java Configuration -## Spring MVC with Java Configuration Example Project +This module contains articles about Spring MVC with Java configuration ### The Course + The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: diff --git a/spring-mvc-kotlin/README.md b/spring-mvc-kotlin/README.md index cc6827eb1b..bd0593731f 100644 --- a/spring-mvc-kotlin/README.md +++ b/spring-mvc-kotlin/README.md @@ -1,3 +1,7 @@ +## Spring MVC with Kotlin + +This module contains articles about Spring MVC with Kotlin + ### Relevant articles - [Spring MVC Setup with Kotlin](http://www.baeldung.com/spring-mvc-kotlin) - [Working with Kotlin and JPA](http://www.baeldung.com/kotlin-jpa) diff --git a/spring-mvc-simple-2/README.md b/spring-mvc-simple-2/README.md index 6dfe789be4..80456c5732 100644 --- a/spring-mvc-simple-2/README.md +++ b/spring-mvc-simple-2/README.md @@ -1,2 +1,7 @@ +## Spring MVC Simple 2 + +This module contains articles about Spring MVC + ## Relevant articles: - [How to Read HTTP Headers in Spring REST Controllers](https://www.baeldung.com/spring-rest-http-headers) +- More articles: [[<-- prev]](/spring-mvc-simple) diff --git a/spring-mvc-simple/README.md b/spring-mvc-simple/README.md index 755e0932fc..e2068dcae0 100644 --- a/spring-mvc-simple/README.md +++ b/spring-mvc-simple/README.md @@ -1,3 +1,7 @@ +## Spring MVC Simple + +This module contains articles about Spring MVC + ## Relevant articles: - [HandlerAdapters in Spring MVC](http://www.baeldung.com/spring-mvc-handler-adapters) @@ -8,3 +12,4 @@ - [Guide to Spring Email](http://www.baeldung.com/spring-email) - [Request Method Not Supported (405) in Spring](https://www.baeldung.com/spring-request-method-not-supported-405) - [Spring @RequestParam Annotation](https://www.baeldung.com/spring-request-param) +- More articles: [[more -->]](/spring-mvc-simple-2) \ No newline at end of file diff --git a/spring-mvc-velocity/README.md b/spring-mvc-velocity/README.md index 401e135f75..fed4ce260e 100644 --- a/spring-mvc-velocity/README.md +++ b/spring-mvc-velocity/README.md @@ -1,2 +1,6 @@ +## Spring MVC Velocity + +This module contains articles about Spring MVC with Velocity + ### Relevant Articles: - [Quick Guide to Spring MVC with Velocity](http://www.baeldung.com/spring-mvc-with-velocity) diff --git a/spring-mvc-webflow/README.md b/spring-mvc-webflow/README.md index 2df4716e31..dff99ff490 100644 --- a/spring-mvc-webflow/README.md +++ b/spring-mvc-webflow/README.md @@ -1,9 +1,7 @@ -========= +## Spring MVC WebFlow -## Spring MVC with Spring Web Flow - -###The Course +This module contains articles about Spring MVC Web Flow ### Relevant Articles: -- + - [Guide to Spring Web Flow](http://www.baeldung.com/spring-web-flow) diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index c8ec074d17..c08cfb1430 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -1,12 +1,10 @@ -========= +## Spring MVC XML + +This module contains articles about Spring MVC with XML configuration ###The Course The "REST With Spring" Classes: http://bit.ly/restwithspring -## Spring MVC with XML Configuration Example Project -- access a sample jsp page at: `http://localhost:8080/spring-mvc-xml/sample.html` - - ### Relevant Articles: - [Java Session Timeout](http://www.baeldung.com/servlet-session-timeout) - [Returning Image/Media Data with Spring MVC](http://www.baeldung.com/spring-mvc-image-media-data) @@ -15,4 +13,8 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Exploring SpringMVC’s Form Tag Library](http://www.baeldung.com/spring-mvc-form-tags) - [web.xml vs Initializer with Spring](http://www.baeldung.com/spring-xml-vs-java-config) - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) -- [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable) \ No newline at end of file +- [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable) + +## Spring MVC with XML Configuration Example Project +- access a sample jsp page at: `http://localhost:8080/spring-mvc-xml/sample.html` + diff --git a/spring-protobuf/README.md b/spring-protobuf/README.md index dad0e3f54a..d8737014a7 100644 --- a/spring-protobuf/README.md +++ b/spring-protobuf/README.md @@ -1,2 +1,6 @@ +## Spring Protocol Buffers + +This module contains articles about Spring with Protocol Buffers + ### Relevant Articles: - [Spring REST API with Protocol Buffers](http://www.baeldung.com/spring-rest-api-with-protocol-buffers) diff --git a/spring-quartz/README.md b/spring-quartz/README.md index 5d32e65053..45e20f6076 100644 --- a/spring-quartz/README.md +++ b/spring-quartz/README.md @@ -1,26 +1,27 @@ -========================================================================= +## Spring Quartz -## Scheduling in Spring with Quartz Example Project -This is the first example where we configure a basic scheduler. -##### Spring boot application, Main class -### -``` -org.baeldung.springquartz.SpringQuartzApp -``` -###### - -##### Configuration in *application.properties* -#### - - - Default: configures scheduler using Spring convenience classes: - ``` - using.spring.schedulerFactory=true - ``` - - To configure scheduler using Quartz API: - ``` - using.spring.schedulerFactory=false - ``` +This module contains articles about Spring with Quartz ### Relevant Articles: - [Scheduling in Spring with Quartz](http://www.baeldung.com/spring-quartz-schedule) + +## #Scheduling in Spring with Quartz Example Project +This is the first example where we configure a basic scheduler. + +##### Spring boot application, Main class + + +`org.baeldung.springquartz.SpringQuartzApp` + +##### Configuration in *application.properties* + + - Default: configures scheduler using Spring convenience classes: + + `using.spring.schedulerFactory=true` + + - To configure scheduler using Quartz API: + + `using.spring.schedulerFactory=false` + + diff --git a/spring-security-cors/README.md b/spring-security-cors/README.md index 2ab5e33ee3..c9e00e04d7 100644 --- a/spring-security-cors/README.md +++ b/spring-security-cors/README.md @@ -1,3 +1,7 @@ +## Spring Security CORS + +This module contains articles about Spring Security with CORS (Cross Origin Requests) + ## Relevant Articles - [Fixing 401s with CORS Preflights and Spring Security](https://www.baeldung.com/spring-security-cors-preflight) From 42ef916c8058d31e9ba60653d77a02c25d33b55a Mon Sep 17 00:00:00 2001 From: Laurentiu Delcea Date: Fri, 20 Sep 2019 23:19:35 +0300 Subject: [PATCH 230/396] BAEL-3165 Integrate Kinesis with Spring Binder --- .../spring-cloud-stream-kinesis/pom.xml | 48 +++++++++++++++++++ .../java/com/baeldung/KinesisApplication.java | 30 ++++++++++++ .../src/main/resources/application.properties | 11 +++++ .../KinesisApplicationIntegrationTest.java | 15 ++++++ .../src/test/resources/application.properties | 2 + 5 files changed, 106 insertions(+) create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java create mode 100644 spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml new file mode 100644 index 0000000000..3817f2747a --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/pom.xml @@ -0,0 +1,48 @@ + + + 4.0.0 + spring-cloud-stream-kinesis + spring-cloud-stream-kinesis + + + org.springframework.boot + spring-boot-starter-parent + 2.1.8.RELEASE + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.cloud + spring-cloud-stream-binder-kinesis + ${spring-cloud-stream-kinesis-binder.version} + + + + com.amazonaws + aws-java-sdk-kinesis + ${aws-sdk.version} + + + + org.springframework.cloud + spring-cloud-stream-test-support + ${spring-cloud-stream-test.version} + test + + + + + 1.11.632 + 1.2.1.RELEASE + 2.2.1.RELEASE + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java new file mode 100644 index 0000000000..c863cd8fe2 --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/java/com/baeldung/KinesisApplication.java @@ -0,0 +1,30 @@ +package com.baeldung; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.stream.annotation.EnableBinding; +import org.springframework.cloud.stream.annotation.StreamListener; +import org.springframework.cloud.stream.messaging.Processor; +import org.springframework.messaging.support.MessageBuilder; + +@SpringBootApplication +@EnableBinding(Processor.class) +public class KinesisApplication { + + public static void main(String[] args) { + SpringApplication.run(KinesisApplication.class, args); + } + + @Autowired + private Processor processor; + + @StreamListener(Processor.INPUT) + public void consume(String val) { + System.out.println(val); + } + + public void produce(String val) { + processor.output().send(MessageBuilder.withPayload(val).build()); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties new file mode 100644 index 0000000000..1a966c64fb --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/main/resources/application.properties @@ -0,0 +1,11 @@ +cloud.aws.credentials.access-key=aws-key +cloud.aws.credentials.secret-key=aws-secret +cloud.aws.region.static=eu-central-1 +cloud.aws.stack.auto=false + +spring.cloud.stream.bindings.output.destination=myStream +spring.cloud.stream.bindings.output.content-type=text/plain + +spring.cloud.stream.bindings.input.destination=myStream +spring.cloud.stream.bindings.input.group=myStream-group +spring.cloud.stream.bindings.input.content-type=text/plain \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java new file mode 100644 index 0000000000..4e1c281cfb --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/java/com/baeldung/KinesisApplicationIntegrationTest.java @@ -0,0 +1,15 @@ +package com.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = KinesisApplication.class) +public class KinesisApplicationIntegrationTest { + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties new file mode 100644 index 0000000000..48005616ec --- /dev/null +++ b/spring-cloud/spring-cloud-stream/spring-cloud-stream-kinesis/src/test/resources/application.properties @@ -0,0 +1,2 @@ +cloud.aws.region.static=eu-central-1 +cloud.aws.stack.auto=false \ No newline at end of file From b0c356b46804714a9ef9e5ef4453abee155660e1 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 21 Sep 2019 09:59:04 -0500 Subject: [PATCH 231/396] BAEL-2338: add link back to article (#7838) * BAEL-2246: add link back to article * BAEL-2174: rename core-java-net module to core-java-networking * BAEL-2174: add link back to article * BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 add links back to articles * BAEL-2367: add link back to article * BAEL-2335: add link back to article * BAEL-2413: add link back to article * Update README.MD * BAEL-2577: add link back to article * BAEL-2490: add link back to article * BAEL-2471: add link back to article * BAEL-2583: add link back to article * BAEL-2738: add link back to article * BAEL-2711: Add spring-boot-angular module to root pom * BAEL-2544 BAEL-2711 BAEL-2575 BAEL-2657 Add links back to articles * BAEL-2736: Add link back to article * BAEL-2789: Add link back to article * BAEL-2489: add link back to article * BAEL-2840: add link back to article * BAEL-2655: add link back to article * BAEL-2884: add link back to article * BAEL-2985: Fix Spring Boot Apps in spring-data-rest module * BAEL-2898 BAEL-3057 BAEL-3020 add links back to articles * BAEL-3126 BAEL-2463 README * BAEL-2989: add README * BAEL-3149 BAEL-3043 update README * BAEL-2338: update README * BAEL-3149: move code to new module --- .../core-java-lang-syntax-2/README.md | 6 +++++ .../core-java-lang-syntax-2/pom.xml | 26 +++++++++++++++++++ .../com/baeldung/core/modifiers/Employee.java | 0 .../baeldung/core/modifiers/ExampleClass.java | 0 .../core/modifiers/PublicOuterClass.java | 0 pom.xml | 2 ++ xml/README.md | 1 + 7 files changed, 35 insertions(+) create mode 100644 core-java-modules/core-java-lang-syntax-2/README.md create mode 100644 core-java-modules/core-java-lang-syntax-2/pom.xml rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-syntax-2}/src/main/java/com/baeldung/core/modifiers/Employee.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-syntax-2}/src/main/java/com/baeldung/core/modifiers/ExampleClass.java (100%) rename core-java-modules/{core-java-lang-oop-2 => core-java-lang-syntax-2}/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java (100%) diff --git a/core-java-modules/core-java-lang-syntax-2/README.md b/core-java-modules/core-java-lang-syntax-2/README.md new file mode 100644 index 0000000000..4cef971f75 --- /dev/null +++ b/core-java-modules/core-java-lang-syntax-2/README.md @@ -0,0 +1,6 @@ +========= + +## Core Java Lang Syntax Cookbooks and Examples + +### Relevant Articles: +- [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword) diff --git a/core-java-modules/core-java-lang-syntax-2/pom.xml b/core-java-modules/core-java-lang-syntax-2/pom.xml new file mode 100644 index 0000000000..1a8316628f --- /dev/null +++ b/core-java-modules/core-java-lang-syntax-2/pom.xml @@ -0,0 +1,26 @@ + + 4.0.0 + com.baeldung + core-java-lang-syntax-2 + 0.1.0-SNAPSHOT + core-java-lang-syntax-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + core-java-lang-syntax-2 + + + src/main/resources + true + + + + diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/Employee.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/Employee.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/Employee.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java diff --git a/core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java similarity index 100% rename from core-java-modules/core-java-lang-oop-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java diff --git a/pom.xml b/pom.xml index 1daffc5786..10e9eba400 100644 --- a/pom.xml +++ b/pom.xml @@ -413,6 +413,7 @@ core-java-modules/core-java-nio core-java-modules/core-java-security core-java-modules/core-java-lang-syntax + core-java-modules/core-java-lang-syntax-2 core-java-modules/core-java-lang core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop @@ -1151,6 +1152,7 @@ core-java-modules/core-java-nio core-java-modules/core-java-security core-java-modules/core-java-lang-syntax + core-java-modules/core-java-lang-syntax-2 core-java-modules/core-java-lang core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop diff --git a/xml/README.md b/xml/README.md index fb070100db..c24fe3e785 100644 --- a/xml/README.md +++ b/xml/README.md @@ -4,3 +4,4 @@ - [XML Libraries Support in Java](http://www.baeldung.com/java-xml-libraries) - [DOM parsing with Xerces](http://www.baeldung.com/java-xerces-dom-parsing) - [Write an org.w3.dom.Document to a File](https://www.baeldung.com/java-write-xml-document-file) +- [Convert XML to HTML in Java](https://www.baeldung.com/java-convert-xml-to-html) From 0cc708c07c0f706ae992ae8229bd5e94c02b0c50 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 21 Sep 2019 21:46:02 -0500 Subject: [PATCH 232/396] BAEL-3149: fix indentation in pom.xml (#7848) * BAEL-2246: add link back to article * BAEL-2174: rename core-java-net module to core-java-networking * BAEL-2174: add link back to article * BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 add links back to articles * BAEL-2367: add link back to article * BAEL-2335: add link back to article * BAEL-2413: add link back to article * Update README.MD * BAEL-2577: add link back to article * BAEL-2490: add link back to article * BAEL-2471: add link back to article * BAEL-2583: add link back to article * BAEL-2738: add link back to article * BAEL-2711: Add spring-boot-angular module to root pom * BAEL-2544 BAEL-2711 BAEL-2575 BAEL-2657 Add links back to articles * BAEL-2736: Add link back to article * BAEL-2789: Add link back to article * BAEL-2489: add link back to article * BAEL-2840: add link back to article * BAEL-2655: add link back to article * BAEL-2884: add link back to article * BAEL-2985: Fix Spring Boot Apps in spring-data-rest module * BAEL-2898 BAEL-3057 BAEL-3020 add links back to articles * BAEL-3126 BAEL-2463 README * BAEL-2989: add README * BAEL-3149 BAEL-3043 update README * BAEL-2338: update README * BAEL-3149: move code to new module * BAEL-3149: move code to new module --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 10e9eba400..d44bae0453 100644 --- a/pom.xml +++ b/pom.xml @@ -1152,7 +1152,7 @@ core-java-modules/core-java-nio core-java-modules/core-java-security core-java-modules/core-java-lang-syntax - core-java-modules/core-java-lang-syntax-2 + core-java-modules/core-java-lang-syntax-2 core-java-modules/core-java-lang core-java-modules/core-java-lang-2 core-java-modules/core-java-lang-oop From a47a1a7a1661873f6fdfb749bf47bdf939a4be1e Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Sun, 22 Sep 2019 09:13:12 +0530 Subject: [PATCH 233/396] [BAEL-13506] - Removed .gitignore files (#7849) --- .../src/test/resources/.gitignore | 13 ------------- .../src/test/resources/.gitignore | 13 ------------- .../src/test/resources/.gitignore | 13 ------------- .../src/test/resources/.gitignore | 13 ------------- .../core-java-streams/src/test/resources/.gitignore | 13 ------------- .../core-java-text/src/test/resources/.gitignore | 13 ------------- 6 files changed, 78 deletions(-) delete mode 100644 core-java-modules/core-java-annotations/src/test/resources/.gitignore delete mode 100644 core-java-modules/core-java-datetime/src/test/resources/.gitignore delete mode 100644 core-java-modules/core-java-function/src/test/resources/.gitignore delete mode 100644 core-java-modules/core-java-lang-math/src/test/resources/.gitignore delete mode 100644 core-java-modules/core-java-streams/src/test/resources/.gitignore delete mode 100644 core-java-modules/core-java-text/src/test/resources/.gitignore diff --git a/core-java-modules/core-java-annotations/src/test/resources/.gitignore b/core-java-modules/core-java-annotations/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/core-java-modules/core-java-annotations/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-datetime/src/test/resources/.gitignore b/core-java-modules/core-java-datetime/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/core-java-modules/core-java-datetime/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-function/src/test/resources/.gitignore b/core-java-modules/core-java-function/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/core-java-modules/core-java-function/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-lang-math/src/test/resources/.gitignore b/core-java-modules/core-java-lang-math/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/core-java-modules/core-java-lang-math/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-streams/src/test/resources/.gitignore b/core-java-modules/core-java-streams/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/core-java-modules/core-java-streams/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/core-java-modules/core-java-text/src/test/resources/.gitignore b/core-java-modules/core-java-text/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/core-java-modules/core-java-text/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file From c1a6515fcfd3a9855eeca0e626e3b003842a52b7 Mon Sep 17 00:00:00 2001 From: macroscopic64 Date: Sun, 22 Sep 2019 19:15:26 +0530 Subject: [PATCH 234/396] [BAEL-3288] - Graceful Shutdown of a Spring Boot Application --- .../GracefulShutdownApplication.java | 16 +++++++++ .../beans/LongRunningProcessBean.java | 36 +++++++++++++++++++ .../config/SpringConfiguration.java | 34 ++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java create mode 100644 spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java create mode 100644 spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java new file mode 100644 index 0000000000..b7a840b38c --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java @@ -0,0 +1,16 @@ +package com.baeldung.gracefulshutdown; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@EnableAutoConfiguration +@ComponentScan(basePackages = {"com.baeldung.gracefulshutdown"}) +public class GracefulShutdownApplication { + + public static void main(String args[]) { + SpringApplication.run(GracefulShutdownApplication.class, args); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java new file mode 100644 index 0000000000..e21ddfe021 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java @@ -0,0 +1,36 @@ +package com.baeldung.gracefulshutdown.beans; + +import javax.annotation.PostConstruct; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.task.TaskExecutor; +import org.springframework.stereotype.Component; + +@Component +public class LongRunningProcessBean { + + private static final Logger LOG = LoggerFactory.getLogger(LongRunningProcessBean.class); + + @Autowired + private TaskExecutor taskExecutor; + + @PostConstruct + public void runTaskOnStartup() { + LOG.info("runTaskOnStartup entering"); + for (int i = 0; i < 3; i++) { + final int processNumber = i; + taskExecutor.execute(() -> { + try { + LOG.info("Long running process {} using threadpool started", processNumber); + Thread.sleep(60_000); + LOG.info("Long running process {} using threadpool completed", processNumber); + } catch (Exception e) { + LOG.error("Error while executing task", e); + } + }); + } + LOG.info("runTaskOnStartup exiting"); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java new file mode 100644 index 0000000000..1f27163215 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java @@ -0,0 +1,34 @@ +package com.baeldung.gracefulshutdown.config; + +import javax.annotation.PreDestroy; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.task.TaskExecutor; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +@Configuration +@EnableScheduling +public class SpringConfiguration { + + private static final Logger LOG = LoggerFactory.getLogger(SpringConfiguration.class); + + @Bean + public TaskExecutor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(2); + taskExecutor.setMaxPoolSize(2); + taskExecutor.setWaitForTasksToCompleteOnShutdown(true); + taskExecutor.setAwaitTerminationSeconds(30); + taskExecutor.initialize(); + return taskExecutor; + } + + @PreDestroy + public void destroy() { + LOG.info("Shutdown initiated"); + } +} From b7368cb6dbca187efaf136137128e11e052d0ef8 Mon Sep 17 00:00:00 2001 From: Anshul Bansal Date: Sun, 22 Sep 2019 22:26:47 +0300 Subject: [PATCH 235/396] BAEL-3191 - review changes --- .../com/baeldung/category/BaeldungCategory.groovy | 4 ++-- .../com/baeldung/category/NumberCategory.groovy | 9 +++++---- .../com/baeldung/category/CategoryUnitTest.groovy | 12 +++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy b/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy index 366dd182c8..479c39699f 100644 --- a/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy +++ b/core-groovy-2/src/main/groovy/com/baeldung/category/BaeldungCategory.groovy @@ -10,8 +10,8 @@ class BaeldungCategory { return capitalizedStr } - public static Number square(Number self) { - return self*self; + public static double toThePower(Number self, Number exponent) { + return Math.pow(self, exponent); } } diff --git a/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy b/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy index cf0e5282fc..ccf2ed519b 100644 --- a/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy +++ b/core-groovy-2/src/main/groovy/com/baeldung/category/NumberCategory.groovy @@ -4,13 +4,14 @@ import groovy.lang.Category @Category(Number) class NumberCategory { - + public Number cube() { return this*this*this } - - public Number toThePower(Number exponent) { - return Math.pow(this, exponent) + + public int divideWithRoundUp(BigDecimal divisor, boolean isRoundUp) { + def mathRound = isRoundUp ? BigDecimal.ROUND_UP : BigDecimal.ROUND_DOWN + return (int)new BigDecimal(this).divide(divisor, 0, mathRound) } } diff --git a/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy index 2e10efbe03..a1f67b1e2e 100644 --- a/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy +++ b/core-groovy-2/src/test/groovy/com/baeldung/category/CategoryUnitTest.groovy @@ -82,17 +82,19 @@ class CategoryUnitTest extends GroovyTestCase { } } - void test_whenUsingBaeldungCategory_thenSquareNumber() { + void test_whenUsingBaeldungCategory_thenOperationsOnNumber() { use (BaeldungCategory) { - assert 50.square() == 2500 - assert 20.01.square() == 400.4001 + assert 50.toThePower(2) == 2500 + assert 2.4.toThePower(4) == 33.1776 } } - void test_whenUsingNumberUtils_thenCubeNumber() { + void test_whenUsingNumberCategory_thenOperationsOnNumber() { use (NumberCategory) { assert 3.cube() == 27 - assert 2.4.toThePower(4) == 33.1776 + assert 25.divideWithRoundUp(6, true) == 5 + assert 120.23.divideWithRoundUp(6.1, true) == 20 + assert 150.9.divideWithRoundUp(12.1, false) == 12 } } From dac59fbec2360eaf0624aba85e661647cf5c33c5 Mon Sep 17 00:00:00 2001 From: wugangca Date: Sun, 22 Sep 2019 20:23:27 -0600 Subject: [PATCH 236/396] BAEL-2988 Using Enums as Request Parameters in Spring (#7815) * BAEL-2988 Using Enums as Request Parameters in Spring * Remove the unused annotation based on PR feedback * Simplify code based on the PR feedback * Make the methods consistent with the article. --- .../main/java/com/baeldung/Application.java | 2 -- .../java/com/baeldung/config/MvcConfig.java | 7 ++++++ .../converter/StringToEnumConverter.java | 20 +++++++++++++++ .../com/baeldung/cors/EnumController.java | 25 +++++++++++++++++++ .../GlobalControllerExceptionHandler.java | 16 ++++++++++++ .../main/java/com/baeldung/model/Modes.java | 5 ++++ 6 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 spring-rest-simple/src/main/java/com/baeldung/config/converter/StringToEnumConverter.java create mode 100644 spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java create mode 100644 spring-rest-simple/src/main/java/com/baeldung/exceptions/GlobalControllerExceptionHandler.java create mode 100644 spring-rest-simple/src/main/java/com/baeldung/model/Modes.java diff --git a/spring-rest-simple/src/main/java/com/baeldung/Application.java b/spring-rest-simple/src/main/java/com/baeldung/Application.java index dc6bfcb970..f4147568ce 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/Application.java +++ b/spring-rest-simple/src/main/java/com/baeldung/Application.java @@ -4,11 +4,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; -import org.springframework.context.annotation.ComponentScan; @EnableAutoConfiguration @SpringBootApplication -@ComponentScan("com.baeldung.cors") public class Application extends SpringBootServletInitializer { public static void main(final String[] args) { diff --git a/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java b/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java index 48b627a344..246049b722 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java +++ b/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java @@ -2,6 +2,7 @@ package com.baeldung.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; @@ -17,6 +18,7 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import com.baeldung.config.converter.KryoHttpMessageConverter; +import com.baeldung.config.converter.StringToEnumConverter; import java.text.SimpleDateFormat; import java.util.List; @@ -71,4 +73,9 @@ public class MvcConfig implements WebMvcConfigurer { public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } + + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new StringToEnumConverter()); + } } diff --git a/spring-rest-simple/src/main/java/com/baeldung/config/converter/StringToEnumConverter.java b/spring-rest-simple/src/main/java/com/baeldung/config/converter/StringToEnumConverter.java new file mode 100644 index 0000000000..349ee5a796 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/config/converter/StringToEnumConverter.java @@ -0,0 +1,20 @@ +package com.baeldung.config.converter; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +import com.baeldung.model.Modes; + +@Component +public class StringToEnumConverter implements Converter { + @Override + public Modes convert(String source) { + // Remove the try-catch block if we want to handle the exception globally in GlobalControllerExceptionHandler + try { + return Modes.valueOf(source.toUpperCase()); + } catch (IllegalArgumentException e) { + return null; + } + + } +} diff --git a/spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java b/spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java new file mode 100644 index 0000000000..6bd5a16439 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java @@ -0,0 +1,25 @@ +package com.baeldung.cors; + +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.model.Modes; + +@CrossOrigin(maxAge = 3600) +@RestController +@RequestMapping("/enums") +public class EnumController { + + @RequestMapping("/mode2str") + public String getStringToMode(@RequestParam("mode") Modes mode) { + return "good"; + } + + @RequestMapping("/findbymode/{mode}") + public String findByEnum(@PathVariable Modes mode) { + return "good"; + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/exceptions/GlobalControllerExceptionHandler.java b/spring-rest-simple/src/main/java/com/baeldung/exceptions/GlobalControllerExceptionHandler.java new file mode 100644 index 0000000000..78fbcf97dd --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/exceptions/GlobalControllerExceptionHandler.java @@ -0,0 +1,16 @@ +package com.baeldung.exceptions; + +import org.springframework.core.convert.ConversionFailedException; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +@ControllerAdvice +public class GlobalControllerExceptionHandler { + @ExceptionHandler(ConversionFailedException.class) + public ResponseEntity handleConflict(RuntimeException ex) { + // Remove the try-catch block in the StringToEnumConverter if we want to handle the exception here + return new ResponseEntity<>(ex.getMessage(), HttpStatus.BAD_REQUEST); + } +} diff --git a/spring-rest-simple/src/main/java/com/baeldung/model/Modes.java b/spring-rest-simple/src/main/java/com/baeldung/model/Modes.java new file mode 100644 index 0000000000..a82df17d7d --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/model/Modes.java @@ -0,0 +1,5 @@ +package com.baeldung.model; + +public enum Modes { + ALPHA, DELTA +} From cc827908e0080d81bdfd080438472d2406769413 Mon Sep 17 00:00:00 2001 From: at508 Date: Sun, 22 Sep 2019 22:46:13 -0400 Subject: [PATCH 237/396] [BAEL-2998] - Adding example for @DirtiesContext --- testing-modules/spring-testing/pom.xml | 10 ++++- .../SpringDataRestApplication.java | 13 ++++++ .../com/baeldung/dirtiescontext/User.java | 9 ++++ .../baeldung/dirtiescontext/UserCache.java | 30 ++++++++++++++ .../dirtiescontext/DirtiesContextTest.java | 41 +++++++++++++++++++ 5 files changed, 102 insertions(+), 1 deletion(-) create mode 100644 testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/SpringDataRestApplication.java create mode 100644 testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/User.java create mode 100644 testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java create mode 100644 testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextTest.java diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml index 6f2700e2df..bb7d54218a 100644 --- a/testing-modules/spring-testing/pom.xml +++ b/testing-modules/spring-testing/pom.xml @@ -15,18 +15,26 @@ - org.hamcrest java-hamcrest ${hamcrest.version} + + org.projectlombok + lombok + ${lombok.version} + provided + + org.springframework.boot spring-boot-starter LATEST + + org.springframework.boot spring-boot-starter-test diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/SpringDataRestApplication.java b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/SpringDataRestApplication.java new file mode 100644 index 0000000000..ab784532a7 --- /dev/null +++ b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/SpringDataRestApplication.java @@ -0,0 +1,13 @@ +package com.baeldung.dirtiescontext; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringDataRestApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringDataRestApplication.class, args); + } + +} diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/User.java b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/User.java new file mode 100644 index 0000000000..4d453c5e91 --- /dev/null +++ b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/User.java @@ -0,0 +1,9 @@ +package com.baeldung.dirtiescontext; + +public class User { + + String firstName; + + String lastName; + +} diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java new file mode 100644 index 0000000000..f03eee3bb8 --- /dev/null +++ b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java @@ -0,0 +1,30 @@ +package com.baeldung.dirtiescontext; + +import java.util.HashSet; +import java.util.Set; + +import org.springframework.stereotype.Component; + +import lombok.Getter; +import lombok.ToString; + +@ToString +@Component +public class UserCache { + + @Getter + private Set userList = new HashSet<>(); + + public boolean addUser(String user) { + return userList.add(user); + } + + public boolean removeUser(String user) { + return userList.remove(user); + } + + public void printUserList(String message) { + System.out.println(message + ": " + userList); + } + +} \ No newline at end of file diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextTest.java new file mode 100644 index 0000000000..6248f758ce --- /dev/null +++ b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextTest.java @@ -0,0 +1,41 @@ +package com.baeldung.dirtiescontext; + +import org.junit.jupiter.api.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.MethodMode; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +@RunWith(SpringJUnit4ClassRunner.class) +@SpringBootTest(classes = SpringDataRestApplication.class) +class DirtiesContextTest { + + @Autowired + protected UserCache userCache; + + @DirtiesContext(methodMode = MethodMode.AFTER_METHOD) + @Test + void testOne() { + userCache.addUser("John Doe"); + userCache.printUserList("Test One"); + } + + @Test + void testTwo() { + userCache.printUserList("Test Two"); + } + + @Test + void testThree() { + userCache.addUser("Jane Doe"); + userCache.printUserList("Test Three"); + } + + @Test + void testFour() { + userCache.printUserList("Test Four"); + } + +} From bb71b1ec070ff5ec2d2edc4960166074825235b5 Mon Sep 17 00:00:00 2001 From: at508 Date: Mon, 23 Sep 2019 07:04:22 -0400 Subject: [PATCH 238/396] [BAEL-2998] - Updating unit test name to match convention --- ...rtiesContextTest.java => DirtiesContextIntegrationTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/{DirtiesContextTest.java => DirtiesContextIntegrationTest.java} (96%) diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java similarity index 96% rename from testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextTest.java rename to testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java index 6248f758ce..b4f3fa773f 100644 --- a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextTest.java +++ b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java @@ -10,7 +10,7 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = SpringDataRestApplication.class) -class DirtiesContextTest { +class DirtiesContextIntegrationTest { @Autowired protected UserCache userCache; From 6073d2d451d4a3a08b6b9e7e8d25070b3a95521b Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Mon, 23 Sep 2019 16:55:02 +0300 Subject: [PATCH 239/396] Split or move core-java-modules/core-java-concurrency-basic module (#7799) --- .../core-java-concurrency-basic-2/README.md | 10 ++++++ .../core-java-concurrency-basic-2/pom.xml | 33 +++++++++++++++++++ .../com/baeldung/concurrent/delay/Delay.java | 0 .../concurrent/sleepwait/ThreadA.java | 0 .../concurrent/sleepwait/ThreadB.java | 0 .../sleepwait/WaitSleepExample.java | 0 .../BaeldungSynchronizedBlocks.java | 0 .../BaeldungSynchronizedMethods.java | 0 .../threadlifecycle/BlockedState.java | 0 .../concurrent/threadlifecycle/NewState.java | 0 .../threadlifecycle/RunnableState.java | 0 .../threadlifecycle/TerminatedState.java | 0 .../threadlifecycle/TimedWaitingState.java | 0 .../threadlifecycle/WaitingState.java | 0 .../concurrent/waitandnotify/Data.java | 0 .../waitandnotify/NetworkDriver.java | 0 .../concurrent/waitandnotify/Receiver.java | 0 .../concurrent/waitandnotify/Sender.java | 0 .../src/main/resources/logback.xml | 19 +++++++++++ .../BaeldungSychronizedBlockUnitTest.java | 0 .../BaeldungSynchronizeMethodsUnitTest.java | 0 .../waitandnotify/NetworkIntegrationTest.java | 8 ++--- .../core-java-concurrency-basic/README.md | 21 +++++------- .../threadsafety/CounterUnitTest.java} | 10 +++--- .../ExtrinsicLockCounterUnitTest.java} | 10 +++--- .../threadsafety/MathUtilsUnitTest.java} | 9 +++-- .../threadsafety/MessageServiceUnitTest.java} | 10 +++--- .../ReentrantLockCounterUnitTest.java} | 10 +++--- ...eentrantReadWriteLockCounterUnitTest.java} | 14 ++++---- pom.xml | 2 ++ 30 files changed, 114 insertions(+), 42 deletions(-) create mode 100644 core-java-modules/core-java-concurrency-basic-2/README.md create mode 100644 core-java-modules/core-java-concurrency-basic-2/pom.xml rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/delay/Delay.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java (100%) create mode 100644 core-java-modules/core-java-concurrency-basic-2/src/main/resources/logback.xml rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java (100%) rename core-java-modules/{core-java-concurrency-basic => core-java-concurrency-basic-2}/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java (100%) rename core-java-modules/core-java-concurrency-basic/src/test/{com/baeldung/concurrent/threadsafety/tests/CounterTest.java => java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java} (91%) rename core-java-modules/core-java-concurrency-basic/src/test/{com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java => java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java} (91%) rename core-java-modules/core-java-concurrency-basic/src/test/{com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java => java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java} (55%) rename core-java-modules/core-java-concurrency-basic/src/test/{com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java => java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java} (91%) rename core-java-modules/core-java-concurrency-basic/src/test/{com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java => java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java} (91%) rename core-java-modules/core-java-concurrency-basic/src/test/{com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java => java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java} (90%) diff --git a/core-java-modules/core-java-concurrency-basic-2/README.md b/core-java-modules/core-java-concurrency-basic-2/README.md new file mode 100644 index 0000000000..e72725b7cb --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/README.md @@ -0,0 +1,10 @@ +========= + +## Core Java Concurrency Basic 2 Examples + +### Relevant Articles: +- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution) +- [wait and notify() Methods in Java](https://www.baeldung.com/java-wait-notify) +- [Difference Between Wait and Sleep in Java](https://www.baeldung.com/java-wait-and-sleep) +- [Guide to the Synchronized Keyword in Java](https://www.baeldung.com/java-synchronized) +- [Life Cycle of a Thread in Java](https://www.baeldung.com/java-thread-lifecycle) diff --git a/core-java-modules/core-java-concurrency-basic-2/pom.xml b/core-java-modules/core-java-concurrency-basic-2/pom.xml new file mode 100644 index 0000000000..7e0a160456 --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/pom.xml @@ -0,0 +1,33 @@ + + 4.0.0 + com.baeldung + core-java-concurrency-basic-2 + 0.1.0-SNAPSHOT + core-java-concurrency-basic-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + + + core-java-concurrency-basic-2 + + + src/main/resources + true + + + + + + + + diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/delay/Delay.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/delay/Delay.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/delay/Delay.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/delay/Delay.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java rename to core-java-modules/core-java-concurrency-basic-2/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java diff --git a/core-java-modules/core-java-concurrency-basic-2/src/main/resources/logback.xml b/core-java-modules/core-java-concurrency-basic-2/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-modules/core-java-concurrency-basic-2/src/main/resources/logback.xml @@ -0,0 +1,19 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + \ No newline at end of file diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java rename to core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java rename to core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java diff --git a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java similarity index 100% rename from core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java rename to core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java index e2bc328df3..473fe6ff8e 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java +++ b/core-java-modules/core-java-concurrency-basic-2/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java @@ -1,15 +1,15 @@ package com.baeldung.concurrent.waitandnotify; -import static org.junit.Assert.assertEquals; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.io.StringWriter; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class NetworkIntegrationTest { diff --git a/core-java-modules/core-java-concurrency-basic/README.md b/core-java-modules/core-java-concurrency-basic/README.md index c498bed315..2f9d014103 100644 --- a/core-java-modules/core-java-concurrency-basic/README.md +++ b/core-java-modules/core-java-concurrency-basic/README.md @@ -3,18 +3,13 @@ ## Core Java Concurrency Basic Examples ### Relevant Articles: -- [Guide To CompletableFuture](http://www.baeldung.com/java-completablefuture) -- [A Guide to the Java ExecutorService](http://www.baeldung.com/java-executor-service-tutorial) -- [Guide to java.util.concurrent.Future](http://www.baeldung.com/java-future) -- [Difference Between Wait and Sleep in Java](http://www.baeldung.com/java-wait-and-sleep) -- [Guide to the Synchronized Keyword in Java](http://www.baeldung.com/java-synchronized) -- [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent) -- [Implementing a Runnable vs Extending a Thread](http://www.baeldung.com/java-runnable-vs-extending-thread) -- [How to Kill a Java Thread](http://www.baeldung.com/java-thread-stop) -- [ExecutorService – Waiting for Threads to Finish](http://www.baeldung.com/java-executor-wait-for-threads) -- [wait and notify() Methods in Java](http://www.baeldung.com/java-wait-notify) -- [Life Cycle of a Thread in Java](http://www.baeldung.com/java-thread-lifecycle) -- [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable) +- [Guide To CompletableFuture](https://www.baeldung.com/java-completablefuture) +- [A Guide to the Java ExecutorService](https://www.baeldung.com/java-executor-service-tutorial) +- [Guide to java.util.concurrent.Future](https://www.baeldung.com/java-future) +- [Overview of the java.util.concurrent](https://www.baeldung.com/java-util-concurrent) +- [Implementing a Runnable vs Extending a Thread](https://www.baeldung.com/java-runnable-vs-extending-thread) +- [How to Kill a Java Thread](https://www.baeldung.com/java-thread-stop) +- [ExecutorService – Waiting for Threads to Finish](https://www.baeldung.com/java-executor-wait-for-threads) +- [Runnable vs. Callable in Java](https://www.baeldung.com/java-runnable-callable) - [What is Thread-Safety and How to Achieve it?](https://www.baeldung.com/java-thread-safety) - [How to Start a Thread in Java](https://www.baeldung.com/java-start-thread) -- [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution) diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java similarity index 91% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java index 176151083c..6761b05282 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/CounterTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/CounterUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; -import org.junit.Test; -import static org.assertj.core.api.Assertions.assertThat; import com.baeldung.concurrent.threadsafety.callables.CounterCallable; import com.baeldung.concurrent.threadsafety.services.Counter; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -public class CounterTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class CounterUnitTest { @Test public void whenCalledIncrementCounter_thenCorrect() throws Exception { diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java similarity index 91% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java index e34eb250bf..2dcb846bf4 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ExtrinsicLockCounterTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ExtrinsicLockCounterUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; -import org.junit.Test; -import static org.assertj.core.api.Assertions.assertThat; import com.baeldung.concurrent.threadsafety.callables.ExtrinsicLockCounterCallable; import com.baeldung.concurrent.threadsafety.services.ExtrinsicLockCounter; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -public class ExtrinsicLockCounterTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class ExtrinsicLockCounterUnitTest { @Test public void whenCalledIncrementCounter_thenCorrect() throws Exception { diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java similarity index 55% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java index 2708152906..018d4164f0 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MathUtilsTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MathUtilsUnitTest.java @@ -1,13 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; import com.baeldung.concurrent.threadsafety.mathutils.MathUtils; import org.junit.Test; + +import java.math.BigInteger; + import static org.assertj.core.api.Assertions.assertThat; -public class MathUtilsTest { +public class MathUtilsUnitTest { @Test public void whenCalledFactorialMethod_thenCorrect() { - assertThat(MathUtils.factorial(2)).isEqualTo(2); + assertThat(MathUtils.factorial(2)).isEqualTo(new BigInteger("2")); } } diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java similarity index 91% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java index e62206c09a..4df695a537 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/MessageServiceTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/MessageServiceUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; -import org.junit.Test; -import static org.assertj.core.api.Assertions.assertThat; import com.baeldung.concurrent.threadsafety.callables.MessageServiceCallable; import com.baeldung.concurrent.threadsafety.services.MessageService; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -public class MessageServiceTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class MessageServiceUnitTest { @Test public void whenCalledgetMessage_thenCorrect() throws Exception { diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java similarity index 91% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java index 20fa2c74da..330d2d4c86 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantLockCounterTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantLockCounterUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; import com.baeldung.concurrent.threadsafety.callables.ReentrantLockCounterCallable; import com.baeldung.concurrent.threadsafety.services.ReentrantLockCounter; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; -public class ReentrantLockCounterTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class ReentrantLockCounterUnitTest { @Test public void whenCalledIncrementCounter_thenCorrect() throws Exception { diff --git a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java similarity index 90% rename from core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java rename to core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java index 6113473cac..71fad2c87f 100644 --- a/core-java-modules/core-java-concurrency-basic/src/test/com/baeldung/concurrent/threadsafety/tests/ReentrantReadWriteLockCounterTest.java +++ b/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/threadsafety/ReentrantReadWriteLockCounterUnitTest.java @@ -1,14 +1,16 @@ -package com.baeldung.concurrent.threadsafety.tests; +package com.baeldung.concurrent.threadsafety; import com.baeldung.concurrent.threadsafety.callables.ReentranReadWriteLockCounterCallable; import com.baeldung.concurrent.threadsafety.services.ReentrantReadWriteLockCounter; +import org.junit.Test; + import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; -public class ReentrantReadWriteLockCounterTest { +import static org.assertj.core.api.Assertions.assertThat; + +public class ReentrantReadWriteLockCounterUnitTest { @Test public void whenCalledIncrementCounter_thenCorrect() throws Exception { @@ -16,9 +18,9 @@ public class ReentrantReadWriteLockCounterTest { ReentrantReadWriteLockCounter counter = new ReentrantReadWriteLockCounter(); Future future1 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(counter)); Future future2 = (Future) executorService.submit(new ReentranReadWriteLockCounterCallable(counter)); - - assertThat(future1.get()).isEqualTo(1); + assertThat(future2.get()).isEqualTo(2); + assertThat(future1.get()).isEqualTo(1); } } diff --git a/pom.xml b/pom.xml index d44bae0453..6972736288 100644 --- a/pom.xml +++ b/pom.xml @@ -407,6 +407,7 @@ core-java-modules/core-java-collections-array-list core-java-modules/core-java-collections-set core-java-modules/core-java-concurrency-basic + core-java-modules/core-java-concurrency-basic-2 core-java-modules/core-java-concurrency-collections core-java-modules/core-java-io core-java-modules/core-java-io-files @@ -1146,6 +1147,7 @@ core-java-modules/core-java-collections-array-list core-java-modules/core-java-collections-set core-java-modules/core-java-concurrency-basic + core-java-modules/core-java-concurrency-basic-2 core-java-modules/core-java-concurrency-collections core-java-modules/core-java-io core-java-modules/core-java-io-files From 7da66ebd84bc7575765c3d33b92349a66b9b7200 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 23 Sep 2019 19:45:10 +0530 Subject: [PATCH 240/396] BAEL-16977 Week 38 | go through the integration test results and see what NEW failing tests we have (#7837) - Minor fixes for integration tests --- spring-jooq/src/test/resources/application.properties | 2 ++ .../baeldung/example/EmployeeDAOIntegrationTest.java | 10 +++++++--- .../com/baeldung/tags/EmployeeDAOIntegrationTest.java | 10 +++++++--- 3 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 spring-jooq/src/test/resources/application.properties diff --git a/spring-jooq/src/test/resources/application.properties b/spring-jooq/src/test/resources/application.properties new file mode 100644 index 0000000000..dc5d81acfb --- /dev/null +++ b/spring-jooq/src/test/resources/application.properties @@ -0,0 +1,2 @@ +spring.datasource.url=jdbc:h2:tcp:~/jooq;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE +spring.jpa.hibernate.ddl-auto=update diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java index d3b6a52726..2595f2b13c 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/example/EmployeeDAOIntegrationTest.java @@ -1,18 +1,22 @@ package com.baeldung.example; -import com.baeldung.junit.tags.example.Employee; -import com.baeldung.junit.tags.example.EmployeeDAO; -import com.baeldung.junit.tags.example.SpringJdbcConfig; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; +import com.baeldung.junit.tags.example.Employee; +import com.baeldung.junit.tags.example.EmployeeDAO; +import com.baeldung.junit.tags.example.SpringJdbcConfig; + @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { SpringJdbcConfig.class }, loader = AnnotationConfigContextLoader.class) +@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD) public class EmployeeDAOIntegrationTest { @Autowired diff --git a/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java b/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java index bcd76cb4c2..7f0720b96d 100644 --- a/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java +++ b/testing-modules/junit-5-basics/src/test/java/com/baeldung/tags/EmployeeDAOIntegrationTest.java @@ -1,8 +1,5 @@ package com.baeldung.tags; -import com.baeldung.junit.tags.example.Employee; -import com.baeldung.junit.tags.example.EmployeeDAO; -import com.baeldung.junit.tags.example.SpringJdbcConfig; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Tag; @@ -13,12 +10,19 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit.jupiter.SpringExtension; import org.springframework.test.context.support.AnnotationConfigContextLoader; +import com.baeldung.junit.tags.example.Employee; +import com.baeldung.junit.tags.example.EmployeeDAO; +import com.baeldung.junit.tags.example.SpringJdbcConfig; + @ExtendWith(SpringExtension.class) @ContextConfiguration(classes = { SpringJdbcConfig.class }, loader = AnnotationConfigContextLoader.class) +@DirtiesContext(classMode = ClassMode.BEFORE_EACH_TEST_METHOD) public class EmployeeDAOIntegrationTest { @Autowired From 933b41c8b5162ee1aad719d710e24d6b8394420c Mon Sep 17 00:00:00 2001 From: Amy DeGregorio Date: Mon, 23 Sep 2019 15:41:37 -0400 Subject: [PATCH 241/396] Bael 3329 - Updates to Spring Boot Admin (#7856) * BAEL-3222 Example Code and update to spring-boot-admin examples * BAEL-3329 Fix integration tests * BAEL-3329 Fix integration tests --- ...AdminClientApplicationIntegrationTest.java | 14 +++++----- .../spring-boot-admin-server/pom.xml | 10 ++++--- .../configs/NotifierConfiguration.java | 26 ++++++++++++------- .../configs/WebSecurityConfig.java | 2 ++ .../src/main/resources/application.properties | 14 +++++----- .../NotifierConfigurationIntegrationTest.java | 16 ++++++------ .../WebSecurityConfigIntegrationTest.java | 9 ++++--- 7 files changed, 52 insertions(+), 39 deletions(-) diff --git a/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java b/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java index 0201deabca..f9e969c06a 100644 --- a/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java +++ b/spring-boot-admin/spring-boot-admin-client/src/test/java/com/baeldung/springbootadminclient/SpringBootAdminClientApplicationIntegrationTest.java @@ -15,7 +15,7 @@ import static org.junit.Assert.assertEquals; import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = RANDOM_PORT) @@ -36,20 +36,20 @@ public class SpringBootAdminClientApplicationIntegrationTest { @Test public void whenEnvironmentAvailable_ThenAdminServerPropertiesExist() { - assertEquals(environment.getProperty("spring.boot.admin.url"), "http://localhost:8080"); - assertEquals(environment.getProperty("spring.boot.admin.username"), "admin"); - assertEquals(environment.getProperty("spring.boot.admin.password"), "admin"); + assertEquals(environment.getProperty("spring.boot.admin.client.url"), "http://localhost:8080"); + assertEquals(environment.getProperty("spring.boot.admin.client.username"), "admin"); + assertEquals(environment.getProperty("spring.boot.admin.client.password"), "admin"); } @Test public void whenHttpBasicAttempted_ThenSuccess() throws Exception { - mockMvc.perform(get("/env").with(httpBasic("client", "client"))); + mockMvc.perform(get("/actuator/env").with(httpBasic("client", "client"))); } @Test public void whenInvalidHttpBasicAttempted_ThenUnauthorized() throws Exception { mockMvc - .perform(get("/env").with(httpBasic("client", "invalid"))) - .andExpect(status().isUnauthorized()); + .perform(get("/actuator/env").with(httpBasic("client", "invalid"))) + .andExpect(unauthenticated()); } } diff --git a/spring-boot-admin/spring-boot-admin-server/pom.xml b/spring-boot-admin/spring-boot-admin-server/pom.xml index 142cf420f4..5ef99976c8 100644 --- a/spring-boot-admin/spring-boot-admin-server/pom.xml +++ b/spring-boot-admin/spring-boot-admin-server/pom.xml @@ -51,10 +51,12 @@ ${spring-boot-admin-starter-client.version} - - - - + + + org.springframework.boot + spring-boot-starter-mail + + org.springframework.boot spring-boot-starter-test diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java index d43f4b430a..f9abee11b7 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/NotifierConfiguration.java @@ -1,32 +1,40 @@ package com.baeldung.springbootadminserver.configs; import java.time.Duration; +import java.util.Collections; +import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import de.codecentric.boot.admin.server.domain.entities.InstanceRepository; +import de.codecentric.boot.admin.server.notify.CompositeNotifier; import de.codecentric.boot.admin.server.notify.LoggingNotifier; +import de.codecentric.boot.admin.server.notify.Notifier; import de.codecentric.boot.admin.server.notify.RemindingNotifier; import de.codecentric.boot.admin.server.notify.filter.FilteringNotifier; @Configuration public class NotifierConfiguration { - @Autowired - private InstanceRepository repository; + private final InstanceRepository repository; + private final ObjectProvider> otherNotifiers; - // @Autowired private Notifier notifier; - - @Bean - public LoggingNotifier notifier() { - return new LoggingNotifier(repository); + public NotifierConfiguration(InstanceRepository repository, ObjectProvider> otherNotifiers) { + this.repository = repository; + this.otherNotifiers = otherNotifiers; } @Bean public FilteringNotifier filteringNotifier() { - return new FilteringNotifier(notifier(), repository); + CompositeNotifier delegate = new CompositeNotifier(this.otherNotifiers.getIfAvailable(Collections::emptyList)); + return new FilteringNotifier(delegate, this.repository); + } + + @Bean + public LoggingNotifier notifier() { + return new LoggingNotifier(repository); } @Primary diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java index ee37d2f0b3..1943c61ff4 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java +++ b/spring-boot-admin/spring-boot-admin-server/src/main/java/com/baeldung/springbootadminserver/configs/WebSecurityConfig.java @@ -5,6 +5,7 @@ import java.util.UUID; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.csrf.CookieCsrfTokenRepository; @@ -13,6 +14,7 @@ import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import de.codecentric.boot.admin.server.config.AdminServerProperties; @Configuration +@EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { private final AdminServerProperties adminServer; diff --git a/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties b/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties index ba7a7de2a0..273c11468c 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties +++ b/spring-boot-admin/spring-boot-admin-server/src/main/resources/application.properties @@ -16,14 +16,14 @@ management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always #mail notifications -#spring.mail.host=smtp.gmail.com -#spring.mail.username=test@gmail.com -#spring.mail.password=password -#spring.mail.port=587 -#spring.mail.properties.mail.smtp.auth=true -#spring.mail.properties.mail.smtp.starttls.enable=true +spring.mail.host= +spring.mail.username= +spring.mail.password= +spring.mail.port= +spring.mail.properties.mail.smtp.auth= +spring.mail.properties.mail.smtp.starttls.enable= -#spring.boot.admin.notify.mail.to=test@gmail.com +spring.boot.admin.notify.mail.to= #hipchat notifications #spring.boot.admin.notify.hipchat.auth-token= diff --git a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java index fc8acc4e4d..eca83b6f6c 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java +++ b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/NotifierConfigurationIntegrationTest.java @@ -1,10 +1,7 @@ package com.baeldung.springbootadminserver; -import com.baeldung.springbootadminserver.configs.NotifierConfiguration; - -import de.codecentric.boot.admin.server.notify.Notifier; -import de.codecentric.boot.admin.server.notify.RemindingNotifier; -import de.codecentric.boot.admin.server.notify.filter.FilteringNotifier; +import static org.junit.Assert.assertNotEquals; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; import org.junit.Test; import org.junit.runner.RunWith; @@ -13,11 +10,14 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.context.ApplicationContext; import org.springframework.test.context.junit4.SpringRunner; -import static org.junit.Assert.assertNotEquals; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.NONE; +import com.baeldung.springbootadminserver.configs.NotifierConfiguration; + +import de.codecentric.boot.admin.server.notify.Notifier; +import de.codecentric.boot.admin.server.notify.RemindingNotifier; +import de.codecentric.boot.admin.server.notify.filter.FilteringNotifier; @RunWith(SpringRunner.class) -@SpringBootTest(classes = { NotifierConfiguration.class }, webEnvironment = NONE) +@SpringBootTest(classes = { NotifierConfiguration.class, SpringBootAdminServerApplication.class }, webEnvironment = NONE) public class NotifierConfigurationIntegrationTest { @Autowired private ApplicationContext applicationContext; diff --git a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java index 0c0695e6c2..e5018f5f5f 100644 --- a/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java +++ b/spring-boot-admin/spring-boot-admin-server/src/test/java/com/baeldung/springbootadminserver/WebSecurityConfigIntegrationTest.java @@ -14,6 +14,7 @@ import static org.springframework.security.test.web.servlet.request.SecurityMock import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.httpBasic; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; +import static org.springframework.security.test.web.servlet.response.SecurityMockMvcResultMatchers.unauthenticated; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -51,21 +52,21 @@ public class WebSecurityConfigIntegrationTest { .password("admin")); mockMvc - .perform(get("/api/applications/")) + .perform(get("/applications/")) .andExpect(status().is2xxSuccessful()); } @Test public void whenHttpBasicAttempted_ThenSuccess() throws Exception { - mockMvc.perform(get("/env").with(httpBasic("admin", "admin"))); + mockMvc.perform(get("/actuator/env").with(httpBasic("admin", "admin"))); } @Test public void whenInvalidHttpBasicAttempted_ThenUnauthorized() throws Exception { mockMvc - .perform(get("/env").with(httpBasic("admin", "invalid"))) - .andExpect(status().isUnauthorized()); + .perform(get("/actuator/env").with(httpBasic("admin", "invalid"))) + .andExpect(unauthenticated()); } } From ee9f90ab2f07c2f5094b309f9aaa54f35f17b6f0 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 24 Sep 2019 14:12:44 +0100 Subject: [PATCH 242/396] [BAEL-17477] Add links between reactive & reactive-2 (#7839) --- spring-5-reactive-2/README.md | 1 + spring-5-reactive/README.md | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md index a8204932f7..1d21425fb8 100644 --- a/spring-5-reactive-2/README.md +++ b/spring-5-reactive-2/README.md @@ -3,3 +3,4 @@ This module contains articles about reactive Spring 5 - [Spring WebClient vs. RestTemplate](https://www.baeldung.com/spring-webclient-resttemplate) +- More articles: [[<-- prev]](/spring-5-reactive) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index b782f817ad..89ff4fea9f 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -22,4 +22,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) - [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) - [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) -- [more...](/spring-5-reactive-2) +- More articles: [[next -->]](/spring-5-reactive-2) \ No newline at end of file From f4b4a9eea5a508d9b31e62f21b11a6d32aa8e2e8 Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Tue, 24 Sep 2019 16:18:08 +0300 Subject: [PATCH 243/396] Split or move java-collections-maps module (#7802) --- java-collections-maps-2/README.md | 8 ++++++ java-collections-maps-2/pom.xml | 19 ++++++++++++++ .../baeldung/map}/convert/MapToString.java | 2 +- .../baeldung/map}/convert/StringToMap.java | 2 +- .../map/{ => copyhashmap}/CopyHashMap.java | 6 ++--- .../map/initialize/MapInitializer.java | 2 +- .../baeldung/map/iteration/MapIteration.java | 0 .../java/com/baeldung/map/mapmax}/MapMax.java | 8 ++---- .../com/baeldung/map/mergemaps}/Employee.java | 2 +- .../baeldung/map/mergemaps}/MergeMaps.java | 4 +-- .../map/{ => primitives}/PrimitiveMaps.java | 2 +- .../com/baeldung/map}/sort/SortHashMap.java | 4 +-- .../map}/convert/MapToStringUnitTest.java | 2 +- .../map}/convert/StringToMapUnitTest.java | 2 +- .../CopyHashMapUnitTest.java | 9 +++---- .../map/{ => copyhashmap}/Employee.java | 2 +- .../initialize/MapInitializerUnitTest.java | 6 ++--- .../baeldung/map/mapmax}/MapMaxUnitTest.java | 9 +++---- .../TreeMapVsHashMapUnitTest.java | 14 +++++------ .../map}/weakhashmap/WeakHashMapUnitTest.java | 2 +- java-collections-maps/README.md | 18 ++++--------- java-collections-maps/pom.xml | 6 ----- .../com/baeldung/{java => }/map/MapUtil.java | 4 +-- .../com/baeldung/{java => }/map/MyKey.java | 2 +- .../{java => }/map/MyLinkedHashMap.java | 2 +- .../{java => }/map/ImmutableMapUnitTest.java | 11 +++----- .../{java => }/map/KeyCheckUnitTest.java | 8 +++--- .../map/MapMultipleValuesUnitTest.java | 21 ++++++---------- .../baeldung/{java => }/map/MapUnitTest.java | 2 +- .../{java => }/map/MapUtilUnitTest.java | 13 +++++----- .../map/MultiValuedMapUnitTest.java | 24 +++++++++--------- .../compare/HashMapComparisonUnitTest.java | 25 ++++++++----------- 32 files changed, 116 insertions(+), 125 deletions(-) rename {java-collections-maps/src/main/java/com/baeldung => java-collections-maps-2/src/main/java/com/baeldung/map}/convert/MapToString.java (96%) rename {java-collections-maps/src/main/java/com/baeldung => java-collections-maps-2/src/main/java/com/baeldung/map}/convert/StringToMap.java (94%) rename java-collections-maps-2/src/main/java/com/baeldung/map/{ => copyhashmap}/CopyHashMap.java (98%) rename {java-collections-maps/src/main/java/com/baeldung/java => java-collections-maps-2/src/main/java/com/baeldung}/map/initialize/MapInitializer.java (98%) rename {java-collections-maps => java-collections-maps-2}/src/main/java/com/baeldung/map/iteration/MapIteration.java (100%) rename {java-collections-maps/src/main/java/com/baeldung/map/util => java-collections-maps-2/src/main/java/com/baeldung/map/mapmax}/MapMax.java (94%) rename {java-collections-maps/src/main/java/com/baeldung/sort => java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps}/Employee.java (97%) rename {java-collections-maps/src/main/java/com/baeldung/map/java_8 => java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps}/MergeMaps.java (97%) rename java-collections-maps-2/src/main/java/com/baeldung/map/{ => primitives}/PrimitiveMaps.java (98%) rename {java-collections-maps/src/main/java/com/baeldung => java-collections-maps-2/src/main/java/com/baeldung/map}/sort/SortHashMap.java (97%) rename {java-collections-maps/src/test/java/com/baeldung => java-collections-maps-2/src/test/java/com/baeldung/map}/convert/MapToStringUnitTest.java (97%) rename {java-collections-maps/src/test/java/com/baeldung => java-collections-maps-2/src/test/java/com/baeldung/map}/convert/StringToMapUnitTest.java (95%) rename java-collections-maps-2/src/test/java/com/baeldung/map/{ => copyhashmap}/CopyHashMapUnitTest.java (98%) rename java-collections-maps-2/src/test/java/com/baeldung/map/{ => copyhashmap}/Employee.java (91%) rename {java-collections-maps/src/test/java/com/baeldung/java => java-collections-maps-2/src/test/java/com/baeldung}/map/initialize/MapInitializerUnitTest.java (94%) rename {java-collections-maps/src/test/java/com/baeldung/map/util => java-collections-maps-2/src/test/java/com/baeldung/map/mapmax}/MapMaxUnitTest.java (97%) rename java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java => java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java (91%) rename {java-collections-maps/src/test/java/com/baeldung => java-collections-maps-2/src/test/java/com/baeldung/map}/weakhashmap/WeakHashMapUnitTest.java (98%) rename java-collections-maps/src/main/java/com/baeldung/{java => }/map/MapUtil.java (96%) rename java-collections-maps/src/main/java/com/baeldung/{java => }/map/MyKey.java (97%) rename java-collections-maps/src/main/java/com/baeldung/{java => }/map/MyLinkedHashMap.java (94%) rename java-collections-maps/src/test/java/com/baeldung/{java => }/map/ImmutableMapUnitTest.java (92%) rename java-collections-maps/src/test/java/com/baeldung/{java => }/map/KeyCheckUnitTest.java (78%) rename java-collections-maps/src/test/java/com/baeldung/{java => }/map/MapMultipleValuesUnitTest.java (96%) rename java-collections-maps/src/test/java/com/baeldung/{java => }/map/MapUnitTest.java (99%) rename java-collections-maps/src/test/java/com/baeldung/{java => }/map/MapUtilUnitTest.java (99%) rename java-collections-maps/src/test/java/com/baeldung/{java => }/map/MultiValuedMapUnitTest.java (99%) rename java-collections-maps/src/test/java/com/baeldung/{java => }/map/compare/HashMapComparisonUnitTest.java (97%) diff --git a/java-collections-maps-2/README.md b/java-collections-maps-2/README.md index ff84e93ce4..7aef942ff0 100644 --- a/java-collections-maps-2/README.md +++ b/java-collections-maps-2/README.md @@ -1,3 +1,11 @@ ## Relevant Articles: - [Map of Primitives in Java](https://www.baeldung.com/java-map-primitives) - [Copying a HashMap in Java](https://www.baeldung.com/java-copy-hashmap) +- [Guide to WeakHashMap in Java](https://www.baeldung.com/java-weakhashmap) +- [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion) +- [Iterate over a Map in Java](https://www.baeldung.com/java-iterate-map) +- [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps) +- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort) +- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) +- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) +- [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap) diff --git a/java-collections-maps-2/pom.xml b/java-collections-maps-2/pom.xml index e242a8655e..a246559f61 100644 --- a/java-collections-maps-2/pom.xml +++ b/java-collections-maps-2/pom.xml @@ -41,6 +41,22 @@ commons-lang3 ${commons-lang3.version} + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + one.util + streamex + ${streamex.version} + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + org.assertj assertj-core @@ -50,6 +66,9 @@ + 0.6.5 + 4.1 + 1.7.0 8.2.0 3.0.2 8.1.0 diff --git a/java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java similarity index 96% rename from java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java index aca0d05ef1..d13be924ff 100644 --- a/java-collections-maps/src/main/java/com/baeldung/convert/MapToString.java +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/MapToString.java @@ -1,4 +1,4 @@ -package com.baeldung.convert; +package com.baeldung.map.convert; import com.google.common.base.Joiner; import org.apache.commons.lang3.StringUtils; diff --git a/java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java similarity index 94% rename from java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java index caabca4a09..416ba4dd9a 100644 --- a/java-collections-maps/src/main/java/com/baeldung/convert/StringToMap.java +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/convert/StringToMap.java @@ -1,4 +1,4 @@ -package com.baeldung.convert; +package com.baeldung.map.convert; import com.google.common.base.Splitter; diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/CopyHashMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java similarity index 98% rename from java-collections-maps-2/src/main/java/com/baeldung/map/CopyHashMap.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java index 2ebc9413c8..cb18f3aa11 100644 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/CopyHashMap.java +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/copyhashmap/CopyHashMap.java @@ -1,4 +1,6 @@ -package com.baeldung.map; +package com.baeldung.map.copyhashmap; + +import org.apache.commons.lang3.SerializationUtils; import java.util.HashMap; import java.util.Map; @@ -6,8 +8,6 @@ import java.util.Map.Entry; import java.util.Set; import java.util.stream.Collectors; -import org.apache.commons.lang3.SerializationUtils; - public class CopyHashMap { public static HashMap copyUsingConstructor(HashMap originalMap) { diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java b/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java similarity index 98% rename from java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java index 4dbaceac62..4d63abcfd0 100644 --- a/java-collections-maps/src/main/java/com/baeldung/java/map/initialize/MapInitializer.java +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/initialize/MapInitializer.java @@ -1,4 +1,4 @@ -package com.baeldung.java.map.initialize; +package com.baeldung.map.initialize; import java.util.AbstractMap; import java.util.Collections; diff --git a/java-collections-maps/src/main/java/com/baeldung/map/iteration/MapIteration.java b/java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java similarity index 100% rename from java-collections-maps/src/main/java/com/baeldung/map/iteration/MapIteration.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/iteration/MapIteration.java diff --git a/java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java similarity index 94% rename from java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java index 93a98ba6fd..8c33c857ee 100644 --- a/java-collections-maps/src/main/java/com/baeldung/map/util/MapMax.java +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/mapmax/MapMax.java @@ -1,11 +1,7 @@ -package com.baeldung.map.util; +package com.baeldung.map.mapmax; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import java.util.Map.Entry; -import java.util.Optional; public class MapMax { diff --git a/java-collections-maps/src/main/java/com/baeldung/sort/Employee.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java similarity index 97% rename from java-collections-maps/src/main/java/com/baeldung/sort/Employee.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java index b5e56f6141..d7fb0d1a1d 100644 --- a/java-collections-maps/src/main/java/com/baeldung/sort/Employee.java +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/Employee.java @@ -1,4 +1,4 @@ -package com.baeldung.sort; +package com.baeldung.map.mergemaps; public class Employee implements Comparable { diff --git a/java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java similarity index 97% rename from java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java index 052cfb8bad..4f187bad90 100644 --- a/java-collections-maps/src/main/java/com/baeldung/map/java_8/MergeMaps.java +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/mergemaps/MergeMaps.java @@ -1,7 +1,7 @@ -package com.baeldung.map.java_8; +package com.baeldung.map.mergemaps; -import com.baeldung.sort.Employee; import one.util.streamex.EntryStream; + import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; diff --git a/java-collections-maps-2/src/main/java/com/baeldung/map/PrimitiveMaps.java b/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java similarity index 98% rename from java-collections-maps-2/src/main/java/com/baeldung/map/PrimitiveMaps.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java index d835950c68..30bec12ccc 100644 --- a/java-collections-maps-2/src/main/java/com/baeldung/map/PrimitiveMaps.java +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/primitives/PrimitiveMaps.java @@ -1,4 +1,4 @@ -package com.baeldung.map; +package com.baeldung.map.primitives; import cern.colt.map.AbstractIntDoubleMap; import cern.colt.map.OpenIntDoubleHashMap; diff --git a/java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java b/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java similarity index 97% rename from java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java rename to java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java index b8a2b32060..14610ffb00 100644 --- a/java-collections-maps/src/main/java/com/baeldung/sort/SortHashMap.java +++ b/java-collections-maps-2/src/main/java/com/baeldung/map/sort/SortHashMap.java @@ -1,8 +1,8 @@ -package com.baeldung.sort; +package com.baeldung.map.sort; +import com.baeldung.map.mergemaps.Employee; import com.google.common.base.Functions; import com.google.common.collect.ImmutableSortedMap; -import com.google.common.collect.Lists; import com.google.common.collect.Ordering; import java.util.*; diff --git a/java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java similarity index 97% rename from java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java rename to java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java index d9923e74a0..4517dea328 100644 --- a/java-collections-maps/src/test/java/com/baeldung/convert/MapToStringUnitTest.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/MapToStringUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.convert; +package com.baeldung.map.convert; import org.apache.commons.collections4.MapUtils; import org.junit.Assert; diff --git a/java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java similarity index 95% rename from java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java rename to java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java index 8fb906efd0..2f80b30871 100644 --- a/java-collections-maps/src/test/java/com/baeldung/convert/StringToMapUnitTest.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/convert/StringToMapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.convert; +package com.baeldung.map.convert; import org.junit.Assert; import org.junit.jupiter.api.Test; diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/CopyHashMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java similarity index 98% rename from java-collections-maps-2/src/test/java/com/baeldung/map/CopyHashMapUnitTest.java rename to java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java index c400eea153..e2d5e327e1 100644 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/CopyHashMapUnitTest.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/CopyHashMapUnitTest.java @@ -1,13 +1,12 @@ -package com.baeldung.map; +package com.baeldung.map.copyhashmap; -import static org.assertj.core.api.Assertions.assertThat; +import com.google.common.collect.ImmutableMap; +import org.junit.Test; import java.util.HashMap; import java.util.Map; -import org.junit.Test; - -import com.google.common.collect.ImmutableMap; +import static org.assertj.core.api.Assertions.assertThat; public class CopyHashMapUnitTest { diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/Employee.java b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java similarity index 91% rename from java-collections-maps-2/src/test/java/com/baeldung/map/Employee.java rename to java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java index 7963fa811c..5db55c26ea 100644 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/Employee.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/copyhashmap/Employee.java @@ -1,4 +1,4 @@ -package com.baeldung.map; +package com.baeldung.map.copyhashmap; import java.io.Serializable; diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java similarity index 94% rename from java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java rename to java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java index 80a8983d6f..7c6dffe787 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/initialize/MapInitializerUnitTest.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/initialize/MapInitializerUnitTest.java @@ -1,10 +1,10 @@ -package com.baeldung.java.map.initialize; +package com.baeldung.map.initialize; -import static org.junit.Assert.assertEquals; +import org.junit.Test; import java.util.Map; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class MapInitializerUnitTest { diff --git a/java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java similarity index 97% rename from java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java rename to java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java index 883265cc8b..30b945bfc8 100644 --- a/java-collections-maps/src/test/java/com/baeldung/map/util/MapMaxUnitTest.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/mapmax/MapMaxUnitTest.java @@ -1,14 +1,13 @@ -package com.baeldung.map.util; +package com.baeldung.map.mapmax; - -import static org.junit.Assert.assertEquals; +import org.junit.Before; +import org.junit.Test; import java.util.HashMap; import java.util.Map; -import org.junit.Before; -import org.junit.Test; +import static org.junit.Assert.assertEquals; public class MapMaxUnitTest { diff --git a/java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java b/java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java similarity index 91% rename from java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java rename to java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java index f2dfc992c2..1057e3b9f0 100644 --- a/java-collections-maps/src/test/java/com/baeldung/collection/WhenComparingTreeMapVsHashMap.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/treemaphashmap/TreeMapVsHashMapUnitTest.java @@ -1,16 +1,14 @@ -package com.baeldung.collection; - -import java.util.ConcurrentModificationException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; -import java.util.TreeMap; +package com.baeldung.map.treemaphashmap; import org.hamcrest.Matchers; import org.junit.Assert; import org.junit.Test; -public class WhenComparingTreeMapVsHashMap { +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +public class TreeMapVsHashMapUnitTest { @Test public void whenInsertObjectsTreeMap_thenNaturalOrder() { diff --git a/java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java similarity index 98% rename from java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java rename to java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java index d7bcb31867..293f24c378 100644 --- a/java-collections-maps/src/test/java/com/baeldung/weakhashmap/WeakHashMapUnitTest.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/weakhashmap/WeakHashMapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.weakhashmap; +package com.baeldung.map.weakhashmap; import org.junit.Test; diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md index 2eeb2c8843..3a6ad1d10c 100644 --- a/java-collections-maps/README.md +++ b/java-collections-maps/README.md @@ -3,21 +3,13 @@ ## Java Collections Cookbooks and Examples ### Relevant Articles: -- [Guide to WeakHashMap in Java](http://www.baeldung.com/java-weakhashmap) -- [Guide to the Guava BiMap](http://www.baeldung.com/guava-bimap) -- [The Java HashMap Under the Hood](http://www.baeldung.com/java-hashmap) -- [A Guide to LinkedHashMap in Java](http://www.baeldung.com/java-linked-hashmap) -- [A Guide to TreeMap in Java](http://www.baeldung.com/java-treemap) -- [Iterate over a Map in Java](http://www.baeldung.com/java-iterate-map) -- [Java TreeMap vs HashMap](http://www.baeldung.com/java-treemap-vs-hashmap) -- [How to Store Duplicate Keys in a Map in Java?](http://www.baeldung.com/java-map-duplicate-keys) -- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) +- [Guide to the Guava BiMap](https://www.baeldung.com/guava-bimap) +- [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap) +- [A Guide to LinkedHashMap in Java](https://www.baeldung.com/java-linked-hashmap) +- [A Guide to TreeMap in Java](https://www.baeldung.com/java-treemap) +- [How to Store Duplicate Keys in a Map in Java?](https://www.baeldung.com/java-map-duplicate-keys) - [Get the Key for a Value from a Java Map](https://www.baeldung.com/java-map-key-from-value) -- [Sort a HashMap in Java](https://www.baeldung.com/java-hashmap-sort) -- [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) -- [Merging Two Maps with Java 8](https://www.baeldung.com/java-merge-maps) - [How to Check If a Key Exists in a Map](https://www.baeldung.com/java-map-key-exists) - [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) - [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps) -- [Map to String Conversion in Java](https://www.baeldung.com/java-map-to-string-conversion) - [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map) diff --git a/java-collections-maps/pom.xml b/java-collections-maps/pom.xml index 83cc97a21e..b755582580 100644 --- a/java-collections-maps/pom.xml +++ b/java-collections-maps/pom.xml @@ -36,11 +36,6 @@ ${assertj.version} test
    - - one.util - streamex - ${streamex.version} - @@ -49,6 +44,5 @@ 1.7.0 3.6.1 7.1.0 - 0.6.5 diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java b/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java similarity index 96% rename from java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java rename to java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java index 688c7592f3..91b7197a92 100644 --- a/java-collections-maps/src/main/java/com/baeldung/java/map/MapUtil.java +++ b/java-collections-maps/src/main/java/com/baeldung/map/MapUtil.java @@ -1,12 +1,12 @@ /** * */ -package com.baeldung.java.map; +package com.baeldung.map; import java.util.HashSet; import java.util.Map; -import java.util.Set; import java.util.Map.Entry; +import java.util.Set; import java.util.stream.Stream; /** diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java b/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java similarity index 97% rename from java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java rename to java-collections-maps/src/main/java/com/baeldung/map/MyKey.java index ae3c3edc39..9993d7862c 100644 --- a/java-collections-maps/src/main/java/com/baeldung/java/map/MyKey.java +++ b/java-collections-maps/src/main/java/com/baeldung/map/MyKey.java @@ -1,4 +1,4 @@ -package com.baeldung.java.map; +package com.baeldung.map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java b/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java similarity index 94% rename from java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java rename to java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java index 1e237580ec..b687e57d85 100644 --- a/java-collections-maps/src/main/java/com/baeldung/java/map/MyLinkedHashMap.java +++ b/java-collections-maps/src/main/java/com/baeldung/map/MyLinkedHashMap.java @@ -1,4 +1,4 @@ -package com.baeldung.java.map; +package com.baeldung.map; import java.util.LinkedHashMap; import java.util.Map; diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java similarity index 92% rename from java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java rename to java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java index b239ae07d8..d308aac7eb 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/map/ImmutableMapUnitTest.java @@ -1,16 +1,13 @@ -package com.baeldung.java.map; +package com.baeldung.map; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; +import com.google.common.collect.ImmutableMap; +import org.junit.jupiter.api.Test; import java.util.Collections; import java.util.HashMap; import java.util.Map; -import org.junit.jupiter.api.Test; - -import com.google.common.collect.ImmutableMap; +import static org.junit.jupiter.api.Assertions.*; public class ImmutableMapUnitTest { diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java similarity index 78% rename from java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java rename to java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java index 2c97a97690..dbad2e5b5e 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/KeyCheckUnitTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/map/KeyCheckUnitTest.java @@ -1,13 +1,11 @@ -package com.baeldung.java.map; +package com.baeldung.map; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; +import org.junit.Test; import java.util.Collections; import java.util.Map; -import org.junit.Test; +import static org.junit.Assert.*; public class KeyCheckUnitTest { diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java similarity index 96% rename from java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java rename to java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java index 3a0affa6f3..721b48ea7b 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/MapMultipleValuesUnitTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/map/MapMultipleValuesUnitTest.java @@ -1,13 +1,9 @@ -package com.baeldung.java.map; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +package com.baeldung.map; +import com.google.common.collect.ArrayListMultimap; +import com.google.common.collect.LinkedHashMultimap; +import com.google.common.collect.Multimap; +import com.google.common.collect.TreeMultimap; import org.apache.commons.collections4.MultiMap; import org.apache.commons.collections4.MultiMapUtils; import org.apache.commons.collections4.MultiValuedMap; @@ -18,10 +14,9 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.LinkedHashMultimap; -import com.google.common.collect.Multimap; -import com.google.common.collect.TreeMultimap; +import java.util.*; + +import static org.assertj.core.api.Assertions.assertThat; public class MapMultipleValuesUnitTest { private static final Logger LOG = LoggerFactory.getLogger(MapMultipleValuesUnitTest.class); diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java similarity index 99% rename from java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java rename to java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java index 7582eb87fb..eaf68ccba5 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUnitTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/map/MapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.map; +package com.baeldung.map; import org.junit.Test; import org.slf4j.Logger; diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java similarity index 99% rename from java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java rename to java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java index e31385e972..f8e4c8fd8a 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/MapUtilUnitTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/map/MapUtilUnitTest.java @@ -1,9 +1,12 @@ /** * */ -package com.baeldung.java.map; +package com.baeldung.map; -import static org.junit.Assert.assertEquals; +import com.google.common.collect.HashBiMap; +import org.apache.commons.collections4.BidiMap; +import org.apache.commons.collections4.bidimap.DualHashBidiMap; +import org.junit.Test; import java.util.Arrays; import java.util.HashMap; @@ -11,11 +14,7 @@ import java.util.HashSet; import java.util.Map; import java.util.stream.Collectors; -import org.apache.commons.collections4.BidiMap; -import org.apache.commons.collections4.bidimap.DualHashBidiMap; -import org.junit.Test; - -import com.google.common.collect.HashBiMap; +import static org.junit.Assert.assertEquals; /** * @author swpraman diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java similarity index 99% rename from java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java rename to java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java index b3aaf8925f..686c1cef87 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/MultiValuedMapUnitTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/map/MultiValuedMapUnitTest.java @@ -1,15 +1,4 @@ -package com.baeldung.java.map; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; +package com.baeldung.map; import org.apache.commons.collections4.MultiMapUtils; import org.apache.commons.collections4.MultiSet; @@ -18,6 +7,17 @@ import org.apache.commons.collections4.multimap.ArrayListValuedHashMap; import org.apache.commons.collections4.multimap.HashSetValuedHashMap; import org.junit.Test; +import java.util.Arrays; +import java.util.Collection; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; + public class MultiValuedMapUnitTest { @Test diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java similarity index 97% rename from java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java rename to java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java index e8aa12d4bd..0edd0cd87b 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/map/compare/HashMapComparisonUnitTest.java @@ -1,24 +1,21 @@ -package com.baeldung.java.map.compare; +package com.baeldung.map.compare; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.collection.IsMapContaining.hasEntry; -import static org.hamcrest.collection.IsMapContaining.hasKey; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; +import com.google.common.base.Equivalence; +import com.google.common.collect.MapDifference; +import com.google.common.collect.MapDifference.ValueDifference; +import com.google.common.collect.Maps; +import org.junit.Before; +import org.junit.Test; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.stream.Collectors; -import org.junit.Before; -import org.junit.Test; - -import com.google.common.base.Equivalence; -import com.google.common.collect.MapDifference; -import com.google.common.collect.MapDifference.ValueDifference; -import com.google.common.collect.Maps; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.collection.IsMapContaining.hasEntry; +import static org.hamcrest.collection.IsMapContaining.hasKey; +import static org.junit.Assert.*; public class HashMapComparisonUnitTest { From f822c1032baf2fa9cf8a36d604338f8bd2e492a6 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 24 Sep 2019 14:27:23 +0100 Subject: [PATCH 244/396] [BAEL-17699 (#7860) --- .../src/main/resources/factorybean-abstract-spring-ctx.xml | 0 .../src/main/resources/factorybean-spring-ctx.xml | 0 .../src/test/resources/beanfactory-example.xml | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {spring-core => spring-core-2}/src/main/resources/factorybean-abstract-spring-ctx.xml (100%) rename {spring-core => spring-core-2}/src/main/resources/factorybean-spring-ctx.xml (100%) rename {spring-core => spring-core-2}/src/test/resources/beanfactory-example.xml (100%) diff --git a/spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml b/spring-core-2/src/main/resources/factorybean-abstract-spring-ctx.xml similarity index 100% rename from spring-core/src/main/resources/factorybean-abstract-spring-ctx.xml rename to spring-core-2/src/main/resources/factorybean-abstract-spring-ctx.xml diff --git a/spring-core/src/main/resources/factorybean-spring-ctx.xml b/spring-core-2/src/main/resources/factorybean-spring-ctx.xml similarity index 100% rename from spring-core/src/main/resources/factorybean-spring-ctx.xml rename to spring-core-2/src/main/resources/factorybean-spring-ctx.xml diff --git a/spring-core/src/test/resources/beanfactory-example.xml b/spring-core-2/src/test/resources/beanfactory-example.xml similarity index 100% rename from spring-core/src/test/resources/beanfactory-example.xml rename to spring-core-2/src/test/resources/beanfactory-example.xml From 2757d0a3ad27e9e8348077029945b283b4e51e61 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Tue, 24 Sep 2019 14:28:05 +0100 Subject: [PATCH 245/396] [BAEL-17697] - Fixed integration tests (#7859) --- spring-di/src/main/java/com/baeldung/sample/AppConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-di/src/main/java/com/baeldung/sample/AppConfig.java b/spring-di/src/main/java/com/baeldung/sample/AppConfig.java index c948011c69..d13023d89e 100644 --- a/spring-di/src/main/java/com/baeldung/sample/AppConfig.java +++ b/spring-di/src/main/java/com/baeldung/sample/AppConfig.java @@ -4,7 +4,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration -@ComponentScan("org.baeldung.sample") +@ComponentScan("com.baeldung.sample") public class AppConfig { } From 0a67756dee186b703bf96df3a3d211375f626dfa Mon Sep 17 00:00:00 2001 From: Dilip Date: Tue, 24 Sep 2019 15:56:43 -0500 Subject: [PATCH 246/396] Spring WebClient Mocking Code Repo (#7525) * adding complete code implementation of Hexagonal Architectute example * refactored the code * added the webclient mocking * removed the unwanted repo * updated the test cases * removed commented code * fixed the code review comments * fixed the test cases * removed unwanted dependencies * removed the unwanted project * fixed the code review comments * added the mock to the variable name * added the mock to the variable name * addressed the code review comments * removed the unnecessary semi colon * fixed the compilation issues * Update spring-5-reactive-client/pom.xml Co-Authored-By: KevinGilmore * Update spring-5-reactive-client/pom.xml Co-Authored-By: KevinGilmore * added the missing dependency * fixed the compilation issue in the pom.xml file --- spring-5-reactive-client/pom.xml | 50 +++++++- .../com/baeldung/reactive/enums/Role.java | 5 + .../com/baeldung/reactive/model/Employee.java | 64 +++++++++ .../reactive/service/EmployeeService.java | 55 ++++++++ .../EmployeeServiceIntegrationTest.java | 121 ++++++++++++++++++ .../service/EmployeeServiceUnitTest.java | 114 +++++++++++++++++ 6 files changed, 407 insertions(+), 2 deletions(-) create mode 100644 spring-5-reactive-client/src/main/java/com/baeldung/reactive/enums/Role.java create mode 100644 spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Employee.java create mode 100644 spring-5-reactive-client/src/main/java/com/baeldung/reactive/service/EmployeeService.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceIntegrationTest.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceUnitTest.java diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index 70771f6832..9e574b2196 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -54,6 +54,18 @@ org.apache.commons commons-lang3
    + + + com.squareup.okhttp3 + okhttp + 4.0.1 + + + com.squareup.okhttp3 + mockwebserver + 4.0.1 + test + @@ -88,14 +100,25 @@ org.projectlombok lombok - - + + org.mockito + mockito-junit-jupiter + 2.23.0 + test + + + io.projectreactor + reactor-test + 3.2.10.RELEASE + test + org.eclipse.jetty jetty-reactive-httpclient ${jetty-reactive-httpclient.version} test + @@ -108,6 +131,29 @@ JAR + + org.apache.maven.plugins + maven-compiler-plugin + + 1.8 + 1.8 + + + + maven-surefire-plugin + 2.22.0 + + + maven-surefire-plugin + 2.19.1 + + + org.junit.platform + junit-platform-surefire-provider + 1.0.1 + + + diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/enums/Role.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/enums/Role.java new file mode 100644 index 0000000000..6b11f14734 --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/enums/Role.java @@ -0,0 +1,5 @@ +package com.baeldung.reactive.enums; + +public enum Role { + ENGINEER, SENIOR_ENGINEER, LEAD_ENGINEER +} diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Employee.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Employee.java new file mode 100644 index 0000000000..6a8daaf6de --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/model/Employee.java @@ -0,0 +1,64 @@ +package com.baeldung.reactive.model; + + +import com.baeldung.reactive.enums.Role; + +public class Employee { + private Integer employeeId; + private String firstName; + private String lastName; + private Integer age; + private Role role; + + public Employee() { + } + + public Employee(Integer employeeId, String firstName, String lastName, Integer age, Role role) { + this.employeeId = employeeId; + this.firstName = firstName; + this.lastName = lastName; + this.age = age; + this.role = role; + } + + public Integer getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(Integer employeeId) { + this.employeeId = employeeId; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Integer getAge() { + return age; + } + + public void setAge(Integer age) { + this.age = age; + } + + public Role getRole() { + return role; + } + + public void setRole(Role role) { + this.role = role; + } +} + diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/service/EmployeeService.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/service/EmployeeService.java new file mode 100644 index 0000000000..b841dbfe3f --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/service/EmployeeService.java @@ -0,0 +1,55 @@ +package com.baeldung.reactive.service; +import com.baeldung.reactive.model.Employee; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; + +public class EmployeeService { + + private WebClient webClient; + public static String PATH_PARAM_BY_ID = "/employee/{id}"; + public static String ADD_EMPLOYEE = "/employee"; + + public EmployeeService(WebClient webClient) { + this.webClient = webClient; + } + + public EmployeeService(String baseUrl) { + this.webClient = WebClient.create(baseUrl); + } + + public Mono getEmployeeById(Integer employeeId) { + return webClient + .get() + .uri(PATH_PARAM_BY_ID, employeeId) + .retrieve() + .bodyToMono(Employee.class); + } + + public Mono addNewEmployee(Employee newEmployee) { + + return webClient + .post() + .uri(ADD_EMPLOYEE) + .syncBody(newEmployee) + .retrieve(). + bodyToMono(Employee.class); + } + + public Mono updateEmployee(Integer employeeId, Employee updateEmployee) { + + return webClient + .put() + .uri(PATH_PARAM_BY_ID,employeeId) + .syncBody(updateEmployee) + .retrieve() + .bodyToMono(Employee.class); + } + + public Mono deleteEmployeeById(Integer employeeId) { + return webClient + .delete() + .uri(PATH_PARAM_BY_ID,employeeId) + .retrieve() + .bodyToMono(String.class); + } +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceIntegrationTest.java new file mode 100644 index 0000000000..f5d9529ada --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceIntegrationTest.java @@ -0,0 +1,121 @@ +package com.baeldung.reactive.service; + +import com.baeldung.reactive.model.Employee; +import com.baeldung.reactive.enums.Role; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import okhttp3.mockwebserver.MockResponse; +import okhttp3.mockwebserver.MockWebServer; +import okhttp3.mockwebserver.RecordedRequest; +import org.junit.Rule; +import org.junit.jupiter.api.*; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import java.io.IOException; + +import static org.junit.jupiter.api.Assertions.*; + +class EmployeeServiceIntegrationTest { + + public static MockWebServer mockBackEnd; + private EmployeeService employeeService; + private ObjectMapper MAPPER = new ObjectMapper(); + + @BeforeAll + static void setUp() throws IOException { + mockBackEnd = new MockWebServer(); + mockBackEnd.start(); + } + + @AfterAll + static void tearDown() throws IOException { + mockBackEnd.shutdown(); + } + + @BeforeEach + void initialize() { + + String baseUrl = String.format("http://localhost:%s", mockBackEnd.getPort()); + employeeService = new EmployeeService(baseUrl); + } + + @Test + void getEmployeeById() throws Exception { + + Employee mockEmployee = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(mockEmployee)) + .addHeader("Content-Type", "application/json")); + + Mono employeeMono = employeeService.getEmployeeById(100); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getRole().equals(Role.LEAD_ENGINEER)) + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("GET", recordedRequest.getMethod()); + assertEquals("/employee/100", recordedRequest.getPath()); + } + + @Test + void addNewEmployee() throws Exception { + + Employee newEmployee = new Employee(null, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + Employee webClientResponse = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(webClientResponse)) + .addHeader("Content-Type", "application/json")); + + Mono employeeMono = employeeService.addNewEmployee(newEmployee); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getEmployeeId().equals(100)) + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("POST", recordedRequest.getMethod()); + assertEquals("/employee", recordedRequest.getPath()); + } + + @Test + void updateEmployee() throws Exception { + + Integer newAge = 33; + String newLastName = "Sandler New"; + Employee updateEmployee = new Employee(100, "Adam", newLastName, newAge, Role.LEAD_ENGINEER); + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(updateEmployee)) + .addHeader("Content-Type", "application/json")); + + Mono updatedEmploye = employeeService.updateEmployee(100, updateEmployee); + + StepVerifier.create(updatedEmploye) + .expectNextMatches(employee -> employee.getLastName().equals(newLastName) && employee.getAge() == newAge) + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("PUT", recordedRequest.getMethod()); + assertEquals("/employee/100", recordedRequest.getPath()); + + } + + + @Test + void deleteEmployee() throws Exception { + + String responseMessage = "Employee Deleted SuccessFully"; + Integer employeeId = 100; + mockBackEnd.enqueue(new MockResponse().setBody(MAPPER.writeValueAsString(responseMessage)) + .addHeader("Content-Type", "application/json")); + + Mono deletedEmployee = employeeService.deleteEmployeeById(employeeId); + + StepVerifier.create(deletedEmployee) + .expectNext("\"Employee Deleted SuccessFully\"") + .verifyComplete(); + + RecordedRequest recordedRequest = mockBackEnd.takeRequest(); + assertEquals("DELETE", recordedRequest.getMethod()); + assertEquals("/employee/100", recordedRequest.getPath()); + } + +} \ No newline at end of file diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceUnitTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceUnitTest.java new file mode 100644 index 0000000000..1d1a8fd2e4 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/service/EmployeeServiceUnitTest.java @@ -0,0 +1,114 @@ +package com.baeldung.reactive.service; + + +import com.baeldung.reactive.model.Employee; +import com.baeldung.reactive.enums.Role; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.exceptions.base.MockitoException; +import org.mockito.junit.MockitoJUnitRunner; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +class EmployeeServiceUnitTest { + + EmployeeService employeeService; + @Mock + private WebClient webClientMock; + @Mock + private WebClient.RequestHeadersSpec requestHeadersMock; + @Mock + private WebClient.RequestHeadersUriSpec requestHeadersUriMock; + @Mock + private WebClient.RequestBodySpec requestBodyMock; + @Mock + private WebClient.RequestBodyUriSpec requestBodyUriMock; + @Mock + private WebClient.ResponseSpec responseMock; + + @BeforeEach + void setUp() { + employeeService = new EmployeeService(webClientMock); + } + + @Test + void givenEmployeeId_whenGetEmployeeById_thenReturnEmployee() { + + Integer employeeId = 100; + Employee mockEmployee = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + when(webClientMock.get()).thenReturn(requestHeadersUriMock); + when(requestHeadersUriMock.uri("/employee/{id}", employeeId)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(Employee.class)).thenReturn(Mono.just(mockEmployee)); + + Mono employeeMono = employeeService.getEmployeeById(employeeId); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getRole().equals(Role.LEAD_ENGINEER)) + .verifyComplete(); + } + + @Test + void givenEmployee_whenAddEmployee_thenAddNewEmployee() { + + Employee newEmployee = new Employee(null, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + Employee webClientResponse = new Employee(100, "Adam", "Sandler", 32, Role.LEAD_ENGINEER); + when(webClientMock.post()).thenReturn(requestBodyUriMock); + when(requestBodyUriMock.uri(EmployeeService.ADD_EMPLOYEE)).thenReturn(requestBodyMock); + when(requestBodyMock.syncBody(newEmployee)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(Employee.class)).thenReturn(Mono.just(webClientResponse)); + + Mono employeeMono = employeeService.addNewEmployee(newEmployee); + + StepVerifier.create(employeeMono) + .expectNextMatches(employee -> employee.getEmployeeId().equals(100)) + .verifyComplete(); + } + + @Test + void givenEmployee_whenupdateEmployee_thenUpdatedEmployee() { + + Integer newAge = 33; + String newLastName = "Sandler New"; + Employee updateEmployee = new Employee(100, "Adam", newLastName, newAge, Role.LEAD_ENGINEER); + when(webClientMock.put()).thenReturn(requestBodyUriMock); + when(requestBodyUriMock.uri(EmployeeService.PATH_PARAM_BY_ID, 100)).thenReturn(requestBodyMock); + when(requestBodyMock.syncBody(updateEmployee)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(Employee.class)).thenReturn(Mono.just(updateEmployee)); + + Mono updatedEmployee = employeeService.updateEmployee(100, updateEmployee); + + StepVerifier.create(updatedEmployee) + .expectNextMatches(employee -> employee.getLastName().equals(newLastName) && employee.getAge() == newAge) + .verifyComplete(); + + } + + @Test + void givenEmployee_whenDeleteEmployeeById_thenDeleteSuccessful() { + + String responseMessage = "Employee Deleted SuccessFully"; + when(webClientMock.delete()).thenReturn(requestHeadersUriMock); + when(requestHeadersUriMock.uri(EmployeeService.PATH_PARAM_BY_ID, 100)).thenReturn(requestHeadersMock); + when(requestHeadersMock.retrieve()).thenReturn(responseMock); + when(responseMock.bodyToMono(String.class)).thenReturn(Mono.just(responseMessage)); + + Mono deletedEmployee = employeeService.deleteEmployeeById(100); + + StepVerifier.create(deletedEmployee) + .expectNext(responseMessage) + .verifyComplete(); + } +} \ No newline at end of file From 6f9c3399864afa1e5faeb29f2ed8508f24ff5b0f Mon Sep 17 00:00:00 2001 From: Alfred Samanga Date: Wed, 25 Sep 2019 08:13:00 +0200 Subject: [PATCH 247/396] BAEL-3321 Flogger Fluent Logging (#7872) * Added Flogger maven dependency * Implemented Flogger logging examples * Finished implementing Flogger logging examples * Changed Flogger Test to Integration tests * Adding examples on optimisation * Added support for Slf4j and Log4j backends * Added support for Slf4j and Log4j backends, uncommended dependencies in pom, removed log4j config file --- logging-modules/flogger/pom.xml | 39 +++++++++++++++++++ .../flogger/FloggerIntegrationTest.java | 23 +++++++++++ 2 files changed, 62 insertions(+) diff --git a/logging-modules/flogger/pom.xml b/logging-modules/flogger/pom.xml index 2b96332bf6..0bba719616 100644 --- a/logging-modules/flogger/pom.xml +++ b/logging-modules/flogger/pom.xml @@ -17,11 +17,50 @@ flogger 0.4
    + com.google.flogger flogger-system-backend 0.4 runtime + + + com.google.flogger + flogger-slf4j-backend + 0.4 + + + + com.google.flogger + flogger-log4j-backend + 0.4 + + + com.sun.jmx + jmxri + + + com.sun.jdmk + jmxtools + + + javax.jms + jms + + + + + + log4j + log4j + 1.2.17 + + + log4j + apache-log4j-extras + 1.2.17 + + \ No newline at end of file diff --git a/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java index 69460dc045..80fa0edd96 100644 --- a/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java +++ b/logging-modules/flogger/src/test/java/com/baeldung/flogger/FloggerIntegrationTest.java @@ -12,6 +12,10 @@ import java.util.stream.IntStream; import static com.google.common.flogger.LazyArgs.lazy; public class FloggerIntegrationTest { + static { +// System.setProperty("flogger.backend_factory", "com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"); + System.setProperty("flogger.backend_factory", "com.google.common.flogger.backend.slf4j.Slf4jBackendFactory#getInstance"); + } private static final FluentLogger logger = FluentLogger.forEnclosingClass(); @Test @@ -28,6 +32,16 @@ public class FloggerIntegrationTest { }); } + @Test + public void givenAnObject_shouldLogTheObject() { + User user = new User(); + logger.atInfo().log("The user is: %s", user); //correct + + //The following ways of logging are not recommended + logger.atInfo().log("The user is: %s", user.toString()); + logger.atInfo().log("The user is: %s" + user); + } + @Test public void givenASimpleOperation_shouldLogTheResult() { int result = 45 / 3; @@ -70,4 +84,13 @@ public class FloggerIntegrationTest { int s = 30; return String.format("%d seconds elapsed so far. %d items pending processing", s, items); } + + private class User { + String name = "Test"; + + @Override + public String toString() { + return name; + } + } } From af75e04e5085a5e9a3ad4ede025275ebec43c750 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Wed, 25 Sep 2019 18:55:50 +0530 Subject: [PATCH 248/396] BAEL-9496 Fix failing context tests (#7855) * BAEL-9496 Fix failing context tests - Fixes for SpringContextIntegrationTest in several projects * BAEL-9496 Fix failing context tests -Fixed ContextTests for spring-jms and further fixes spring-session-mongodb * BAEL-9496 Fix failing context tests -Fixed context tests from spring-rest-angular project --- .../baeldung/SpringContextIntegrationTest.java | 17 ----------------- .../org/baeldung/SpringContextLiveTest.java | 9 +++++++++ .../gateway/SpringContextLiveTest.java | 9 +++++++++ .../SpringContextIntegrationTest.java | 15 --------------- .../vaultsample/SpringContextLiveTest.java | 9 +++++++++ .../src/test/resources/application.properties | 2 ++ .../baeldung/SpringContextIntegrationTest.java | 2 +- .../java/org/baeldung/SpringContextTest.java | 2 +- .../baeldung/web/main/PersistenceConfig.java | 2 +- .../src/main/resources/application.properties | 3 ++- .../src/main/resources/{db/sql => }/data.sql | 7 ------- .../baeldung/SpringContextIntegrationTest.java | 4 +++- .../java/com/baeldung/SpringContextTest.java | 9 +++++---- spring-session/spring-session-mongodb/pom.xml | 6 ++++++ .../baeldung/SpringContextIntegrationTest.java | 2 +- ...textLiveTest.java => SpringContextTest.java} | 4 ++-- .../src/test/resources/application.properties | 2 ++ .../baeldung/SpringContextIntegrationTest.java | 17 ----------------- .../org/baeldung/SpringContextLiveTest.java | 4 ++++ .../baeldung/SpringContextIntegrationTest.java | 16 ---------------- .../org/baeldung/SpringContextLiveTest.java | 9 +++++++++ .../src/test/resources/application.properties | 1 + .../src/main/resources/application.yml | 2 +- .../baeldung/SpringContextIntegrationTest.java | 16 ---------------- .../org/baeldung/SpringContextLiveTest.java | 9 +++++++++ 25 files changed, 77 insertions(+), 101 deletions(-) delete mode 100644 spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java delete mode 100644 spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java create mode 100644 spring-jenkins-pipeline/src/test/resources/application.properties rename spring-rest-angular/src/main/resources/{db/sql => }/data.sql (92%) rename spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextIntegrationTest.java => spring-security-mvc/src/test/java/com/baeldung/SpringContextTest.java (64%) rename spring-session/spring-session-mongodb/src/test/java/org/baeldung/{SpringContextLiveTest.java => SpringContextTest.java} (71%) create mode 100644 spring-session/spring-session-mongodb/src/test/resources/application.properties delete mode 100644 spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextIntegrationTest.java delete mode 100644 spring-vault/src/test/java/org/baeldung/SpringContextIntegrationTest.java create mode 100644 spring-vault/src/test/resources/application.properties delete mode 100644 spring-webflux-amqp/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 28dbc9a8d8..0000000000 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.baeldung.spring.cloud.DataFlowShellApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = DataFlowShellApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void contextLoads() { - } - -} diff --git a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java index 5be4f9c077..1784eb772a 100644 --- a/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-cloud-data-flow/spring-cloud-data-flow-stream-processing/data-flow-shell/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -6,6 +6,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * complete data-flow server and shell setup running + * + *
    + * For more info: + * https://www.baeldung.com/spring-cloud-data-flow-stream-processing + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = DataFlowShellApplication.class) public class SpringContextLiveTest { diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java index a3cbb3310d..a5c6ab612a 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java +++ b/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextLiveTest.java @@ -5,6 +5,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * Eureka server and Gateway application up and running + * + *
    + * For more info: + * https://www.baeldung.com/spring-cloud-netflix-eureka + * https://www.baeldung.com/spring-cloud-gateway-pattern + */ @RunWith(SpringRunner.class) @SpringBootTest public class SpringContextLiveTest { diff --git a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java deleted file mode 100644 index e1eb2f8e24..0000000000 --- a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextIntegrationTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.spring.cloud.vaultsample; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = VaultSampleApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java b/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java index 3be4d96964..82fe3d7a4a 100644 --- a/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java +++ b/spring-cloud/spring-cloud-vault/src/test/java/org/baeldung/spring/cloud/vaultsample/SpringContextLiveTest.java @@ -5,6 +5,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * vault server up and running on the environment + * + *
    + * For more info on setting up the vault server: + * https://www.baeldung.com/vault + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = VaultSampleApplication.class) public class SpringContextLiveTest { diff --git a/spring-jenkins-pipeline/src/test/resources/application.properties b/spring-jenkins-pipeline/src/test/resources/application.properties new file mode 100644 index 0000000000..4ee830556a --- /dev/null +++ b/spring-jenkins-pipeline/src/test/resources/application.properties @@ -0,0 +1,2 @@ +#To use a randomly allocated free port during tests to avoid port conflict across tests +spring.data.mongodb.port=0 diff --git a/spring-jms/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-jms/src/test/java/org/baeldung/SpringContextIntegrationTest.java index e13809f571..483ffec208 100644 --- a/spring-jms/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-jms/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -6,7 +6,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:EmbeddedActiveMQ.xml"}) +@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) public class SpringContextIntegrationTest { @Test diff --git a/spring-jms/src/test/java/org/baeldung/SpringContextTest.java b/spring-jms/src/test/java/org/baeldung/SpringContextTest.java index e89faeebb7..11c9d9bca6 100644 --- a/spring-jms/src/test/java/org/baeldung/SpringContextTest.java +++ b/spring-jms/src/test/java/org/baeldung/SpringContextTest.java @@ -6,7 +6,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations = {"classpath:applicationContext.xml", "classpath:EmbeddedActiveMQ.xml"}) +@ContextConfiguration(locations = { "classpath:applicationContext.xml" }) public class SpringContextTest { @Test diff --git a/spring-rest-angular/src/main/java/org/baeldung/web/main/PersistenceConfig.java b/spring-rest-angular/src/main/java/org/baeldung/web/main/PersistenceConfig.java index e0f6002733..0fc6b74892 100644 --- a/spring-rest-angular/src/main/java/org/baeldung/web/main/PersistenceConfig.java +++ b/spring-rest-angular/src/main/java/org/baeldung/web/main/PersistenceConfig.java @@ -26,7 +26,7 @@ public class PersistenceConfig { @Bean public DataSource dataSource() { EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder(); - EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.HSQL).addScript("db/sql/data.sql").build(); + EmbeddedDatabase db = builder.setType(EmbeddedDatabaseType.HSQL).build(); return db; } diff --git a/spring-rest-angular/src/main/resources/application.properties b/spring-rest-angular/src/main/resources/application.properties index 2571d286a3..cfa27938c9 100644 --- a/spring-rest-angular/src/main/resources/application.properties +++ b/spring-rest-angular/src/main/resources/application.properties @@ -1,4 +1,5 @@ server.servlet.contextPath=/ spring.h2.console.enabled=true logging.level.org.hibernate.SQL=info -spring.jpa.hibernate.ddl-auto=none \ No newline at end of file +spring.jpa.generate-ddl=true +spring.jpa.hibernate.ddl-auto=create \ No newline at end of file diff --git a/spring-rest-angular/src/main/resources/db/sql/data.sql b/spring-rest-angular/src/main/resources/data.sql similarity index 92% rename from spring-rest-angular/src/main/resources/db/sql/data.sql rename to spring-rest-angular/src/main/resources/data.sql index 418381a681..71e54b29ce 100644 --- a/spring-rest-angular/src/main/resources/db/sql/data.sql +++ b/spring-rest-angular/src/main/resources/data.sql @@ -1,10 +1,3 @@ -CREATE TABLE student ( - id INTEGER PRIMARY KEY, - name VARCHAR(30), - gender VARCHAR(10), - age INTEGER -); - INSERT INTO student (id,name,gender,age) VALUES (1,'Bryan', 'Male',20); INSERT INTO student (id,name,gender,age) diff --git a/spring-security-mvc/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-security-mvc/src/test/java/com/baeldung/SpringContextIntegrationTest.java index 8e53a6371a..ac9da5ca60 100644 --- a/spring-security-mvc/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-security-mvc/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -5,8 +5,10 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.session.SpringSessionApplication; + @RunWith(SpringRunner.class) -@SpringBootTest +@SpringBootTest(classes = SpringSessionApplication.class) public class SpringContextIntegrationTest { @Test diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextIntegrationTest.java b/spring-security-mvc/src/test/java/com/baeldung/SpringContextTest.java similarity index 64% rename from spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextIntegrationTest.java rename to spring-security-mvc/src/test/java/com/baeldung/SpringContextTest.java index dc635cd003..f1c3801c8a 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/src/test/java/com/baeldung/spring/cloud/bootstrap/gateway/SpringContextIntegrationTest.java +++ b/spring-security-mvc/src/test/java/com/baeldung/SpringContextTest.java @@ -1,16 +1,17 @@ -package com.baeldung.spring.cloud.bootstrap.gateway; +package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.session.SpringSessionApplication; + @RunWith(SpringRunner.class) -@SpringBootTest -public class SpringContextIntegrationTest { +@SpringBootTest(classes = SpringSessionApplication.class) +public class SpringContextTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { } - } diff --git a/spring-session/spring-session-mongodb/pom.xml b/spring-session/spring-session-mongodb/pom.xml index dc055ff32d..b9e06615de 100644 --- a/spring-session/spring-session-mongodb/pom.xml +++ b/spring-session/spring-session-mongodb/pom.xml @@ -40,6 +40,12 @@ spring-boot-starter-test test + + + de.flapdoodle.embed + de.flapdoodle.embed.mongo + test + diff --git a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java index 16b7404f57..1acc6a5cb1 100644 --- a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -7,7 +7,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringSessionMongoDBApplication.class) +@SpringBootTest(classes = SpringSessionMongoDBApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class SpringContextIntegrationTest { @Test diff --git a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextTest.java similarity index 71% rename from spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextLiveTest.java rename to spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextTest.java index b41f2b0338..cc935b8cfb 100644 --- a/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-session/spring-session-mongodb/src/test/java/org/baeldung/SpringContextTest.java @@ -7,8 +7,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringSessionMongoDBApplication.class) -public class SpringContextLiveTest { +@SpringBootTest(classes = SpringSessionMongoDBApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class SpringContextTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-session/spring-session-mongodb/src/test/resources/application.properties b/spring-session/spring-session-mongodb/src/test/resources/application.properties new file mode 100644 index 0000000000..4ee830556a --- /dev/null +++ b/spring-session/spring-session-mongodb/src/test/resources/application.properties @@ -0,0 +1,2 @@ +#To use a randomly allocated free port during tests to avoid port conflict across tests +spring.data.mongodb.port=0 diff --git a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index a62e728826..0000000000 --- a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -import com.baeldung.spring.session.SessionWebApplication; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SessionWebApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java index b23ce7dbbb..3a4f14e9e6 100644 --- a/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-session/spring-session-redis/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -7,6 +7,10 @@ import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.spring.session.SessionWebApplication; +/** + * This live test requires: + * redis instance running on the environment + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SessionWebApplication.class) public class SpringContextLiveTest { diff --git a/spring-vault/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-vault/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index a2d727ea79..0000000000 --- a/spring-vault/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung; - -import org.baeldung.springvault.SpringVaultApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringVaultApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-vault/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-vault/src/test/java/org/baeldung/SpringContextLiveTest.java index 1b3db59ecb..60dc119f13 100644 --- a/spring-vault/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-vault/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -6,6 +6,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * vault server up and running on the environment + * + *
    + * For more info on setting up the vault server: + * https://www.baeldung.com/vault + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringVaultApplication.class) public class SpringContextLiveTest { diff --git a/spring-vault/src/test/resources/application.properties b/spring-vault/src/test/resources/application.properties new file mode 100644 index 0000000000..709574239b --- /dev/null +++ b/spring-vault/src/test/resources/application.properties @@ -0,0 +1 @@ +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/spring-webflux-amqp/src/main/resources/application.yml b/spring-webflux-amqp/src/main/resources/application.yml index 3f527ce4c5..702aaba357 100755 --- a/spring-webflux-amqp/src/main/resources/application.yml +++ b/spring-webflux-amqp/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: rabbitmq: - host: 192.168.99.100 + host: localhost port: 5672 username: guest password: guest diff --git a/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 35efff49c2..0000000000 --- a/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung; - -import org.baeldung.spring.amqp.SpringWebfluxAmqpApplication; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(classes = SpringWebfluxAmqpApplication.class) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextLiveTest.java b/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextLiveTest.java index effe8d2cfa..4d9f658cdc 100644 --- a/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextLiveTest.java +++ b/spring-webflux-amqp/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -6,6 +6,15 @@ import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; +/** + * This live test requires: + * rabbitmq instance running on the environment + * + *
    + * To run rabbitmq using docker image: + * (e.g. `docker run -d --name rabbitmq -p 5672:5672 rabbitmq:3`) + * + */ @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringWebfluxAmqpApplication.class) public class SpringContextLiveTest { From 9f18b6bcbe175f898295360d8a01ea51f9b46733 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Wed, 25 Sep 2019 14:28:28 +0100 Subject: [PATCH 249/396] [BAEL-17495] - Add README descriptions 11 (#7861) * [BAEL-17495] - Add README descriptions 11 * Changed wording for the REST modules --- spring-reactive-kotlin/README.md | 4 ++++ spring-reactor/README.md | 4 ++++ spring-remoting/README.md | 4 +++- spring-rest-angular/README.md | 4 +++- spring-rest-compress/README.md | 7 ++++--- spring-rest-full/README.md | 5 +++-- spring-rest-hal-browser/README.md | 4 ++++ spring-rest-query-language/README.md | 9 +++------ spring-rest-shell/README.md | 4 +++- spring-rest/README.md | 4 +++- 10 files changed, 34 insertions(+), 15 deletions(-) diff --git a/spring-reactive-kotlin/README.md b/spring-reactive-kotlin/README.md index cf5debc617..46f4b580fd 100644 --- a/spring-reactive-kotlin/README.md +++ b/spring-reactive-kotlin/README.md @@ -1,2 +1,6 @@ +## Spring Reactive Kotlin + +This module contains articles about reactive Kotlin + ### Relevant Articles: - [Spring Webflux with Kotlin](http://www.baeldung.com/spring-webflux-kotlin) diff --git a/spring-reactor/README.md b/spring-reactor/README.md index 0da2d6be51..e7d7eb927d 100644 --- a/spring-reactor/README.md +++ b/spring-reactor/README.md @@ -1,3 +1,7 @@ +## Spring Reactor + +This module contains articles about Spring Reactor + ## Relevant articles: - [Introduction to Spring Reactor](http://www.baeldung.com/spring-reactor) diff --git a/spring-remoting/README.md b/spring-remoting/README.md index 0898b9b002..247aa52db2 100644 --- a/spring-remoting/README.md +++ b/spring-remoting/README.md @@ -1,4 +1,6 @@ -## Spring Remoting Tutorials +## Spring Remoting + +This module contains articles about Spring Remoting ### Relevant Articles - [Intro to Spring Remoting with HTTP Invokers](http://www.baeldung.com/spring-remoting-http-invoker) diff --git a/spring-rest-angular/README.md b/spring-rest-angular/README.md index d2c2879649..5cd2570152 100644 --- a/spring-rest-angular/README.md +++ b/spring-rest-angular/README.md @@ -1,4 +1,6 @@ -## Spring REST Angular Example Project +## Spring REST Angular + +This module contains articles about REST APIs with Spring and Angular ### Relevant Articles: diff --git a/spring-rest-compress/README.md b/spring-rest-compress/README.md index 238c28e4b5..ce627d8595 100644 --- a/spring-rest-compress/README.md +++ b/spring-rest-compress/README.md @@ -1,5 +1,6 @@ -========================================================================= -## How to compress requests using the Spring RestTemplate Example Project +## Spring REST Compress + +This module contains articles about request compression with Spring ### Relevant Articles: -- [How to compress requests using the Spring RestTemplate]() +- [How to compress requests using the Spring RestTemplate](https://www.baeldung.com/spring-resttemplate-compressing-requests) diff --git a/spring-rest-full/README.md b/spring-rest-full/README.md index b7b006d75e..a0e6e74179 100644 --- a/spring-rest-full/README.md +++ b/spring-rest-full/README.md @@ -1,8 +1,9 @@ -========= +## Spring REST Full -## REST Example Project with Spring +This module contains articles about REST APIs with Spring ### Courses + The "REST With Spring" Classes: http://bit.ly/restwithspring The "Learn Spring Security" Classes: http://github.learnspringsecurity.com diff --git a/spring-rest-hal-browser/README.md b/spring-rest-hal-browser/README.md index d9760c8295..027937f116 100644 --- a/spring-rest-hal-browser/README.md +++ b/spring-rest-hal-browser/README.md @@ -1,2 +1,6 @@ +## Spring REST HAL Browser + +This module contains articles about Spring REST with the HAL browser + ### Relevant Articles: - [Spring REST and HAL Browser](http://www.baeldung.com/spring-rest-hal) diff --git a/spring-rest-query-language/README.md b/spring-rest-query-language/README.md index 7677f96379..383cecec36 100644 --- a/spring-rest-query-language/README.md +++ b/spring-rest-query-language/README.md @@ -1,8 +1,9 @@ -========= +## Spring REST Query Language -## REST Example Project Query Language +This module contains articles about the REST query language with Spring ### Courses + The "REST With Spring" Classes: http://bit.ly/restwithspring The "Learn Spring Security" Classes: http://github.learnspringsecurity.com @@ -16,15 +17,11 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [REST Query Language with RSQL](http://www.baeldung.com/rest-api-search-language-rsql-fiql) - [REST Query Language – Implementing OR Operation](http://www.baeldung.com/rest-api-query-search-or-operation) - - - ### Build the Project ``` mvn clean install ``` - ### Set up MySQL ``` mysql -u root -p diff --git a/spring-rest-shell/README.md b/spring-rest-shell/README.md index b250f06a4b..0b126e6b1c 100644 --- a/spring-rest-shell/README.md +++ b/spring-rest-shell/README.md @@ -1,4 +1,6 @@ -## Spring REST Shell Project +## Spring REST Shell + +This module contains articles about Spring REST Shell ### Relevant Articles diff --git a/spring-rest/README.md b/spring-rest/README.md index 54b47604d4..1d713c05c0 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -1,4 +1,6 @@ -## Spring REST Example Project +## Spring REST + +This module contains articles about REST APIs with Spring ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring From 2a381c38aa30ce02d35a704bd4e1840cad5adbd0 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Wed, 25 Sep 2019 14:30:01 +0100 Subject: [PATCH 250/396] [BAEL-17496] - Add README descriptions 12 (#7862) * [BAEL-17496] - Add README descriptions 12 * Small changes --- spring-rest-simple/README.md | 4 ++++ spring-resttemplate/README.md | 4 +++- spring-roo/README.md | 4 ++++ spring-security-acl/README.md | 4 +++- spring-security-angular/README.md | 4 ++++ spring-security-cache-control/README.md | 4 ++-- spring-security-core/README.md | 18 +++++++++++------- .../{README.MD => README.md} | 4 ++++ spring-security-mvc-custom/README.md | 4 ++-- spring-security-mvc-digest-auth/README.md | 4 ++-- 10 files changed, 39 insertions(+), 15 deletions(-) rename spring-security-mvc-boot/{README.MD => README.md} (91%) diff --git a/spring-rest-simple/README.md b/spring-rest-simple/README.md index c01f27bd98..d60f57b227 100644 --- a/spring-rest-simple/README.md +++ b/spring-rest-simple/README.md @@ -1,3 +1,7 @@ +## Spring REST Simple + +This module contains articles about REST APIs in Spring + ## Relevant articles: - [Guide to UriComponentsBuilder in Spring](http://www.baeldung.com/spring-uricomponentsbuilder) diff --git a/spring-resttemplate/README.md b/spring-resttemplate/README.md index 97a89ff7aa..9b75e1aa81 100644 --- a/spring-resttemplate/README.md +++ b/spring-resttemplate/README.md @@ -1,4 +1,6 @@ -## Spring REST Example Project +## Spring RestTemplate + +This module contains articles about Spring RestTemplate ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-roo/README.md b/spring-roo/README.md index b63b6f35d4..5a8ce6e30f 100644 --- a/spring-roo/README.md +++ b/spring-roo/README.md @@ -1,2 +1,6 @@ +## Spring Roo + +This module contains articles about Spring Roo + ### Relevant Articles: [Quick Guide to Spring Roo](http://www.baeldung.com/spring-roo) diff --git a/spring-security-acl/README.md b/spring-security-acl/README.md index fb3e8160ab..2f95793f8d 100644 --- a/spring-security-acl/README.md +++ b/spring-security-acl/README.md @@ -1,4 +1,6 @@ -## Spring Security ACL Project +## Spring Security ACL + +This module contains articles about Spring Security ACL ### Relevant Articles - [Introduction to Spring Security ACL](http://www.baeldung.com/spring-security-acl) diff --git a/spring-security-angular/README.md b/spring-security-angular/README.md index 80312c4bab..2b376a539f 100644 --- a/spring-security-angular/README.md +++ b/spring-security-angular/README.md @@ -1,2 +1,6 @@ +## Spring Security Angular + +This module contains articles about Spring Security with Angular + ### Relevant Articles: - [Spring Security Login Page with Angular](https://www.baeldung.com/spring-security-login-angular) diff --git a/spring-security-cache-control/README.md b/spring-security-cache-control/README.md index 4b0bab72cb..fc5bdda1f6 100644 --- a/spring-security-cache-control/README.md +++ b/spring-security-cache-control/README.md @@ -1,6 +1,6 @@ -========= - ## Spring Security Cache Control +This module contains articles about cache control with Spring Security + ### Relevant Articles: - [Spring Security – Cache Control Headers](http://www.baeldung.com/spring-security-cache-control-headers) diff --git a/spring-security-core/README.md b/spring-security-core/README.md index bc9a8afed7..3dfcb276d7 100644 --- a/spring-security-core/README.md +++ b/spring-security-core/README.md @@ -1,13 +1,17 @@ -## @PreFilter and @PostFilter annotations +## Spring Security Core -### Build the Project ### - -``` -mvn clean install -``` +This module contains articles about core Spring Security ### Relevant Articles: - [Spring Security – @PreFilter and @PostFilter](http://www.baeldung.com/spring-security-prefilter-postfilter) - [Spring Boot Authentication Auditing Support](http://www.baeldung.com/spring-boot-authentication-audit) - [Introduction to Spring Method Security](http://www.baeldung.com/spring-security-method-security) -- [Overview and Need for DelegatingFilterProxy in Spring](https://www.baeldung.com/spring-delegating-filter-proxy) \ No newline at end of file +- [Overview and Need for DelegatingFilterProxy in Spring](https://www.baeldung.com/spring-delegating-filter-proxy) + +### @PreFilter and @PostFilter annotations + +#### Build the Project + +`mvn clean install` + + diff --git a/spring-security-mvc-boot/README.MD b/spring-security-mvc-boot/README.md similarity index 91% rename from spring-security-mvc-boot/README.MD rename to spring-security-mvc-boot/README.md index 20036283a3..150ea3eee9 100644 --- a/spring-security-mvc-boot/README.MD +++ b/spring-security-mvc-boot/README.md @@ -1,3 +1,7 @@ +## Spring Boot Security MVC + +This module contains articles about Spring Security with Spring MVC in Boot applications + ### The Course The "REST With Spring" Classes: http://github.learnspringsecurity.com diff --git a/spring-security-mvc-custom/README.md b/spring-security-mvc-custom/README.md index ca0731a0c3..84bdec3c10 100644 --- a/spring-security-mvc-custom/README.md +++ b/spring-security-mvc-custom/README.md @@ -1,6 +1,6 @@ -========= +## Spring Security MVC Custom -## Spring Security Login Example Project +This module contains articles about Spring Security with custom MVC applications ###The Course The "REST With Spring" Classes: http://github.learnspringsecurity.com diff --git a/spring-security-mvc-digest-auth/README.md b/spring-security-mvc-digest-auth/README.md index be0bf0a675..da612e273b 100644 --- a/spring-security-mvc-digest-auth/README.md +++ b/spring-security-mvc-digest-auth/README.md @@ -1,6 +1,6 @@ -========= +## Spring Security with Digest Authentication -## Spring Security with Digest Authentication Example Project +This module contains articles about digest authentication with Spring Security ###The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com From c2cf7ae969d2b070a132bb629e8e0613d922c98c Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Wed, 25 Sep 2019 14:30:51 +0100 Subject: [PATCH 251/396] [BAEL-17476] - Add README descriptions 13 (#7863) * [BAEL-17476] - Add README descriptions 13 * Changed the wording in some modules --- spring-security-mvc-jsonview/README.md | 4 ++++ spring-security-mvc-ldap/README.md | 3 ++- spring-security-mvc-login/README.md | 6 +++--- .../README.md | 4 ++-- spring-security-mvc-socket/README.md | 16 ++++++++++++---- spring-security-mvc/README.md | 4 ++-- spring-security-openid/README.md | 9 +++++++-- spring-security-react/README.md | 4 ++-- spring-security-rest-basic-auth/README.md | 5 +++-- spring-security-rest/README.md | 4 ++-- 10 files changed, 39 insertions(+), 20 deletions(-) diff --git a/spring-security-mvc-jsonview/README.md b/spring-security-mvc-jsonview/README.md index 35c806e856..0e28d4c292 100644 --- a/spring-security-mvc-jsonview/README.md +++ b/spring-security-mvc-jsonview/README.md @@ -1,3 +1,7 @@ +## Spring Security MVC Json View + +This module contains articles about Spring Security with JSON + ### Relevant Articles: - [Filtering Jackson JSON Output Based on Spring Security Role](https://www.baeldung.com/spring-security-role-filter-json) diff --git a/spring-security-mvc-ldap/README.md b/spring-security-mvc-ldap/README.md index 6f03143183..fe04cd23fa 100644 --- a/spring-security-mvc-ldap/README.md +++ b/spring-security-mvc-ldap/README.md @@ -1,5 +1,6 @@ +## Spring Security LDAP -## Spring Security with LDAP Example Project +This module contains articles about Spring Security LDAP ###The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com diff --git a/spring-security-mvc-login/README.md b/spring-security-mvc-login/README.md index 983d949cb8..a20a04edec 100644 --- a/spring-security-mvc-login/README.md +++ b/spring-security-mvc-login/README.md @@ -1,8 +1,8 @@ -========= +## Spring Security Login -## Spring Security Login Example Project +This module contains articles about login mechanisms with Spring Security -###The Course +### The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: diff --git a/spring-security-mvc-persisted-remember-me/README.md b/spring-security-mvc-persisted-remember-me/README.md index db2ae890f9..260e55198a 100644 --- a/spring-security-mvc-persisted-remember-me/README.md +++ b/spring-security-mvc-persisted-remember-me/README.md @@ -1,6 +1,6 @@ -========= +## Spring Security Persisted Remember Me -## Spring Security Persisted Remember Me Example Project +This module contains articles about 'remember me' with Spring Security ###The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com diff --git a/spring-security-mvc-socket/README.md b/spring-security-mvc-socket/README.md index d3f28af387..187bbe82b0 100644 --- a/spring-security-mvc-socket/README.md +++ b/spring-security-mvc-socket/README.md @@ -1,3 +1,15 @@ +## Spring Security MVC Socket + +This module contains articles about WebSockets with Spring Security + +### Relevant Articles: + +- [Intro to Security and WebSockets](http://www.baeldung.com/spring-security-websockets) +- [Spring WebSockets: Build an User Chat](https://www.baeldung.com/spring-websockets-send-message-to-user) +- [REST vs WebSockets](https://www.baeldung.com/rest-vs-websockets) + +### Running This Project: + To build the project, run the command: mvn clean install. This will build a war file in the target folder that you can deploye on a server like Tomcat. Alternatively, run the project from an IDE. @@ -5,7 +17,3 @@ Alternatively, run the project from an IDE. To login, use credentials from the data.sql file in src/main/resource, eg: user/password. -### Relevant Articles: -- [Intro to Security and WebSockets](http://www.baeldung.com/spring-security-websockets) -- [Spring WebSockets: Build an User Chat](https://www.baeldung.com/spring-websockets-send-message-to-user) -- [REST vs WebSockets](https://www.baeldung.com/rest-vs-websockets) diff --git a/spring-security-mvc/README.md b/spring-security-mvc/README.md index ce40ed5f5f..ad55e903c5 100644 --- a/spring-security-mvc/README.md +++ b/spring-security-mvc/README.md @@ -1,6 +1,6 @@ -========= +## Spring Security MVC -## Spring Security Login Example Project +This module contains articles about Spring Security in MVC applications ###The Course The "Learn Spring Security" Classes: http://github.learnspringsecurity.com diff --git a/spring-security-openid/README.md b/spring-security-openid/README.md index 8c65c09f2f..1512ffbde5 100644 --- a/spring-security-openid/README.md +++ b/spring-security-openid/README.md @@ -1,16 +1,21 @@ +## Spring Security OpenID + +This module contains articles about OpenID with Spring Security + ### Relevant articles - [Spring Security and OpenID Connect](http://www.baeldung.com/spring-security-openid-connect) - -## OpenID Connect with Spring Security +### OpenID Connect with Spring Security ### Run the Project + ``` mvn spring-boot:run ``` ### Obtain Google App - Client ID, Secret + - You need to get client id and client secret by creating a new project at [Google Developer Console](https://console.developers.google.com/project/_/apiui/credential?pli=1) - Make sure to add OAuth2 credentials by selecting Add credentials > OAuth 2.0 client ID - Make sure you set redirect URI to http://localhost:8081/google-login diff --git a/spring-security-react/README.md b/spring-security-react/README.md index 1a845f0daa..4eb402c699 100644 --- a/spring-security-react/README.md +++ b/spring-security-react/README.md @@ -1,6 +1,6 @@ -========= +## Spring Security React -## Spring Security React Example Project +This module contains articles about Spring Security with ReactJS ### The Course diff --git a/spring-security-rest-basic-auth/README.md b/spring-security-rest-basic-auth/README.md index b905824161..41d463f1e2 100644 --- a/spring-security-rest-basic-auth/README.md +++ b/spring-security-rest-basic-auth/README.md @@ -1,8 +1,9 @@ -========= +## Spring Security REST Basic Authentication -## REST API with Basic Authentication - Example Project +This module contains articles about basic authentication in RESTful APIs with Spring Security ###The Course + The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index f450a514b2..c7ac45e38f 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -1,6 +1,6 @@ -========= +## Spring Security REST -## Spring Security for REST Example Project +This module contains articles about REST APIs with Spring Security ### Courses The "REST With Spring" Classes: http://bit.ly/restwithspring From e45da12044b801a0342bc4d14455f211abf2f552 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Wed, 25 Sep 2019 14:37:18 +0100 Subject: [PATCH 252/396] [BAEL-17498] - Add README descriptions 14 (#7864) * [BAEL-17498] - Add README descriptions 14 * Changed wording in modules --- spring-security-rest-custom/README.md | 4 ++-- spring-security-sso/README.md | 4 ++++ spring-security-stormpath/README.md | 4 ++++ spring-security-thymeleaf/README.MD | 5 +++-- spring-security-x509/README.md | 6 +++++- spring-session/README.md | 4 ++-- spring-sleuth/README.md | 6 +++++- spring-soap/README.md | 6 +++++- spring-social-login/README.md | 4 ++++ spring-spel/README.md | 4 ++++ 10 files changed, 38 insertions(+), 9 deletions(-) diff --git a/spring-security-rest-custom/README.md b/spring-security-rest-custom/README.md index d7cb31e784..846093b554 100644 --- a/spring-security-rest-custom/README.md +++ b/spring-security-rest-custom/README.md @@ -1,6 +1,6 @@ -========= +## Spring Security REST Custom -## Spring Security for REST Example Project +This module contains articles about REST APIs with Spring Security ###The Course The "REST With Spring" Classes: http://github.learnspringsecurity.com diff --git a/spring-security-sso/README.md b/spring-security-sso/README.md index 88e3fbb2f7..31694bee45 100644 --- a/spring-security-sso/README.md +++ b/spring-security-sso/README.md @@ -1,3 +1,7 @@ +## Spring Security Single Sign On + +This module contains modules about single-sign-on with Spring Security + ### Relevant Articles: - [Simple Single Sign-On with Spring Security OAuth2](http://www.baeldung.com/sso-spring-security-oauth2) - [Spring Security Kerberos Integration](https://www.baeldung.com/spring-security-kerberos-integration) diff --git a/spring-security-stormpath/README.md b/spring-security-stormpath/README.md index f83882112f..abd65294a3 100644 --- a/spring-security-stormpath/README.md +++ b/spring-security-stormpath/README.md @@ -1,3 +1,7 @@ +## Spring Security Stormpath + +This module contains articles about Spring Security with Stormpath + ### Relevant articles - [Spring Security with Stormpath](http://www.baeldung.com/spring-security-stormpath) diff --git a/spring-security-thymeleaf/README.MD b/spring-security-thymeleaf/README.MD index 36007bce62..67b811fac8 100644 --- a/spring-security-thymeleaf/README.MD +++ b/spring-security-thymeleaf/README.MD @@ -1,5 +1,6 @@ -This module is for Spring Security Thymeleaf tutorial. -Jira BAEL-1556 +## Spring Security Thymeleaf + +This module contains articles about Spring Security with Thymeleaf ### Relevant Articles: diff --git a/spring-security-x509/README.md b/spring-security-x509/README.md index 2a4b84eae6..2c0e25a229 100644 --- a/spring-security-x509/README.md +++ b/spring-security-x509/README.md @@ -1,2 +1,6 @@ -Relevant Articles: +## Spring Security X.509 + +This module contains articles about X.509 authentication with Spring Security + +### Relevant Articles: - [X.509 Authentication in Spring Security](http://www.baeldung.com/x-509-authentication-in-spring-security) diff --git a/spring-session/README.md b/spring-session/README.md index c9875beadf..65040ec734 100644 --- a/spring-session/README.md +++ b/spring-session/README.md @@ -1,6 +1,6 @@ -========= +## Spring Session -## Spring Session Examples +This module contains articles about Spring Session ### Relevant Articles: - [Guide to Spring Session](https://www.baeldung.com/spring-session) diff --git a/spring-sleuth/README.md b/spring-sleuth/README.md index 47aa126939..692fbaa8b7 100644 --- a/spring-sleuth/README.md +++ b/spring-sleuth/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Spring Sleuth + +This module contains articles about Spring Cloud Sleuth + +### Relevant articles: - [Spring Cloud Sleuth in a Monolith Application](http://www.baeldung.com/spring-cloud-sleuth-single-application) diff --git a/spring-soap/README.md b/spring-soap/README.md index 8d96350e1e..c23f0bc6f0 100644 --- a/spring-soap/README.md +++ b/spring-soap/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Spring SOAP + +This module contains articles about SOAP APIs with Spring + +### Relevant articles: - [Creating a SOAP Web Service with Spring](https://www.baeldung.com/spring-boot-soap-web-service) diff --git a/spring-social-login/README.md b/spring-social-login/README.md index f745a90acb..c3ca867a95 100644 --- a/spring-social-login/README.md +++ b/spring-social-login/README.md @@ -1,2 +1,6 @@ +## Spring Social + +This module contains articles about Spring Social + ### Relevant Articles: - [A Secondary Facebook Login with Spring Social](http://www.baeldung.com/facebook-authentication-with-spring-security-and-social) diff --git a/spring-spel/README.md b/spring-spel/README.md index d7e69e114c..f81d304e1a 100644 --- a/spring-spel/README.md +++ b/spring-spel/README.md @@ -1,2 +1,6 @@ +## Spring Expression Language + +This module contains articles about the Spring Expression Language (SpEL) + ### Relevant Articles: - [Spring Expression Language Guide](http://www.baeldung.com/spring-expression-language) From d06b026a7be95841f644d48dc5d3984969eaf9e9 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Wed, 25 Sep 2019 14:39:31 +0100 Subject: [PATCH 253/396] [BAEL-17476] - Add Readme descriptions 15 (#7875) * [BAEL-17476] - Add Readme descriptions 15 * Added Spring Vert.X readme change --- spring-state-machine/README.md | 4 ++++ spring-static-resources/README.md | 4 ++++ spring-swagger-codegen/README.md | 4 ++++ spring-thymeleaf/README.md | 7 ++++--- spring-vault/README.md | 5 +++++ spring-vertx/README.md | 4 ++++ spring-webflux-amqp/README.md | 5 ++++- spring-zuul/README.md | 5 ++--- static-analysis/README.md | 4 ++++ stripe/README.md | 4 ++-- 10 files changed, 37 insertions(+), 9 deletions(-) diff --git a/spring-state-machine/README.md b/spring-state-machine/README.md index a2668fb650..f80ef34ef8 100644 --- a/spring-state-machine/README.md +++ b/spring-state-machine/README.md @@ -1,3 +1,7 @@ +## Spring State Machine + +This module contains articles about Spring State Machine + ### Relevant articles - [A Guide to the Spring State Machine Project](http://www.baeldung.com/spring-state-machine) diff --git a/spring-static-resources/README.md b/spring-static-resources/README.md index 64f017b5dd..8d77e6fe94 100644 --- a/spring-static-resources/README.md +++ b/spring-static-resources/README.md @@ -1,3 +1,7 @@ +## Spring Static Resources + +This module contains articles about static resources with Spring + ### Relevant Articles: - [Cachable Static Assets with Spring MVC](http://www.baeldung.com/cachable-static-assets-with-spring-mvc) - [Minification of JS and CSS Assets with Maven](http://www.baeldung.com/maven-minification-of-js-and-css-assets) diff --git a/spring-swagger-codegen/README.md b/spring-swagger-codegen/README.md index ee6b240c30..dbcf2b3e8d 100644 --- a/spring-swagger-codegen/README.md +++ b/spring-swagger-codegen/README.md @@ -1,3 +1,7 @@ +## Spring Swagger CodeGen + +This module contains articles about Spring with Swagger CodeGen + ### Relevant articles - [Generate Spring Boot REST Client with Swagger](http://www.baeldung.com/spring-boot-rest-client-swagger-codegen) diff --git a/spring-thymeleaf/README.md b/spring-thymeleaf/README.md index 082a65f55b..88f3e35f8c 100644 --- a/spring-thymeleaf/README.md +++ b/spring-thymeleaf/README.md @@ -1,6 +1,6 @@ -========= +## Spring Thymeleaf -## Spring Thymeleaf Example Project +This module contains articles about Spring with Thymeleaf ### Relevant Articles: - [Introduction to Using Thymeleaf in Spring](http://www.baeldung.com/thymeleaf-in-spring-mvc) @@ -19,13 +19,14 @@ - [Working with Select and Option in Thymeleaf](http://www.baeldung.com/thymeleaf-select-option) - [Working With Custom HTML Attributes in Thymeleaf](https://www.baeldung.com/thymeleaf-custom-html-attributes) - [Spring Request Parameters with Thymeleaf](https://www.baeldung.com/spring-thymeleaf-request-parameters) +- [[next -->]](/spring-thymeleaf-2) ### Build the Project mvn clean install - ### Run the Project + mvn cargo:run - **note**: starts on port '8082' diff --git a/spring-vault/README.md b/spring-vault/README.md index 8db065a3dd..9e1d14ba6b 100644 --- a/spring-vault/README.md +++ b/spring-vault/README.md @@ -1,2 +1,7 @@ +## Spring Vault + +This module contains articles about Spring Vault + ### Relevant Articles: + - [Spring Vault](https://www.baeldung.com/spring-vault) diff --git a/spring-vertx/README.md b/spring-vertx/README.md index 05d059e1b2..e9557f330b 100644 --- a/spring-vertx/README.md +++ b/spring-vertx/README.md @@ -1,2 +1,6 @@ +## Spring Vert.x + +This module contains articles about Spring with Vert.x + ### Relevant Articles: - [Vert.x Spring Integration](http://www.baeldung.com/spring-vertx) diff --git a/spring-webflux-amqp/README.md b/spring-webflux-amqp/README.md index 5cd3391c3e..b7ac73b53d 100644 --- a/spring-webflux-amqp/README.md +++ b/spring-webflux-amqp/README.md @@ -1,4 +1,7 @@ +## Spring WebFlux AMQP + +This module contains articles about Spring WebFlux with AMQP + ### Relevant Articles: -================================ - [Spring AMQP in Reactive Applications](http://www.baeldung.com/spring-amqp-reactive) diff --git a/spring-zuul/README.md b/spring-zuul/README.md index 41a77f70c8..a2ea211195 100644 --- a/spring-zuul/README.md +++ b/spring-zuul/README.md @@ -1,7 +1,6 @@ -========= - -## Spring REST with a Zuul +## Spring Zuul +This module contains articles about Spring with Netflix Zuul ### Relevant Articles: - [Spring REST with a Zuul Proxy](http://www.baeldung.com/spring-rest-with-zuul-proxy) diff --git a/static-analysis/README.md b/static-analysis/README.md index e4d4bc7bfc..e3710831cf 100644 --- a/static-analysis/README.md +++ b/static-analysis/README.md @@ -1,3 +1,7 @@ +## Static Analysis + +This module contains articles about static program analysis + ## Relevant articles: - [Introduction to PMD](http://www.baeldung.com/pmd) diff --git a/stripe/README.md b/stripe/README.md index 8a44ff9d33..a7134b9633 100644 --- a/stripe/README.md +++ b/stripe/README.md @@ -1,6 +1,6 @@ -### Stripe API for Java Sample Project +### Stripe -This is Spring Boot project that displays a checkout form and charges a credit card using the Stripe API for Java. +This module contains articles about Stripe ### Relevant articles From 6b18970f6e3febe797115b55a3486f6862f97533 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Wed, 25 Sep 2019 16:21:38 +0100 Subject: [PATCH 254/396] updated Querysdl --- spring-data-rest-querydsl/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-data-rest-querydsl/README.md b/spring-data-rest-querydsl/README.md index 88efaff35e..be47d05f8d 100644 --- a/spring-data-rest-querydsl/README.md +++ b/spring-data-rest-querydsl/README.md @@ -1,6 +1,6 @@ ## Spring Data REST Querydsl -This module contains articles about Spring Data REST Querydsl +This module contains articles about Querydsl with Spring Data REST ### Relevant Articles: - [REST Query Language Over Multiple Tables with Querydsl Web Support](http://www.baeldung.com/rest-querydsl-multiple-tables) From 9f2a86c79669d84a87d27e0639324d498d394d68 Mon Sep 17 00:00:00 2001 From: Maciej Andrearczyk Date: Wed, 25 Sep 2019 19:33:21 +0200 Subject: [PATCH 255/396] BAEL-3285 | Simultaneous Spring WebClient calls --- spring-5-reactive-client/pom.xml | 6 ++ .../simultaneouswebclient/Client.java | 66 +++++++++++++++++ .../reactive/simultaneouswebclient/Item.java | 17 +++++ .../reactive/simultaneouswebclient/User.java | 17 +++++ .../simultaneouswebclient/UserWithItem.java | 19 +++++ .../ClientIntegrationTest.java | 71 +++++++++++++++++++ 6 files changed, 196 insertions(+) create mode 100644 spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Client.java create mode 100644 spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Item.java create mode 100644 spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/User.java create mode 100644 spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/UserWithItem.java create mode 100644 spring-5-reactive-client/src/test/java/com/baeldung/reactive/simultaneouswebclient/ClientIntegrationTest.java diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index 1b71815eb4..2ef5741e84 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -77,6 +77,12 @@ spring-boot-starter-test test + + com.github.tomakehurst + wiremock + 2.24.1 + test + org.apache.commons diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Client.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Client.java new file mode 100644 index 0000000000..4fbb904564 --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Client.java @@ -0,0 +1,66 @@ +package com.baeldung.reactive.simultaneouswebclient; + +import org.springframework.web.reactive.function.client.WebClient; +import reactor.core.publisher.Mono; +import reactor.core.publisher.Flux; +import reactor.core.scheduler.Schedulers; + +import java.util.List; + +public class Client { + + private WebClient webClient; + + public Client(String uri) { + this.webClient = WebClient.create(uri); + } + + public Mono getUser(int id) { + return webClient + .get() + .uri("/user/{id}", id) + .retrieve() + .bodyToMono(User.class); + } + + public Mono getItem(int id) { + return webClient + .get() + .uri("/item/{id}", id) + .retrieve() + .bodyToMono(Item.class); + } + + public Mono getOtherUser(int id) { + return webClient + .get() + .uri("/otheruser/{id}", id) + .retrieve() + .bodyToMono(User.class); + } + + public List fetchUsers(List userIds) { + return Flux.fromIterable(userIds) + .parallel() + .runOn(Schedulers.elastic()) + .flatMap(this::getUser) + .collectSortedList((u1, u2) -> u2.id() - u1.id()) + .block(); + } + + public List fetchUserAndOtherUser(int id) { + return Flux.merge(getUser(id), getOtherUser(id)) + .parallel() + .runOn(Schedulers.elastic()) + .collectSortedList((u1, u2) -> u2.id() - u1.id()) + .block(); + } + + public UserWithItem fetchUserAndItem(int userId, int itemId) { + Mono user = getUser(userId).subscribeOn(Schedulers.elastic()); + Mono item = getItem(itemId).subscribeOn(Schedulers.elastic()); + + return Mono.zip(user, item, UserWithItem::new) + .block(); + } +} diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Item.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Item.java new file mode 100644 index 0000000000..5584e1896d --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Item.java @@ -0,0 +1,17 @@ +package com.baeldung.reactive.simultaneouswebclient; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class Item { + private int id; + + @JsonCreator + public Item(@JsonProperty("id") int id) { + this.id = id; + } + + public int id() { + return id; + } +} diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/User.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/User.java new file mode 100644 index 0000000000..e080538227 --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/User.java @@ -0,0 +1,17 @@ +package com.baeldung.reactive.simultaneouswebclient; + +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonProperty; + +public class User { + private int id; + + @JsonCreator + public User(@JsonProperty("id") int id) { + this.id = id; + } + + public int id() { + return id; + } +} diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/UserWithItem.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/UserWithItem.java new file mode 100644 index 0000000000..d19a324e55 --- /dev/null +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/UserWithItem.java @@ -0,0 +1,19 @@ +package com.baeldung.reactive.simultaneouswebclient; + +public class UserWithItem { + private User user; + private Item item; + + public UserWithItem(User user, Item item) { + this.user = user; + this.item = item; + } + + public User user() { + return user; + } + + public Item item() { + return item; + } +} diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/simultaneouswebclient/ClientIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/simultaneouswebclient/ClientIntegrationTest.java new file mode 100644 index 0000000000..e5b707d384 --- /dev/null +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/simultaneouswebclient/ClientIntegrationTest.java @@ -0,0 +1,71 @@ +package com.baeldung.reactive.simultaneouswebclient; + +import org.junit.Test; +import org.junit.Before; +import org.junit.After; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; +import com.github.tomakehurst.wiremock.WireMockServer; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import static com.github.tomakehurst.wiremock.core.WireMockConfiguration.wireMockConfig; +import static com.github.tomakehurst.wiremock.client.WireMock.*; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ClientIntegrationTest { + + private WireMockServer wireMockServer; + + @Before + public void setup() { + wireMockServer = new WireMockServer(wireMockConfig().port(8089)); + wireMockServer.start(); + configureFor("localhost", wireMockServer.port()); + } + + @After + public void tearDown() { + wireMockServer.stop(); + } + + @Test + public void checkIfCallsAreExecutedSimultaneously() { + // Arrange + int requestsNumber = 5; + int singleRequestTime = 1000; + + for (int i = 1; i <= requestsNumber; i++) { + stubFor( + get(urlEqualTo("/user/" + i)).willReturn(aResponse() + .withFixedDelay(singleRequestTime) + .withStatus(200) + .withHeader("Content-Type", "application/json") + .withBody(String.format("{ \"id\": %d }", i)))); + } + + List userIds = IntStream.rangeClosed(1, requestsNumber) + .boxed() + .collect(Collectors.toList()); + + Client client = new Client("http://localhost:8089"); + + // Act + long start = System.currentTimeMillis(); + List users = client.fetchUsers(userIds); + long end = System.currentTimeMillis(); + + // Assert + long totalExecutionTime = end - start; + + assertEquals("Unexpected number of users", requestsNumber, users.size()); + assertTrue("Execution time is too big", 2 * singleRequestTime > totalExecutionTime); + } +} From 824acb9351121e6dc912402a943e87e7369f4bec Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 26 Sep 2019 11:08:01 +0530 Subject: [PATCH 256/396] BAEL-17703 Fix the integrations tests in mockito (#7871) * BAEL-17703 Fix the integrations tests in mockito - Upgraded power-mockito api 2 jar - Renamed many IntegrationTests back to UnitTests as they do not require any integration components * BAEL-17703 Fix the integrations tests in mockito -Renamed MockFinals to MockFinalsUnitTest so that it can be picked by builds --- testing-modules/mockito/pom.xml | 2 +- ...egrationTest.java => LuckyNumberGeneratorUnitTest.java} | 2 +- ...ckitoIntegrationTest.java => PowerMockitoUnitTest.java} | 7 +++---- ...MockitoIntegrationTest.java => BDDMockitoUnitTest.java} | 2 +- .../mockito/{MockFinals.java => MockFinalsUnitTest.java} | 2 +- ...IntegrationTest.java => MockitoAnnotationUnitTest.java} | 2 +- ...grationTest.java => MockitoConfigExamplesUnitTest.java} | 2 +- ...nIntegrationTest.java => MockitoExceptionUnitTest.java} | 2 +- ...toMockIntegrationTest.java => MockitoMockUnitTest.java} | 2 +- ...grationTest.java => MockitoVerifyExamplesUnitTest.java} | 2 +- ...kitoSpyIntegrationTest.java => MockitoSpyUnitTest.java} | 2 +- 11 files changed, 13 insertions(+), 14 deletions(-) rename testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/{LuckyNumberGeneratorIntegrationTest.java => LuckyNumberGeneratorUnitTest.java} (97%) rename testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/{PowerMockitoIntegrationTest.java => PowerMockitoUnitTest.java} (94%) rename testing-modules/mockito/src/test/java/org/baeldung/bddmockito/{BDDMockitoIntegrationTest.java => BDDMockitoUnitTest.java} (98%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{MockFinals.java => MockFinalsUnitTest.java} (95%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{MockitoAnnotationIntegrationTest.java => MockitoAnnotationUnitTest.java} (98%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{MockitoConfigExamplesIntegrationTest.java => MockitoConfigExamplesUnitTest.java} (98%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{MockitoExceptionIntegrationTest.java => MockitoExceptionUnitTest.java} (97%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{MockitoMockIntegrationTest.java => MockitoMockUnitTest.java} (98%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/{MockitoVerifyExamplesIntegrationTest.java => MockitoVerifyExamplesUnitTest.java} (98%) rename testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/{MockitoSpyIntegrationTest.java => MockitoSpyUnitTest.java} (97%) diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml index 7b6d6e7735..f307b80370 100644 --- a/testing-modules/mockito/pom.xml +++ b/testing-modules/mockito/pom.xml @@ -96,7 +96,7 @@ 19.0 - 1.7.0 + 2.0.2 2.0.0.0 2.1.1 diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java similarity index 97% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java index 5e311c60f2..5b66aa0a9e 100644 --- a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/LuckyNumberGeneratorUnitTest.java @@ -14,7 +14,7 @@ import org.powermock.modules.junit4.PowerMockRunner; @RunWith(PowerMockRunner.class) @PrepareForTest(fullyQualifiedNames = "com.baeldung.powermockito.introduction.LuckyNumberGenerator") -public class LuckyNumberGeneratorIntegrationTest { +public class LuckyNumberGeneratorUnitTest { @Test public final void givenPrivateMethodWithReturn_whenUsingPowerMockito_thenCorrect() throws Exception { diff --git a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java similarity index 94% rename from testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java index 1b6431f0c2..4943b0486a 100644 --- a/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/powermockito/introduction/PowerMockitoUnitTest.java @@ -13,7 +13,7 @@ import static org.powermock.api.mockito.PowerMockito.*; @RunWith(PowerMockRunner.class) @PrepareForTest(fullyQualifiedNames = "com.baeldung.powermockito.introduction.*") -public class PowerMockitoIntegrationTest { +public class PowerMockitoUnitTest { @Test public void givenFinalMethods_whenUsingPowerMockito_thenCorrect() throws Exception { @@ -44,10 +44,10 @@ public class PowerMockitoIntegrationTest { assertEquals("Hello Baeldung!", firstWelcome); assertEquals("Hello Baeldung!", secondWelcome); - verifyStatic(times(2)); + verifyStatic(CollaboratorWithStaticMethods.class, times(2)); CollaboratorWithStaticMethods.firstMethod(Mockito.anyString()); - verifyStatic(Mockito.never()); + verifyStatic(CollaboratorWithStaticMethods.class, Mockito.never()); CollaboratorWithStaticMethods.secondMethod(); CollaboratorWithStaticMethods.thirdMethod(); @@ -60,7 +60,6 @@ public class PowerMockitoIntegrationTest { spy(CollaboratorForPartialMocking.class); when(CollaboratorForPartialMocking.staticMethod()).thenReturn("I am a static mock method."); returnValue = CollaboratorForPartialMocking.staticMethod(); - verifyStatic(); CollaboratorForPartialMocking.staticMethod(); assertEquals("I am a static mock method.", returnValue); diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoUnitTest.java index e0ca6f0a35..977a60933f 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoUnitTest.java @@ -10,7 +10,7 @@ import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; -public class BDDMockitoIntegrationTest { +public class BDDMockitoUnitTest { PhoneBookService phoneBookService; PhoneBookRepository phoneBookRepository; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinalsUnitTest.java similarity index 95% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinalsUnitTest.java index caa456c891..000774592c 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinals.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinalsUnitTest.java @@ -8,7 +8,7 @@ import static org.mockito.Mockito.when; import org.baeldung.mockito.voidmethods.MyList; -public class MockFinals { +public class MockFinalsUnitTest { @Test public void whenMockFinalClassMockWorks() { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationUnitTest.java index 5e083adbf5..6bc0e69e65 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationUnitTest.java @@ -11,7 +11,7 @@ import java.util.Map; import static org.junit.Assert.assertEquals; //@RunWith(MockitoJUnitRunner.class) -public class MockitoAnnotationIntegrationTest { +public class MockitoAnnotationUnitTest { @Mock private List mockedList; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesUnitTest.java index 096bbe1ed7..c065e164c5 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesUnitTest.java @@ -13,7 +13,7 @@ import static org.mockito.Mockito.*; import org.baeldung.mockito.voidmethods.MyList; -public class MockitoConfigExamplesIntegrationTest { +public class MockitoConfigExamplesUnitTest { // tests diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionUnitTest.java similarity index 97% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionUnitTest.java index 9a25ccb28c..88da16ae2b 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionUnitTest.java @@ -8,7 +8,7 @@ import static org.mockito.Mockito.when; import org.junit.Test; import org.mockito.Mockito; -public class MockitoExceptionIntegrationTest { +public class MockitoExceptionUnitTest { @Test(expected = NullPointerException.class) public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockUnitTest.java index de26642ede..30c843ff13 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockUnitTest.java @@ -17,7 +17,7 @@ import org.mockito.exceptions.verification.TooLittleActualInvocations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; -public class MockitoMockIntegrationTest { +public class MockitoMockUnitTest { private static class CustomAnswer implements Answer { @Override diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesUnitTest.java index 9c71b1fc4f..a6e40b84e1 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesUnitTest.java @@ -16,7 +16,7 @@ import static org.junit.Assert.assertThat; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; -public class MockitoVerifyExamplesIntegrationTest { +public class MockitoVerifyExamplesUnitTest { // tests diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyIntegrationTest.java b/testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyUnitTest.java similarity index 97% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyIntegrationTest.java rename to testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyUnitTest.java index d0b838a789..068a4c6de9 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyIntegrationTest.java +++ b/testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyUnitTest.java @@ -12,7 +12,7 @@ import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) -public class MockitoSpyIntegrationTest { +public class MockitoSpyUnitTest { @Spy private List aSpyList = new ArrayList(); From 327e46c239d5c1c19c56b7e79bf4f7e899e99d1e Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Thu, 26 Sep 2019 08:59:52 +0200 Subject: [PATCH 257/396] spelling fix --- .../java/com/baeldung/interpolation/ValidationExamples.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java index 30d770205e..6c9b924200 100644 --- a/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/interpolation/ValidationExamples.java @@ -18,7 +18,7 @@ public class ValidationExamples { @Min( value = 1, - message = "There must be at least {value} test{value > 1 ? 's' : ''} int the test case" + message = "There must be at least {value} test{value > 1 ? 's' : ''} in the test case" ) private int testCount; From ee66ea0013fa2050404ec7333adfbf5ee11a120c Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Thu, 26 Sep 2019 11:11:22 +0200 Subject: [PATCH 258/396] #BAEL-17505 Add README descriptions to several modules. --- persistence-modules/hibernate-mapping/README.md | 5 ++++- persistence-modules/spring-data-dynamodb/README.MD | 4 ++++ persistence-modules/spring-data-eclipselink/README.md | 4 ++++ persistence-modules/spring-data-solr/README.md | 4 ++++ persistence-modules/spring-hibernate-5/README.md | 6 +++++- spring-security-thymeleaf/README.MD | 2 +- spring-session/spring-session-jdbc/README.md | 7 +++++-- 7 files changed, 27 insertions(+), 5 deletions(-) diff --git a/persistence-modules/hibernate-mapping/README.md b/persistence-modules/hibernate-mapping/README.md index 99374f9135..658f758709 100644 --- a/persistence-modules/hibernate-mapping/README.md +++ b/persistence-modules/hibernate-mapping/README.md @@ -1,7 +1,10 @@ +## Hibernate Mapping + +This module contains articles about Object-Relational Mapping with Hibernate. ### Relevant Articles: - [Persisting Maps with Hibernate](https://www.baeldung.com/hibernate-persisting-maps) - [Difference Between @Size, @Length, and @Column(length=value)](https://www.baeldung.com/jpa-size-length-column-differences) - [Hibernate Validator Specific Constraints](https://www.baeldung.com/hibernate-validator-constraints) -- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) \ No newline at end of file +- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) diff --git a/persistence-modules/spring-data-dynamodb/README.MD b/persistence-modules/spring-data-dynamodb/README.MD index 9a6855ea0b..9f6cdfdb17 100644 --- a/persistence-modules/spring-data-dynamodb/README.MD +++ b/persistence-modules/spring-data-dynamodb/README.MD @@ -1,2 +1,6 @@ +## Spring Data with DynamoDB + +This module contains articles about Spring Data with DynamoDB. + ### Relevant Articles: - [DynamoDB in a Spring Boot Application Using Spring Data](http://www.baeldung.com/spring-data-dynamodb) diff --git a/persistence-modules/spring-data-eclipselink/README.md b/persistence-modules/spring-data-eclipselink/README.md index 7981470488..af99bf9cf2 100644 --- a/persistence-modules/spring-data-eclipselink/README.md +++ b/persistence-modules/spring-data-eclipselink/README.md @@ -1,3 +1,7 @@ +## Spring Data with EclipseLink + +This module contains articles about Spring Data with EclipseLink. + ### Relevant articles - [A Guide to EclipseLink with Spring](http://www.baeldung.com/spring-eclipselink) diff --git a/persistence-modules/spring-data-solr/README.md b/persistence-modules/spring-data-solr/README.md index fbce5280e3..c282fd2ce7 100644 --- a/persistence-modules/spring-data-solr/README.md +++ b/persistence-modules/spring-data-solr/README.md @@ -1,2 +1,6 @@ +## Spring Data with Solr + +This module contains articles about Spring Data with Solr. + ### Relevant Articles: - [Introduction to Spring Data Solr](http://www.baeldung.com/spring-data-solr) diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md index 7a18761a7b..a74600a47f 100644 --- a/persistence-modules/spring-hibernate-5/README.md +++ b/persistence-modules/spring-hibernate-5/README.md @@ -1,3 +1,7 @@ +## Hibernate 5 with Spring + +This module contains articles about Hibernate 5 with Spring. + ### Relevant articles - [Hibernate Many to Many Annotation Tutorial](http://www.baeldung.com/hibernate-many-to-many) @@ -7,4 +11,4 @@ - [@DynamicUpdate with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-dynamicupdate) - [Hibernate Second-Level Cache](http://www.baeldung.com/hibernate-second-level-cache) - [Deleting Objects with Hibernate](http://www.baeldung.com/delete-with-hibernate) -- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource) \ No newline at end of file +- [Spring, Hibernate and a JNDI Datasource](http://www.baeldung.com/spring-persistence-jpa-jndi-datasource) diff --git a/spring-security-thymeleaf/README.MD b/spring-security-thymeleaf/README.MD index 67b811fac8..c9bae791e2 100644 --- a/spring-security-thymeleaf/README.MD +++ b/spring-security-thymeleaf/README.MD @@ -1,6 +1,6 @@ ## Spring Security Thymeleaf -This module contains articles about Spring Security with Thymeleaf +This module contains articles about Spring Security with Thymeleaf. ### Relevant Articles: diff --git a/spring-session/spring-session-jdbc/README.md b/spring-session/spring-session-jdbc/README.md index 94fd1cd3e7..a31ee044e8 100644 --- a/spring-session/spring-session-jdbc/README.md +++ b/spring-session/spring-session-jdbc/README.md @@ -1,4 +1,7 @@ -This module is for Spring Session with JDBC tutorial. -Jira BAEL-1911 +## Spring Session with JDBC + +This module contains articles about Spring Session with JDBC. ### Relevant Articles: + +- [Spring Session with JDBC](https://www.baeldung.com/spring-session-jdbc) From 6f7676c739806e22b51785f699abf52a7c373191 Mon Sep 17 00:00:00 2001 From: macroscopic64 Date: Thu, 26 Sep 2019 23:39:55 +0530 Subject: [PATCH 259/396] [BAEL-3288] - Graceful Shutdown of a Spring Boot Application --- .../gracefulshutdown/GracefulShutdownApplication.java | 6 +----- .../gracefulshutdown/config/SpringConfiguration.java | 2 -- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java index b7a840b38c..9cb226a49f 100644 --- a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java @@ -1,13 +1,9 @@ package com.baeldung.gracefulshutdown; import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -@SpringBootApplication -@EnableAutoConfiguration -@ComponentScan(basePackages = {"com.baeldung.gracefulshutdown"}) +@SpringBootApplication(scanBasePackages = {"com.baeldung.gracefulshutdown"}) public class GracefulShutdownApplication { public static void main(String args[]) { diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java index 1f27163215..b458f16206 100644 --- a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java +++ b/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java @@ -7,11 +7,9 @@ import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.TaskExecutor; -import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; @Configuration -@EnableScheduling public class SpringConfiguration { private static final Logger LOG = LoggerFactory.getLogger(SpringConfiguration.class); From 9ad7ed0e2f9a107c28e0897ac214513a4262dd12 Mon Sep 17 00:00:00 2001 From: Jonathan Cook Date: Thu, 26 Sep 2019 21:08:17 +0200 Subject: [PATCH 260/396] BAEL-3110 - Linux Commands - Remove All Text After X (#7867) * BAEL-3132 - Linux Commands - Loop Through Directories/Folders * BAEL-3132 - Linux Commands - Loop Through Directories/Folders - update pom description. * BAEL-3132 - Linux Commands - Loop Through Directories/Folders - Add another example using find exec. * BAEL-3132 - Linux Commands - Loop Through Directories/Folders * BAEL-3110 - Linux Commands - Remove All Text After X --- .../text/src/main/bash/remove_characters.sh | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100755 linux-bash/text/src/main/bash/remove_characters.sh diff --git a/linux-bash/text/src/main/bash/remove_characters.sh b/linux-bash/text/src/main/bash/remove_characters.sh new file mode 100755 index 0000000000..a8f51468f4 --- /dev/null +++ b/linux-bash/text/src/main/bash/remove_characters.sh @@ -0,0 +1,19 @@ +#!/bin/bash + +my_var="Hola Mundo" +echo ${my_var} + +my_filename="interesting-text-file.txt" +echo ${my_filename:0:21} + +echo ${my_filename%.*} + +complicated_filename="hello-world.tar.gz" +echo ${complicated_filename%%.*} + +echo ${my_filename/.*/} + +echo 'interesting-text-file.txt' | sed 's/.txt*//' + +echo 'interesting-text-file.txt' | cut -f1 -d"." +echo ${complicated_filename} | cut -f1 -d"." From ed92f5579de3caa6cf391262a95272d466d76f0d Mon Sep 17 00:00:00 2001 From: amit2103 Date: Fri, 27 Sep 2019 01:07:06 +0530 Subject: [PATCH 261/396] [BAEL-17473] - Initial commit --- spring-boot-artifacts/README.md | 7 + .../pom.xml | 4 +- .../baeldung/properties/ConfProperties.java | 0 .../ExternalPropertyConfigurer.java | 0 .../ExternalPropertyFileLoader.java | 0 .../com/baeldung/webjar/TestController.java | 0 .../webjar/WebjarsdemoApplication.java | 0 .../src/main/resources/application.properties | 1 + .../main/resources/external/conf.properties | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/templates/index.html | 0 ...rnalPropertyFileLoaderIntegrationTest.java | 0 ...WebjarsdemoApplicationIntegrationTest.java | 0 spring-boot-deployment/README.md | 5 + spring-boot-deployment/pom.xml | 203 ++++++++++++++++++ .../SpringBootConfigurationApplication.java | 0 .../controller/GreetingsController.java | 0 .../SpringBootConsoleApplication.java | 0 .../SpringBootTomcatApplication.java | 0 .../springbootsimple/TomcatController.java | 0 .../resources/application-tomcat.properties | 0 .../src/main/resources/application.properties | 1 + .../src/main/resources/logback.xml | 10 +- .../SpringContextIntegrationTest.java | 0 .../SpringContextTest.java | 0 ...gBootTomcatApplicationIntegrationTest.java | 0 spring-boot-environment/README.md | 2 + spring-boot-environment/pom.xml | 148 +++++++++++++ .../PriceCalculationApplication.java | 0 ...ceCalculationEnvironmentPostProcessor.java | 0 .../PriceCalculationAutoConfig.java | 0 .../calculator/GrossPriceCalculator.java | 0 .../calculator/NetPriceCalculator.java | 0 .../calculator/PriceCalculator.java | 0 .../service/PriceCalculationService.java | 0 .../main/resources/META-INF/spring.factories | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/logback.xml | 13 ++ ...ationEnvironmentPostProcessorLiveTest.java | 0 spring-boot-management/pom.xml | 56 ----- spring-boot-ops-2/.gitignore | 29 --- spring-boot-ops-2/README.MD | 4 - spring-boot-ops-2/pom.xml | 40 ---- .../src/main/resources/application.properties | 1 - spring-boot-ops/README.md | 14 -- spring-boot-runtime/README.md | 5 + .../docker/Dockerfile | 0 .../docker/logback.xml | 0 .../docker/run.sh | 0 spring-boot-runtime/pom.xml | 159 ++++++++++++++ .../compare/ComparisonApplication.java | 0 .../baeldung/compare/StartupEventHandler.java | 0 .../com/baeldung/restart/Application.java | 0 .../baeldung/restart/RestartController.java | 0 .../com/baeldung/restart/RestartService.java | 0 .../com/baeldung/shutdown/Application.java | 0 .../com/baeldung/shutdown/ShutdownConfig.java | 0 .../com/baeldung/shutdown/TerminateBean.java | 0 .../shutdown/shutdown/ShutdownController.java | 0 .../logging/LoggingApplication.java | 2 + .../management/logging/LoggingController.java | 0 .../management/logging/SecurityConfig.java | 0 .../spring/boot/management/trace/App.java | 2 + .../trace/CustomTraceRepository.java | 0 .../boot/management/trace/EchoController.java | 0 .../management/trace/TraceRequestFilter.java | 0 .../resources/application-logging.properties | 0 .../src/main/resources/application.properties | 7 + .../src/main/resources/logback.xml | 13 ++ .../restart/RestartApplicationManualTest.java | 0 .../ShutdownApplicationIntegrationTest.java | 0 .../application-integrationtest.properties | 0 .../src/test/resources/application.properties | 0 spring-mvc-simple-2/README.md | 1 + spring-mvc-simple-2/pom.xml | 147 +++++++++++-- .../java/org/baeldung/boot/Application.java | 0 .../org/baeldung/boot/config/WebConfig.java | 0 .../controller/GenericEntityController.java | 0 .../converter/GenericBigDecimalConverter.java | 0 ...tringToAbstractEntityConverterFactory.java | 0 .../converter/StringToEmployeeConverter.java | 0 .../boot/converter/StringToEnumConverter.java | 0 .../StringToLocalDateTimeConverter.java | 0 .../controller/AbstractEntityController.java | 0 .../StringToEmployeeConverterController.java | 0 .../baeldung/boot/domain/AbstractEntity.java | 0 .../java/org/baeldung/boot/domain/Bar.java | 0 .../org/baeldung/boot/domain/Employee.java | 0 .../java/org/baeldung/boot/domain/Foo.java | 0 .../baeldung/boot/domain/GenericEntity.java | 0 .../java/org/baeldung/boot/domain/Modes.java | 0 .../repository/GenericEntityRepository.java | 0 .../HeaderVersionArgumentResolver.java | 0 .../baeldung/boot/web/resolver/Version.java | 0 .../SpringBootApplicationIntegrationTest.java | 2 +- .../SpringBootJPAIntegrationTest.java | 2 +- .../SpringBootMailIntegrationTest.java | 2 +- 97 files changed, 710 insertions(+), 170 deletions(-) create mode 100644 spring-boot-artifacts/README.md rename {spring-boot-ops => spring-boot-artifacts}/pom.xml (98%) rename {spring-boot-ops => spring-boot-artifacts}/src/main/java/com/baeldung/properties/ConfProperties.java (100%) rename {spring-boot-ops => spring-boot-artifacts}/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java (100%) rename {spring-boot-ops => spring-boot-artifacts}/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java (100%) rename {spring-boot-ops => spring-boot-artifacts}/src/main/java/com/baeldung/webjar/TestController.java (100%) rename {spring-boot-ops => spring-boot-artifacts}/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java (100%) create mode 100644 spring-boot-artifacts/src/main/resources/application.properties rename {spring-boot-ops => spring-boot-artifacts}/src/main/resources/external/conf.properties (100%) rename {spring-boot-ops => spring-boot-artifacts}/src/main/resources/logback.xml (100%) rename {spring-boot-ops => spring-boot-artifacts}/src/main/resources/templates/index.html (100%) rename {spring-boot-ops => spring-boot-artifacts}/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java (100%) rename {spring-boot-ops => spring-boot-artifacts}/src/test/java/com/baeldung/webjar/WebjarsdemoApplicationIntegrationTest.java (100%) create mode 100644 spring-boot-deployment/README.md create mode 100644 spring-boot-deployment/pom.xml rename {spring-boot-ops-2 => spring-boot-deployment}/src/main/java/com/baeldung/springbootconfiguration/SpringBootConfigurationApplication.java (100%) rename {spring-boot-ops-2 => spring-boot-deployment}/src/main/java/com/baeldung/springbootconfiguration/controller/GreetingsController.java (100%) rename {spring-boot-ops => spring-boot-deployment}/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java (100%) rename {spring-boot-ops => spring-boot-deployment}/src/main/java/com/baeldung/springbootsimple/SpringBootTomcatApplication.java (100%) rename {spring-boot-ops => spring-boot-deployment}/src/main/java/com/baeldung/springbootsimple/TomcatController.java (100%) rename {spring-boot-ops-2 => spring-boot-deployment}/src/main/resources/application-tomcat.properties (100%) create mode 100644 spring-boot-deployment/src/main/resources/application.properties rename {spring-boot-management => spring-boot-deployment}/src/main/resources/logback.xml (58%) rename {spring-boot-ops-2 => spring-boot-deployment}/src/test/java/com/baeldung/springbootconfiguration/SpringContextIntegrationTest.java (100%) rename {spring-boot-ops-2 => spring-boot-deployment}/src/test/java/com/baeldung/springbootconfiguration/SpringContextTest.java (100%) rename {spring-boot-ops => spring-boot-deployment}/src/test/java/com/baeldung/springbootsimple/SpringBootTomcatApplicationIntegrationTest.java (100%) create mode 100644 spring-boot-environment/README.md create mode 100644 spring-boot-environment/pom.xml rename {spring-boot-ops => spring-boot-environment}/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationApplication.java (100%) rename {spring-boot-ops => spring-boot-environment}/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessor.java (100%) rename {spring-boot-ops => spring-boot-environment}/src/main/java/com/baeldung/environmentpostprocessor/autoconfig/PriceCalculationAutoConfig.java (100%) rename {spring-boot-ops => spring-boot-environment}/src/main/java/com/baeldung/environmentpostprocessor/calculator/GrossPriceCalculator.java (100%) rename {spring-boot-ops => spring-boot-environment}/src/main/java/com/baeldung/environmentpostprocessor/calculator/NetPriceCalculator.java (100%) rename {spring-boot-ops => spring-boot-environment}/src/main/java/com/baeldung/environmentpostprocessor/calculator/PriceCalculator.java (100%) rename {spring-boot-ops => spring-boot-environment}/src/main/java/com/baeldung/environmentpostprocessor/service/PriceCalculationService.java (100%) rename {spring-boot-ops => spring-boot-environment}/src/main/resources/META-INF/spring.factories (100%) rename {spring-boot-ops => spring-boot-environment}/src/main/resources/application.properties (100%) create mode 100644 spring-boot-environment/src/main/resources/logback.xml rename {spring-boot-ops => spring-boot-environment}/src/test/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessorLiveTest.java (100%) delete mode 100644 spring-boot-management/pom.xml delete mode 100644 spring-boot-ops-2/.gitignore delete mode 100644 spring-boot-ops-2/README.MD delete mode 100644 spring-boot-ops-2/pom.xml delete mode 100644 spring-boot-ops-2/src/main/resources/application.properties delete mode 100644 spring-boot-ops/README.md create mode 100644 spring-boot-runtime/README.md rename {spring-boot-ops => spring-boot-runtime}/docker/Dockerfile (100%) rename {spring-boot-ops => spring-boot-runtime}/docker/logback.xml (100%) rename {spring-boot-ops => spring-boot-runtime}/docker/run.sh (100%) mode change 100755 => 100644 create mode 100644 spring-boot-runtime/pom.xml rename {spring-boot-ops => spring-boot-runtime}/src/main/java/com/baeldung/compare/ComparisonApplication.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/main/java/com/baeldung/compare/StartupEventHandler.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/main/java/com/baeldung/restart/Application.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/main/java/com/baeldung/restart/RestartController.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/main/java/com/baeldung/restart/RestartService.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/main/java/com/baeldung/shutdown/Application.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/main/java/com/baeldung/shutdown/ShutdownConfig.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/main/java/com/baeldung/shutdown/TerminateBean.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/main/java/com/baeldung/shutdown/shutdown/ShutdownController.java (100%) rename {spring-boot-management => spring-boot-runtime}/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java (82%) rename {spring-boot-management => spring-boot-runtime}/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java (100%) rename {spring-boot-management => spring-boot-runtime}/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java (100%) rename {spring-boot-management => spring-boot-runtime}/src/main/java/com/baeldung/spring/boot/management/trace/App.java (80%) rename {spring-boot-management => spring-boot-runtime}/src/main/java/com/baeldung/spring/boot/management/trace/CustomTraceRepository.java (100%) rename {spring-boot-management => spring-boot-runtime}/src/main/java/com/baeldung/spring/boot/management/trace/EchoController.java (100%) rename {spring-boot-management => spring-boot-runtime}/src/main/java/com/baeldung/spring/boot/management/trace/TraceRequestFilter.java (100%) rename spring-boot-management/src/main/resources/application.properties => spring-boot-runtime/src/main/resources/application-logging.properties (100%) create mode 100644 spring-boot-runtime/src/main/resources/application.properties create mode 100644 spring-boot-runtime/src/main/resources/logback.xml rename {spring-boot-ops => spring-boot-runtime}/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/test/java/com/baeldung/shutdown/ShutdownApplicationIntegrationTest.java (100%) rename {spring-boot-ops => spring-boot-runtime}/src/test/resources/application-integrationtest.properties (100%) rename {spring-boot-ops => spring-boot-runtime}/src/test/resources/application.properties (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/Application.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/config/WebConfig.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/controller/GenericEntityController.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/converter/StringToEnumConverter.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/converter/StringToLocalDateTimeConverter.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/converter/controller/AbstractEntityController.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/domain/AbstractEntity.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/domain/Bar.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/domain/Employee.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/domain/Foo.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/domain/GenericEntity.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/domain/Modes.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java (100%) rename {spring-boot-ops => spring-mvc-simple-2}/src/main/java/org/baeldung/boot/web/resolver/Version.java (100%) rename {spring-boot-ops/src/test/java/org => spring-mvc-simple-2/src/test/java/com}/baeldung/SpringBootApplicationIntegrationTest.java (99%) rename {spring-boot-ops/src/test/java/org => spring-mvc-simple-2/src/test/java/com}/baeldung/SpringBootJPAIntegrationTest.java (98%) rename {spring-boot-ops/src/test/java/org => spring-mvc-simple-2/src/test/java/com}/baeldung/SpringBootMailIntegrationTest.java (99%) diff --git a/spring-boot-artifacts/README.md b/spring-boot-artifacts/README.md new file mode 100644 index 0000000000..0a3f1b7e60 --- /dev/null +++ b/spring-boot-artifacts/README.md @@ -0,0 +1,7 @@ +### Relevant Articles: + - [Spring Boot Dependency Management with a Custom Parent](https://www.baeldung.com/spring-boot-dependency-management-custom-parent) + - [Create a Fat Jar App with Spring Boot](https://www.baeldung.com/deployable-fat-jar-spring-boot) + - [Intro to Spring Boot Starters](https://www.baeldung.com/spring-boot-starters) + - [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar) + - [Introduction to WebJars](https://www.baeldung.com/maven-webjars) + - [A Quick Guide to Maven Wrapper](https://www.baeldung.com/maven-wrapper) \ No newline at end of file diff --git a/spring-boot-ops/pom.xml b/spring-boot-artifacts/pom.xml similarity index 98% rename from spring-boot-ops/pom.xml rename to spring-boot-artifacts/pom.xml index f578a24163..756864895d 100644 --- a/spring-boot-ops/pom.xml +++ b/spring-boot-artifacts/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - spring-boot-ops - spring-boot-ops + spring-boot-artifacts + spring-boot-artifacts war Demo project for Spring Boot diff --git a/spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java b/spring-boot-artifacts/src/main/java/com/baeldung/properties/ConfProperties.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/properties/ConfProperties.java rename to spring-boot-artifacts/src/main/java/com/baeldung/properties/ConfProperties.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java b/spring-boot-artifacts/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java rename to spring-boot-artifacts/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java b/spring-boot-artifacts/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java rename to spring-boot-artifacts/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/webjar/TestController.java b/spring-boot-artifacts/src/main/java/com/baeldung/webjar/TestController.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/webjar/TestController.java rename to spring-boot-artifacts/src/main/java/com/baeldung/webjar/TestController.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java b/spring-boot-artifacts/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java rename to spring-boot-artifacts/src/main/java/com/baeldung/webjar/WebjarsdemoApplication.java diff --git a/spring-boot-artifacts/src/main/resources/application.properties b/spring-boot-artifacts/src/main/resources/application.properties new file mode 100644 index 0000000000..709574239b --- /dev/null +++ b/spring-boot-artifacts/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/spring-boot-ops/src/main/resources/external/conf.properties b/spring-boot-artifacts/src/main/resources/external/conf.properties similarity index 100% rename from spring-boot-ops/src/main/resources/external/conf.properties rename to spring-boot-artifacts/src/main/resources/external/conf.properties diff --git a/spring-boot-ops/src/main/resources/logback.xml b/spring-boot-artifacts/src/main/resources/logback.xml similarity index 100% rename from spring-boot-ops/src/main/resources/logback.xml rename to spring-boot-artifacts/src/main/resources/logback.xml diff --git a/spring-boot-ops/src/main/resources/templates/index.html b/spring-boot-artifacts/src/main/resources/templates/index.html similarity index 100% rename from spring-boot-ops/src/main/resources/templates/index.html rename to spring-boot-artifacts/src/main/resources/templates/index.html diff --git a/spring-boot-ops/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java b/spring-boot-artifacts/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java similarity index 100% rename from spring-boot-ops/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java rename to spring-boot-artifacts/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java diff --git a/spring-boot-ops/src/test/java/com/baeldung/webjar/WebjarsdemoApplicationIntegrationTest.java b/spring-boot-artifacts/src/test/java/com/baeldung/webjar/WebjarsdemoApplicationIntegrationTest.java similarity index 100% rename from spring-boot-ops/src/test/java/com/baeldung/webjar/WebjarsdemoApplicationIntegrationTest.java rename to spring-boot-artifacts/src/test/java/com/baeldung/webjar/WebjarsdemoApplicationIntegrationTest.java diff --git a/spring-boot-deployment/README.md b/spring-boot-deployment/README.md new file mode 100644 index 0000000000..90c5d05e33 --- /dev/null +++ b/spring-boot-deployment/README.md @@ -0,0 +1,5 @@ +### Relevant Articles: + - [Deploy a Spring Boot WAR into a Tomcat Server](https://www.baeldung.com/spring-boot-war-tomcat-deploy) + - [Spring Boot Console Application](https://www.baeldung.com/spring-boot-console-app) + - [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat) + - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs) diff --git a/spring-boot-deployment/pom.xml b/spring-boot-deployment/pom.xml new file mode 100644 index 0000000000..6802452ddf --- /dev/null +++ b/spring-boot-deployment/pom.xml @@ -0,0 +1,203 @@ + + + 4.0.0 + spring-boot-deployment + spring-boot-deployment + war + Demo project for Spring Boot + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-mail + + + + org.springframework.boot + spring-boot-starter-actuator + + + + com.h2database + h2 + runtime + + + + javax.persistence + javax.persistence-api + ${jpa.version} + + + + com.google.guava + guava + ${guava.version} + + + + org.subethamail + subethasmtp + ${subethasmtp.version} + test + + + + org.webjars + bootstrap + ${bootstrap.version} + + + + org.webjars + jquery + ${jquery.version} + + + + org.springframework.cloud + spring-cloud-context + ${springcloud.version} + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + + + + ${project.artifactId} + + + src/main/resources + true + + **/conf.properties + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + com.baeldung.webjar.WebjarsdemoApplication + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + 2.18 + + + + integration-tests + + integration-test + verify + + + + + **/ExternalPropertyFileLoaderIntegrationTest.java + + + + + + + + + + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*IntTest.java + + + **/AutoconfigurationTest.java + + + + + + + json + + + + + + + + + + + org.baeldung.boot.Application + 3.1.1 + 3.3.7-1 + 2.2 + 18.0 + 3.1.7 + 2.0.2.RELEASE + 4.5.8 + + + diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/springbootconfiguration/SpringBootConfigurationApplication.java b/spring-boot-deployment/src/main/java/com/baeldung/springbootconfiguration/SpringBootConfigurationApplication.java similarity index 100% rename from spring-boot-ops-2/src/main/java/com/baeldung/springbootconfiguration/SpringBootConfigurationApplication.java rename to spring-boot-deployment/src/main/java/com/baeldung/springbootconfiguration/SpringBootConfigurationApplication.java diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/springbootconfiguration/controller/GreetingsController.java b/spring-boot-deployment/src/main/java/com/baeldung/springbootconfiguration/controller/GreetingsController.java similarity index 100% rename from spring-boot-ops-2/src/main/java/com/baeldung/springbootconfiguration/controller/GreetingsController.java rename to spring-boot-deployment/src/main/java/com/baeldung/springbootconfiguration/controller/GreetingsController.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java b/spring-boot-deployment/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java rename to spring-boot-deployment/src/main/java/com/baeldung/springbootnonwebapp/SpringBootConsoleApplication.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/springbootsimple/SpringBootTomcatApplication.java b/spring-boot-deployment/src/main/java/com/baeldung/springbootsimple/SpringBootTomcatApplication.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/springbootsimple/SpringBootTomcatApplication.java rename to spring-boot-deployment/src/main/java/com/baeldung/springbootsimple/SpringBootTomcatApplication.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/springbootsimple/TomcatController.java b/spring-boot-deployment/src/main/java/com/baeldung/springbootsimple/TomcatController.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/springbootsimple/TomcatController.java rename to spring-boot-deployment/src/main/java/com/baeldung/springbootsimple/TomcatController.java diff --git a/spring-boot-ops-2/src/main/resources/application-tomcat.properties b/spring-boot-deployment/src/main/resources/application-tomcat.properties similarity index 100% rename from spring-boot-ops-2/src/main/resources/application-tomcat.properties rename to spring-boot-deployment/src/main/resources/application-tomcat.properties diff --git a/spring-boot-deployment/src/main/resources/application.properties b/spring-boot-deployment/src/main/resources/application.properties new file mode 100644 index 0000000000..709574239b --- /dev/null +++ b/spring-boot-deployment/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/spring-boot-management/src/main/resources/logback.xml b/spring-boot-deployment/src/main/resources/logback.xml similarity index 58% rename from spring-boot-management/src/main/resources/logback.xml rename to spring-boot-deployment/src/main/resources/logback.xml index 36314cbeeb..7d900d8ea8 100644 --- a/spring-boot-management/src/main/resources/logback.xml +++ b/spring-boot-deployment/src/main/resources/logback.xml @@ -1,13 +1,13 @@ - + + - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + - - - + \ No newline at end of file diff --git a/spring-boot-ops-2/src/test/java/com/baeldung/springbootconfiguration/SpringContextIntegrationTest.java b/spring-boot-deployment/src/test/java/com/baeldung/springbootconfiguration/SpringContextIntegrationTest.java similarity index 100% rename from spring-boot-ops-2/src/test/java/com/baeldung/springbootconfiguration/SpringContextIntegrationTest.java rename to spring-boot-deployment/src/test/java/com/baeldung/springbootconfiguration/SpringContextIntegrationTest.java diff --git a/spring-boot-ops-2/src/test/java/com/baeldung/springbootconfiguration/SpringContextTest.java b/spring-boot-deployment/src/test/java/com/baeldung/springbootconfiguration/SpringContextTest.java similarity index 100% rename from spring-boot-ops-2/src/test/java/com/baeldung/springbootconfiguration/SpringContextTest.java rename to spring-boot-deployment/src/test/java/com/baeldung/springbootconfiguration/SpringContextTest.java diff --git a/spring-boot-ops/src/test/java/com/baeldung/springbootsimple/SpringBootTomcatApplicationIntegrationTest.java b/spring-boot-deployment/src/test/java/com/baeldung/springbootsimple/SpringBootTomcatApplicationIntegrationTest.java similarity index 100% rename from spring-boot-ops/src/test/java/com/baeldung/springbootsimple/SpringBootTomcatApplicationIntegrationTest.java rename to spring-boot-deployment/src/test/java/com/baeldung/springbootsimple/SpringBootTomcatApplicationIntegrationTest.java diff --git a/spring-boot-environment/README.md b/spring-boot-environment/README.md new file mode 100644 index 0000000000..57cf8b2461 --- /dev/null +++ b/spring-boot-environment/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: + - [EnvironmentPostProcessor in Spring Boot](https://www.baeldung.com/spring-boot-environmentpostprocessor) diff --git a/spring-boot-environment/pom.xml b/spring-boot-environment/pom.xml new file mode 100644 index 0000000000..a957dcde1b --- /dev/null +++ b/spring-boot-environment/pom.xml @@ -0,0 +1,148 @@ + + + 4.0.0 + spring-boot-environment + spring-boot-environment + war + Demo project for Spring Boot + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-mail + + + + org.springframework.boot + spring-boot-starter-actuator + + + + com.h2database + h2 + runtime + + + + javax.persistence + javax.persistence-api + ${jpa.version} + + + + com.google.guava + guava + ${guava.version} + + + + org.subethamail + subethasmtp + ${subethasmtp.version} + test + + + + org.springframework.cloud + spring-cloud-context + ${springcloud.version} + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + + + + ${project.artifactId} + + + src/main/resources + true + + **/conf.properties + + + + + + + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*IntTest.java + + + **/AutoconfigurationTest.java + + + + + + + json + + + + + + + + + + 2.2 + 18.0 + 3.1.7 + 2.0.2.RELEASE + 4.5.8 + + + diff --git a/spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationApplication.java b/spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationApplication.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationApplication.java rename to spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationApplication.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessor.java b/spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessor.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessor.java rename to spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessor.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/autoconfig/PriceCalculationAutoConfig.java b/spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/autoconfig/PriceCalculationAutoConfig.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/autoconfig/PriceCalculationAutoConfig.java rename to spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/autoconfig/PriceCalculationAutoConfig.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/calculator/GrossPriceCalculator.java b/spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/calculator/GrossPriceCalculator.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/calculator/GrossPriceCalculator.java rename to spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/calculator/GrossPriceCalculator.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/calculator/NetPriceCalculator.java b/spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/calculator/NetPriceCalculator.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/calculator/NetPriceCalculator.java rename to spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/calculator/NetPriceCalculator.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/calculator/PriceCalculator.java b/spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/calculator/PriceCalculator.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/calculator/PriceCalculator.java rename to spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/calculator/PriceCalculator.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/service/PriceCalculationService.java b/spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/service/PriceCalculationService.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/environmentpostprocessor/service/PriceCalculationService.java rename to spring-boot-environment/src/main/java/com/baeldung/environmentpostprocessor/service/PriceCalculationService.java diff --git a/spring-boot-ops/src/main/resources/META-INF/spring.factories b/spring-boot-environment/src/main/resources/META-INF/spring.factories similarity index 100% rename from spring-boot-ops/src/main/resources/META-INF/spring.factories rename to spring-boot-environment/src/main/resources/META-INF/spring.factories diff --git a/spring-boot-ops/src/main/resources/application.properties b/spring-boot-environment/src/main/resources/application.properties similarity index 100% rename from spring-boot-ops/src/main/resources/application.properties rename to spring-boot-environment/src/main/resources/application.properties diff --git a/spring-boot-environment/src/main/resources/logback.xml b/spring-boot-environment/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-boot-environment/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/spring-boot-ops/src/test/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessorLiveTest.java b/spring-boot-environment/src/test/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessorLiveTest.java similarity index 100% rename from spring-boot-ops/src/test/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessorLiveTest.java rename to spring-boot-environment/src/test/java/com/baeldung/environmentpostprocessor/PriceCalculationEnvironmentPostProcessorLiveTest.java diff --git a/spring-boot-management/pom.xml b/spring-boot-management/pom.xml deleted file mode 100644 index ca483d2f61..0000000000 --- a/spring-boot-management/pom.xml +++ /dev/null @@ -1,56 +0,0 @@ - - - 4.0.0 - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../parent-boot-2 - - com.baeldung - spring-boot-management - 0.0.1-SNAPSHOT - spring-boot-management - - - com.baeldung.spring.boot.management.logging.LoggingApplication - 1.8 - 2.1.6 - - - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-security - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin-starter-client.version} - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-boot-ops-2/.gitignore b/spring-boot-ops-2/.gitignore deleted file mode 100644 index 153c9335eb..0000000000 --- a/spring-boot-ops-2/.gitignore +++ /dev/null @@ -1,29 +0,0 @@ -HELP.md -/target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ -/build/ - -### VS Code ### -.vscode/ diff --git a/spring-boot-ops-2/README.MD b/spring-boot-ops-2/README.MD deleted file mode 100644 index b4218dc395..0000000000 --- a/spring-boot-ops-2/README.MD +++ /dev/null @@ -1,4 +0,0 @@ -### Relevant Articles - -- [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat) -- [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs) diff --git a/spring-boot-ops-2/pom.xml b/spring-boot-ops-2/pom.xml deleted file mode 100644 index 74fcd79169..0000000000 --- a/spring-boot-ops-2/pom.xml +++ /dev/null @@ -1,40 +0,0 @@ - - - 4.0.0 - com.baeldung - spring-boot-ops-2 - 0.0.1-SNAPSHOT - spring-boot-ops-2 - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/spring-boot-ops-2/src/main/resources/application.properties b/spring-boot-ops-2/src/main/resources/application.properties deleted file mode 100644 index fc3fff1d38..0000000000 --- a/spring-boot-ops-2/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ -spring.profiles.active=tomcat diff --git a/spring-boot-ops/README.md b/spring-boot-ops/README.md deleted file mode 100644 index 5be5c974d3..0000000000 --- a/spring-boot-ops/README.md +++ /dev/null @@ -1,14 +0,0 @@ -### Relevant Articles: - - [Deploy a Spring Boot WAR into a Tomcat Server](http://www.baeldung.com/spring-boot-war-tomcat-deploy) - - [Spring Boot Dependency Management with a Custom Parent](http://www.baeldung.com/spring-boot-dependency-management-custom-parent) - - [A Custom Data Binder in Spring MVC](http://www.baeldung.com/spring-mvc-custom-data-binder) - - [Create a Fat Jar App with Spring Boot](http://www.baeldung.com/deployable-fat-jar-spring-boot) - - [Introduction to WebJars](http://www.baeldung.com/maven-webjars) - - [Intro to Spring Boot Starters](http://www.baeldung.com/spring-boot-starters) - - [A Quick Guide to Maven Wrapper](http://www.baeldung.com/maven-wrapper) - - [Shutdown a Spring Boot Application](http://www.baeldung.com/spring-boot-shutdown) - - [Spring Boot Console Application](http://www.baeldung.com/spring-boot-console-app) - - [Comparing Embedded Servlet Containers in Spring Boot](http://www.baeldung.com/spring-boot-servlet-containers) - - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - - [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar) - - [EnvironmentPostProcessor in Spring Boot](https://www.baeldung.com/spring-boot-environmentpostprocessor) diff --git a/spring-boot-runtime/README.md b/spring-boot-runtime/README.md new file mode 100644 index 0000000000..fb5e0b14de --- /dev/null +++ b/spring-boot-runtime/README.md @@ -0,0 +1,5 @@ +### Relevant Articles: + - [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown) + - [Comparing Embedded Servlet Containers in Spring Boot](https://www.baeldung.com/spring-boot-servlet-containers) + - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) + diff --git a/spring-boot-ops/docker/Dockerfile b/spring-boot-runtime/docker/Dockerfile similarity index 100% rename from spring-boot-ops/docker/Dockerfile rename to spring-boot-runtime/docker/Dockerfile diff --git a/spring-boot-ops/docker/logback.xml b/spring-boot-runtime/docker/logback.xml similarity index 100% rename from spring-boot-ops/docker/logback.xml rename to spring-boot-runtime/docker/logback.xml diff --git a/spring-boot-ops/docker/run.sh b/spring-boot-runtime/docker/run.sh old mode 100755 new mode 100644 similarity index 100% rename from spring-boot-ops/docker/run.sh rename to spring-boot-runtime/docker/run.sh diff --git a/spring-boot-runtime/pom.xml b/spring-boot-runtime/pom.xml new file mode 100644 index 0000000000..eab8ca3cc2 --- /dev/null +++ b/spring-boot-runtime/pom.xml @@ -0,0 +1,159 @@ + + + 4.0.0 + spring-boot-runtime + spring-boot-runtime + war + Demo project for Spring Boot + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-thymeleaf + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-mail + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-starter-security + + + de.codecentric + spring-boot-admin-starter-client + ${spring-boot-admin-starter-client.version} + + + + com.h2database + h2 + runtime + + + + javax.persistence + javax.persistence-api + ${jpa.version} + + + + com.google.guava + guava + ${guava.version} + + + + org.subethamail + subethasmtp + ${subethasmtp.version} + test + + + + org.springframework.cloud + spring-cloud-context + ${springcloud.version} + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + + + + ${project.artifactId} + + + src/main/resources + true + + **/conf.properties + + + + + + + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*IntTest.java + + + **/AutoconfigurationTest.java + + + + + + + json + + + + + + + + + + 2.2 + 18.0 + 3.1.7 + 2.0.2.RELEASE + 4.5.8 + 2.1.6 + + + diff --git a/spring-boot-ops/src/main/java/com/baeldung/compare/ComparisonApplication.java b/spring-boot-runtime/src/main/java/com/baeldung/compare/ComparisonApplication.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/compare/ComparisonApplication.java rename to spring-boot-runtime/src/main/java/com/baeldung/compare/ComparisonApplication.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/compare/StartupEventHandler.java b/spring-boot-runtime/src/main/java/com/baeldung/compare/StartupEventHandler.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/compare/StartupEventHandler.java rename to spring-boot-runtime/src/main/java/com/baeldung/compare/StartupEventHandler.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/restart/Application.java b/spring-boot-runtime/src/main/java/com/baeldung/restart/Application.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/restart/Application.java rename to spring-boot-runtime/src/main/java/com/baeldung/restart/Application.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/restart/RestartController.java b/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartController.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/restart/RestartController.java rename to spring-boot-runtime/src/main/java/com/baeldung/restart/RestartController.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/restart/RestartService.java b/spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/restart/RestartService.java rename to spring-boot-runtime/src/main/java/com/baeldung/restart/RestartService.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/shutdown/Application.java b/spring-boot-runtime/src/main/java/com/baeldung/shutdown/Application.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/shutdown/Application.java rename to spring-boot-runtime/src/main/java/com/baeldung/shutdown/Application.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/shutdown/ShutdownConfig.java b/spring-boot-runtime/src/main/java/com/baeldung/shutdown/ShutdownConfig.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/shutdown/ShutdownConfig.java rename to spring-boot-runtime/src/main/java/com/baeldung/shutdown/ShutdownConfig.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/shutdown/TerminateBean.java b/spring-boot-runtime/src/main/java/com/baeldung/shutdown/TerminateBean.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/shutdown/TerminateBean.java rename to spring-boot-runtime/src/main/java/com/baeldung/shutdown/TerminateBean.java diff --git a/spring-boot-ops/src/main/java/com/baeldung/shutdown/shutdown/ShutdownController.java b/spring-boot-runtime/src/main/java/com/baeldung/shutdown/shutdown/ShutdownController.java similarity index 100% rename from spring-boot-ops/src/main/java/com/baeldung/shutdown/shutdown/ShutdownController.java rename to spring-boot-runtime/src/main/java/com/baeldung/shutdown/shutdown/ShutdownController.java diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java b/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java similarity index 82% rename from spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java rename to spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java index 6371ac4c64..5c1b143c4e 100644 --- a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java +++ b/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/LoggingApplication.java @@ -2,7 +2,9 @@ package com.baeldung.spring.boot.management.logging; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Profile; +@Profile("logging") @SpringBootApplication public class LoggingApplication { public static void main(String[] args) { diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java b/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java similarity index 100% rename from spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java rename to spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/LoggingController.java diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java b/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java similarity index 100% rename from spring-boot-management/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java rename to spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/logging/SecurityConfig.java diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/trace/App.java b/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/trace/App.java similarity index 80% rename from spring-boot-management/src/main/java/com/baeldung/spring/boot/management/trace/App.java rename to spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/trace/App.java index 150e451c57..ffc30e9b33 100644 --- a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/trace/App.java +++ b/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/trace/App.java @@ -2,7 +2,9 @@ package com.baeldung.spring.boot.management.trace; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Profile; +@Profile("logging") @SpringBootApplication public class App { diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/trace/CustomTraceRepository.java b/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/trace/CustomTraceRepository.java similarity index 100% rename from spring-boot-management/src/main/java/com/baeldung/spring/boot/management/trace/CustomTraceRepository.java rename to spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/trace/CustomTraceRepository.java diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/trace/EchoController.java b/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/trace/EchoController.java similarity index 100% rename from spring-boot-management/src/main/java/com/baeldung/spring/boot/management/trace/EchoController.java rename to spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/trace/EchoController.java diff --git a/spring-boot-management/src/main/java/com/baeldung/spring/boot/management/trace/TraceRequestFilter.java b/spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/trace/TraceRequestFilter.java similarity index 100% rename from spring-boot-management/src/main/java/com/baeldung/spring/boot/management/trace/TraceRequestFilter.java rename to spring-boot-runtime/src/main/java/com/baeldung/spring/boot/management/trace/TraceRequestFilter.java diff --git a/spring-boot-management/src/main/resources/application.properties b/spring-boot-runtime/src/main/resources/application-logging.properties similarity index 100% rename from spring-boot-management/src/main/resources/application.properties rename to spring-boot-runtime/src/main/resources/application-logging.properties diff --git a/spring-boot-runtime/src/main/resources/application.properties b/spring-boot-runtime/src/main/resources/application.properties new file mode 100644 index 0000000000..27b7915cff --- /dev/null +++ b/spring-boot-runtime/src/main/resources/application.properties @@ -0,0 +1,7 @@ +management.endpoints.web.exposure.include=* +management.metrics.enable.root=true +management.metrics.enable.jvm=true +management.endpoint.restart.enabled=true +spring.datasource.jmx-enabled=false +spring.main.allow-bean-definition-overriding=true +management.endpoint.shutdown.enabled=true \ No newline at end of file diff --git a/spring-boot-runtime/src/main/resources/logback.xml b/spring-boot-runtime/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-boot-runtime/src/main/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + \ No newline at end of file diff --git a/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java b/spring-boot-runtime/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java similarity index 100% rename from spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java rename to spring-boot-runtime/src/test/java/com/baeldung/restart/RestartApplicationManualTest.java diff --git a/spring-boot-ops/src/test/java/com/baeldung/shutdown/ShutdownApplicationIntegrationTest.java b/spring-boot-runtime/src/test/java/com/baeldung/shutdown/ShutdownApplicationIntegrationTest.java similarity index 100% rename from spring-boot-ops/src/test/java/com/baeldung/shutdown/ShutdownApplicationIntegrationTest.java rename to spring-boot-runtime/src/test/java/com/baeldung/shutdown/ShutdownApplicationIntegrationTest.java diff --git a/spring-boot-ops/src/test/resources/application-integrationtest.properties b/spring-boot-runtime/src/test/resources/application-integrationtest.properties similarity index 100% rename from spring-boot-ops/src/test/resources/application-integrationtest.properties rename to spring-boot-runtime/src/test/resources/application-integrationtest.properties diff --git a/spring-boot-ops/src/test/resources/application.properties b/spring-boot-runtime/src/test/resources/application.properties similarity index 100% rename from spring-boot-ops/src/test/resources/application.properties rename to spring-boot-runtime/src/test/resources/application.properties diff --git a/spring-mvc-simple-2/README.md b/spring-mvc-simple-2/README.md index 6dfe789be4..312c174fff 100644 --- a/spring-mvc-simple-2/README.md +++ b/spring-mvc-simple-2/README.md @@ -1,2 +1,3 @@ ## Relevant articles: - [How to Read HTTP Headers in Spring REST Controllers](https://www.baeldung.com/spring-rest-http-headers) +- [A Custom Data Binder in Spring MVC](https://www.baeldung.com/spring-mvc-custom-data-binder) \ No newline at end of file diff --git a/spring-mvc-simple-2/pom.xml b/spring-mvc-simple-2/pom.xml index 74302cff78..ac1f9a661c 100644 --- a/spring-mvc-simple-2/pom.xml +++ b/spring-mvc-simple-2/pom.xml @@ -1,37 +1,152 @@ - - + + 4.0.0 spring-mvc-simple-2 - war spring-mvc-simple-2 + war + Demo project for Spring Boot - com.baeldung parent-boot-2 + com.baeldung 0.0.1-SNAPSHOT ../parent-boot-2 + org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + provided + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-mail + + + + org.springframework.boot + spring-boot-starter-actuator + + + + com.h2database + h2 + runtime + + + + javax.persistence + javax.persistence-api + ${jpa.version} + + + + com.google.guava + guava + ${guava.version} + + + + org.subethamail + subethasmtp + ${subethasmtp.version} + test + + + + org.springframework.cloud + spring-cloud-context + ${springcloud.version} + + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + + ${project.artifactId} + + + src/main/resources + true + + **/conf.properties + + + + + + + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*IntTest.java + + + **/AutoconfigurationTest.java + + + + + + + json + + + + + + + + - 1.8 - 1.8 + + org.baeldung.boot.Application + 3.1.1 + 3.3.7-1 + 2.2 + 18.0 + 3.1.7 + 2.0.2.RELEASE + 4.5.8 - - - - org.apache.maven.plugins - maven-war-plugin - - - spring-mvc-simple2 - diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/Application.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/Application.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/Application.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/Application.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/config/WebConfig.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/config/WebConfig.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/config/WebConfig.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/config/WebConfig.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/controller/GenericEntityController.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/controller/GenericEntityController.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/controller/GenericEntityController.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/controller/GenericEntityController.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/GenericBigDecimalConverter.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/StringToAbstractEntityConverterFactory.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/StringToEmployeeConverter.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEnumConverter.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/StringToEnumConverter.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToEnumConverter.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/StringToEnumConverter.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToLocalDateTimeConverter.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/StringToLocalDateTimeConverter.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/converter/StringToLocalDateTimeConverter.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/StringToLocalDateTimeConverter.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/controller/AbstractEntityController.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/controller/AbstractEntityController.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/converter/controller/AbstractEntityController.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/controller/AbstractEntityController.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/converter/controller/StringToEmployeeConverterController.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/domain/AbstractEntity.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/AbstractEntity.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/domain/AbstractEntity.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/AbstractEntity.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Bar.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/Bar.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/domain/Bar.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/Bar.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Employee.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/Employee.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/domain/Employee.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/Employee.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Foo.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/Foo.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/domain/Foo.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/Foo.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/domain/GenericEntity.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/GenericEntity.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/domain/GenericEntity.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/GenericEntity.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/domain/Modes.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/Modes.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/domain/Modes.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/domain/Modes.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/web/resolver/HeaderVersionArgumentResolver.java diff --git a/spring-boot-ops/src/main/java/org/baeldung/boot/web/resolver/Version.java b/spring-mvc-simple-2/src/main/java/org/baeldung/boot/web/resolver/Version.java similarity index 100% rename from spring-boot-ops/src/main/java/org/baeldung/boot/web/resolver/Version.java rename to spring-mvc-simple-2/src/main/java/org/baeldung/boot/web/resolver/Version.java diff --git a/spring-boot-ops/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java b/spring-mvc-simple-2/src/test/java/com/baeldung/SpringBootApplicationIntegrationTest.java similarity index 99% rename from spring-boot-ops/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java rename to spring-mvc-simple-2/src/test/java/com/baeldung/SpringBootApplicationIntegrationTest.java index 5627543b62..7190c4f427 100644 --- a/spring-boot-ops/src/test/java/org/baeldung/SpringBootApplicationIntegrationTest.java +++ b/spring-mvc-simple-2/src/test/java/com/baeldung/SpringBootApplicationIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.baeldung.boot.Application; import org.baeldung.boot.domain.Modes; diff --git a/spring-boot-ops/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java b/spring-mvc-simple-2/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java similarity index 98% rename from spring-boot-ops/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java rename to spring-mvc-simple-2/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java index c368cf5219..c283529435 100644 --- a/spring-boot-ops/src/test/java/org/baeldung/SpringBootJPAIntegrationTest.java +++ b/spring-mvc-simple-2/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.baeldung.boot.Application; import org.baeldung.boot.domain.GenericEntity; diff --git a/spring-boot-ops/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java b/spring-mvc-simple-2/src/test/java/com/baeldung/SpringBootMailIntegrationTest.java similarity index 99% rename from spring-boot-ops/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java rename to spring-mvc-simple-2/src/test/java/com/baeldung/SpringBootMailIntegrationTest.java index a6a84184fa..1a2a4e22d9 100644 --- a/spring-boot-ops/src/test/java/org/baeldung/SpringBootMailIntegrationTest.java +++ b/spring-mvc-simple-2/src/test/java/com/baeldung/SpringBootMailIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package com.baeldung; import org.baeldung.boot.Application; import org.junit.After; From e25f50fa1b0445b73b3bd1675435d1485866cb95 Mon Sep 17 00:00:00 2001 From: at508 Date: Thu, 26 Sep 2019 22:58:21 -0400 Subject: [PATCH 262/396] [BAEL-2998] - rearranging test order --- .../baeldung/dirtiescontext/UserCache.java | 2 -- .../DirtiesContextIntegrationTest.java | 33 ++++++++++--------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java index f03eee3bb8..f4fba1f310 100644 --- a/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java +++ b/testing-modules/spring-testing/src/main/java/com/baeldung/dirtiescontext/UserCache.java @@ -6,9 +6,7 @@ import java.util.Set; import org.springframework.stereotype.Component; import lombok.Getter; -import lombok.ToString; -@ToString @Component public class UserCache { diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java index b4f3fa773f..7fad754b8f 100644 --- a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java +++ b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java @@ -1,13 +1,16 @@ package com.baeldung.dirtiescontext; +import org.junit.FixMethodOrder; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; +import org.junit.runners.MethodSorters; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.MethodMode; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +@FixMethodOrder(MethodSorters.NAME_ASCENDING) @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = SpringDataRestApplication.class) class DirtiesContextIntegrationTest { @@ -15,27 +18,27 @@ class DirtiesContextIntegrationTest { @Autowired protected UserCache userCache; + @Test + void testA() { + userCache.addUser("Jane Doe"); + userCache.printUserList("Test A"); + } + + @Test + void testB() { + userCache.printUserList("Test B"); + } + @DirtiesContext(methodMode = MethodMode.AFTER_METHOD) @Test - void testOne() { + void testC() { userCache.addUser("John Doe"); - userCache.printUserList("Test One"); + userCache.printUserList("Test C"); } @Test - void testTwo() { - userCache.printUserList("Test Two"); - } - - @Test - void testThree() { - userCache.addUser("Jane Doe"); - userCache.printUserList("Test Three"); - } - - @Test - void testFour() { - userCache.printUserList("Test Four"); + void testD() { + userCache.printUserList("Test D"); } } From cc23ac598a3eb3aa8665eee0501b26810d4914ca Mon Sep 17 00:00:00 2001 From: wugangca Date: Thu, 26 Sep 2019 21:25:57 -0600 Subject: [PATCH 263/396] BAEL-2988 Make the code consistent with the article. (#7870) * BAEL-2988 Make the code consistent with the article. * BAEL-2988 Use @GetMapping annotation based on the feedback. --- .../src/main/java/com/baeldung/cors/EnumController.java | 5 +++-- .../src/main/java/com/baeldung/model/Modes.java | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java b/spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java index 6bd5a16439..34ce4d3927 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java +++ b/spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java @@ -1,6 +1,7 @@ package com.baeldung.cors; import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; @@ -13,12 +14,12 @@ import com.baeldung.model.Modes; @RequestMapping("/enums") public class EnumController { - @RequestMapping("/mode2str") + @GetMapping("/mode2str") public String getStringToMode(@RequestParam("mode") Modes mode) { return "good"; } - @RequestMapping("/findbymode/{mode}") + @GetMapping("/findbymode/{mode}") public String findByEnum(@PathVariable Modes mode) { return "good"; } diff --git a/spring-rest-simple/src/main/java/com/baeldung/model/Modes.java b/spring-rest-simple/src/main/java/com/baeldung/model/Modes.java index a82df17d7d..d3a1ab4a61 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/model/Modes.java +++ b/spring-rest-simple/src/main/java/com/baeldung/model/Modes.java @@ -1,5 +1,5 @@ package com.baeldung.model; public enum Modes { - ALPHA, DELTA + ALPHA, BETA; } From 957ad4587c9dd9b9ec271ff177e9bfd4b29bb371 Mon Sep 17 00:00:00 2001 From: Marcos Lopez Gonzalez Date: Fri, 27 Sep 2019 06:34:17 +0300 Subject: [PATCH 264/396] BAEL-3085 Using a slash character in Spring URLs (#7823) * slashes in Spring URLs * cleanup * restored format of pom * using more descriptive names * using more descriptive names * slash in urls code moved to spring-mvc-simple-2 module --- spring-mvc-simple-2/pom.xml | 5 ++ .../baeldung/spring/slash/Application.java | 14 +++ .../spring/slash/SlashParsingController.java | 31 +++++++ .../slash/SlashParsingControllerIntTest.java | 87 +++++++++++++++++++ 4 files changed, 137 insertions(+) create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/Application.java create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/SlashParsingController.java create mode 100644 spring-mvc-simple-2/src/test/java/com/baeldung/spring/slash/SlashParsingControllerIntTest.java diff --git a/spring-mvc-simple-2/pom.xml b/spring-mvc-simple-2/pom.xml index 74302cff78..ca911b2719 100644 --- a/spring-mvc-simple-2/pom.xml +++ b/spring-mvc-simple-2/pom.xml @@ -18,6 +18,11 @@ org.springframework.boot spring-boot-starter-web + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/Application.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/Application.java new file mode 100644 index 0000000000..7db6ac3755 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/Application.java @@ -0,0 +1,14 @@ +package com.baeldung.spring.slash; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@SpringBootApplication +public class Application implements WebMvcConfigurer { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/SlashParsingController.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/SlashParsingController.java new file mode 100644 index 0000000000..635587ee5b --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/slash/SlashParsingController.java @@ -0,0 +1,31 @@ +package com.baeldung.spring.slash; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("slash") +public class SlashParsingController { + + @GetMapping("mypaths/{anything}") + public String pathVariable(@PathVariable("anything") String anything) { + return anything; + } + + @GetMapping("all/**") + public String allDirectories(HttpServletRequest request) { + return request.getRequestURI() + .split(request.getContextPath() + "/all/")[1]; + } + + @GetMapping("all") + public String queryParameter(@RequestParam("param") String param) { + return param; + } + +} diff --git a/spring-mvc-simple-2/src/test/java/com/baeldung/spring/slash/SlashParsingControllerIntTest.java b/spring-mvc-simple-2/src/test/java/com/baeldung/spring/slash/SlashParsingControllerIntTest.java new file mode 100644 index 0000000000..d81b34f7bf --- /dev/null +++ b/spring-mvc-simple-2/src/test/java/com/baeldung/spring/slash/SlashParsingControllerIntTest.java @@ -0,0 +1,87 @@ +package com.baeldung.spring.slash; + +import static org.junit.Assert.assertEquals; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.net.URI; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; + +@AutoConfigureMockMvc +@ExtendWith(SpringExtension.class) +@SpringBootTest +public class SlashParsingControllerIntTest { + + @Autowired + private MockMvc mockMvc; + + @Test + public void whenUsingPathVariablemWithoutSlashes_thenStatusOk() throws Exception { + final String stringWithoutSlashes = "noslash"; + + MvcResult mvcResult = mockMvc.perform(get("/slash/mypaths/" + stringWithoutSlashes)) + .andExpect(status().isOk()) + .andReturn(); + + assertEquals(stringWithoutSlashes, mvcResult.getResponse() + .getContentAsString()); + } + + @Test + public void whenUsingPathVariableWithSlashes_thenStatusNotFound() throws Exception { + final String stringWithSlashes = "url/with/slashes"; + + mockMvc.perform(get("/slash/mypaths/" + stringWithSlashes)) + .andExpect(status().isNotFound()); + } + + @Test + public void givenAllFallbackEndpoint_whenUsingPathWithSlashes_thenStatusOk() throws Exception { + final String stringWithSlashes = "url/for/testing/purposes"; + + MvcResult mvcResult = mockMvc.perform(get("/slash/all/" + stringWithSlashes)) + .andExpect(status().isOk()) + .andReturn(); + + assertEquals(stringWithSlashes, mvcResult.getResponse() + .getContentAsString()); + } + + @Test + public void givenAllFallbackEndpoint_whenUsingConsecutiveSlashes_thenPathNormalized() throws Exception { + final String stringWithSlashes = "http://myurl.com"; + + MvcResult mvcResult = mockMvc.perform(get("/slash/all/" + stringWithSlashes)) + .andExpect(status().isOk()) + .andReturn(); + + String stringWithSlashesNormalized = URI.create("/slash/all/" + stringWithSlashes) + .normalize() + .toString() + .split("/slash/all/")[1]; + + assertEquals(stringWithSlashesNormalized, mvcResult.getResponse() + .getContentAsString()); + } + + @Test + public void whenUsingSlashesInQueryParam_thenParameterAccepted() throws Exception { + final String stringWithSlashes = "url/for////testing/purposes"; + + MvcResult mvcResult = mockMvc.perform(get("/slash/all").param("param", stringWithSlashes)) + .andExpect(status().isOk()) + .andReturn(); + + assertEquals(stringWithSlashes, mvcResult.getResponse() + .getContentAsString()); + } + +} From 0677a0627145940bdf5554574ff00ce2ba6fab01 Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Fri, 27 Sep 2019 16:31:36 +0300 Subject: [PATCH 265/396] Split or move core-java-collections module (#7842) --- .../core-java-collections-2/README.md | 15 ++++ .../core-java-collections-2/pom.xml | 58 +++++++++++++ .../combiningcollections/CombiningArrays.java | 2 +- .../combiningcollections/CombiningLists.java | 2 +- .../combiningcollections/CombiningMaps.java | 2 +- .../combiningcollections/CombiningSets.java | 2 +- .../CollectionUtilsCollectionFilter.java | 2 +- .../EclipseCollectionsCollectionFilter.java | 2 +- .../filtering/GuavaCollectionFilter.java | 2 +- .../filtering/StreamsCollectionFilter.java | 2 +- .../iterablesize}/IterableSize.java | 2 +- ...lectionStreamsUsingCommonsEmptyIfNull.java | 2 +- ...ionStreamsUsingJava8OptionalContainer.java | 2 +- ...ctionStreamsUsingNullDereferenceCheck.java | 2 +- .../removal/CollectionRemoveIf.java | 2 +- .../collections}/removal/Iterators.java | 2 +- .../removal/StreamFilterAndCollector.java | 2 +- .../removal/StreamPartitioningBy.java | 2 +- .../CombiningArraysUnitTest.java | 2 +- .../CombiningListsUnitTest.java | 2 +- .../CombiningMapsUnitTest.java | 2 +- .../CombiningSetsUnitTest.java | 2 +- .../filtering/CollectionFiltersUnitTest.java | 2 +- .../iterablesize}/IterableSizeUnitTest.java | 2 +- .../CollectionsJoinAndSplitJUnitTest.java | 2 +- .../JoinSplitCollectionsUnitTest.java | 2 +- .../CombineMultipleCollectionsUnitTest.java} | 4 +- ...treamsUsingCommonsEmptyIfNullUnitTest.java | 2 +- ...msUsingJava8OptionalContainerUnitTest.java | 2 +- ...eamsUsingNullDereferenceCheckUnitTest.java | 2 +- .../collections}/removal/RemovalUnitTest.java | 2 +- .../ShufflingCollectionsUnitTest.java | 2 +- .../collections}/sorting/Employee.java | 2 +- .../sorting/JavaSortingUnitTest.java | 2 +- .../core-java-collections-3/README.md | 11 +++ .../core-java-collections-3/pom.xml | 34 ++++++++ .../ArrayListBenchmark.java | 2 +- .../arraylistvsvector/Employee.java | 55 ++++++++++++ .../arraylistvsvector}/VectorExample.java | 2 +- .../CollectionsBenchmark.java | 2 +- .../containsperformance/Employee.java | 55 ++++++++++++ .../collections}/iterators/Iterators.java | 2 +- .../ArraySortBenchmark.java | 2 +- .../CollectionsSortCompare.java | 2 +- .../ClearVsRemoveAllUnitTest.java | 2 +- .../HashmapVsHashtableDifferenceUnitTest.java | 2 +- .../iterators/IteratorsUnitTest.java | 8 +- .../core-java-collections-list/README.md | 3 +- .../core-java-collections/README.md | 28 ++----- .../core-java-collections/pom.xml | 33 -------- .../{application => }/Application.java | 2 +- ...ncurrentModificationExceptionUnitTest.java | 83 ------------------- .../SynchronizedCollectionUnitTest.java | 2 +- .../{test => }/SynchronizedListUnitTest.java | 2 +- .../{test => }/SynchronizedMapUnitTest.java | 2 +- .../{test => }/SynchronizedSetUnitTest.java | 2 +- .../SynchronizedSortedMapUnitTest.java | 2 +- .../SynchronizedSortedSetUnitTest.java | 2 +- .../org/baeldung/java/collections/README.md | 3 - pom.xml | 4 + 60 files changed, 292 insertions(+), 194 deletions(-) create mode 100644 core-java-modules/core-java-collections-2/README.md create mode 100644 core-java-modules/core-java-collections-2/pom.xml rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/combiningcollections/CombiningArrays.java (95%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/combiningcollections/CombiningLists.java (96%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/combiningcollections/CombiningMaps.java (96%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/combiningcollections/CombiningSets.java (96%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/java => core-java-collections-2/src/main/java/com/baeldung/collections}/filtering/CollectionUtilsCollectionFilter.java (91%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/java => core-java-collections-2/src/main/java/com/baeldung/collections}/filtering/EclipseCollectionsCollectionFilter.java (96%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/java => core-java-collections-2/src/main/java/com/baeldung/collections}/filtering/GuavaCollectionFilter.java (91%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/java => core-java-collections-2/src/main/java/com/baeldung/collections}/filtering/StreamsCollectionFilter.java (95%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/java/iterable => core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize}/IterableSize.java (97%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java (92%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java (92%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java (91%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/removal/CollectionRemoveIf.java (91%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/removal/Iterators.java (93%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/removal/StreamFilterAndCollector.java (93%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-2/src/main/java/com/baeldung/collections}/removal/StreamPartitioningBy.java (95%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-2/src/test/java/com/baeldung/collections}/combiningcollections/CombiningArraysUnitTest.java (96%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-2/src/test/java/com/baeldung/collections}/combiningcollections/CombiningListsUnitTest.java (96%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-2/src/test/java/com/baeldung/collections}/combiningcollections/CombiningMapsUnitTest.java (96%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-2/src/test/java/com/baeldung/collections}/combiningcollections/CombiningSetsUnitTest.java (96%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung/java => core-java-collections-2/src/test/java/com/baeldung/collections}/filtering/CollectionFiltersUnitTest.java (98%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung/java/iterable => core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize}/IterableSizeUnitTest.java (96%) rename core-java-modules/{core-java-collections/src/test/java/org/baeldung/java/collections => core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit}/CollectionsJoinAndSplitJUnitTest.java (97%) rename core-java-modules/{core-java-collections/src/test/java/org/baeldung/java/collections => core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit}/JoinSplitCollectionsUnitTest.java (99%) rename core-java-modules/{core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java => core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java} (98%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-2/src/test/java/com/baeldung/collections}/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java (95%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-2/src/test/java/com/baeldung/collections}/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java (95%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-2/src/test/java/com/baeldung/collections}/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java (95%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-2/src/test/java/com/baeldung/collections}/removal/RemovalUnitTest.java (98%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-2/src/test/java/com/baeldung/collections}/shufflingcollections/ShufflingCollectionsUnitTest.java (97%) rename core-java-modules/{core-java-collections/src/test/java/org/baeldung/java => core-java-collections-2/src/test/java/com/baeldung/collections}/sorting/Employee.java (96%) rename core-java-modules/{core-java-collections/src/test/java/org/baeldung/java => core-java-collections-2/src/test/java/com/baeldung/collections}/sorting/JavaSortingUnitTest.java (99%) create mode 100644 core-java-modules/core-java-collections-3/README.md create mode 100644 core-java-modules/core-java-collections-3/pom.xml rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/performance => core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector}/ArrayListBenchmark.java (98%) create mode 100644 core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/java/list => core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector}/VectorExample.java (92%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/performance => core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance}/CollectionsBenchmark.java (96%) create mode 100644 core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java rename core-java-modules/{core-java-collections/src/main/java/com/baeldung => core-java-collections-3/src/main/java/com/baeldung/collections}/iterators/Iterators.java (97%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/performance => core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison}/ArraySortBenchmark.java (97%) rename core-java-modules/{core-java-collections/src/main/java/com/baeldung/java/sort => core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison}/CollectionsSortCompare.java (94%) rename core-java-modules/{core-java-collections-list/src/test/java/com/baeldung/collection => core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall}/ClearVsRemoveAllUnitTest.java (95%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-3/src/test/java/com/baeldung/collections}/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java (98%) rename core-java-modules/{core-java-collections/src/test/java/com/baeldung => core-java-collections-3/src/test/java/com/baeldung/collections}/iterators/IteratorsUnitTest.java (77%) rename core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/{application => }/Application.java (90%) delete mode 100644 core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java rename core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/{test => }/SynchronizedCollectionUnitTest.java (94%) rename core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/{test => }/SynchronizedListUnitTest.java (97%) rename core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/{test => }/SynchronizedMapUnitTest.java (94%) rename core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/{test => }/SynchronizedSetUnitTest.java (93%) rename core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/{test => }/SynchronizedSortedMapUnitTest.java (94%) rename core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/{test => }/SynchronizedSortedSetUnitTest.java (94%) delete mode 100644 core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md diff --git a/core-java-modules/core-java-collections-2/README.md b/core-java-modules/core-java-collections-2/README.md new file mode 100644 index 0000000000..13ca191edb --- /dev/null +++ b/core-java-modules/core-java-collections-2/README.md @@ -0,0 +1,15 @@ +========= + +## Core Java Collections Cookbooks and Examples + +### Relevant Articles: +- [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements) +- [How to Filter a Collection in Java](https://www.baeldung.com/java-collection-filtering) +- [Join and Split Arrays and Collections in Java](https://www.baeldung.com/java-join-and-split) +- [Java – Combine Multiple Collections](https://www.baeldung.com/java-combine-multiple-collections) +- [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections) +- [Shuffling Collections In Java](https://www.baeldung.com/java-shuffle-collection) +- [Sorting in Java](https://www.baeldung.com/java-sorting) +- [Getting the Size of an Iterable in Java](https://www.baeldung.com/java-iterable-size) +- [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections) + diff --git a/core-java-modules/core-java-collections-2/pom.xml b/core-java-modules/core-java-collections-2/pom.xml new file mode 100644 index 0000000000..0ac53ec180 --- /dev/null +++ b/core-java-modules/core-java-collections-2/pom.xml @@ -0,0 +1,58 @@ + + 4.0.0 + core-java-collections-2 + 0.0.1-SNAPSHOT + core-java-collections-2 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.eclipse.collections + eclipse-collections + ${eclipse.collections.version} + + + org.apache.commons + commons-collections4 + ${commons-collections4.version} + + + org.apache.commons + commons-exec + ${commons-exec.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + + + 7.1.0 + 4.1 + 3.11.1 + 1.2.0 + 1.3 + + diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningArrays.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningArrays.java similarity index 95% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningArrays.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningArrays.java index 2ad48033c0..5f63123f6a 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningArrays.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningArrays.java @@ -1,4 +1,4 @@ -package com.baeldung.combiningcollections; +package com.baeldung.collections.combiningcollections; import java.util.Arrays; import java.util.stream.Stream; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningLists.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningLists.java similarity index 96% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningLists.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningLists.java index 3fdf672758..a45e9cdfe8 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningLists.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningLists.java @@ -1,4 +1,4 @@ -package com.baeldung.combiningcollections; +package com.baeldung.collections.combiningcollections; import java.util.ArrayList; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningMaps.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningMaps.java similarity index 96% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningMaps.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningMaps.java index d8bbd01ed3..d4d21d0dad 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningMaps.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningMaps.java @@ -1,4 +1,4 @@ -package com.baeldung.combiningcollections; +package com.baeldung.collections.combiningcollections; import java.util.Collection; import java.util.HashMap; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningSets.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningSets.java similarity index 96% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningSets.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningSets.java index 5f531c1d43..27a5681eee 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/combiningcollections/CombiningSets.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/combiningcollections/CombiningSets.java @@ -1,4 +1,4 @@ -package com.baeldung.combiningcollections; +package com.baeldung.collections.combiningcollections; import java.util.Collection; import java.util.HashSet; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/CollectionUtilsCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/CollectionUtilsCollectionFilter.java similarity index 91% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/CollectionUtilsCollectionFilter.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/CollectionUtilsCollectionFilter.java index 58f9f6af54..de5158e147 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/CollectionUtilsCollectionFilter.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/CollectionUtilsCollectionFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.java.filtering; +package com.baeldung.collections.filtering; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/EclipseCollectionsCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/EclipseCollectionsCollectionFilter.java similarity index 96% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/EclipseCollectionsCollectionFilter.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/EclipseCollectionsCollectionFilter.java index 981d6ca241..a7b78b1f9b 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/EclipseCollectionsCollectionFilter.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/EclipseCollectionsCollectionFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.java.filtering; +package com.baeldung.collections.filtering; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/GuavaCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/GuavaCollectionFilter.java similarity index 91% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/GuavaCollectionFilter.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/GuavaCollectionFilter.java index 88338fd6d4..0a2a782c33 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/GuavaCollectionFilter.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/GuavaCollectionFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.java.filtering; +package com.baeldung.collections.filtering; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/StreamsCollectionFilter.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/StreamsCollectionFilter.java similarity index 95% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/StreamsCollectionFilter.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/StreamsCollectionFilter.java index f074f74199..a9fb8481e5 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/filtering/StreamsCollectionFilter.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/filtering/StreamsCollectionFilter.java @@ -1,4 +1,4 @@ -package com.baeldung.java.filtering; +package com.baeldung.collections.filtering; import java.util.Collection; import java.util.function.Predicate; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/iterable/IterableSize.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize/IterableSize.java similarity index 97% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/iterable/IterableSize.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize/IterableSize.java index 03864f16f2..b96e2bb571 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/iterable/IterableSize.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/iterablesize/IterableSize.java @@ -1,4 +1,4 @@ -package com.baeldung.java.iterable; +package com.baeldung.collections.iterablesize; import java.util.Collection; import java.util.stream.StreamSupport; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java similarity index 92% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java index 2405c26aac..ce5cbb39d6 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNull.java @@ -1,4 +1,4 @@ -package com.baeldung.nullsafecollectionstreams; +package com.baeldung.collections.nullsafecollectionstreams; import java.util.Collection; import java.util.stream.Stream; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java similarity index 92% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java index da767d4563..68d51c2d87 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainer.java @@ -1,4 +1,4 @@ -package com.baeldung.nullsafecollectionstreams; +package com.baeldung.collections.nullsafecollectionstreams; import java.util.Collection; import java.util.Optional; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java similarity index 91% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java index 0c10f1cebc..6c606ebedd 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheck.java @@ -1,4 +1,4 @@ -package com.baeldung.nullsafecollectionstreams; +package com.baeldung.collections.nullsafecollectionstreams; import java.util.Collection; import java.util.stream.Stream; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/CollectionRemoveIf.java similarity index 91% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/CollectionRemoveIf.java index 2f5e91596f..4089382376 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/CollectionRemoveIf.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/CollectionRemoveIf.java @@ -1,4 +1,4 @@ -package com.baeldung.removal; +package com.baeldung.collections.removal; import java.util.ArrayList; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/Iterators.java similarity index 93% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/Iterators.java index 86b91b3fdc..d551b04eae 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/Iterators.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/Iterators.java @@ -1,4 +1,4 @@ -package com.baeldung.removal; +package com.baeldung.collections.removal; import java.util.ArrayList; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamFilterAndCollector.java similarity index 93% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamFilterAndCollector.java index bf6db68bae..e0dc75f428 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamFilterAndCollector.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamFilterAndCollector.java @@ -1,4 +1,4 @@ -package com.baeldung.removal; +package com.baeldung.collections.removal; import java.util.ArrayList; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamPartitioningBy.java similarity index 95% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java rename to core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamPartitioningBy.java index c77e996616..c01c334f01 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/removal/StreamPartitioningBy.java +++ b/core-java-modules/core-java-collections-2/src/main/java/com/baeldung/collections/removal/StreamPartitioningBy.java @@ -1,4 +1,4 @@ -package com.baeldung.removal; +package com.baeldung.collections.removal; import java.util.ArrayList; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningArraysUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningArraysUnitTest.java similarity index 96% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningArraysUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningArraysUnitTest.java index 3b80d773ad..312f5582ba 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningArraysUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningArraysUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.combiningcollections; +package com.baeldung.collections.combiningcollections; import static org.junit.Assert.*; import org.junit.Test; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningListsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningListsUnitTest.java similarity index 96% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningListsUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningListsUnitTest.java index c5851d7daf..5443e56e5f 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningListsUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningListsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.combiningcollections; +package com.baeldung.collections.combiningcollections; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningMapsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningMapsUnitTest.java similarity index 96% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningMapsUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningMapsUnitTest.java index 3fa9cc7dc4..644f178f80 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningMapsUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningMapsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.combiningcollections; +package com.baeldung.collections.combiningcollections; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningSetsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningSetsUnitTest.java similarity index 96% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningSetsUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningSetsUnitTest.java index 330827bdc2..c9976eb6de 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/combiningcollections/CombiningSetsUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/combiningcollections/CombiningSetsUnitTest.java @@ -1,5 +1,5 @@ -package com.baeldung.combiningcollections; +package com.baeldung.collections.combiningcollections; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/filtering/CollectionFiltersUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/filtering/CollectionFiltersUnitTest.java similarity index 98% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/java/filtering/CollectionFiltersUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/filtering/CollectionFiltersUnitTest.java index b30805d471..db387818b8 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/filtering/CollectionFiltersUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/filtering/CollectionFiltersUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.filtering; +package com.baeldung.collections.filtering; import static org.assertj.core.api.Assertions.assertThat; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/iterable/IterableSizeUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize/IterableSizeUnitTest.java similarity index 96% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/java/iterable/IterableSizeUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize/IterableSizeUnitTest.java index 4bc413dee0..35702a74b3 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/iterable/IterableSizeUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/iterablesize/IterableSizeUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.iterable; +package com.baeldung.collections.iterablesize; import static org.junit.Assert.assertEquals; diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsJoinAndSplitJUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/CollectionsJoinAndSplitJUnitTest.java similarity index 97% rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsJoinAndSplitJUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/CollectionsJoinAndSplitJUnitTest.java index c288cf499d..1904fd1587 100644 --- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsJoinAndSplitJUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/CollectionsJoinAndSplitJUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java.collections; +package com.baeldung.collections.joinsplit; import java.util.ArrayList; import java.util.Collections; diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/JoinSplitCollectionsUnitTest.java similarity index 99% rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/JoinSplitCollectionsUnitTest.java index c594529f41..1fbe210ad4 100644 --- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/JoinSplitCollectionsUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/joinsplit/JoinSplitCollectionsUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java.collections; +package com.baeldung.collections.joinsplit; import org.junit.Test; diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java similarity index 98% rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java index d43075c925..ebef8d6875 100644 --- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsConcatenateUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/multiplecollections/CombineMultipleCollectionsUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java.collections; +package com.baeldung.collections.multiplecollections; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -14,7 +14,7 @@ import java.util.stream.Stream; import static java.util.Arrays.asList; -public class CollectionsConcatenateUnitTest { +public class CombineMultipleCollectionsUnitTest { @Test public void givenUsingJava8_whenConcatenatingUsingConcat_thenCorrect() { diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java similarity index 95% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java index 875045946d..42cda7926c 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingCommonsEmptyIfNullUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.nullsafecollectionstreams; +package com.baeldung.collections.nullsafecollectionstreams; import java.util.Arrays; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java similarity index 95% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java index 402f1a6a19..666d5e7d04 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingJava8OptionalContainerUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.nullsafecollectionstreams; +package com.baeldung.collections.nullsafecollectionstreams; import java.util.Arrays; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java similarity index 95% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java index bb6152371d..2e8eeb35ad 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/nullsafecollectionstreams/NullSafeCollectionStreamsUsingNullDereferenceCheckUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.nullsafecollectionstreams; +package com.baeldung.collections.nullsafecollectionstreams; import java.util.Arrays; import java.util.Collection; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/removal/RemovalUnitTest.java similarity index 98% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/removal/RemovalUnitTest.java index 1b379f32de..998dbe6cca 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/removal/RemovalUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/removal/RemovalUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.removal; +package com.baeldung.collections.removal; import org.junit.Before; import org.junit.Test; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/shufflingcollections/ShufflingCollectionsUnitTest.java similarity index 97% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/shufflingcollections/ShufflingCollectionsUnitTest.java index d013907c9a..041e67ba7f 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/shufflingcollections/ShufflingCollectionsUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/shufflingcollections/ShufflingCollectionsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.shufflingcollections; +package com.baeldung.collections.shufflingcollections; import org.junit.Test; diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/Employee.java similarity index 96% rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/Employee.java index 99af49c8d3..e838dbea18 100644 --- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/Employee.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/Employee.java @@ -1,4 +1,4 @@ -package org.baeldung.java.sorting; +package com.baeldung.collections.sorting; public class Employee implements Comparable { diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/JavaSortingUnitTest.java similarity index 99% rename from core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java rename to core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/JavaSortingUnitTest.java index ca9c9b4b5d..2505adcea7 100644 --- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/sorting/JavaSortingUnitTest.java +++ b/core-java-modules/core-java-collections-2/src/test/java/com/baeldung/collections/sorting/JavaSortingUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java.sorting; +package com.baeldung.collections.sorting; import com.google.common.primitives.Ints; import org.apache.commons.lang3.ArrayUtils; diff --git a/core-java-modules/core-java-collections-3/README.md b/core-java-modules/core-java-collections-3/README.md new file mode 100644 index 0000000000..9218384640 --- /dev/null +++ b/core-java-modules/core-java-collections-3/README.md @@ -0,0 +1,11 @@ +========= + +## Core Java Collections Cookbooks and Examples + +### Relevant Articles: +- [Time Comparison of Arrays.sort(Object[]) and Arrays.sort(int[])](https://www.baeldung.com/arrays-sortobject-vs-sortint) +- [Java ArrayList vs Vector](https://www.baeldung.com/java-arraylist-vs-vector) +- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences) +- [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall) +- [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance) +- [Fail-Safe Iterator vs Fail-Fast Iterator](https://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator) diff --git a/core-java-modules/core-java-collections-3/pom.xml b/core-java-modules/core-java-collections-3/pom.xml new file mode 100644 index 0000000000..84c7865e68 --- /dev/null +++ b/core-java-modules/core-java-collections-3/pom.xml @@ -0,0 +1,34 @@ + + 4.0.0 + core-java-collections-3 + 0.1.0-SNAPSHOT + core-java-collections-3 + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.openjdk.jmh + jmh-core + ${openjdk.jmh.version} + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + 1.19 + 3.11.1 + + diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/ArrayListBenchmark.java similarity index 98% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/ArrayListBenchmark.java index 331ae8d908..7fcadf019c 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArrayListBenchmark.java +++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/ArrayListBenchmark.java @@ -1,4 +1,4 @@ -package com.baeldung.performance; +package com.baeldung.collections.arraylistvsvector; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; diff --git a/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java new file mode 100644 index 0000000000..02f25a7558 --- /dev/null +++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/Employee.java @@ -0,0 +1,55 @@ +package com.baeldung.collections.arraylistvsvector; + +public class Employee { + + private Long id; + private String name; + + public Employee(Long id, String name) { + this.name = name; + this.id = id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Employee employee = (Employee) o; + + if (!id.equals(employee.id)) return false; + return name.equals(employee.name); + + } + + @Override + public int hashCode() { + int result = id.hashCode(); + result = 31 * result + name.hashCode(); + return result; + } + + @Override + public String toString() { + return "Employee{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/VectorExample.java similarity index 92% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/VectorExample.java index 7debc07911..e82e47cdbb 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/list/VectorExample.java +++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/arraylistvsvector/VectorExample.java @@ -1,4 +1,4 @@ -package com.baeldung.java.list; +package com.baeldung.collections.arraylistvsvector; import java.util.Enumeration; import java.util.Iterator; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/CollectionsBenchmark.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/CollectionsBenchmark.java similarity index 96% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/CollectionsBenchmark.java rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/CollectionsBenchmark.java index 921e1608ea..76edd10e92 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/CollectionsBenchmark.java +++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/CollectionsBenchmark.java @@ -1,4 +1,4 @@ -package com.baeldung.performance; +package com.baeldung.collections.containsperformance; import org.openjdk.jmh.annotations.*; import org.openjdk.jmh.runner.Runner; diff --git a/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java new file mode 100644 index 0000000000..6c60f8772c --- /dev/null +++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/containsperformance/Employee.java @@ -0,0 +1,55 @@ +package com.baeldung.collections.containsperformance; + +public class Employee { + + private Long id; + private String name; + + public Employee(Long id, String name) { + this.name = name; + this.id = id; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Employee employee = (Employee) o; + + if (!id.equals(employee.id)) return false; + return name.equals(employee.name); + + } + + @Override + public int hashCode() { + int result = id.hashCode(); + result = 31 * result + name.hashCode(); + return result; + } + + @Override + public String toString() { + return "Employee{" + + "id=" + id + + ", name='" + name + '\'' + + '}'; + } +} diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/iterators/Iterators.java similarity index 97% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/iterators/Iterators.java index 5e7cfdb54f..23e6bbda77 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/iterators/Iterators.java +++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/iterators/Iterators.java @@ -1,4 +1,4 @@ -package com.baeldung.iterators; +package com.baeldung.collections.iterators; import java.util.ArrayList; import java.util.Iterator; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/ArraySortBenchmark.java similarity index 97% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/ArraySortBenchmark.java index b93f8e9cc2..1cd56aa29d 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/performance/ArraySortBenchmark.java +++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/ArraySortBenchmark.java @@ -1,4 +1,4 @@ -package com.baeldung.performance; +package com.baeldung.collections.sortingcomparison; import java.util.Arrays; import java.util.concurrent.TimeUnit; diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/CollectionsSortCompare.java similarity index 94% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java rename to core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/CollectionsSortCompare.java index 1eff522877..abe7a12a00 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/java/sort/CollectionsSortCompare.java +++ b/core-java-modules/core-java-collections-3/src/main/java/com/baeldung/collections/sortingcomparison/CollectionsSortCompare.java @@ -1,4 +1,4 @@ -package com.baeldung.java.sort; +package com.baeldung.collections.sortingcomparison; import java.util.ArrayList; import java.util.Arrays; diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall/ClearVsRemoveAllUnitTest.java similarity index 95% rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java rename to core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall/ClearVsRemoveAllUnitTest.java index 8b0a7ef0db..9cd9c6aa50 100644 --- a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java +++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/clearvsremoveall/ClearVsRemoveAllUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.collection; +package com.baeldung.collections.clearvsremoveall; import org.junit.jupiter.api.Test; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java similarity index 98% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java rename to core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java index 5218332d60..b00a7fd953 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java +++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.hashmapvshashtable; +package com.baeldung.collections.hashmapvshashtable; import static org.junit.Assert.assertEquals; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/iterators/IteratorsUnitTest.java similarity index 77% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java rename to core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/iterators/IteratorsUnitTest.java index 36e1f4a83c..95cf590857 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/iterators/IteratorsUnitTest.java +++ b/core-java-modules/core-java-collections-3/src/test/java/com/baeldung/collections/iterators/IteratorsUnitTest.java @@ -1,8 +1,8 @@ -package com.baeldung.iterators; +package com.baeldung.collections.iterators; -import static com.baeldung.iterators.Iterators.failFast1; -import static com.baeldung.iterators.Iterators.failFast2; -import static com.baeldung.iterators.Iterators.failSafe1; +import static com.baeldung.collections.iterators.Iterators.failFast1; +import static com.baeldung.collections.iterators.Iterators.failFast2; +import static com.baeldung.collections.iterators.Iterators.failSafe1; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; diff --git a/core-java-modules/core-java-collections-list/README.md b/core-java-modules/core-java-collections-list/README.md index e83fcce5ff..1542a352fe 100644 --- a/core-java-modules/core-java-collections-list/README.md +++ b/core-java-modules/core-java-collections-list/README.md @@ -11,4 +11,5 @@ - [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list) - [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java) - [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) -- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list) \ No newline at end of file +- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list) +- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) diff --git a/core-java-modules/core-java-collections/README.md b/core-java-modules/core-java-collections/README.md index b34293769d..7be7d02b3f 100644 --- a/core-java-modules/core-java-collections/README.md +++ b/core-java-modules/core-java-collections/README.md @@ -3,29 +3,13 @@ ## Core Java Collections Cookbooks and Examples ### Relevant Articles: -- [Java – Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections) -- [Collect a Java Stream to an Immutable Collection](http://www.baeldung.com/java-stream-immutable-collection) -- [Introduction to the Java ArrayDeque](http://www.baeldung.com/java-array-deque) -- [Getting the Size of an Iterable in Java](http://www.baeldung.com/java-iterable-size) -- [How to Filter a Collection in Java](http://www.baeldung.com/java-collection-filtering) -- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) -- [Fail-Safe Iterator vs Fail-Fast Iterator](http://www.baeldung.com/java-fail-safe-vs-fail-fast-iterator) -- [Shuffling Collections In Java](http://www.baeldung.com/java-shuffle-collection) -- [An Introduction to Java.util.Hashtable Class](http://www.baeldung.com/java-hash-table) -- [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections) +- [Collect a Java Stream to an Immutable Collection](https://www.baeldung.com/java-stream-immutable-collection) +- [Introduction to the Java ArrayDeque](https://www.baeldung.com/java-array-deque) +- [An Introduction to Java.util.Hashtable Class](https://www.baeldung.com/java-hash-table) - [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe) -- [Differences Between Collection.clear() and Collection.removeAll()](https://www.baeldung.com/java-collection-clear-vs-removeall) -- [Performance of contains() in a HashSet vs ArrayList](https://www.baeldung.com/java-hashset-arraylist-contains-performance) - [Time Complexity of Java Collections](https://www.baeldung.com/java-collections-complexity) -- [Operating on and Removing an Item from Stream](https://www.baeldung.com/java-use-remove-item-stream) -- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections) -- [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements) -- [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections) -- [Sorting in Java](http://www.baeldung.com/java-sorting) -- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) - [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) -- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) -- [Differences Between HashMap and Hashtable](https://www.baeldung.com/hashmap-hashtable-differences) -- [Java ArrayList vs Vector](https://www.baeldung.com/java-arraylist-vs-vector) +- [A Guide to Iterator in Java](https://www.baeldung.com/java-iterator) - [Defining a Char Stack in Java](https://www.baeldung.com/java-char-stack) -- [Time Comparison of Arrays.sort(Object[]) and Arrays.sort(int[])](https://www.baeldung.com/arrays-sortobject-vs-sortint) +- [Guide to the Java Queue Interface](https://www.baeldung.com/java-queue) +- [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections) diff --git a/core-java-modules/core-java-collections/pom.xml b/core-java-modules/core-java-collections/pom.xml index e5b89c3d16..7fd702845b 100644 --- a/core-java-modules/core-java-collections/pom.xml +++ b/core-java-modules/core-java-collections/pom.xml @@ -14,33 +14,12 @@ - - org.apache.commons - commons-collections4 - ${commons-collections4.version} - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - org.eclipse.collections - eclipse-collections - ${eclipse.collections.version} - org.assertj assertj-core ${assertj.version} test - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - org.openjdk.jmh jmh-core @@ -51,11 +30,6 @@ jmh-generator-annprocess ${openjdk.jmh.version} - - org.apache.commons - commons-exec - ${commons-exec.version} - org.projectlombok lombok @@ -66,13 +40,6 @@ 1.19 - 1.2.0 - 3.8.1 - 4.1 - 4.01 - 1.7.0 3.11.1 - 7.1.0 - 1.3 diff --git a/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/application/Application.java b/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/Application.java similarity index 90% rename from core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/application/Application.java rename to core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/Application.java index 093308a34a..f974a24839 100644 --- a/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/application/Application.java +++ b/core-java-modules/core-java-collections/src/main/java/com/baeldung/synchronizedcollections/Application.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.application; +package com.baeldung.synchronizedcollections; import java.util.Arrays; import java.util.Collections; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java deleted file mode 100644 index d0d8c3923c..0000000000 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/java/collections/ConcurrentModificationExceptionUnitTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.baeldung.java.collections; - -import org.junit.Test; - -import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; - -import static java.util.Arrays.asList; -import static org.junit.Assert.assertEquals; - -public class ConcurrentModificationExceptionUnitTest { - - @Test - public void changingContentWithSetDoesNotThrowConcurrentModificationException() throws Exception { - ArrayList array = new ArrayList<>(asList(0, "one", 2, "three")); - - for (Object item : array) { - array.set(3, 3); - } - } - - @Test - public void removingElementUsingIteratorAPI() throws Exception { - List originalList = new ArrayList<>(asList("zero", "one", "two", "three")); - - Iterator iterator = originalList.iterator(); - - while (iterator.hasNext()) { - String next = iterator.next(); - if (Objects.equals(next, "one")) iterator.remove(); - } - - assertEquals(originalList, asList("zero", "two", "three")); - } - - @Test - public void modifyingContentAndIteratingUsingListIteratorAPI() throws Exception { - List originalList = new ArrayList<>(asList("zero", "one", "two", "three")); - - ListIterator iterator = originalList.listIterator(); - - while (iterator.hasNext()) { - String next = iterator.next(); - if (Objects.equals(next, "one")) { - iterator.set("another"); - } - - if (Objects.equals(next, "two")) { - iterator.remove(); - } - - if (Objects.equals(next, "three")) { - iterator.add("four"); - } - } - - assertEquals(originalList, asList("zero", "another", "three", "four")); - } - - @Test - public void removingElementUsingCopyAndListAPI() throws Exception { - List originalList = new ArrayList<>(asList("zero", "one", "two", "three")); - - List listCopy = new ArrayList<>(originalList); - - for (String next : listCopy) { - if (Objects.equals(next, "one")) originalList.remove(originalList.indexOf(next) - 1); - } - - assertEquals(originalList, asList("one", "two", "three")); - } - - @Test - public void copyOnWriteList() throws Exception { - List originalList = new CopyOnWriteArrayList<>(asList("zero", "one", "two", "three")); - - for (String next : originalList) { - if (Objects.equals(next, "one")) originalList.remove(originalList.indexOf(next) - 1); - } - - assertEquals(originalList, asList("one", "two", "three")); - } -} diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedCollectionUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedCollectionUnitTest.java similarity index 94% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedCollectionUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedCollectionUnitTest.java index fd84503226..29b1ab9e70 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedCollectionUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedCollectionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.ArrayList; import java.util.Arrays; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedListUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedListUnitTest.java similarity index 97% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedListUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedListUnitTest.java index 72354622ae..0e3c9cd217 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedListUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedListUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.ArrayList; import java.util.Arrays; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedMapUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedMapUnitTest.java similarity index 94% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedMapUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedMapUnitTest.java index 842e253e9e..9a4d80b403 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedMapUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedMapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.Collections; import java.util.HashMap; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSetUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSetUnitTest.java similarity index 93% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSetUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSetUnitTest.java index f88f58a55b..88fd343f56 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSetUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSetUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.Arrays; import java.util.Collections; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedMapUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedMapUnitTest.java similarity index 94% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedMapUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedMapUnitTest.java index 23933b2b4b..7cbfa9bfa9 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedMapUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedMapUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.Collections; import java.util.Map; diff --git a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedSetUnitTest.java b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedSetUnitTest.java similarity index 94% rename from core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedSetUnitTest.java rename to core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedSetUnitTest.java index 3ce1e6ed26..98820665c1 100644 --- a/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/test/SynchronizedSortedSetUnitTest.java +++ b/core-java-modules/core-java-collections/src/test/java/com/baeldung/synchronizedcollections/SynchronizedSortedSetUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.synchronizedcollections.test; +package com.baeldung.synchronizedcollections; import java.util.Arrays; import java.util.Collections; diff --git a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md b/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md deleted file mode 100644 index 317d81fae7..0000000000 --- a/core-java-modules/core-java-collections/src/test/java/org/baeldung/java/collections/README.md +++ /dev/null @@ -1,3 +0,0 @@ -### Relevant Articles: -- [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) -- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) diff --git a/pom.xml b/pom.xml index 6972736288..89786496c7 100644 --- a/pom.xml +++ b/pom.xml @@ -401,6 +401,8 @@ core-java-modules/core-java-arrays core-java-modules/core-java-arrays-2 core-java-modules/core-java-collections + core-java-modules/core-java-collections-2 + core-java-modules/core-java-collections-3 core-java-modules/core-java-collections-list core-java-modules/core-java-collections-list-2 core-java-modules/core-java-collections-list-3 @@ -1141,6 +1143,8 @@ core-java-modules/core-java-arrays core-java-modules/core-java-arrays-2 core-java-modules/core-java-collections + core-java-modules/core-java-collections-2 + core-java-modules/core-java-collections-3 core-java-modules/core-java-collections-list core-java-modules/core-java-collections-list-2 core-java-modules/core-java-collections-list-3 From 7f56b97a7dd7c805ad8b2c2cc1aea739dad7706b Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 27 Sep 2019 19:20:31 +0530 Subject: [PATCH 266/396] BAEL-11102 Fix the integrations tests in spring-5-reactive (#7869) --- .../reactive/errorhandling/ErrorHandlingIntegrationTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java index 42da90ecd5..3bbbed0d77 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/errorhandling/ErrorHandlingIntegrationTest.java @@ -12,11 +12,13 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.MediaType; import org.springframework.security.test.context.support.WithMockUser; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) +@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) +@DirtiesContext @WithMockUser @AutoConfigureWebTestClient(timeout = "10000") public class ErrorHandlingIntegrationTest { From 6d499542a1ee22c2201d584efa58aad18c808b91 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 27 Sep 2019 19:21:32 +0530 Subject: [PATCH 267/396] BAEL-17355 Fix the integrations tests in spring-boot-properties (#7865) - Committing initial value correctly --- spring-boot-properties/extra.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-properties/extra.properties b/spring-boot-properties/extra.properties index 51874a0415..8e28a6f889 100644 --- a/spring-boot-properties/extra.properties +++ b/spring-boot-properties/extra.properties @@ -1 +1 @@ -application.theme.color=red \ No newline at end of file +application.theme.color=blue \ No newline at end of file From afda4464417d905d051cce5c2125a3fd3248f81c Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 27 Sep 2019 19:22:22 +0530 Subject: [PATCH 268/396] BAEL-17701 Fix the integrations tests in spring-jooq (#7868) --- spring-jooq/src/test/resources/application.properties | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/spring-jooq/src/test/resources/application.properties b/spring-jooq/src/test/resources/application.properties index dc5d81acfb..ef37552bf0 100644 --- a/spring-jooq/src/test/resources/application.properties +++ b/spring-jooq/src/test/resources/application.properties @@ -1,2 +1,4 @@ -spring.datasource.url=jdbc:h2:tcp:~/jooq;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE +spring.datasource.url=jdbc:h2:~/jooq;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE +spring.datasource.username=sa +spring.datasource.password= spring.jpa.hibernate.ddl-auto=update From 80a30cf9c6380bbd736db3925de6506855cde9c5 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 27 Sep 2019 14:54:57 +0100 Subject: [PATCH 269/396] [BAEL-17492] Add README descriptions 8 (#7840) * [BAEL-17492] Add README descriptions 8 * Small changes * monospaced the word --- spring-di/README.md | 4 ++++ spring-drools/README.md | 4 ++++ spring-ehcache/README.md | 5 +++-- spring-ejb/README.md | 4 ++++ spring-exceptions/README.md | 7 ++----- spring-freemarker/README.md | 5 ++--- spring-groovy/README.md | 4 ++++ spring-integration/README.md | 4 ++++ spring-jenkins-pipeline/README.md | 13 +++++++++---- spring-jersey/README.md | 4 +++- 10 files changed, 39 insertions(+), 15 deletions(-) diff --git a/spring-di/README.md b/spring-di/README.md index 59651751ee..17f50ba410 100644 --- a/spring-di/README.md +++ b/spring-di/README.md @@ -1,3 +1,7 @@ +## Spring Dependency Injection + +This module contains articles about dependency injection with Spring + ### Relevant Articles - [The Spring @Qualifier Annotation](https://www.baeldung.com/spring-qualifier-annotation) diff --git a/spring-drools/README.md b/spring-drools/README.md index 00b35a4624..3685a399bc 100644 --- a/spring-drools/README.md +++ b/spring-drools/README.md @@ -1,3 +1,7 @@ +## Spring Drools + +This modules contains articles about Spring with Drools + ## Relevant articles: - [Drools Spring Integration](http://www.baeldung.com/drools-spring-integration) diff --git a/spring-ehcache/README.md b/spring-ehcache/README.md index ecf96cd7c7..da7376e476 100644 --- a/spring-ehcache/README.md +++ b/spring-ehcache/README.md @@ -1,7 +1,8 @@ -## Spring Ehcache Example Project +## Spring Ehcache -A simple example of using ehcache with spring-boot. +This module contains articles about Spring with Ehcache ### Relevant Articles: + - [Spring Boot Ehcache Example](https://www.baeldung.com/spring-boot-ehcache) diff --git a/spring-ejb/README.md b/spring-ejb/README.md index 58ccb20e70..f475aafc7f 100644 --- a/spring-ejb/README.md +++ b/spring-ejb/README.md @@ -1,3 +1,7 @@ +## Spring EJB + +This module contains articles about Spring with EJB + ### Relevant Articles - [Guide to EJB Set-up](http://www.baeldung.com/ejb-intro) diff --git a/spring-exceptions/README.md b/spring-exceptions/README.md index b9472c4cca..026e8485c8 100644 --- a/spring-exceptions/README.md +++ b/spring-exceptions/README.md @@ -1,10 +1,7 @@ -========= +## Spring `Exception`s -## Spring Exceptions Example Project +This module contains articles about Spring `Exception`s -This project is used to replicate Spring Exceptions only. - - ### Relevant articles: - [Spring BeanCreationException](http://www.baeldung.com/spring-beancreationexception) - [Spring DataIntegrityViolationException](http://www.baeldung.com/spring-dataIntegrityviolationexception) diff --git a/spring-freemarker/README.md b/spring-freemarker/README.md index bd939d11e9..ce8fb78f4d 100644 --- a/spring-freemarker/README.md +++ b/spring-freemarker/README.md @@ -1,7 +1,6 @@ -========= - -## Using FreeMarker in Spring MVC +## Spring FreeMarker +This module contains articles about Spring with FreeMarker ### Relevant Articles: - [Introduction to Using FreeMarker in Spring MVC](http://www.baeldung.com/freemarker-in-spring-mvc-tutorial) diff --git a/spring-groovy/README.md b/spring-groovy/README.md index 36404230a9..c3bb5636ba 100644 --- a/spring-groovy/README.md +++ b/spring-groovy/README.md @@ -1,3 +1,7 @@ +## Spring Groovy + +This module contains articles about Spring with Groovy + ## Relevant Articles: - [Groovy Bean Definitions](https://www.baeldung.com/spring-groovy-beans) diff --git a/spring-integration/README.md b/spring-integration/README.md index 244cf1fb14..f2fbfe48b5 100644 --- a/spring-integration/README.md +++ b/spring-integration/README.md @@ -1,3 +1,7 @@ +## Spring Integration + +This module contains articles about Spring Integration + ### Relevant Articles: - [Introduction to Spring Integration](http://www.baeldung.com/spring-integration) - [Security In Spring Integration](http://www.baeldung.com/spring-integration-security) diff --git a/spring-jenkins-pipeline/README.md b/spring-jenkins-pipeline/README.md index 8c10e85da2..0086ae256d 100644 --- a/spring-jenkins-pipeline/README.md +++ b/spring-jenkins-pipeline/README.md @@ -1,5 +1,12 @@ -BASIC CRUD API with Spring Boot -================================ +## Spring Jenkins + +This module contains articles about Spring with Jenkins + +### Relevant articles + +- [Intro to Jenkins 2 and the Power of Pipelines](http://www.baeldung.com/jenkins-pipelines) + +## Basic CRUD API with Spring Boot This is the code of a simple API for some CRUD operations build using Spring Boot. @@ -21,6 +28,4 @@ Now with default configurations it will be available at: [http://localhost:8080] Enjoy it :) -### Relevant articles -- [Intro to Jenkins 2 and the Power of Pipelines](http://www.baeldung.com/jenkins-pipelines) diff --git a/spring-jersey/README.md b/spring-jersey/README.md index 37928620d3..6adc5f1375 100644 --- a/spring-jersey/README.md +++ b/spring-jersey/README.md @@ -1,4 +1,6 @@ -========= +## Spring Jersey + +This module contains articles about Spring with Jersey ## REST API with Jersey & Spring Example Project - [REST API with Jersey and Spring](http://www.baeldung.com/jersey-rest-api-with-spring) From 950226e8f00e5c3da60f666e0c11b07037937a91 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 27 Sep 2019 14:58:00 +0100 Subject: [PATCH 270/396] [BAEL-17476] Add README descriptions 17 (#7877) * [BAEL-17476] Add README descriptions 17 * Removed 'with' in spring security kerberos readme --- java-blockchain/README.md | 7 ++++--- spring-boot-di/README.MD | 4 ++++ spring-boot-flowable/README.md | 4 ++++ spring-boot-nashorn/README.md | 9 +++++++-- spring-security-kerberos/README.md | 17 ++++++++++------- tensorflow-java/README.md | 4 ++++ wicket/README.md | 15 ++++++++++----- xml/README.md | 4 ++++ xstream/README.md | 4 ++++ 9 files changed, 51 insertions(+), 17 deletions(-) diff --git a/java-blockchain/README.md b/java-blockchain/README.md index 600f4dd610..5afd0d356b 100644 --- a/java-blockchain/README.md +++ b/java-blockchain/README.md @@ -1,6 +1,7 @@ -========= +## Java Blockchain -## Basic Implementation of Blockchian in Java +This module contains articles about Blockchain in Java ### Relevant Articles: -- []() + +- [Implementing a Simple Blockchain in Java](https://www.baeldung.com/java-blockchain) diff --git a/spring-boot-di/README.MD b/spring-boot-di/README.MD index 78cd163668..6e2c495b88 100644 --- a/spring-boot-di/README.MD +++ b/spring-boot-di/README.MD @@ -1,3 +1,7 @@ +## Spring Boot Dependency Inject + +This module contains articles about dependency injection with Spring Boot + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/spring-boot-flowable/README.md b/spring-boot-flowable/README.md index 8fb90d953b..884ddb7ec6 100644 --- a/spring-boot-flowable/README.md +++ b/spring-boot-flowable/README.md @@ -1,3 +1,7 @@ +## Spring Boot Flowable + +This module contains articles about Flowable in Boot applications + ### Relevant articles - [Introduction to Flowable](http://www.baeldung.com/flowable) diff --git a/spring-boot-nashorn/README.md b/spring-boot-nashorn/README.md index 1ca43927ee..f24adfe8e8 100644 --- a/spring-boot-nashorn/README.md +++ b/spring-boot-nashorn/README.md @@ -1,3 +1,8 @@ -### Relevant Articles: -- []() +## Spring Boot Nashorn + +This module contains articles about Spring Boot with Nashorn + +### Relevant Articles: + +- [Isomorphic Application with React and Nashorn](https://www.baeldung.com/react-nashorn-isomorphic-app) diff --git a/spring-security-kerberos/README.md b/spring-security-kerberos/README.md index 1b77c380db..a868fb86b7 100644 --- a/spring-security-kerberos/README.md +++ b/spring-security-kerberos/README.md @@ -1,10 +1,13 @@ -## @PreFilter and @PostFilter annotations +## Spring Security Kerberos + +This module contains articles about Spring Security Kerberos + +### Relevant Articles: + +- [Introduction to SPNEGO/Kerberos Authentication in Spring](https://www.baeldung.com/spring-security-kerberos) + +### @PreFilter and @PostFilter annotations ### Build the Project ### -``` -mvn clean install -``` - -### Relevant Articles: -- [Introduction to SPNEGO/Kerberos Authentication in Spring](https://www.baeldung.com/spring-security-kerberos) +`mvn clean install` \ No newline at end of file diff --git a/tensorflow-java/README.md b/tensorflow-java/README.md index f826375ac1..b96e4a83db 100644 --- a/tensorflow-java/README.md +++ b/tensorflow-java/README.md @@ -1,3 +1,7 @@ +## Tensorflow + +This module contains articles about Tensorflow + ## Relevant articles: - [Introduction to Tensorflow for Java](https://www.baeldung.com/tensorflow-java) diff --git a/wicket/README.md b/wicket/README.md index e873ee1ba1..91fab2a364 100644 --- a/wicket/README.md +++ b/wicket/README.md @@ -1,8 +1,13 @@ +## Wicket + +This module contains articles about Wicket + +### Relevant Articles + +- [Introduction to the Wicket Framework](http://www.baeldung.com/intro-to-the-wicket-framework) + +### Execution From the same directory where pom.xml is, execute the following command to run the project: -mvn jetty:run - - -###Relevant Articles: -- [Introduction to the Wicket Framework](http://www.baeldung.com/intro-to-the-wicket-framework) +mvn jetty:run \ No newline at end of file diff --git a/xml/README.md b/xml/README.md index c24fe3e785..f125955089 100644 --- a/xml/README.md +++ b/xml/README.md @@ -1,3 +1,7 @@ +## XML + +This module contains articles about eXtensible Markup Language (XML) + ### Relevant Articles: - [Intro to XPath with Java](http://www.baeldung.com/java-xpath) - [Introduction to JiBX](http://www.baeldung.com/jibx) diff --git a/xstream/README.md b/xstream/README.md index bf917e81fb..62996132c8 100644 --- a/xstream/README.md +++ b/xstream/README.md @@ -1,3 +1,7 @@ +## XStream + +This module contains articles about XStream + ## Relevant Articles: - [XStream User Guide: JSON](http://www.baeldung.com/xstream-json-processing) From 3604e6096da853e2ad1dc5a1a95b7a0fe76d95f1 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 27 Sep 2019 14:59:13 +0100 Subject: [PATCH 271/396] [BAEL-17476] - Add README descriptions 16 (#7876) * [BAEL-17476] - Add README descriptions 16 * Updated VRaptor --- structurizr/README.md | 4 ++++ struts-2/README.md | 4 ++++ testing-modules/README.md | 3 +-- twilio/README.md | 2 ++ twitter4j/README.md | 4 ++++ undertow/README.md | 4 ++++ vertx-and-rxjava/README.md | 4 ++++ vertx/README.md | 4 ++++ vraptor/README.md | 24 +++++++++++++++++++----- 9 files changed, 46 insertions(+), 7 deletions(-) diff --git a/structurizr/README.md b/structurizr/README.md index e596dfa458..90ce49b482 100644 --- a/structurizr/README.md +++ b/structurizr/README.md @@ -1,2 +1,6 @@ +## Structurizr + +This module contains articles about Structurizr + ### Relevant Articles: - [Intro to Structurizr](http://www.baeldung.com/structurizr) diff --git a/struts-2/README.md b/struts-2/README.md index 8a1425ccb5..6121ab3166 100644 --- a/struts-2/README.md +++ b/struts-2/README.md @@ -1,3 +1,7 @@ +## Struts 2 + +This module contains articles about Struts 2 + ### Relevant articles - [A Quick Struts 2 Intro](http://www.baeldung.com/struts-2-intro) diff --git a/testing-modules/README.md b/testing-modules/README.md index 21fc87a67f..c6098d1210 100644 --- a/testing-modules/README.md +++ b/testing-modules/README.md @@ -1,4 +1,3 @@ - ## Testing Modules -This is a aggregator module containing several modules focused on testing libraries. +This is an aggregator module containing multiple modules focused on testing libraries. diff --git a/twilio/README.md b/twilio/README.md index 9d230610c7..b098473fa9 100644 --- a/twilio/README.md +++ b/twilio/README.md @@ -1,4 +1,6 @@ +## Twilio +This module contains articles about Twilio ### Relevant Articles: diff --git a/twitter4j/README.md b/twitter4j/README.md index 3057c1c4b2..0f58240538 100644 --- a/twitter4j/README.md +++ b/twitter4j/README.md @@ -1,3 +1,7 @@ +## Twitter4J + +This module contains articles about Twitter4J + ### Relevant articles - [Introduction to Twitter4J](http://www.baeldung.com/twitter4j) diff --git a/undertow/README.md b/undertow/README.md index 8bfb4832e2..ceec806bd4 100644 --- a/undertow/README.md +++ b/undertow/README.md @@ -1,2 +1,6 @@ +## Undertow + +This module contains articles about JBoss Undertow + ### Relevant Articles: - [Introduction to JBoss Undertow](http://www.baeldung.com/jboss-undertow) diff --git a/vertx-and-rxjava/README.md b/vertx-and-rxjava/README.md index ccd4ce3457..6d217426e0 100644 --- a/vertx-and-rxjava/README.md +++ b/vertx-and-rxjava/README.md @@ -1,2 +1,6 @@ +## Vert.x and RxJava + +This module contains articles about RxJava with Vert.x + ### Relevant articles - [Example of Vertx and RxJava Integration](http://www.baeldung.com/vertx-rx-java) diff --git a/vertx/README.md b/vertx/README.md index e710df362d..fffc0afd62 100644 --- a/vertx/README.md +++ b/vertx/README.md @@ -1,3 +1,7 @@ +## Vert.x + +This module contains articles about Vert.x + ### Relevant articles - [Introduction to Vert.x](http://www.baeldung.com/vertx) diff --git a/vraptor/README.md b/vraptor/README.md index 0dc531ba8d..c5a7128922 100644 --- a/vraptor/README.md +++ b/vraptor/README.md @@ -1,18 +1,32 @@ +## VRaptor + +This module contains articles about VRaptor + +### Relevant Article: + +- [Introduction to VRaptor in Java](http://www.baeldung.com/vraptor) + # VRaptor blank project This is a blank project to help you to use VRaptor. You can easily import in you IDE as Maven project. +### Instructions + +After creating your project, you can run it using Tomcat 7 or higher: + +`mvn tomcat7:run` + +Take care to never run `mvn tomcat:run` since that will use Tomcat 6, which isn't compatible with VRaptor. + +### Em Português + Este é um projeto em branco para ajudar você a usar o VRaptor. Você pode facilmente importá-lo na sua IDE favorita como um projeto Maven. Após criar seu projeto você pode rodá-lo com um tomcat7 ou +: -``` -mvn tomcat7:run -``` +`mvn tomcat7:run` Cuidado para *jamais* executar `mvn tomcat:run` pois ele usará um tomcat6 (incompatível). -### Relevant Article: -- [Introduction to VRaptor in Java](http://www.baeldung.com/vraptor) From cd032c9d73a9a7b27c337273005fc7ac79ada0cd Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 27 Sep 2019 15:01:25 +0100 Subject: [PATCH 272/396] [BAEL-17476] - Add README descriptions 1 (#7881) --- parent-boot-1/README.md | 1 + parent-boot-2/README.md | 1 + parent-java/README.md | 4 +++- parent-kotlin/README.md | 3 ++- parent-spring-4/README.md | 4 +++- parent-spring-5/README.md | 4 +++- saas/README.md | 4 ++++ spark-java/README.md | 4 ++-- spring-4/README.md | 4 ++++ spring-5/README.md | 4 +++- 10 files changed, 26 insertions(+), 7 deletions(-) diff --git a/parent-boot-1/README.md b/parent-boot-1/README.md index 8b312c348a..5ad14c6519 100644 --- a/parent-boot-1/README.md +++ b/parent-boot-1/README.md @@ -1,2 +1,3 @@ +## Parent Boot 1 This is a parent module for all projects using Spring Boot 1. diff --git a/parent-boot-2/README.md b/parent-boot-2/README.md index 3f18bdf38e..7afe447a66 100644 --- a/parent-boot-2/README.md +++ b/parent-boot-2/README.md @@ -1,2 +1,3 @@ +## Parent Boot 2 This is a parent module for all projects using Spring Boot 2. diff --git a/parent-java/README.md b/parent-java/README.md index 729105e3fd..1b14b7cfc1 100644 --- a/parent-java/README.md +++ b/parent-java/README.md @@ -1 +1,3 @@ -## Relevant Articles: +## Parent Java + +This is a parent module for all projects using Java \ No newline at end of file diff --git a/parent-kotlin/README.md b/parent-kotlin/README.md index 6c17a6ac29..c78ecbac42 100644 --- a/parent-kotlin/README.md +++ b/parent-kotlin/README.md @@ -1,2 +1,3 @@ +## Parent Kotlin -Parent module for Kotlin projects. +This is a parent module for all projects using Kotlin diff --git a/parent-spring-4/README.md b/parent-spring-4/README.md index 729105e3fd..f14d003dd5 100644 --- a/parent-spring-4/README.md +++ b/parent-spring-4/README.md @@ -1 +1,3 @@ -## Relevant Articles: +## Parent Spring 4 + +This is a parent module for all projects using Spring 4 diff --git a/parent-spring-5/README.md b/parent-spring-5/README.md index 729105e3fd..791a6ca197 100644 --- a/parent-spring-5/README.md +++ b/parent-spring-5/README.md @@ -1 +1,3 @@ -## Relevant Articles: +## Parent Spring 5 + +This is a parent module for all projects using Spring 5 diff --git a/saas/README.md b/saas/README.md index 4e0eeea974..f537c7ff95 100644 --- a/saas/README.md +++ b/saas/README.md @@ -1,3 +1,7 @@ +## SAAS + +This module contains articles about software as a service (SAAS) + ## Relevant articles: - [JIRA REST API Integration](http://www.baeldung.com/jira-rest-api) diff --git a/spark-java/README.md b/spark-java/README.md index 5abe78263c..3f16b29b9f 100644 --- a/spark-java/README.md +++ b/spark-java/README.md @@ -1,6 +1,6 @@ -========= +## Spark Java -## Spark Java Framework Tutorial Sample Project +This module contains articles about Spark ### Relevant Articles - [Building an API With the Spark Java Framework](http://www.baeldung.com/spark-framework-rest-api) diff --git a/spring-4/README.md b/spring-4/README.md index 57cb8c3eeb..5bc38d4a9d 100644 --- a/spring-4/README.md +++ b/spring-4/README.md @@ -1,3 +1,7 @@ +## Spring 4 + +This module contains articles about Spring 4 + ### Relevant Articles: - [A Guide to Flips for Spring](http://www.baeldung.com/flips-spring) - [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari) diff --git a/spring-5/README.md b/spring-5/README.md index d3c1decbc7..7f4c643b7a 100644 --- a/spring-5/README.md +++ b/spring-5/README.md @@ -1,4 +1,6 @@ -## Spring REST Example Project +## Spring 5 + +This module contains articles about Spring 5 ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring From 5373bc17196d4353aad55588a905ad8b6c8194fa Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 27 Sep 2019 19:32:22 +0530 Subject: [PATCH 273/396] BAEL-17950 Fix the integrations tests in xml (#7882) -Fixed integration test issue and renamed the class back to *UnitTest as its not an integration test at all --- xml/pom.xml | 81 ++++++++++++++----- ...grationTest.java => CustomerUnitTest.java} | 4 +- 2 files changed, 64 insertions(+), 21 deletions(-) rename xml/src/test/java/com/baeldung/xml/jibx/{CustomerIntegrationTest.java => CustomerUnitTest.java} (94%) diff --git a/xml/pom.xml b/xml/pom.xml index d500d72454..bbd607f9b5 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -137,25 +137,68 @@ - - xml - - - src/main/resources - true - - - - - maven-compiler-plugin - ${maven-compiler-plugin.version} - - - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - + + xml + + + src/main/resources + true + + + + + + org.jibx + maven-jibx-plugin + + + + + + org.jibx + maven-jibx-plugin + ${maven-jibx-plugin.version} + + src/main/resources + + *-binding.xml + + + template-binding.xml + + src/main/resources + + *-binding.xml + + true + + + + process-classes + process-classes + + bind + + + + process-test-classes + process-test-classes + + test-bind + + + + + + maven-compiler-plugin + ${maven-compiler-plugin.version} + + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + diff --git a/xml/src/test/java/com/baeldung/xml/jibx/CustomerIntegrationTest.java b/xml/src/test/java/com/baeldung/xml/jibx/CustomerUnitTest.java similarity index 94% rename from xml/src/test/java/com/baeldung/xml/jibx/CustomerIntegrationTest.java rename to xml/src/test/java/com/baeldung/xml/jibx/CustomerUnitTest.java index be28dfe00a..9a4b5bc14b 100644 --- a/xml/src/test/java/com/baeldung/xml/jibx/CustomerIntegrationTest.java +++ b/xml/src/test/java/com/baeldung/xml/jibx/CustomerUnitTest.java @@ -11,7 +11,7 @@ import java.io.InputStream; import static junit.framework.Assert.assertEquals; -public class CustomerIntegrationTest { +public class CustomerUnitTest { @Test public void whenUnmarshalXML_ThenFieldsAreMapped() throws JiBXException, FileNotFoundException { @@ -21,7 +21,7 @@ public class CustomerIntegrationTest { InputStream inputStream = classLoader.getResourceAsStream("Customer1.xml"); Customer customer = (Customer) uctx.unmarshalDocument(inputStream, null); - assertEquals("Stefan Jaegar", customer.getPerson().getName()); + assertEquals("Stefan Jaeger", customer.getPerson().getName()); assertEquals("Davos Dorf", customer.getCity()); } From 2202f38699c8407b195d21fdaa94b8bbed9db269 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Fri, 27 Sep 2019 16:19:48 +0200 Subject: [PATCH 274/396] [BAEL-17489] Adding README descriptions to the following modules: (#7829) * [BAEL-17489] Adding README descriptions to the following modules: spring-boot-custom-starter spring-boot-disable-console-logging spring-boot-gradle spring-boot-jasypt spring-boot-keycloak spring-boot-kotlin spring-boot-logging-log4j2 spring-boot-management spring-boot-mvc spring-boot-mvc-birt * Change description of management module and add prev/next links as per new template. --- spring-boot-custom-starter/README.md | 4 ++++ spring-boot-disable-console-logging/README.md | 4 ++++ spring-boot-gradle/README.md | 4 ++++ spring-boot-jasypt/README.md | 3 +++ spring-boot-keycloak/README.md | 4 ++++ spring-boot-kotlin/README.md | 4 ++++ spring-boot-logging-log4j2/README.md | 4 ++++ spring-boot-management/README.md | 7 +++++++ spring-boot-mvc-2/README.md | 5 +++++ spring-boot-mvc-birt/README.md | 4 ++++ spring-boot-mvc/README.md | 5 +++++ 11 files changed, 48 insertions(+) create mode 100644 spring-boot-management/README.md diff --git a/spring-boot-custom-starter/README.md b/spring-boot-custom-starter/README.md index f983441ca0..9a62884ecb 100644 --- a/spring-boot-custom-starter/README.md +++ b/spring-boot-custom-starter/README.md @@ -1,3 +1,7 @@ +## Spring Boot Custom Starter + +This module contains articles about writing Spring Boot [starters](https://www.baeldung.com/spring-boot-starters). + ### Relevant Articles: - [Creating a Custom Starter with Spring Boot](http://www.baeldung.com/spring-boot-custom-starter) diff --git a/spring-boot-disable-console-logging/README.md b/spring-boot-disable-console-logging/README.md index 3d75fddc8e..7f1c06042f 100644 --- a/spring-boot-disable-console-logging/README.md +++ b/spring-boot-disable-console-logging/README.md @@ -1,2 +1,6 @@ +## Spring Boot Disable Console Logging + +This module contains articles about disabling Spring Boot console logging. + ### Relevant Articles: - [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) diff --git a/spring-boot-gradle/README.md b/spring-boot-gradle/README.md index 76b82dce02..3a64cca553 100644 --- a/spring-boot-gradle/README.md +++ b/spring-boot-gradle/README.md @@ -1,3 +1,7 @@ +## Spring Boot Gradle + +This module contains articles about Gradle in Spring Boot projects. + ### Relevant Articles: - [Spring Boot: Configuring a Main Class](http://www.baeldung.com/spring-boot-main-class) diff --git a/spring-boot-jasypt/README.md b/spring-boot-jasypt/README.md index 5df2a4a6e5..a07ca19790 100644 --- a/spring-boot-jasypt/README.md +++ b/spring-boot-jasypt/README.md @@ -1,3 +1,6 @@ +## Spring Boot Jasypt + +This module contains articles about Jasypt in Spring Boot projects. ### Relevant Articles: diff --git a/spring-boot-keycloak/README.md b/spring-boot-keycloak/README.md index cfe82c6cf7..15f0f1459c 100644 --- a/spring-boot-keycloak/README.md +++ b/spring-boot-keycloak/README.md @@ -1,2 +1,6 @@ +## Spring Boot Keycloak + +This module contains articles about Keycloak in Spring Boot projects. + ## Relevant articles: - [A Quick Guide to Using Keycloak with Spring Boot](http://www.baeldung.com/spring-boot-keycloak) diff --git a/spring-boot-kotlin/README.md b/spring-boot-kotlin/README.md index dc50c24aa0..73c312040d 100644 --- a/spring-boot-kotlin/README.md +++ b/spring-boot-kotlin/README.md @@ -1,2 +1,6 @@ +## Spring Boot Kotlin + +This module contains articles about Kotlin in Spring Boot projects. + ### Relevant Articles: - [Non-blocking Spring Boot with Kotlin Coroutines](http://www.baeldung.com/non-blocking-spring-boot-with-kotlin-coroutines) diff --git a/spring-boot-logging-log4j2/README.md b/spring-boot-logging-log4j2/README.md index ea968d7fae..2d72ab6f97 100644 --- a/spring-boot-logging-log4j2/README.md +++ b/spring-boot-logging-log4j2/README.md @@ -1,3 +1,7 @@ +## Spring Boot Logging with Log4j 2 + +This module contains articles about logging in Spring Boot projects with Log4j 2. + ### Relevant Articles: - [Logging in Spring Boot](http://www.baeldung.com/spring-boot-logging) - [Logging to Graylog with Spring Boot](https://www.baeldung.com/graylog-with-spring-boot) diff --git a/spring-boot-management/README.md b/spring-boot-management/README.md new file mode 100644 index 0000000000..53d4c439ff --- /dev/null +++ b/spring-boot-management/README.md @@ -0,0 +1,7 @@ +## Spring Boot Logging HTTP Requests + +This module contains articles about the management of Spring Boot applications. + +### Relevant Articles: +- [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) + diff --git a/spring-boot-mvc-2/README.md b/spring-boot-mvc-2/README.md index f8e26f218b..0ff0f1f156 100644 --- a/spring-boot-mvc-2/README.md +++ b/spring-boot-mvc-2/README.md @@ -1,3 +1,8 @@ +## Spring Boot MVC + +This module contains articles about Spring Web MVC in Spring Boot projects. + ### Relevant Articles: - [Functional Controllers in Spring MVC](https://www.baeldung.com/spring-mvc-functional-controllers) +- More articles: [[prev -->]](/spring-boot-mvc) diff --git a/spring-boot-mvc-birt/README.md b/spring-boot-mvc-birt/README.md index 9fe3d94e2a..2c3804c745 100644 --- a/spring-boot-mvc-birt/README.md +++ b/spring-boot-mvc-birt/README.md @@ -1,3 +1,7 @@ +## Spring Boot MVC BIRT + +This module contains articles about BIRT Reporting in Spring Boot MVC projects. + ### Relevant Articles - [BIRT Reporting with Spring Boot](https://www.baeldung.com/birt-reports-spring-boot) diff --git a/spring-boot-mvc/README.md b/spring-boot-mvc/README.md index e3e3dbdb74..444d91b0e7 100644 --- a/spring-boot-mvc/README.md +++ b/spring-boot-mvc/README.md @@ -1,3 +1,7 @@ +## Spring Boot MVC + +This module contains articles about Spring Web MVC in Spring Boot projects. + ### Relevant Articles: - [Guide to the Favicon in Spring Boot](http://www.baeldung.com/spring-boot-favicon) @@ -14,3 +18,4 @@ - [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js) - [Using Spring ResponseEntity to Manipulate the HTTP Response](http://www.baeldung.com/spring-response-entity) - [Spring Bean Annotations](http://www.baeldung.com/spring-bean-annotations) +- More articles: [[next -->]](/spring-boot-mvc-2) From 9346659bbfaedc4804335e3864ccd94c512c370e Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Fri, 27 Sep 2019 15:23:20 +0100 Subject: [PATCH 275/396] re-run failing test --- spring-cloud/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud/README.md b/spring-cloud/README.md index 1cc9d9d3cf..2727aec08c 100644 --- a/spring-cloud/README.md +++ b/spring-cloud/README.md @@ -1,3 +1,3 @@ -## Spring Cloud +## Spring Cloud This module contains modules about Spring Cloud \ No newline at end of file From 2a6a8024cd1f2d362b66ae0d2b2198ad2ccf92f0 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 27 Sep 2019 15:26:02 +0100 Subject: [PATCH 276/396] [BAEL-17487] Added readme descriptions (#7796) * [BAEL-17487] Added readme descriptions * Updated descriptions * Updated spring-apache-camel readme * changed 'article' to 'articles' --- spring-5-security-cognito/README.md | 4 +++ spring-activiti/README.md | 4 +++ spring-akka/README.md | 4 +++ spring-all/README.md | 2 -- spring-amqp/README.md | 4 +++ spring-aop/README.md | 4 +++ spring-apache-camel/README.md | 39 +++++++++++------------------ spring-batch/README.md | 3 +-- spring-bom/README.md | 3 +++ spring-boot/README.MD | 4 +++ 10 files changed, 43 insertions(+), 28 deletions(-) diff --git a/spring-5-security-cognito/README.md b/spring-5-security-cognito/README.md index 0825882c05..ff2784f410 100644 --- a/spring-5-security-cognito/README.md +++ b/spring-5-security-cognito/README.md @@ -1,3 +1,7 @@ +## Spring 5 Security Cognito + +This module contains articles about Spring 5 with Amazon Cognito + ## Relevant articles: - [Authenticating with Amazon Cognito Using Spring Security](https://www.baeldung.com/spring-security-oauth-cognito) diff --git a/spring-activiti/README.md b/spring-activiti/README.md index 703dfeec52..75f3ea51e5 100644 --- a/spring-activiti/README.md +++ b/spring-activiti/README.md @@ -1,3 +1,7 @@ +## Spring Activiti + +This module contains articles about Spring with Activiti + ### Relevant articles - [A Guide to Activiti with Java](http://www.baeldung.com/java-activiti) diff --git a/spring-akka/README.md b/spring-akka/README.md index 0f1c013214..035551d459 100644 --- a/spring-akka/README.md +++ b/spring-akka/README.md @@ -1,2 +1,6 @@ +## Spring Akka + +This module contains articles about Spring with Akka + ### Relevant Articles: - [Introduction to Spring with Akka](http://www.baeldung.com/akka-with-spring) diff --git a/spring-all/README.md b/spring-all/README.md index c5825b47fb..8a4e8fa18f 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -1,5 +1,3 @@ -========= - ## Spring General Example Project This project is used to replicate Spring Exceptions only. diff --git a/spring-amqp/README.md b/spring-amqp/README.md index 5e29011995..0ae4eda12e 100644 --- a/spring-amqp/README.md +++ b/spring-amqp/README.md @@ -1,3 +1,7 @@ +## Spring AMQP + +This module contains articles about Spring with the AMQP messaging system + ## Relevant articles: - [Messaging With Spring AMQP](https://www.baeldung.com/spring-amqp) diff --git a/spring-aop/README.md b/spring-aop/README.md index af8ab71da0..915299a073 100644 --- a/spring-aop/README.md +++ b/spring-aop/README.md @@ -1,3 +1,7 @@ +## Spring AOP + +This module contains articles about Spring aspect oriented programming (AOP) + ### Relevant articles - [Implementing a Custom Spring AOP Annotation](http://www.baeldung.com/spring-aop-annotation) diff --git a/spring-apache-camel/README.md b/spring-apache-camel/README.md index e72e18b198..e89eb4fe6c 100644 --- a/spring-apache-camel/README.md +++ b/spring-apache-camel/README.md @@ -1,35 +1,26 @@ +## Spring Apache Camel -

    Configure and Use Apache Camel with Spring

    +This module contains articles about Spring with Apache Camel -This article will demonstrate how to configure and use Apache Camel with Spring Framework. +### Relevant Articles -

    Relevant Articles

    +- [Apache Camel](http://camel.apache.org/) +- [Enterprise Integration Patterns](http://www.enterpriseintegrationpatterns.com/patterns/messaging/toc.html) +- [Introduction To Apache Camel](http://www.baeldung.com/apache-camel-intro) +- [Integration Patterns With Apache Camel](http://www.baeldung.com/camel-integration-patterns) +- [Using Apache Camel with Spring](http://www.baeldung.com/spring-apache-camel-tutorial) - +### Framework Versions: -

    Framework Versions:

    +- Spring 4.2.4 +- Apache Camel 2.16.1 -
      -
    • Spring 4.2.4
    • -
    • Apache Camel 2.16.1
    • -
    +### Build and Run Application -

    Build and Run Application

    +To build this application execute: -To build this application execute following maven command in ApacheCamelFileProcessor directory. - -mvn clean install +`mvn clean install` To run this application you can either run our main class App from your IDE or you can execute following maven command: -mvn exec:java -Dexec.mainClass="App" - -

    Relevant Articles on Baeldung

    - +`mvn exec:java -Dexec.mainClass="com.baeldung.camel.main.App"` \ No newline at end of file diff --git a/spring-batch/README.md b/spring-batch/README.md index ddd830cd47..c100835948 100644 --- a/spring-batch/README.md +++ b/spring-batch/README.md @@ -1,7 +1,6 @@ -========= - ## Spring Batch +This module contains articles about Spring Batch ### Relevant Articles: - [Introduction to Spring Batch](http://www.baeldung.com/introduction-to-spring-batch) diff --git a/spring-bom/README.md b/spring-bom/README.md index d056216a2e..60e7d75340 100644 --- a/spring-bom/README.md +++ b/spring-bom/README.md @@ -1,3 +1,6 @@ +## Spring BOM + +This module contains articles about Spring with Maven BOM (Bill Of Materials) ### Relevant Articles: - [Spring with Maven BOM](http://www.baeldung.com/spring-maven-bom) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 04d76e438e..522a1f7120 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -1,3 +1,7 @@ +## Spring Boot + +This module contains articles about Spring Boot + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring From eb6ced2100c0e9c38b2585e1480d7b4c74920305 Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Fri, 27 Sep 2019 17:36:49 +0300 Subject: [PATCH 277/396] Split or move libraries-apache-commons module (#7873) --- .../README.md | 13 + libraries-apache-commons-collections/pom.xml | 40 ++ .../collections/collectionutils}/Address.java | 2 +- .../collectionutils}/Customer.java | 2 +- .../commons/collections}/BagUnitTest.java | 2 +- .../commons/collections/BidiMapUnitTest.java | 0 .../commons/collections/MapUtilsUnitTest.java | 0 .../commons/collections/SetUtilsUnitTest.java | 0 .../CircularFifoQueueUnitTest.java | 2 +- .../CollectionUtilsGuideUnitTest.java | 6 +- .../orderedmap/OrderedMapUnitTest.java | 422 +++++++++--------- libraries-apache-commons-io/README.md | 7 + libraries-apache-commons-io/pom.xml | 31 ++ .../com/baeldung/commons/io/FileMonitor.java | 0 .../commons/io/CommonsIOUnitTest.java | 0 .../io}/csv/CSVReaderWriterUnitTest.java | 2 +- .../src/test/resources/aaa.txt | 0 .../src/test/resources/book.csv | 0 .../src/test/resources/fileTest.txt | 0 .../src/test/resources/sample.txt | 0 libraries-apache-commons/.gitignore | 9 - libraries-apache-commons/README.md | 25 +- libraries-apache-commons/pom.xml | 25 -- pom.xml | 4 + 24 files changed, 322 insertions(+), 270 deletions(-) create mode 100644 libraries-apache-commons-collections/README.md create mode 100644 libraries-apache-commons-collections/pom.xml rename {libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil => libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils}/Address.java (94%) rename {libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil => libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils}/Customer.java (97%) rename {libraries-apache-commons/src/test/java/com/baeldung/commons/collections4 => libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections}/BagUnitTest.java (98%) rename {libraries-apache-commons => libraries-apache-commons-collections}/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java (100%) rename {libraries-apache-commons => libraries-apache-commons-collections}/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java (100%) rename {libraries-apache-commons => libraries-apache-commons-collections}/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java (100%) rename {libraries-apache-commons/src/test/java/com/baeldung => libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections}/circularfifoqueue/CircularFifoQueueUnitTest.java (98%) rename {libraries-apache-commons/src/test/java/com/baeldung/commons/collections => libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/collectionutils}/CollectionUtilsGuideUnitTest.java (96%) rename {libraries-apache-commons => libraries-apache-commons-collections}/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java (97%) create mode 100644 libraries-apache-commons-io/README.md create mode 100644 libraries-apache-commons-io/pom.xml rename {libraries-apache-commons => libraries-apache-commons-io}/src/main/java/com/baeldung/commons/io/FileMonitor.java (100%) rename {libraries-apache-commons => libraries-apache-commons-io}/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java (100%) rename {libraries-apache-commons/src/test/java/com/baeldung/commons => libraries-apache-commons-io/src/test/java/com/baeldung/commons/io}/csv/CSVReaderWriterUnitTest.java (98%) rename {libraries-apache-commons => libraries-apache-commons-io}/src/test/resources/aaa.txt (100%) rename {libraries-apache-commons => libraries-apache-commons-io}/src/test/resources/book.csv (100%) rename {libraries-apache-commons => libraries-apache-commons-io}/src/test/resources/fileTest.txt (100%) rename {libraries-apache-commons => libraries-apache-commons-io}/src/test/resources/sample.txt (100%) delete mode 100644 libraries-apache-commons/.gitignore diff --git a/libraries-apache-commons-collections/README.md b/libraries-apache-commons-collections/README.md new file mode 100644 index 0000000000..998ad1da09 --- /dev/null +++ b/libraries-apache-commons-collections/README.md @@ -0,0 +1,13 @@ +## Apache Commons Collections + +This module contains articles about Apache Commons Collections + +### Relevant articles + +- [Apache Commons Collections SetUtils](https://www.baeldung.com/apache-commons-setutils) +- [Apache Commons Collections OrderedMap](https://www.baeldung.com/apache-commons-ordered-map) +- [Guide to Apache Commons CircularFifoQueue](https://www.baeldung.com/commons-circular-fifo-queue) +- [Apache Commons Collections Bag](https://www.baeldung.com/apache-commons-bag) +- [A Guide to Apache Commons Collections CollectionUtils](https://www.baeldung.com/apache-commons-collection-utils) +- [Apache Commons Collections BidiMap](https://www.baeldung.com/commons-collections-bidi-map) +- [Apache Commons Collections MapUtils](https://www.baeldung.com/apache-commons-map-utils) \ No newline at end of file diff --git a/libraries-apache-commons-collections/pom.xml b/libraries-apache-commons-collections/pom.xml new file mode 100644 index 0000000000..eba0ad331e --- /dev/null +++ b/libraries-apache-commons-collections/pom.xml @@ -0,0 +1,40 @@ + + + 4.0.0 + libraries-apache-commons-collections + libraries-apache-commons-collections + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + org.apache.commons + commons-collections4 + ${commons.collections.version} + + + org.hamcrest + java-hamcrest + ${org.hamcrest.java-hamcrest.version} + test + + + org.assertj + assertj-core + ${assertj.version} + test + + + + + 4.1 + 3.6.2 + 2.0.0.0 + + + diff --git a/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java b/libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Address.java similarity index 94% rename from libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java rename to libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Address.java index a1e231ec85..02c36a46f9 100644 --- a/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java +++ b/libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Address.java @@ -1,4 +1,4 @@ -package com.baeldung.commons.collectionutil; +package com.baeldung.commons.collections.collectionutils; public class Address { diff --git a/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java b/libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Customer.java similarity index 97% rename from libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java rename to libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Customer.java index 1c6a8dc4f1..7d6db68474 100644 --- a/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java +++ b/libraries-apache-commons-collections/src/main/java/com/baeldung/commons/collections/collectionutils/Customer.java @@ -1,4 +1,4 @@ -package com.baeldung.commons.collectionutil; +package com.baeldung.commons.collections.collectionutils; public class Customer implements Comparable { diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BagUnitTest.java similarity index 98% rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BagUnitTest.java index ebad4093f0..0877e6d4ac 100644 --- a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java +++ b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BagUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.commons.collections4; +package com.baeldung.commons.collections; import org.apache.commons.collections4.Bag; import org.apache.commons.collections4.SortedBag; diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java similarity index 100% rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java similarity index 100% rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java similarity index 100% rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java diff --git a/libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/circularfifoqueue/CircularFifoQueueUnitTest.java similarity index 98% rename from libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/circularfifoqueue/CircularFifoQueueUnitTest.java index 39384a7442..5664c7b44e 100644 --- a/libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java +++ b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/circularfifoqueue/CircularFifoQueueUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.circularfifoqueue; +package com.baeldung.commons.collections.circularfifoqueue; import java.util.ArrayList; import java.util.List; diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/collectionutils/CollectionUtilsGuideUnitTest.java similarity index 96% rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/collectionutils/CollectionUtilsGuideUnitTest.java index 448c5b0729..e9a4612280 100644 --- a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java +++ b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/collectionutils/CollectionUtilsGuideUnitTest.java @@ -1,7 +1,7 @@ -package com.baeldung.commons.collections; +package com.baeldung.commons.collections.collectionutils; -import com.baeldung.commons.collectionutil.Address; -import com.baeldung.commons.collectionutil.Customer; +import com.baeldung.commons.collections.collectionutils.Address; +import com.baeldung.commons.collections.collectionutils.Customer; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.Predicate; import org.apache.commons.collections4.Transformer; diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java similarity index 97% rename from libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java rename to libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java index c64143cba7..1ffc4a825f 100644 --- a/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java +++ b/libraries-apache-commons-collections/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java @@ -1,211 +1,211 @@ -package com.baeldung.commons.collections.orderedmap; - -import org.apache.commons.collections4.OrderedMap; -import org.apache.commons.collections4.OrderedMapIterator; -import org.apache.commons.collections4.map.LinkedMap; -import org.apache.commons.collections4.map.ListOrderedMap; -import org.junit.Before; -import org.junit.Test; - -import java.util.ArrayList; -import java.util.List; - -import static org.junit.Assert.assertEquals; - -public class OrderedMapUnitTest { - - private String[] names = { "Emily", "Mathew", "Rose", "John", "Anna" }; - private Integer[] ages = { 37, 28, 40, 36, 21 }; - - private int RUNNERS_COUNT = names.length; - - private OrderedMap runnersLinkedMap; - private OrderedMap runnersListOrderedMap; - - @Before - public void createRunners() { - // First implementation: ListOrderedMap - this.runnersListOrderedMap = new ListOrderedMap<>(); - this.loadOrderedMapOfRunners(this.runnersListOrderedMap); - - // Second implementation: LinkedMap - this.runnersLinkedMap = new LinkedMap<>(); - this.loadOrderedMapOfRunners(this.runnersLinkedMap); - } - - private void loadOrderedMapOfRunners(OrderedMap runners) { - for (int i = 0; i < RUNNERS_COUNT; i++) { - runners.put(this.names[i], this.ages[i]); - } - } - - @Test - public void givenALinkedMap_whenIteratedWithMapIterator_thenPreservesOrder() { - // Tests that the order in map iterator is the same - // as defined in the constant arrays of names and ages: - - OrderedMapIterator runnersIterator = this.runnersLinkedMap.mapIterator(); - int i = 0; - while (runnersIterator.hasNext()) { - runnersIterator.next(); - assertEquals(runnersIterator.getKey(), this.names[i]); - assertEquals(runnersIterator.getValue(), this.ages[i]); - i++; - } - } - - @Test - public void givenAListOrderedMap_whenIteratedWithMapIterator_thenPreservesOrder() { - // Tests that the order in map iterator is the same - // as defined in the constant arrays of names and ages: - - OrderedMapIterator runnersIterator = this.runnersListOrderedMap.mapIterator(); - int i = 0; - while (runnersIterator.hasNext()) { - runnersIterator.next(); - assertEquals(runnersIterator.getKey(), this.names[i]); - assertEquals(runnersIterator.getValue(), this.ages[i]); - i++; - } - } - - @Test - public void givenALinkedMap_whenIteratedForwards_thenPreservesOrder() { - // Tests that the order in the forward iteration is the same - // as defined in the constant arrays of names and ages - - String name = this.runnersLinkedMap.firstKey(); - int i = 0; - while (name != null) { - assertEquals(name, this.names[i]); - name = this.runnersLinkedMap.nextKey(name); - i++; - } - } - - @Test - public void givenAListOrderedMap_whenIteratedForwards_thenPreservesOrder() { - // Tests that the order in the forward iteration is the same - // as defined in the constant arrays of names and ages - - String name = this.runnersListOrderedMap.firstKey(); - int i = 0; - while (name != null) { - assertEquals(name, this.names[i]); - name = this.runnersListOrderedMap.nextKey(name); - i++; - } - } - - @Test - public void givenALinkedMap_whenIteratedBackwards_thenPreservesOrder() { - // Tests that the order in the backwards iteration is the same - // as defined in the constant arrays of names and ages - - String name = this.runnersLinkedMap.lastKey(); - int i = RUNNERS_COUNT - 1; - while (name != null) { - assertEquals(name, this.names[i]); - name = this.runnersLinkedMap.previousKey(name); - i--; - } - } - - @Test - public void givenAListOrderedMap_whenIteratedBackwards_thenPreservesOrder() { - // Tests that the order in the backwards iteration is the same - // as defined in the constant arrays of names and ages - - String name = this.runnersListOrderedMap.lastKey(); - int i = RUNNERS_COUNT - 1; - while (name != null) { - assertEquals(name, this.names[i]); - name = this.runnersListOrderedMap.previousKey(name); - i--; - } - } - - @Test - public void givenALinkedMap_whenObjectIsSearched_thenMatchesConstantArray() { - assertEquals(ages[4], this.runnersLinkedMap.get("Anna")); - } - - @Test - public void givenALinkedMap_whenConvertedToList_thenMatchesKeySet() { - // Casting the OrderedMap to a LinkedMap we can use asList() method - - LinkedMap lmap = (LinkedMap) this.runnersLinkedMap; - List listKeys = new ArrayList<>(); - listKeys.addAll(this.runnersLinkedMap.keySet()); - List linkedMap = lmap.asList(); - assertEquals(listKeys, linkedMap); - } - - @Test - public void givenALinkedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() { - LinkedMap lmap = (LinkedMap) this.runnersLinkedMap; - - for (int i = 0; i < RUNNERS_COUNT; i++) { - // accessed by index: - String name = lmap.get(i); - assertEquals(name, this.names[i]); - - // index of key concides with position in array - assertEquals(lmap.indexOf(this.names[i]), i); - } - } - - @Test - public void givenALinkedMap_whenElementRemoved_thenSizeDecrease() { - LinkedMap lmap = (LinkedMap) this.runnersLinkedMap; - Integer johnAge = lmap.remove("John");// by object - assertEquals(johnAge, new Integer(36)); - assertEquals(lmap.size(), RUNNERS_COUNT - 1); - - Integer emilyAge = lmap.remove(0);// by index - assertEquals(emilyAge, new Integer(37)); - assertEquals(lmap.size(), RUNNERS_COUNT - 2); - } - - @Test - public void givenAListOrderedMap_whenObjectIsSearched_thenMatchesConstantArray() { - assertEquals(ages[4], this.runnersListOrderedMap.get("Anna")); - } - - @Test - public void givenAListOrderedMap_whenConvertedToList_thenMatchesKeySet() { - ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap; - List listKeys = new ArrayList<>(); - listKeys.addAll(this.runnersListOrderedMap.keySet()); - List lomapList = lomap.asList(); - assertEquals(listKeys, lomapList); - } - - @Test - public void givenAListOrderedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() { - ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap; - - for (int i = 0; i < RUNNERS_COUNT; i++) { - // accessed by index: - String name = lomap.get(i); - assertEquals(name, this.names[i]); - - // index of key concides with position in array - assertEquals(lomap.indexOf(this.names[i]), i); - } - } - - @Test - public void givenAListOrderedMap_whenElementRemoved_thenSizeDecrease() { - ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap; - - Integer johnAge = lomap.remove("John");// by object - - assertEquals(johnAge, new Integer(36)); - assertEquals(lomap.size(), RUNNERS_COUNT - 1); - - Integer emilyAge = lomap.remove(0);// by index - assertEquals(emilyAge, new Integer(37)); - assertEquals(lomap.size(), RUNNERS_COUNT - 2); - } -} +package com.baeldung.commons.collections.orderedmap; + +import org.apache.commons.collections4.OrderedMap; +import org.apache.commons.collections4.OrderedMapIterator; +import org.apache.commons.collections4.map.LinkedMap; +import org.apache.commons.collections4.map.ListOrderedMap; +import org.junit.Before; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + +public class OrderedMapUnitTest { + + private String[] names = { "Emily", "Mathew", "Rose", "John", "Anna" }; + private Integer[] ages = { 37, 28, 40, 36, 21 }; + + private int RUNNERS_COUNT = names.length; + + private OrderedMap runnersLinkedMap; + private OrderedMap runnersListOrderedMap; + + @Before + public void createRunners() { + // First implementation: ListOrderedMap + this.runnersListOrderedMap = new ListOrderedMap<>(); + this.loadOrderedMapOfRunners(this.runnersListOrderedMap); + + // Second implementation: LinkedMap + this.runnersLinkedMap = new LinkedMap<>(); + this.loadOrderedMapOfRunners(this.runnersLinkedMap); + } + + private void loadOrderedMapOfRunners(OrderedMap runners) { + for (int i = 0; i < RUNNERS_COUNT; i++) { + runners.put(this.names[i], this.ages[i]); + } + } + + @Test + public void givenALinkedMap_whenIteratedWithMapIterator_thenPreservesOrder() { + // Tests that the order in map iterator is the same + // as defined in the constant arrays of names and ages: + + OrderedMapIterator runnersIterator = this.runnersLinkedMap.mapIterator(); + int i = 0; + while (runnersIterator.hasNext()) { + runnersIterator.next(); + assertEquals(runnersIterator.getKey(), this.names[i]); + assertEquals(runnersIterator.getValue(), this.ages[i]); + i++; + } + } + + @Test + public void givenAListOrderedMap_whenIteratedWithMapIterator_thenPreservesOrder() { + // Tests that the order in map iterator is the same + // as defined in the constant arrays of names and ages: + + OrderedMapIterator runnersIterator = this.runnersListOrderedMap.mapIterator(); + int i = 0; + while (runnersIterator.hasNext()) { + runnersIterator.next(); + assertEquals(runnersIterator.getKey(), this.names[i]); + assertEquals(runnersIterator.getValue(), this.ages[i]); + i++; + } + } + + @Test + public void givenALinkedMap_whenIteratedForwards_thenPreservesOrder() { + // Tests that the order in the forward iteration is the same + // as defined in the constant arrays of names and ages + + String name = this.runnersLinkedMap.firstKey(); + int i = 0; + while (name != null) { + assertEquals(name, this.names[i]); + name = this.runnersLinkedMap.nextKey(name); + i++; + } + } + + @Test + public void givenAListOrderedMap_whenIteratedForwards_thenPreservesOrder() { + // Tests that the order in the forward iteration is the same + // as defined in the constant arrays of names and ages + + String name = this.runnersListOrderedMap.firstKey(); + int i = 0; + while (name != null) { + assertEquals(name, this.names[i]); + name = this.runnersListOrderedMap.nextKey(name); + i++; + } + } + + @Test + public void givenALinkedMap_whenIteratedBackwards_thenPreservesOrder() { + // Tests that the order in the backwards iteration is the same + // as defined in the constant arrays of names and ages + + String name = this.runnersLinkedMap.lastKey(); + int i = RUNNERS_COUNT - 1; + while (name != null) { + assertEquals(name, this.names[i]); + name = this.runnersLinkedMap.previousKey(name); + i--; + } + } + + @Test + public void givenAListOrderedMap_whenIteratedBackwards_thenPreservesOrder() { + // Tests that the order in the backwards iteration is the same + // as defined in the constant arrays of names and ages + + String name = this.runnersListOrderedMap.lastKey(); + int i = RUNNERS_COUNT - 1; + while (name != null) { + assertEquals(name, this.names[i]); + name = this.runnersListOrderedMap.previousKey(name); + i--; + } + } + + @Test + public void givenALinkedMap_whenObjectIsSearched_thenMatchesConstantArray() { + assertEquals(ages[4], this.runnersLinkedMap.get("Anna")); + } + + @Test + public void givenALinkedMap_whenConvertedToList_thenMatchesKeySet() { + // Casting the OrderedMap to a LinkedMap we can use asList() method + + LinkedMap lmap = (LinkedMap) this.runnersLinkedMap; + List listKeys = new ArrayList<>(); + listKeys.addAll(this.runnersLinkedMap.keySet()); + List linkedMap = lmap.asList(); + assertEquals(listKeys, linkedMap); + } + + @Test + public void givenALinkedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() { + LinkedMap lmap = (LinkedMap) this.runnersLinkedMap; + + for (int i = 0; i < RUNNERS_COUNT; i++) { + // accessed by index: + String name = lmap.get(i); + assertEquals(name, this.names[i]); + + // index of key concides with position in array + assertEquals(lmap.indexOf(this.names[i]), i); + } + } + + @Test + public void givenALinkedMap_whenElementRemoved_thenSizeDecrease() { + LinkedMap lmap = (LinkedMap) this.runnersLinkedMap; + Integer johnAge = lmap.remove("John");// by object + assertEquals(johnAge, new Integer(36)); + assertEquals(lmap.size(), RUNNERS_COUNT - 1); + + Integer emilyAge = lmap.remove(0);// by index + assertEquals(emilyAge, new Integer(37)); + assertEquals(lmap.size(), RUNNERS_COUNT - 2); + } + + @Test + public void givenAListOrderedMap_whenObjectIsSearched_thenMatchesConstantArray() { + assertEquals(ages[4], this.runnersListOrderedMap.get("Anna")); + } + + @Test + public void givenAListOrderedMap_whenConvertedToList_thenMatchesKeySet() { + ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap; + List listKeys = new ArrayList<>(); + listKeys.addAll(this.runnersListOrderedMap.keySet()); + List lomapList = lomap.asList(); + assertEquals(listKeys, lomapList); + } + + @Test + public void givenAListOrderedMap_whenSearchByIndexIsUsed_thenMatchesConstantArray() { + ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap; + + for (int i = 0; i < RUNNERS_COUNT; i++) { + // accessed by index: + String name = lomap.get(i); + assertEquals(name, this.names[i]); + + // index of key concides with position in array + assertEquals(lomap.indexOf(this.names[i]), i); + } + } + + @Test + public void givenAListOrderedMap_whenElementRemoved_thenSizeDecrease() { + ListOrderedMap lomap = (ListOrderedMap) this.runnersListOrderedMap; + + Integer johnAge = lomap.remove("John");// by object + + assertEquals(johnAge, new Integer(36)); + assertEquals(lomap.size(), RUNNERS_COUNT - 1); + + Integer emilyAge = lomap.remove(0);// by index + assertEquals(emilyAge, new Integer(37)); + assertEquals(lomap.size(), RUNNERS_COUNT - 2); + } +} diff --git a/libraries-apache-commons-io/README.md b/libraries-apache-commons-io/README.md new file mode 100644 index 0000000000..d5f29499d2 --- /dev/null +++ b/libraries-apache-commons-io/README.md @@ -0,0 +1,7 @@ +## Apache Commons Collections + +This module contains articles about Apache Commons IO + +### Relevant articles +- [Apache Commons IO](https://www.baeldung.com/apache-commons-io) +- [Introduction to Apache Commons CSV](https://www.baeldung.com/apache-commons-csv) diff --git a/libraries-apache-commons-io/pom.xml b/libraries-apache-commons-io/pom.xml new file mode 100644 index 0000000000..7ec71d8264 --- /dev/null +++ b/libraries-apache-commons-io/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + libraries-apache-commons-io + libraries-apache-commons-io + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + org.apache.commons + commons-csv + ${commons-csv.version} + + + commons-io + commons-io + ${commons-io.version} + + + + + 1.4 + + + diff --git a/libraries-apache-commons/src/main/java/com/baeldung/commons/io/FileMonitor.java b/libraries-apache-commons-io/src/main/java/com/baeldung/commons/io/FileMonitor.java similarity index 100% rename from libraries-apache-commons/src/main/java/com/baeldung/commons/io/FileMonitor.java rename to libraries-apache-commons-io/src/main/java/com/baeldung/commons/io/FileMonitor.java diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java b/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java similarity index 100% rename from libraries-apache-commons/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java rename to libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java diff --git a/libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java b/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java similarity index 98% rename from libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java rename to libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java index f93e59ed75..b99f4e8bc3 100644 --- a/libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java +++ b/libraries-apache-commons-io/src/test/java/com/baeldung/commons/io/csv/CSVReaderWriterUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.commons.csv; +package com.baeldung.commons.io.csv; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVPrinter; diff --git a/libraries-apache-commons/src/test/resources/aaa.txt b/libraries-apache-commons-io/src/test/resources/aaa.txt similarity index 100% rename from libraries-apache-commons/src/test/resources/aaa.txt rename to libraries-apache-commons-io/src/test/resources/aaa.txt diff --git a/libraries-apache-commons/src/test/resources/book.csv b/libraries-apache-commons-io/src/test/resources/book.csv similarity index 100% rename from libraries-apache-commons/src/test/resources/book.csv rename to libraries-apache-commons-io/src/test/resources/book.csv diff --git a/libraries-apache-commons/src/test/resources/fileTest.txt b/libraries-apache-commons-io/src/test/resources/fileTest.txt similarity index 100% rename from libraries-apache-commons/src/test/resources/fileTest.txt rename to libraries-apache-commons-io/src/test/resources/fileTest.txt diff --git a/libraries-apache-commons/src/test/resources/sample.txt b/libraries-apache-commons-io/src/test/resources/sample.txt similarity index 100% rename from libraries-apache-commons/src/test/resources/sample.txt rename to libraries-apache-commons-io/src/test/resources/sample.txt diff --git a/libraries-apache-commons/.gitignore b/libraries-apache-commons/.gitignore deleted file mode 100644 index e594daf27a..0000000000 --- a/libraries-apache-commons/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -*.class - -# Folders # -/gensrc -/target - -# Packaged files # -*.jar -/bin/ diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md index 01f2379588..ae424cb6c5 100644 --- a/libraries-apache-commons/README.md +++ b/libraries-apache-commons/README.md @@ -1,20 +1,11 @@ ### Relevant articles -- [Array Processing with Apache Commons Lang 3](http://www.baeldung.com/array-processing-commons-lang) -- [String Processing with Apache Commons Lang 3](http://www.baeldung.com/string-processing-commons-lang) -- [Introduction to Apache Commons Math](http://www.baeldung.com/apache-commons-math) -- [Apache Commons Collections SetUtils](http://www.baeldung.com/apache-commons-setutils) -- [Apache Commons Collections OrderedMap](http://www.baeldung.com/apache-commons-ordered-map) -- [Introduction to Apache Commons Text](http://www.baeldung.com/java-apache-commons-text) -- [A Guide to Apache Commons DbUtils](http://www.baeldung.com/apache-commons-dbutils) -- [Guide to Apache Commons CircularFifoQueue](http://www.baeldung.com/commons-circular-fifo-queue) -- [Apache Commons Chain](http://www.baeldung.com/apache-commons-chain) -- [Introduction to Apache Commons CSV](http://www.baeldung.com/apache-commons-csv) -- [Apache Commons IO](http://www.baeldung.com/apache-commons-io) -- [Apache Commons Collections Bag](http://www.baeldung.com/apache-commons-bag) -- [A Guide to Apache Commons Collections CollectionUtils](http://www.baeldung.com/apache-commons-collection-utils) -- [Apache Commons BeanUtils](http://www.baeldung.com/apache-commons-beanutils) -- [Apache Commons Collections BidiMap](http://www.baeldung.com/commons-collections-bidi-map) -- [Apache Commons Collections MapUtils](http://www.baeldung.com/apache-commons-map-utils) -- [Histograms with Apache Commons Frequency](http://www.baeldung.com/apache-commons-frequency) +- [Array Processing with Apache Commons Lang 3](https://www.baeldung.com/array-processing-commons-lang) +- [String Processing with Apache Commons Lang 3](https://www.baeldung.com/string-processing-commons-lang) +- [Introduction to Apache Commons Math](https://www.baeldung.com/apache-commons-math) +- [Introduction to Apache Commons Text](https://www.baeldung.com/java-apache-commons-text) +- [A Guide to Apache Commons DbUtils](https://www.baeldung.com/apache-commons-dbutils) +- [Apache Commons Chain](https://www.baeldung.com/apache-commons-chain) +- [Apache Commons BeanUtils](https://www.baeldung.com/apache-commons-beanutils) +- [Histograms with Apache Commons Frequency](https://www.baeldung.com/apache-commons-frequency) - [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) \ No newline at end of file diff --git a/libraries-apache-commons/pom.xml b/libraries-apache-commons/pom.xml index 05d11d83fe..f83a8c7304 100644 --- a/libraries-apache-commons/pom.xml +++ b/libraries-apache-commons/pom.xml @@ -32,21 +32,11 @@ commons-text ${commons-text.version} - - commons-io - commons-io - ${commons-io.version} - commons-chain commons-chain ${commons-chain.version} - - org.apache.commons - commons-csv - ${commons-csv.version} - commons-dbutils commons-dbutils @@ -72,18 +62,6 @@ xchart ${xchart-version} - - org.apache.commons - commons-collections4 - ${commons.collections.version} - - - org.hamcrest - java-hamcrest - ${org.hamcrest.java-hamcrest.version} - test - - @@ -91,11 +69,8 @@ 1.1 1.9.3 1.2 - 1.4 3.6.2 1.6 - 4.1 - 2.0.0.0 1.10.L001 3.5.2 3.6 diff --git a/pom.xml b/pom.xml index 89786496c7..3c335f82bd 100644 --- a/pom.xml +++ b/pom.xml @@ -530,6 +530,8 @@ libraries-data libraries-data-2 libraries-apache-commons + libraries-apache-commons-collections + libraries-apache-commons-io libraries-primitive libraries-testing libraries-security @@ -1266,6 +1268,8 @@ libraries-data libraries-data-2 libraries-apache-commons + libraries-apache-commons-collections + libraries-apache-commons-io libraries-testing libraries-security libraries-server From ceba5408ec81de8c1e8ae03676dcfafe36ad27c9 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 27 Sep 2019 20:16:06 +0530 Subject: [PATCH 278/396] BAEL-17945 Fix the integrations tests in libraries (#7880) -Fixing serenity tests failing due to mismatching libraries --- libraries-testing/pom.xml | 12 +++++++++--- .../src/test/java/com/baeldung/hamcrest/Animal.java | 2 +- .../src/test/java/com/baeldung/hamcrest/Cat.java | 2 +- .../baeldung/hamcrest/HamcrestMatcherUnitTest.java | 4 ++-- .../com/baeldung/hamcrest/IsPositiveInteger.java | 2 +- .../src/test/java/com/baeldung/hamcrest/Person.java | 2 +- 6 files changed, 15 insertions(+), 9 deletions(-) diff --git a/libraries-testing/pom.xml b/libraries-testing/pom.xml index 7cc5a8f775..a2fbed31b2 100644 --- a/libraries-testing/pom.xml +++ b/libraries-testing/pom.xml @@ -43,6 +43,12 @@ serenity-rest-assured ${serenity.version} test + + + io.rest-assured + rest-assured + + net.serenity-bdd @@ -162,15 +168,15 @@ - 1.9.26 - 1.41.0 + 1.9.9 + 1.9.0 1.9.0 1.9.27 1.5.0 3.0.0 0.8.1 4.3.8.RELEASE - 3.0.3 + 4.1.1 3.6.2 2.0.0.0 diff --git a/libraries-testing/src/test/java/com/baeldung/hamcrest/Animal.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/Animal.java index 1a0266f5a3..1d37eef59b 100644 --- a/libraries-testing/src/test/java/com/baeldung/hamcrest/Animal.java +++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/Animal.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; public class Animal { String name; diff --git a/libraries-testing/src/test/java/com/baeldung/hamcrest/Cat.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/Cat.java index 892e5b6e30..b15a3628da 100644 --- a/libraries-testing/src/test/java/com/baeldung/hamcrest/Cat.java +++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/Cat.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; public class Cat extends Animal { diff --git a/libraries-testing/src/test/java/com/baeldung/hamcrest/HamcrestMatcherUnitTest.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/HamcrestMatcherUnitTest.java index cf9fde7114..f5887ba79b 100644 --- a/libraries-testing/src/test/java/com/baeldung/hamcrest/HamcrestMatcherUnitTest.java +++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/HamcrestMatcherUnitTest.java @@ -1,10 +1,10 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; import org.junit.Test; import java.util.*; -import static org.baeldung.hamcrest.IsPositiveInteger.isAPositiveInteger; +import static com.baeldung.hamcrest.IsPositiveInteger.isAPositiveInteger; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; import static org.hamcrest.beans.HasProperty.hasProperty; diff --git a/libraries-testing/src/test/java/com/baeldung/hamcrest/IsPositiveInteger.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/IsPositiveInteger.java index 0d8d262538..4d2ef8a8e5 100644 --- a/libraries-testing/src/test/java/com/baeldung/hamcrest/IsPositiveInteger.java +++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/IsPositiveInteger.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; import org.hamcrest.Description; import org.hamcrest.Factory; diff --git a/libraries-testing/src/test/java/com/baeldung/hamcrest/Person.java b/libraries-testing/src/test/java/com/baeldung/hamcrest/Person.java index 0053c98043..417daa866e 100644 --- a/libraries-testing/src/test/java/com/baeldung/hamcrest/Person.java +++ b/libraries-testing/src/test/java/com/baeldung/hamcrest/Person.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; public class Person { String name; From 8f06ddfa33a1511dad1265d4087d7ad18a5f76d2 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 27 Sep 2019 16:39:57 +0100 Subject: [PATCH 279/396] [BAEL-17651] - spring-boot-angular & spring-boot-angular-ecommerce merge (#7866) * [BAEL-17651] - angular merge * Added article link the readme * added colon * removed spring-boot-angular-ecommerce from parent pom --- pom.xml | 2 - spring-boot-angular-ecommerce/README.md | 6 -- spring-boot-angular-ecommerce/pom.xml | 81 ------------------ spring-boot-angular/README.md | 5 +- spring-boot-angular/pom.xml | 3 +- .../ecommerce/EcommerceApplication.java | 0 .../ecommerce/controller/OrderController.java | 0 .../controller/ProductController.java | 0 .../ecommerce/dto/OrderProductDto.java | 0 .../exception/ApiExceptionHandler.java | 0 .../exception/ResourceNotFoundException.java | 0 .../com/baeldung/ecommerce/model/Order.java | 0 .../ecommerce/model/OrderProduct.java | 0 .../ecommerce/model/OrderProductPK.java | 0 .../baeldung/ecommerce/model/OrderStatus.java | 0 .../com/baeldung/ecommerce/model/Product.java | 0 .../repository/OrderProductRepository.java | 0 .../ecommerce/repository/OrderRepository.java | 0 .../repository/ProductRepository.java | 0 .../service/OrderProductService.java | 0 .../service/OrderProductServiceImpl.java | 0 .../ecommerce/service/OrderService.java | 0 .../ecommerce/service/OrderServiceImpl.java | 0 .../ecommerce/service/ProductService.java | 0 .../ecommerce/service/ProductServiceImpl.java | 0 .../main/js/application}/.angular-cli.json | 0 .../main/js/application}/.editorconfig | 0 .../main/js/application}/.gitignore | 4 +- .../main/js/application}/README.md | 0 .../main/js/application}/e2e/app.e2e-spec.ts | 0 .../src/main/js/application/e2e}/app.po.ts | 0 .../js/application}/e2e/tsconfig.e2e.json | 0 .../main/js/application}/karma.conf.js | 0 .../main/js/application}/package-lock.json | 0 .../main/js/application}/package.json | 0 .../main/js/application}/protractor.conf.js | 0 .../src/app/app-routing.module.ts | 0 .../js/application}/src/app/app.component.css | 0 .../application}/src/app/app.component.html | 0 .../src/app/app.component.spec.ts | 0 .../js/application}/src/app/app.component.ts | 0 .../js/application}/src/app/app.module.ts | 0 .../js/application}/src/app/model/user.ts | 0 .../src/app/service/user.service.spec.ts | 0 .../src/app/service/user.service.ts | 0 .../src/app/user-form/user-form.component.css | 0 .../app/user-form/user-form.component.html | 0 .../app/user-form/user-form.component.spec.ts | 0 .../src/app/user-form/user-form.component.ts | 0 .../src/app/user-list/user-list.component.css | 0 .../app/user-list/user-list.component.html | 0 .../app/user-list/user-list.component.spec.ts | 0 .../src/app/user-list/user-list.component.ts | 0 .../main/js/application}/src/assets/.gitkeep | 0 .../src/environments/environment.prod.ts | 0 .../src/environments/environment.ts | 0 .../src/main/js/application}/src/favicon.ico | Bin .../main/js/application}/src/index.html | 0 .../src/main/js/application}/src/main.ts | 0 .../main/js/application}/src/polyfills.ts | 0 .../src/main/js/application}/src/styles.css | 0 .../js/application}/src/tsconfig.app.json | 0 .../js/application}/src/tsconfig.spec.json | 0 .../main/js/application}/src/typings.d.ts | 0 .../main/js/application}/tsconfig.json | 0 .../main/js/application}/tslint.json | 0 .../src/main/js/ecommerce}/.editorconfig | 0 .../src/main/js/ecommerce}/README.md | 0 .../src/main/js/ecommerce}/angular.json | 0 .../main/js/ecommerce}/e2e/protractor.conf.js | 0 .../js/ecommerce}/e2e/src/app.e2e-spec.ts | 0 .../main/js/ecommerce/e2e/src}/app.po.ts | 0 .../main/js/ecommerce}/e2e/tsconfig.e2e.json | 0 .../src/main/js/ecommerce}/package-lock.json | 0 .../src/main/js/ecommerce}/package.json | 0 .../src/main/js/ecommerce}/proxy-conf.json | 0 .../js/ecommerce}/src/app/app.component.css | 0 .../js/ecommerce}/src/app/app.component.html | 0 .../ecommerce}/src/app/app.component.spec.ts | 0 .../js/ecommerce}/src/app/app.component.ts | 0 .../main/js/ecommerce}/src/app/app.module.ts | 0 .../src/app/ecommerce/ecommerce.component.css | 0 .../app/ecommerce/ecommerce.component.html | 0 .../app/ecommerce/ecommerce.component.spec.ts | 0 .../src/app/ecommerce/ecommerce.component.ts | 0 .../ecommerce/models/product-order.model.ts | 0 .../ecommerce/models/product-orders.model.ts | 0 .../src/app/ecommerce/models/product.model.ts | 0 .../app/ecommerce/orders/orders.component.css | 0 .../ecommerce/orders/orders.component.html | 0 .../ecommerce/orders/orders.component.spec.ts | 0 .../app/ecommerce/orders/orders.component.ts | 0 .../ecommerce/products/products.component.css | 0 .../products/products.component.html | 0 .../products/products.component.spec.ts | 0 .../ecommerce/products/products.component.ts | 0 .../ecommerce/services/EcommerceService.ts | 0 .../shopping-cart/shopping-cart.component.css | 0 .../shopping-cart.component.html | 0 .../shopping-cart.component.spec.ts | 0 .../shopping-cart/shopping-cart.component.ts | 0 .../main/js/ecommerce}/src/assets/.gitkeep | 0 .../src/main/js/ecommerce}/src/browserslist | 0 .../src/environments/environment.prod.ts | 0 .../src/environments/environment.ts | 0 .../main/js/ecommerce}/src/favicon.ico | Bin .../src/main/js/ecommerce}/src/index.html | 0 .../src/main/js/ecommerce}/src/karma.conf.js | 0 .../main/js/ecommerce}/src/main.ts | 0 .../src/main/js/ecommerce}/src/polyfills.ts | 0 .../main/js/ecommerce}/src/styles.css | 0 .../src/main/js/ecommerce}/src/test.ts | 0 .../main/js/ecommerce}/src/tsconfig.app.json | 0 .../main/js/ecommerce}/src/tsconfig.spec.json | 0 .../src/main/js/ecommerce}/src/tslint.json | 0 .../src/main/js/ecommerce}/tsconfig.json | 0 .../src/main/js/ecommerce}/tslint.json | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/logback.xml | 0 .../EcommerceApplicationIntegrationTest.java | 0 .../SpringContextIntegrationTest.java | 0 .../java/org/baeldung/SpringContextTest.java | 0 122 files changed, 7 insertions(+), 94 deletions(-) delete mode 100644 spring-boot-angular-ecommerce/README.md delete mode 100644 spring-boot-angular-ecommerce/pom.xml rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/controller/OrderController.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/controller/ProductController.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/model/Order.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/model/Product.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/service/OrderService.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/service/ProductService.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/.angular-cli.json (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/.editorconfig (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/.gitignore (82%) rename spring-boot-angular/{angularclient => src/main/js/application}/README.md (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/e2e/app.e2e-spec.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend/e2e/src => spring-boot-angular/src/main/js/application/e2e}/app.po.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/e2e/tsconfig.e2e.json (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/karma.conf.js (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/package-lock.json (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/package.json (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/protractor.conf.js (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/app-routing.module.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/app.component.css (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/app.component.html (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/app.component.spec.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/app.component.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/app.module.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/model/user.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/service/user.service.spec.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/service/user.service.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/user-form/user-form.component.css (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/user-form/user-form.component.html (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/user-form/user-form.component.spec.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/user-form/user-form.component.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/user-list/user-list.component.css (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/user-list/user-list.component.html (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/user-list/user-list.component.spec.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/app/user-list/user-list.component.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/application}/src/assets/.gitkeep (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/application}/src/environments/environment.prod.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/environments/environment.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/application}/src/favicon.ico (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/index.html (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/application}/src/main.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/polyfills.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/application}/src/styles.css (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/tsconfig.app.json (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/tsconfig.spec.json (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/src/typings.d.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/tsconfig.json (100%) rename spring-boot-angular/{angularclient => src/main/js/application}/tslint.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/.editorconfig (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/README.md (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/angular.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/e2e/protractor.conf.js (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/e2e/src/app.e2e-spec.ts (100%) rename spring-boot-angular/{angularclient/e2e => src/main/js/ecommerce/e2e/src}/app.po.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/e2e/tsconfig.e2e.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/package-lock.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/package.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/proxy-conf.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/app.component.css (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/app.component.html (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/app.component.spec.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/app.component.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/app.module.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/ecommerce.component.css (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/ecommerce.component.html (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/ecommerce.component.spec.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/ecommerce.component.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/models/product-order.model.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/models/product-orders.model.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/models/product.model.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/orders/orders.component.css (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/orders/orders.component.html (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/orders/orders.component.spec.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/orders/orders.component.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/products/products.component.css (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/products/products.component.html (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/products/products.component.spec.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/products/products.component.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/services/EcommerceService.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/shopping-cart/shopping-cart.component.css (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/shopping-cart/shopping-cart.component.html (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/shopping-cart/shopping-cart.component.spec.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/app/ecommerce/shopping-cart/shopping-cart.component.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/ecommerce}/src/assets/.gitkeep (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/browserslist (100%) rename spring-boot-angular/{angularclient => src/main/js/ecommerce}/src/environments/environment.prod.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/environments/environment.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/ecommerce}/src/favicon.ico (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/index.html (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/karma.conf.js (100%) rename spring-boot-angular/{angularclient => src/main/js/ecommerce}/src/main.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/polyfills.ts (100%) rename spring-boot-angular/{angularclient => src/main/js/ecommerce}/src/styles.css (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/test.ts (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/tsconfig.app.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/tsconfig.spec.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/src/tslint.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/tsconfig.json (100%) rename {spring-boot-angular-ecommerce/src/main/frontend => spring-boot-angular/src/main/js/ecommerce}/tslint.json (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/resources/application.properties (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/main/resources/logback.xml (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/test/java/com/baeldung/ecommerce/EcommerceApplicationIntegrationTest.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/test/java/org/baeldung/SpringContextIntegrationTest.java (100%) rename {spring-boot-angular-ecommerce => spring-boot-angular}/src/test/java/org/baeldung/SpringContextTest.java (100%) diff --git a/pom.xml b/pom.xml index 3c335f82bd..79e5194ee8 100644 --- a/pom.xml +++ b/pom.xml @@ -671,7 +671,6 @@ spring-boot spring-boot-admin spring-boot-angular - spring-boot-angular-ecommerce spring-boot-autoconfiguration spring-boot-bootstrap spring-boot-camel @@ -1389,7 +1388,6 @@ spring-boot spring-boot-admin spring-boot-angular - spring-boot-angular-ecommerce spring-boot-autoconfiguration spring-boot-bootstrap spring-boot-camel diff --git a/spring-boot-angular-ecommerce/README.md b/spring-boot-angular-ecommerce/README.md deleted file mode 100644 index 9b592de9cc..0000000000 --- a/spring-boot-angular-ecommerce/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Spring Boot Angular Ecommerce - -This module contains articles about Spring Boot with Angular in regards to ecommerce applications. - -### Relevant Articles: -- [A Simple E-Commerce Implementation with Spring](https://www.baeldung.com/spring-angular-ecommerce) diff --git a/spring-boot-angular-ecommerce/pom.xml b/spring-boot-angular-ecommerce/pom.xml deleted file mode 100644 index 510e6c6ec3..0000000000 --- a/spring-boot-angular-ecommerce/pom.xml +++ /dev/null @@ -1,81 +0,0 @@ - - - 4.0.0 - spring-boot-angular-ecommerce - 0.0.1-SNAPSHOT - spring-boot-angular-ecommerce - jar - Spring Boot Angular E-commerce Appliciation - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring.boot.version} - pom - import - - - - - - - org.springframework.boot - spring-boot-starter-data-jpa - ${spring.boot.version} - - - org.springframework.boot - spring-boot-starter-web - ${spring.boot.version} - - - org.springframework.boot - spring-boot-devtools - ${spring.boot.version} - runtime - - - com.h2database - h2 - 1.4.197 - runtime - - - com.fasterxml.jackson.datatype - jackson-datatype-jsr310 - 2.9.6 - - - org.springframework.boot - spring-boot-starter-test - ${spring.boot.version} - test - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot-maven-plugin.version} - - - - - - UTF-8 - UTF-8 - 2.0.3.RELEASE - 2.0.4.RELEASE - - diff --git a/spring-boot-angular/README.md b/spring-boot-angular/README.md index a1904c2c17..027b23202e 100644 --- a/spring-boot-angular/README.md +++ b/spring-boot-angular/README.md @@ -1,7 +1,8 @@ ## Spring Boot Angular -This module contains articles about Spring Boot with Angular +This module contains articles about Spring Boot with Angular ### Relevant Articles: -- [Building a Web Application with Spring Boot and Angular](https://www.baeldung.com/spring-boot-angular-web) +- [Building a Web Application with Spring Boot and Angular](https://www.baeldung.com/spring-boot-angular-web) +- [A Simple E-Commerce Implementation with Spring](https://www.baeldung.com/spring-angular-ecommerce) diff --git a/spring-boot-angular/pom.xml b/spring-boot-angular/pom.xml index 71c46cb7f5..8c26668752 100644 --- a/spring-boot-angular/pom.xml +++ b/spring-boot-angular/pom.xml @@ -7,11 +7,12 @@ 1.0 jar + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../parent-boot-2 diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/EcommerceApplication.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/controller/OrderController.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/OrderController.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/controller/OrderController.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/OrderController.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/controller/ProductController.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/ProductController.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/controller/ProductController.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/controller/ProductController.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/dto/OrderProductDto.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ApiExceptionHandler.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/exception/ResourceNotFoundException.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/Order.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Order.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/Order.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Order.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProduct.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderProductPK.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/OrderStatus.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/Product.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Product.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/model/Product.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/model/Product.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderProductRepository.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/OrderRepository.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/repository/ProductRepository.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductService.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderProductServiceImpl.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderService.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderService.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderService.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderService.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/OrderServiceImpl.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/ProductService.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductService.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/ProductService.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductService.java diff --git a/spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java b/spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java similarity index 100% rename from spring-boot-angular-ecommerce/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java rename to spring-boot-angular/src/main/java/com/baeldung/ecommerce/service/ProductServiceImpl.java diff --git a/spring-boot-angular/angularclient/.angular-cli.json b/spring-boot-angular/src/main/js/application/.angular-cli.json similarity index 100% rename from spring-boot-angular/angularclient/.angular-cli.json rename to spring-boot-angular/src/main/js/application/.angular-cli.json diff --git a/spring-boot-angular/angularclient/.editorconfig b/spring-boot-angular/src/main/js/application/.editorconfig similarity index 100% rename from spring-boot-angular/angularclient/.editorconfig rename to spring-boot-angular/src/main/js/application/.editorconfig diff --git a/spring-boot-angular/angularclient/.gitignore b/spring-boot-angular/src/main/js/application/.gitignore similarity index 82% rename from spring-boot-angular/angularclient/.gitignore rename to spring-boot-angular/src/main/js/application/.gitignore index eabf65e51a..0537fca516 100644 --- a/spring-boot-angular/angularclient/.gitignore +++ b/spring-boot-angular/src/main/js/application/.gitignore @@ -36,8 +36,8 @@ testem.log /typings # e2e -/e2e/*.js -/e2e/*.map +/spring-boot-angular/src/main/js/application/e2e/*.js +/spring-boot-angular/src/main/js/application/e2e/*.map # System Files .DS_Store diff --git a/spring-boot-angular/angularclient/README.md b/spring-boot-angular/src/main/js/application/README.md similarity index 100% rename from spring-boot-angular/angularclient/README.md rename to spring-boot-angular/src/main/js/application/README.md diff --git a/spring-boot-angular/angularclient/e2e/app.e2e-spec.ts b/spring-boot-angular/src/main/js/application/e2e/app.e2e-spec.ts similarity index 100% rename from spring-boot-angular/angularclient/e2e/app.e2e-spec.ts rename to spring-boot-angular/src/main/js/application/e2e/app.e2e-spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/e2e/src/app.po.ts b/spring-boot-angular/src/main/js/application/e2e/app.po.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/e2e/src/app.po.ts rename to spring-boot-angular/src/main/js/application/e2e/app.po.ts diff --git a/spring-boot-angular/angularclient/e2e/tsconfig.e2e.json b/spring-boot-angular/src/main/js/application/e2e/tsconfig.e2e.json similarity index 100% rename from spring-boot-angular/angularclient/e2e/tsconfig.e2e.json rename to spring-boot-angular/src/main/js/application/e2e/tsconfig.e2e.json diff --git a/spring-boot-angular/angularclient/karma.conf.js b/spring-boot-angular/src/main/js/application/karma.conf.js similarity index 100% rename from spring-boot-angular/angularclient/karma.conf.js rename to spring-boot-angular/src/main/js/application/karma.conf.js diff --git a/spring-boot-angular/angularclient/package-lock.json b/spring-boot-angular/src/main/js/application/package-lock.json similarity index 100% rename from spring-boot-angular/angularclient/package-lock.json rename to spring-boot-angular/src/main/js/application/package-lock.json diff --git a/spring-boot-angular/angularclient/package.json b/spring-boot-angular/src/main/js/application/package.json similarity index 100% rename from spring-boot-angular/angularclient/package.json rename to spring-boot-angular/src/main/js/application/package.json diff --git a/spring-boot-angular/angularclient/protractor.conf.js b/spring-boot-angular/src/main/js/application/protractor.conf.js similarity index 100% rename from spring-boot-angular/angularclient/protractor.conf.js rename to spring-boot-angular/src/main/js/application/protractor.conf.js diff --git a/spring-boot-angular/angularclient/src/app/app-routing.module.ts b/spring-boot-angular/src/main/js/application/src/app/app-routing.module.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/app-routing.module.ts rename to spring-boot-angular/src/main/js/application/src/app/app-routing.module.ts diff --git a/spring-boot-angular/angularclient/src/app/app.component.css b/spring-boot-angular/src/main/js/application/src/app/app.component.css similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.component.css rename to spring-boot-angular/src/main/js/application/src/app/app.component.css diff --git a/spring-boot-angular/angularclient/src/app/app.component.html b/spring-boot-angular/src/main/js/application/src/app/app.component.html similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.component.html rename to spring-boot-angular/src/main/js/application/src/app/app.component.html diff --git a/spring-boot-angular/angularclient/src/app/app.component.spec.ts b/spring-boot-angular/src/main/js/application/src/app/app.component.spec.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.component.spec.ts rename to spring-boot-angular/src/main/js/application/src/app/app.component.spec.ts diff --git a/spring-boot-angular/angularclient/src/app/app.component.ts b/spring-boot-angular/src/main/js/application/src/app/app.component.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.component.ts rename to spring-boot-angular/src/main/js/application/src/app/app.component.ts diff --git a/spring-boot-angular/angularclient/src/app/app.module.ts b/spring-boot-angular/src/main/js/application/src/app/app.module.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/app.module.ts rename to spring-boot-angular/src/main/js/application/src/app/app.module.ts diff --git a/spring-boot-angular/angularclient/src/app/model/user.ts b/spring-boot-angular/src/main/js/application/src/app/model/user.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/model/user.ts rename to spring-boot-angular/src/main/js/application/src/app/model/user.ts diff --git a/spring-boot-angular/angularclient/src/app/service/user.service.spec.ts b/spring-boot-angular/src/main/js/application/src/app/service/user.service.spec.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/service/user.service.spec.ts rename to spring-boot-angular/src/main/js/application/src/app/service/user.service.spec.ts diff --git a/spring-boot-angular/angularclient/src/app/service/user.service.ts b/spring-boot-angular/src/main/js/application/src/app/service/user.service.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/service/user.service.ts rename to spring-boot-angular/src/main/js/application/src/app/service/user.service.ts diff --git a/spring-boot-angular/angularclient/src/app/user-form/user-form.component.css b/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.css similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-form/user-form.component.css rename to spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.css diff --git a/spring-boot-angular/angularclient/src/app/user-form/user-form.component.html b/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.html similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-form/user-form.component.html rename to spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.html diff --git a/spring-boot-angular/angularclient/src/app/user-form/user-form.component.spec.ts b/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.spec.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-form/user-form.component.spec.ts rename to spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.spec.ts diff --git a/spring-boot-angular/angularclient/src/app/user-form/user-form.component.ts b/spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-form/user-form.component.ts rename to spring-boot-angular/src/main/js/application/src/app/user-form/user-form.component.ts diff --git a/spring-boot-angular/angularclient/src/app/user-list/user-list.component.css b/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.css similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-list/user-list.component.css rename to spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.css diff --git a/spring-boot-angular/angularclient/src/app/user-list/user-list.component.html b/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.html similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-list/user-list.component.html rename to spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.html diff --git a/spring-boot-angular/angularclient/src/app/user-list/user-list.component.spec.ts b/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.spec.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-list/user-list.component.spec.ts rename to spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.spec.ts diff --git a/spring-boot-angular/angularclient/src/app/user-list/user-list.component.ts b/spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.ts similarity index 100% rename from spring-boot-angular/angularclient/src/app/user-list/user-list.component.ts rename to spring-boot-angular/src/main/js/application/src/app/user-list/user-list.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/assets/.gitkeep b/spring-boot-angular/src/main/js/application/src/assets/.gitkeep similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/assets/.gitkeep rename to spring-boot-angular/src/main/js/application/src/assets/.gitkeep diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/environments/environment.prod.ts b/spring-boot-angular/src/main/js/application/src/environments/environment.prod.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/environments/environment.prod.ts rename to spring-boot-angular/src/main/js/application/src/environments/environment.prod.ts diff --git a/spring-boot-angular/angularclient/src/environments/environment.ts b/spring-boot-angular/src/main/js/application/src/environments/environment.ts similarity index 100% rename from spring-boot-angular/angularclient/src/environments/environment.ts rename to spring-boot-angular/src/main/js/application/src/environments/environment.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/favicon.ico b/spring-boot-angular/src/main/js/application/src/favicon.ico similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/favicon.ico rename to spring-boot-angular/src/main/js/application/src/favicon.ico diff --git a/spring-boot-angular/angularclient/src/index.html b/spring-boot-angular/src/main/js/application/src/index.html similarity index 100% rename from spring-boot-angular/angularclient/src/index.html rename to spring-boot-angular/src/main/js/application/src/index.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/main.ts b/spring-boot-angular/src/main/js/application/src/main.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/main.ts rename to spring-boot-angular/src/main/js/application/src/main.ts diff --git a/spring-boot-angular/angularclient/src/polyfills.ts b/spring-boot-angular/src/main/js/application/src/polyfills.ts similarity index 100% rename from spring-boot-angular/angularclient/src/polyfills.ts rename to spring-boot-angular/src/main/js/application/src/polyfills.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/styles.css b/spring-boot-angular/src/main/js/application/src/styles.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/styles.css rename to spring-boot-angular/src/main/js/application/src/styles.css diff --git a/spring-boot-angular/angularclient/src/tsconfig.app.json b/spring-boot-angular/src/main/js/application/src/tsconfig.app.json similarity index 100% rename from spring-boot-angular/angularclient/src/tsconfig.app.json rename to spring-boot-angular/src/main/js/application/src/tsconfig.app.json diff --git a/spring-boot-angular/angularclient/src/tsconfig.spec.json b/spring-boot-angular/src/main/js/application/src/tsconfig.spec.json similarity index 100% rename from spring-boot-angular/angularclient/src/tsconfig.spec.json rename to spring-boot-angular/src/main/js/application/src/tsconfig.spec.json diff --git a/spring-boot-angular/angularclient/src/typings.d.ts b/spring-boot-angular/src/main/js/application/src/typings.d.ts similarity index 100% rename from spring-boot-angular/angularclient/src/typings.d.ts rename to spring-boot-angular/src/main/js/application/src/typings.d.ts diff --git a/spring-boot-angular/angularclient/tsconfig.json b/spring-boot-angular/src/main/js/application/tsconfig.json similarity index 100% rename from spring-boot-angular/angularclient/tsconfig.json rename to spring-boot-angular/src/main/js/application/tsconfig.json diff --git a/spring-boot-angular/angularclient/tslint.json b/spring-boot-angular/src/main/js/application/tslint.json similarity index 100% rename from spring-boot-angular/angularclient/tslint.json rename to spring-boot-angular/src/main/js/application/tslint.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/.editorconfig b/spring-boot-angular/src/main/js/ecommerce/.editorconfig similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/.editorconfig rename to spring-boot-angular/src/main/js/ecommerce/.editorconfig diff --git a/spring-boot-angular-ecommerce/src/main/frontend/README.md b/spring-boot-angular/src/main/js/ecommerce/README.md similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/README.md rename to spring-boot-angular/src/main/js/ecommerce/README.md diff --git a/spring-boot-angular-ecommerce/src/main/frontend/angular.json b/spring-boot-angular/src/main/js/ecommerce/angular.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/angular.json rename to spring-boot-angular/src/main/js/ecommerce/angular.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/e2e/protractor.conf.js b/spring-boot-angular/src/main/js/ecommerce/e2e/protractor.conf.js similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/e2e/protractor.conf.js rename to spring-boot-angular/src/main/js/ecommerce/e2e/protractor.conf.js diff --git a/spring-boot-angular-ecommerce/src/main/frontend/e2e/src/app.e2e-spec.ts b/spring-boot-angular/src/main/js/ecommerce/e2e/src/app.e2e-spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/e2e/src/app.e2e-spec.ts rename to spring-boot-angular/src/main/js/ecommerce/e2e/src/app.e2e-spec.ts diff --git a/spring-boot-angular/angularclient/e2e/app.po.ts b/spring-boot-angular/src/main/js/ecommerce/e2e/src/app.po.ts similarity index 100% rename from spring-boot-angular/angularclient/e2e/app.po.ts rename to spring-boot-angular/src/main/js/ecommerce/e2e/src/app.po.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/e2e/tsconfig.e2e.json b/spring-boot-angular/src/main/js/ecommerce/e2e/tsconfig.e2e.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/e2e/tsconfig.e2e.json rename to spring-boot-angular/src/main/js/ecommerce/e2e/tsconfig.e2e.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/package-lock.json b/spring-boot-angular/src/main/js/ecommerce/package-lock.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/package-lock.json rename to spring-boot-angular/src/main/js/ecommerce/package-lock.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/package.json b/spring-boot-angular/src/main/js/ecommerce/package.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/package.json rename to spring-boot-angular/src/main/js/ecommerce/package.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/proxy-conf.json b/spring-boot-angular/src/main/js/ecommerce/proxy-conf.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/proxy-conf.json rename to spring-boot-angular/src/main/js/ecommerce/proxy-conf.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.css b/spring-boot-angular/src/main/js/ecommerce/src/app/app.component.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.css rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.component.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/app.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/app.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/app.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/app.module.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/app.module.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/app.module.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/app.module.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.css b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.css rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/ecommerce.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/ecommerce.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product-order.model.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product-order.model.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product-order.model.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product-order.model.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product-orders.model.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product-orders.model.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product-orders.model.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product-orders.model.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product.model.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product.model.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/models/product.model.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/models/product.model.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.css b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.css rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/orders/orders.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/orders/orders.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.css b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.css rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/products/products.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/products/products.component.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/services/EcommerceService.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/services/EcommerceService.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/services/EcommerceService.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/services/EcommerceService.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.css b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.css similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.css rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.html b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.html rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.spec.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.spec.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.spec.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.spec.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.ts b/spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/app/ecommerce/shopping-cart/shopping-cart.component.ts rename to spring-boot-angular/src/main/js/ecommerce/src/app/ecommerce/shopping-cart/shopping-cart.component.ts diff --git a/spring-boot-angular/angularclient/src/assets/.gitkeep b/spring-boot-angular/src/main/js/ecommerce/src/assets/.gitkeep similarity index 100% rename from spring-boot-angular/angularclient/src/assets/.gitkeep rename to spring-boot-angular/src/main/js/ecommerce/src/assets/.gitkeep diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/browserslist b/spring-boot-angular/src/main/js/ecommerce/src/browserslist similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/browserslist rename to spring-boot-angular/src/main/js/ecommerce/src/browserslist diff --git a/spring-boot-angular/angularclient/src/environments/environment.prod.ts b/spring-boot-angular/src/main/js/ecommerce/src/environments/environment.prod.ts similarity index 100% rename from spring-boot-angular/angularclient/src/environments/environment.prod.ts rename to spring-boot-angular/src/main/js/ecommerce/src/environments/environment.prod.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/environments/environment.ts b/spring-boot-angular/src/main/js/ecommerce/src/environments/environment.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/environments/environment.ts rename to spring-boot-angular/src/main/js/ecommerce/src/environments/environment.ts diff --git a/spring-boot-angular/angularclient/src/favicon.ico b/spring-boot-angular/src/main/js/ecommerce/src/favicon.ico similarity index 100% rename from spring-boot-angular/angularclient/src/favicon.ico rename to spring-boot-angular/src/main/js/ecommerce/src/favicon.ico diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/index.html b/spring-boot-angular/src/main/js/ecommerce/src/index.html similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/index.html rename to spring-boot-angular/src/main/js/ecommerce/src/index.html diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/karma.conf.js b/spring-boot-angular/src/main/js/ecommerce/src/karma.conf.js similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/karma.conf.js rename to spring-boot-angular/src/main/js/ecommerce/src/karma.conf.js diff --git a/spring-boot-angular/angularclient/src/main.ts b/spring-boot-angular/src/main/js/ecommerce/src/main.ts similarity index 100% rename from spring-boot-angular/angularclient/src/main.ts rename to spring-boot-angular/src/main/js/ecommerce/src/main.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/polyfills.ts b/spring-boot-angular/src/main/js/ecommerce/src/polyfills.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/polyfills.ts rename to spring-boot-angular/src/main/js/ecommerce/src/polyfills.ts diff --git a/spring-boot-angular/angularclient/src/styles.css b/spring-boot-angular/src/main/js/ecommerce/src/styles.css similarity index 100% rename from spring-boot-angular/angularclient/src/styles.css rename to spring-boot-angular/src/main/js/ecommerce/src/styles.css diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/test.ts b/spring-boot-angular/src/main/js/ecommerce/src/test.ts similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/test.ts rename to spring-boot-angular/src/main/js/ecommerce/src/test.ts diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/tsconfig.app.json b/spring-boot-angular/src/main/js/ecommerce/src/tsconfig.app.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/tsconfig.app.json rename to spring-boot-angular/src/main/js/ecommerce/src/tsconfig.app.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/tsconfig.spec.json b/spring-boot-angular/src/main/js/ecommerce/src/tsconfig.spec.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/tsconfig.spec.json rename to spring-boot-angular/src/main/js/ecommerce/src/tsconfig.spec.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/src/tslint.json b/spring-boot-angular/src/main/js/ecommerce/src/tslint.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/src/tslint.json rename to spring-boot-angular/src/main/js/ecommerce/src/tslint.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/tsconfig.json b/spring-boot-angular/src/main/js/ecommerce/tsconfig.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/tsconfig.json rename to spring-boot-angular/src/main/js/ecommerce/tsconfig.json diff --git a/spring-boot-angular-ecommerce/src/main/frontend/tslint.json b/spring-boot-angular/src/main/js/ecommerce/tslint.json similarity index 100% rename from spring-boot-angular-ecommerce/src/main/frontend/tslint.json rename to spring-boot-angular/src/main/js/ecommerce/tslint.json diff --git a/spring-boot-angular-ecommerce/src/main/resources/application.properties b/spring-boot-angular/src/main/resources/application.properties similarity index 100% rename from spring-boot-angular-ecommerce/src/main/resources/application.properties rename to spring-boot-angular/src/main/resources/application.properties diff --git a/spring-boot-angular-ecommerce/src/main/resources/logback.xml b/spring-boot-angular/src/main/resources/logback.xml similarity index 100% rename from spring-boot-angular-ecommerce/src/main/resources/logback.xml rename to spring-boot-angular/src/main/resources/logback.xml diff --git a/spring-boot-angular-ecommerce/src/test/java/com/baeldung/ecommerce/EcommerceApplicationIntegrationTest.java b/spring-boot-angular/src/test/java/com/baeldung/ecommerce/EcommerceApplicationIntegrationTest.java similarity index 100% rename from spring-boot-angular-ecommerce/src/test/java/com/baeldung/ecommerce/EcommerceApplicationIntegrationTest.java rename to spring-boot-angular/src/test/java/com/baeldung/ecommerce/EcommerceApplicationIntegrationTest.java diff --git a/spring-boot-angular-ecommerce/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-boot-angular/src/test/java/org/baeldung/SpringContextIntegrationTest.java similarity index 100% rename from spring-boot-angular-ecommerce/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-boot-angular/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/spring-boot-angular-ecommerce/src/test/java/org/baeldung/SpringContextTest.java b/spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java similarity index 100% rename from spring-boot-angular-ecommerce/src/test/java/org/baeldung/SpringContextTest.java rename to spring-boot-angular/src/test/java/org/baeldung/SpringContextTest.java From 5621a6d8c5b527a607a261db4eea0d838393e2ab Mon Sep 17 00:00:00 2001 From: macroscopic64 Date: Sat, 28 Sep 2019 11:38:39 +0530 Subject: [PATCH 280/396] [BAEL-3288] - Graceful Shutdown of a Spring Boot Application --- .../baeldung/gracefulshutdown/GracefulShutdownApplication.java | 0 .../baeldung/gracefulshutdown/beans/LongRunningProcessBean.java | 0 .../com/baeldung/gracefulshutdown/config/SpringConfiguration.java | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename {spring-boot => spring-boot-ops-2}/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java (100%) rename {spring-boot => spring-boot-ops-2}/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java (100%) rename {spring-boot => spring-boot-ops-2}/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java (100%) diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java rename to spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java rename to spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java diff --git a/spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java rename to spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java From d4b9f8a59a7a665941259e84a18cb7d1545f7ffa Mon Sep 17 00:00:00 2001 From: macroscopic64 Date: Sat, 28 Sep 2019 11:40:44 +0530 Subject: [PATCH 281/396] [BAEL-3288] - Graceful Shutdown of a Spring Boot Application --- .../baeldung/gracefulshutdown/GracefulShutdownApplication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java index 9cb226a49f..dd0d0f920c 100644 --- a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java +++ b/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java @@ -3,7 +3,7 @@ package com.baeldung.gracefulshutdown; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -@SpringBootApplication(scanBasePackages = {"com.baeldung.gracefulshutdown"}) +@SpringBootApplication public class GracefulShutdownApplication { public static void main(String args[]) { From a846c037cbe24aac76faeee1f4c3e3091e6ca8d4 Mon Sep 17 00:00:00 2001 From: "yassin.hajaj" Date: Fri, 30 Aug 2019 00:34:11 +0200 Subject: [PATCH 282/396] BAEL-3219 Parsing an XML File Using SAX Parser --- .../java/com/baeldung/sax/SaxParserMain.java | 161 ++++++++++++++++++ xml/src/main/resources/sax/baeldung.xml | 16 ++ 2 files changed, 177 insertions(+) create mode 100644 xml/src/main/java/com/baeldung/sax/SaxParserMain.java create mode 100644 xml/src/main/resources/sax/baeldung.xml diff --git a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java new file mode 100644 index 0000000000..fdf9b524d0 --- /dev/null +++ b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java @@ -0,0 +1,161 @@ +package com.baeldung.sax; + +import org.xml.sax.Attributes; +import org.xml.sax.SAXException; +import org.xml.sax.helpers.DefaultHandler; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +public class SaxParserMain { + public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { + SAXParserFactory factory = SAXParserFactory.newInstance(); + SAXParser saxParser = factory.newSAXParser(); + + BaeldungHandler baeldungHandler = new BaeldungHandler(); + saxParser.parse("xml\\src\\main\\resources\\sax\\baeldung.xml", baeldungHandler); + System.out.println(baeldungHandler.getWebsite()); + } + + public static class BaeldungHandler extends DefaultHandler { + private Baeldung website; + private String elementValue; + + @Override + public void characters(char[] ch, int start, int length) throws SAXException { + elementValue = new String(ch, start, length); + } + + @Override + public void startDocument() throws SAXException { + website = new Baeldung(); + } + + @Override + public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { + switch (qName) { + case ARTICLES: + website.setArticleList(new ArrayList<>()); + break; + case ARTICLE: + website.getArticleList().add(new BaeldungArticle()); + } + } + + @Override + public void endElement(String uri, String localName, String qName) throws SAXException { + switch (qName) { + case TITLE: + latestArticle().setTitle(elementValue); + break; + case CONTENT: + latestArticle().setContent(elementValue); + break; + } + } + + private BaeldungArticle latestArticle() { + List articleList = website.getArticleList(); + int latestArticleIndex = articleList.size() - 1; + return articleList.get(latestArticleIndex); + } + + public Baeldung getWebsite() { + return website; + } + + @Override + public String toString() { + return "BaeldungHandler{" + + "website=" + website + + ", elementValue='" + elementValue + '\'' + + '}'; + } + + private static final String ARTICLES = "articles"; + private static final String ARTICLE = "article"; + private static final String TITLE = "title"; + private static final String CONTENT = "content"; + } + + + public static class Baeldung { + private List articleList; + + public List getArticleList() { + return articleList; + } + + public void setArticleList(List articleList) { + this.articleList = articleList; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + Baeldung baeldung = (Baeldung) o; + return Objects.equals(articleList, baeldung.articleList); + } + + @Override + public int hashCode() { + return Objects.hash(articleList); + } + + @Override + public String toString() { + return "Baeldung{" + + "articleList=" + articleList + + '}'; + } + } + + public static class BaeldungArticle { + private String title; + private String content; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getContent() { + return content; + } + + public void setContent(String content) { + this.content = content; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BaeldungArticle that = (BaeldungArticle) o; + return Objects.equals(title, that.title) && + Objects.equals(content, that.content); + } + + @Override + public int hashCode() { + return Objects.hash(title, content); + } + + @Override + public String toString() { + return "BaeldungArticle{" + + "title='" + title + '\'' + + ", content='" + content + '\'' + + '}'; + } + } +} diff --git a/xml/src/main/resources/sax/baeldung.xml b/xml/src/main/resources/sax/baeldung.xml new file mode 100644 index 0000000000..4b839f35c7 --- /dev/null +++ b/xml/src/main/resources/sax/baeldung.xml @@ -0,0 +1,16 @@ + + +
    + Parsing an XML File Using SAX Parser + Lorem ipsum... +
    +
    + Parsing an XML File Using DOM Parser + Lorem ipsum... +
    +
    + Parsing an XML File Using StAX Parser + Lorem ipsum... +
    +
    +
    \ No newline at end of file From 6e77eef313253f92b4c9643e1e75f72cce41e7ba Mon Sep 17 00:00:00 2001 From: "yassin.hajaj" Date: Sat, 31 Aug 2019 13:38:40 +0200 Subject: [PATCH 283/396] BAEL-3219 Parsing an XML File Using SAX Parser --- .../com/baeldung/sax/SaxParserMainTest.java | 44 +++++++++++++++++++ xml/src/test/resources/sax/baeldung.xml | 16 +++++++ 2 files changed, 60 insertions(+) create mode 100644 xml/src/test/java/com/baeldung/sax/SaxParserMainTest.java create mode 100644 xml/src/test/resources/sax/baeldung.xml diff --git a/xml/src/test/java/com/baeldung/sax/SaxParserMainTest.java b/xml/src/test/java/com/baeldung/sax/SaxParserMainTest.java new file mode 100644 index 0000000000..af31bc3bd2 --- /dev/null +++ b/xml/src/test/java/com/baeldung/sax/SaxParserMainTest.java @@ -0,0 +1,44 @@ +package com.baeldung.sax; + +import org.junit.Test; +import org.xml.sax.SAXException; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; +import javax.xml.parsers.SAXParserFactory; +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.*; + +public class SaxParserMainTest { + + @Test + void parse_baeldung_xml_document() throws IOException, SAXException, ParserConfigurationException { + SAXParserFactory factory = SAXParserFactory.newInstance(); + SAXParser saxParser = factory.newSAXParser(); + + SaxParserMain.BaeldungHandler baeldungHandler = new SaxParserMain.BaeldungHandler(); + saxParser.parse("xml\\src\\test\\resources\\sax\\baeldung.xml", baeldungHandler); + + SaxParserMain.Baeldung result = baeldungHandler.getWebsite(); + + assertNotNull(result); + List articles = result.getArticleList(); + + assertNotNull(articles); + assertEquals(3, articles.size()); + + SaxParserMain.BaeldungArticle articleOne = articles.get(0); + assertEquals("Parsing an XML File Using SAX Parser", articleOne.getTitle()); + assertEquals("Lorem ipsum...", articleOne.getContent()); + + SaxParserMain.BaeldungArticle articleTwo = articles.get(1); + assertEquals("Parsing an XML File Using DOM Parser", articleTwo.getTitle()); + assertEquals("Lorem ipsum...", articleTwo.getContent()); + + SaxParserMain.BaeldungArticle articleThree = articles.get(2); + assertEquals("Parsing an XML File Using StAX Parser", articleThree.getTitle()); + assertEquals("Lorem ipsum...", articleThree.getContent()); + } +} diff --git a/xml/src/test/resources/sax/baeldung.xml b/xml/src/test/resources/sax/baeldung.xml new file mode 100644 index 0000000000..4b839f35c7 --- /dev/null +++ b/xml/src/test/resources/sax/baeldung.xml @@ -0,0 +1,16 @@ + + +
    + Parsing an XML File Using SAX Parser + Lorem ipsum... +
    +
    + Parsing an XML File Using DOM Parser + Lorem ipsum... +
    +
    + Parsing an XML File Using StAX Parser + Lorem ipsum... +
    +
    +
    \ No newline at end of file From 21804927e3b2bdd1edcad9af94581edd8b445fe3 Mon Sep 17 00:00:00 2001 From: "yassin.hajaj" Date: Sat, 31 Aug 2019 15:40:44 +0200 Subject: [PATCH 284/396] BAEL-3219 Parsing an XML File Using SAX Parser --- .../{SaxParserMainTest.java => SaxParserMainUnitTest.java} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename xml/src/test/java/com/baeldung/sax/{SaxParserMainTest.java => SaxParserMainUnitTest.java} (84%) diff --git a/xml/src/test/java/com/baeldung/sax/SaxParserMainTest.java b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java similarity index 84% rename from xml/src/test/java/com/baeldung/sax/SaxParserMainTest.java rename to xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java index af31bc3bd2..d9351aed03 100644 --- a/xml/src/test/java/com/baeldung/sax/SaxParserMainTest.java +++ b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java @@ -11,15 +11,15 @@ import java.util.List; import static org.junit.Assert.*; -public class SaxParserMainTest { +public class SaxParserMainUnitTest { @Test - void parse_baeldung_xml_document() throws IOException, SAXException, ParserConfigurationException { + public void parse_baeldung_xml_document() throws IOException, SAXException, ParserConfigurationException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); SaxParserMain.BaeldungHandler baeldungHandler = new SaxParserMain.BaeldungHandler(); - saxParser.parse("xml\\src\\test\\resources\\sax\\baeldung.xml", baeldungHandler); + saxParser.parse("src\\test\\resources\\sax\\baeldung.xml", baeldungHandler); SaxParserMain.Baeldung result = baeldungHandler.getWebsite(); From 08da9be66649c6056a6490f25ac7d446172e23a6 Mon Sep 17 00:00:00 2001 From: "yassin.hajaj" Date: Sat, 31 Aug 2019 21:48:19 +0200 Subject: [PATCH 285/396] BAEL-3219 Parsing an XML File Using SAX Parser --- .../java/com/baeldung/sax/SaxParserMainUnitTest.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java index d9351aed03..d94857dbb5 100644 --- a/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java +++ b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java @@ -7,6 +7,11 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.List; import static org.junit.Assert.*; @@ -14,12 +19,13 @@ import static org.junit.Assert.*; public class SaxParserMainUnitTest { @Test - public void parse_baeldung_xml_document() throws IOException, SAXException, ParserConfigurationException { + public void parse_baeldung_xml_document() throws IOException, SAXException, ParserConfigurationException, URISyntaxException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); SaxParserMain.BaeldungHandler baeldungHandler = new SaxParserMain.BaeldungHandler(); - saxParser.parse("src\\test\\resources\\sax\\baeldung.xml", baeldungHandler); + Path path = Paths.get(new URL("src\\test\\resources\\sax\\baeldung.xml").toURI()); + saxParser.parse(path.toFile(), baeldungHandler); SaxParserMain.Baeldung result = baeldungHandler.getWebsite(); From 6f4957a63d07358c4bfa9acc4819d0164b15b6dd Mon Sep 17 00:00:00 2001 From: "yassin.hajaj" Date: Sat, 31 Aug 2019 21:57:51 +0200 Subject: [PATCH 286/396] BAEL-3219 Parsing an XML File Using SAX Parser --- .../java/com/baeldung/sax/SaxParserMainUnitTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java index d94857dbb5..8a8aa62dd2 100644 --- a/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java +++ b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java @@ -7,11 +7,6 @@ import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import java.io.IOException; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; -import java.nio.file.Path; -import java.nio.file.Paths; import java.util.List; import static org.junit.Assert.*; @@ -19,13 +14,12 @@ import static org.junit.Assert.*; public class SaxParserMainUnitTest { @Test - public void parse_baeldung_xml_document() throws IOException, SAXException, ParserConfigurationException, URISyntaxException { + public void parse_baeldung_xml_document() throws IOException, SAXException, ParserConfigurationException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); SaxParserMain.BaeldungHandler baeldungHandler = new SaxParserMain.BaeldungHandler(); - Path path = Paths.get(new URL("src\\test\\resources\\sax\\baeldung.xml").toURI()); - saxParser.parse(path.toFile(), baeldungHandler); + saxParser.parse("src/test/resources/sax/baeldung.xml", baeldungHandler); SaxParserMain.Baeldung result = baeldungHandler.getWebsite(); From 59729b7e2339cd63072566db388691b22112f6bc Mon Sep 17 00:00:00 2001 From: "yassin.hajaj" Date: Sun, 1 Sep 2019 21:37:01 +0200 Subject: [PATCH 287/396] BAEL-3219 Parsing an XML File Using SAX Parser --- xml/pom.xml | 7 ++ .../java/com/baeldung/sax/SaxParserMain.java | 93 +++---------------- 2 files changed, 18 insertions(+), 82 deletions(-) diff --git a/xml/pom.xml b/xml/pom.xml index bbd607f9b5..3b8b88ba73 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -111,6 +111,13 @@ ${commons-lang.version}
    + + org.projectlombok + lombok + 1.18.8 + provided + + org.junit.jupiter junit-jupiter diff --git a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java index fdf9b524d0..654d5162cd 100644 --- a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java +++ b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java @@ -1,5 +1,7 @@ package com.baeldung.sax; +import lombok.Data; +import lombok.ToString; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -10,7 +12,6 @@ import javax.xml.parsers.SAXParserFactory; import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Objects; public class SaxParserMain { public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { @@ -18,11 +19,17 @@ public class SaxParserMain { SAXParser saxParser = factory.newSAXParser(); BaeldungHandler baeldungHandler = new BaeldungHandler(); - saxParser.parse("xml\\src\\main\\resources\\sax\\baeldung.xml", baeldungHandler); + saxParser.parse("xml/src/main/resources/sax/baeldung.xml", baeldungHandler); System.out.println(baeldungHandler.getWebsite()); } + @ToString public static class BaeldungHandler extends DefaultHandler { + private static final String ARTICLES = "articles"; + private static final String ARTICLE = "article"; + private static final String TITLE = "title"; + private static final String CONTENT = "content"; + private Baeldung website; private String elementValue; @@ -68,94 +75,16 @@ public class SaxParserMain { public Baeldung getWebsite() { return website; } - - @Override - public String toString() { - return "BaeldungHandler{" + - "website=" + website + - ", elementValue='" + elementValue + '\'' + - '}'; - } - - private static final String ARTICLES = "articles"; - private static final String ARTICLE = "article"; - private static final String TITLE = "title"; - private static final String CONTENT = "content"; } - + @Data public static class Baeldung { private List articleList; - - public List getArticleList() { - return articleList; - } - - public void setArticleList(List articleList) { - this.articleList = articleList; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - Baeldung baeldung = (Baeldung) o; - return Objects.equals(articleList, baeldung.articleList); - } - - @Override - public int hashCode() { - return Objects.hash(articleList); - } - - @Override - public String toString() { - return "Baeldung{" + - "articleList=" + articleList + - '}'; - } } + @Data public static class BaeldungArticle { private String title; private String content; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getContent() { - return content; - } - - public void setContent(String content) { - this.content = content; - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - BaeldungArticle that = (BaeldungArticle) o; - return Objects.equals(title, that.title) && - Objects.equals(content, that.content); - } - - @Override - public int hashCode() { - return Objects.hash(title, content); - } - - @Override - public String toString() { - return "BaeldungArticle{" + - "title='" + title + '\'' + - ", content='" + content + '\'' + - '}'; - } } } From f82e007672f60178d1e3b4e5ba207536805f464b Mon Sep 17 00:00:00 2001 From: YassinHajaj Date: Fri, 6 Sep 2019 16:01:11 +0000 Subject: [PATCH 288/396] BAEL-3219 --- xml/pom.xml | 13 ++------ .../java/com/baeldung/sax/SaxParserMain.java | 32 ++++++++++++++++--- xml/src/main/resources/sax/baeldung.xml | 6 ++-- .../baeldung/sax/SaxParserMainUnitTest.java | 8 ++--- xml/src/test/resources/sax/baeldung.xml | 6 ++-- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/xml/pom.xml b/xml/pom.xml index 3b8b88ba73..24969d1d6b 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -111,13 +111,6 @@ ${commons-lang.version} - - org.projectlombok - lombok - 1.18.8 - provided - - org.junit.jupiter junit-jupiter @@ -332,7 +325,7 @@ - maven-assembly-plugin @@ -352,9 +345,9 @@ - make-assembly - package attached diff --git a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java index 654d5162cd..5aba9409de 100644 --- a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java +++ b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java @@ -1,7 +1,5 @@ package com.baeldung.sax; -import lombok.Data; -import lombok.ToString; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; @@ -23,7 +21,7 @@ public class SaxParserMain { System.out.println(baeldungHandler.getWebsite()); } - @ToString + //@ToString public static class BaeldungHandler extends DefaultHandler { private static final String ARTICLES = "articles"; private static final String ARTICLE = "article"; @@ -77,14 +75,38 @@ public class SaxParserMain { } } - @Data + //@Data public static class Baeldung { private List articleList; + + public void setArticleList(List articleList) { + this.articleList = articleList; + } + + public List getArticleList() { + return this.articleList; + } } - @Data + //@Data public static class BaeldungArticle { private String title; private String content; + + public void setTitle(String title) { + this.title = title; + } + + public String getTitle() { + return this.title; + } + + public void setContent(String content) { + this.content = content; + } + + public String getContent() { + return this.content; + } } } diff --git a/xml/src/main/resources/sax/baeldung.xml b/xml/src/main/resources/sax/baeldung.xml index 4b839f35c7..6736d5bdca 100644 --- a/xml/src/main/resources/sax/baeldung.xml +++ b/xml/src/main/resources/sax/baeldung.xml @@ -2,15 +2,15 @@
    Parsing an XML File Using SAX Parser - Lorem ipsum... + SAX Parser's Lorem ipsum...
    Parsing an XML File Using DOM Parser - Lorem ipsum... + DOM Parser's Lorem ipsum...
    Parsing an XML File Using StAX Parser - Lorem ipsum... + StAX Parser's Lorem ipsum...
    \ No newline at end of file diff --git a/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java index 8a8aa62dd2..333c5619c8 100644 --- a/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java +++ b/xml/src/test/java/com/baeldung/sax/SaxParserMainUnitTest.java @@ -14,7 +14,7 @@ import static org.junit.Assert.*; public class SaxParserMainUnitTest { @Test - public void parse_baeldung_xml_document() throws IOException, SAXException, ParserConfigurationException { + public void givenAProperXMLFile_whenItIsParsed_ThenAnObjectContainsAllItsElements() throws IOException, SAXException, ParserConfigurationException { SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser saxParser = factory.newSAXParser(); @@ -31,14 +31,14 @@ public class SaxParserMainUnitTest { SaxParserMain.BaeldungArticle articleOne = articles.get(0); assertEquals("Parsing an XML File Using SAX Parser", articleOne.getTitle()); - assertEquals("Lorem ipsum...", articleOne.getContent()); + assertEquals("SAX Parser's Lorem ipsum...", articleOne.getContent()); SaxParserMain.BaeldungArticle articleTwo = articles.get(1); assertEquals("Parsing an XML File Using DOM Parser", articleTwo.getTitle()); - assertEquals("Lorem ipsum...", articleTwo.getContent()); + assertEquals("DOM Parser's Lorem ipsum...", articleTwo.getContent()); SaxParserMain.BaeldungArticle articleThree = articles.get(2); assertEquals("Parsing an XML File Using StAX Parser", articleThree.getTitle()); - assertEquals("Lorem ipsum...", articleThree.getContent()); + assertEquals("StAX Parser's Lorem ipsum...", articleThree.getContent()); } } diff --git a/xml/src/test/resources/sax/baeldung.xml b/xml/src/test/resources/sax/baeldung.xml index 4b839f35c7..6736d5bdca 100644 --- a/xml/src/test/resources/sax/baeldung.xml +++ b/xml/src/test/resources/sax/baeldung.xml @@ -2,15 +2,15 @@
    Parsing an XML File Using SAX Parser - Lorem ipsum... + SAX Parser's Lorem ipsum...
    Parsing an XML File Using DOM Parser - Lorem ipsum... + DOM Parser's Lorem ipsum...
    Parsing an XML File Using StAX Parser - Lorem ipsum... + StAX Parser's Lorem ipsum...
    \ No newline at end of file From c5693676ee6e4002d5bf82f8909c2063821e8db3 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Sat, 28 Sep 2019 12:40:03 +0200 Subject: [PATCH 289/396] #BAEL-17506 Add README descriptions to several modules. --- .../core-java-concurrency-advanced/README.md | 4 ++-- core-kotlin-2/README.md | 7 ++++++- core-kotlin-io/README.md | 6 +++++- core-kotlin/README.md | 7 ++++++- jenkins/README.md | 1 + jenkins/hello-world/README.md | 6 +++++- jhipster/README.md | 9 +++++++++ jws/README.md | 4 ++++ libraries/README.md | 15 +++++++++------ persistence-modules/hibernate-mapping/README.md | 2 +- persistence-modules/hibernate5/README.md | 6 +++++- persistence-modules/java-jpa-2/README.md | 7 ++++++- persistence-modules/java-jpa/README.md | 7 ++++++- 13 files changed, 65 insertions(+), 16 deletions(-) create mode 100644 jhipster/README.md diff --git a/core-java-modules/core-java-concurrency-advanced/README.md b/core-java-modules/core-java-concurrency-advanced/README.md index 8e99858693..f76e68757a 100644 --- a/core-java-modules/core-java-concurrency-advanced/README.md +++ b/core-java-modules/core-java-concurrency-advanced/README.md @@ -1,7 +1,7 @@ -========= - ## Core Java Concurrency Advanced Examples +This module contains articles about advanced concurrency in core Java. + ### Relevant Articles: - [Introduction to Thread Pools in Java](http://www.baeldung.com/thread-pool-java-and-guava) - [Guide to CountDownLatch in Java](http://www.baeldung.com/java-countdown-latch) diff --git a/core-kotlin-2/README.md b/core-kotlin-2/README.md index d75dd2208a..ecf16c2c91 100644 --- a/core-kotlin-2/README.md +++ b/core-kotlin-2/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Core Kotlin + +This module contains articles about core Kotlin. + +### Relevant articles: - [Void Type in Kotlin](https://www.baeldung.com/kotlin-void-type) - [How to use Kotlin Range Expressions](https://www.baeldung.com/kotlin-ranges) @@ -8,3 +12,4 @@ - [Split a List into Parts in Kotlin](https://www.baeldung.com/kotlin-split-list-into-parts) - [String Comparison in Kotlin](https://www.baeldung.com/kotlin-string-comparison) - [Guide to JVM Platform Annotations in Kotlin](https://www.baeldung.com/kotlin-jvm-annotations) +- More articles: [[<-- prev]](/core-kotlin) diff --git a/core-kotlin-io/README.md b/core-kotlin-io/README.md index cb4dac7e4d..ad4c503895 100644 --- a/core-kotlin-io/README.md +++ b/core-kotlin-io/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Core Kotlin I/O + +This module contains articles about core Kotlin I/O. + +### Relevant articles: - [InputStream to String in Kotlin](https://www.baeldung.com/kotlin-inputstream-to-string) - [Console I/O in Kotlin](https://www.baeldung.com/kotlin-console-io) diff --git a/core-kotlin/README.md b/core-kotlin/README.md index 3392db9171..8d42a32e91 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Core Kotlin + +This module contains articles about core Kotlin. + +### Relevant articles: - [Introduction to the Kotlin Language](http://www.baeldung.com/kotlin) - [Guide to the “when{}” Block in Kotlin](http://www.baeldung.com/kotlin-when) @@ -56,3 +60,4 @@ - [Static Methods Behavior in Kotlin](https://www.baeldung.com/kotlin-static-methods) - [Inline Functions in Kotlin](https://www.baeldung.com/kotlin-inline-functions) - [Delegation Pattern in Kotlin](https://www.baeldung.com/kotlin-delegation-pattern) +- More articles: [[next -->]](/core-kotlin-2) diff --git a/jenkins/README.md b/jenkins/README.md index 6b28b61277..ba3e13cc95 100644 --- a/jenkins/README.md +++ b/jenkins/README.md @@ -1,2 +1,3 @@ +## Jenkins This is an aggregator modules for Jenkins-related modules. diff --git a/jenkins/hello-world/README.md b/jenkins/hello-world/README.md index da60e556df..5f6b9f364a 100644 --- a/jenkins/hello-world/README.md +++ b/jenkins/hello-world/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Jenkins Plugins + +This module contains articles about Jenkins plugins. + +### Relevant articles: - [Writing a Jenkins Plugin](http://www.baeldung.com/jenkins-custom-plugin) diff --git a/jhipster/README.md b/jhipster/README.md new file mode 100644 index 0000000000..1bb31951f0 --- /dev/null +++ b/jhipster/README.md @@ -0,0 +1,9 @@ +## JHipster + +This module contains articles about JHipster. + +### Relevant articles: + +- [JHipster with a Microservice Architecture](https://www.baeldung.com/jhipster-microservices) +- [Intro to JHipster](https://www.baeldung.com/jhipster) +- [Building a Basic UAA-Secured JHipster Microservice](https://www.baeldung.com/jhipster-uaa-secured-micro-service) diff --git a/jws/README.md b/jws/README.md index 428d8b650d..5916efad24 100644 --- a/jws/README.md +++ b/jws/README.md @@ -1,3 +1,7 @@ +## Java Web Start + +This module contains articles about Java Web Start. + ### Relevant articles - [A Guide to the Java Web Start](http://www.baeldung.com/java-web-start) diff --git a/libraries/README.md b/libraries/README.md index ebf087ccd8..5bd53731f1 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -1,3 +1,12 @@ +## Libraries + +This module contains articles about various Java libraries. +These are small libraries that are relatively easy to use and does not require any separate module of their own. + +The code examples related to different libraries should go in a new package. + +Remember, for advanced libraries like JUnit, Jackson, etc. we already have separate modules. Please make sure to have a look at the existing modules in such cases. + ### Relevant articles - [Introduction to Javatuples](http://www.baeldung.com/java-tuples) @@ -37,9 +46,3 @@ - [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) - [Introduction to Functional Java](https://www.baeldung.com/java-functional-library) - [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library) - -The libraries module contains examples related to small libraries that are relatively easy to use and does not require any separate module of its own. - -The code examples related to different libraries should go in a new package. - -Remember, for advanced libraries like JUnit, Jackson, etc. we already have separate modules. Please make sure to have a look at the existing modules in such cases. diff --git a/persistence-modules/hibernate-mapping/README.md b/persistence-modules/hibernate-mapping/README.md index 99374f9135..c227620324 100644 --- a/persistence-modules/hibernate-mapping/README.md +++ b/persistence-modules/hibernate-mapping/README.md @@ -4,4 +4,4 @@ - [Persisting Maps with Hibernate](https://www.baeldung.com/hibernate-persisting-maps) - [Difference Between @Size, @Length, and @Column(length=value)](https://www.baeldung.com/jpa-size-length-column-differences) - [Hibernate Validator Specific Constraints](https://www.baeldung.com/hibernate-validator-constraints) -- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) \ No newline at end of file +- [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index 65322f0cea..a8e2eae38b 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Hibernate 5 + +This module contains articles about Hibernate 5. + +### Relevant articles: - [Dynamic Mapping with Hibernate](http://www.baeldung.com/hibernate-dynamic-mapping) - [An Overview of Identifiers in Hibernate](http://www.baeldung.com/hibernate-identifiers) diff --git a/persistence-modules/java-jpa-2/README.md b/persistence-modules/java-jpa-2/README.md index 579dcbdab0..9a677901c2 100644 --- a/persistence-modules/java-jpa-2/README.md +++ b/persistence-modules/java-jpa-2/README.md @@ -1,4 +1,9 @@ -# Relevant Articles +## JPA in Java + +This module contains articles about JPA (Java Persistence API) in Java. + +### Relevant Articles - [JPA Query Parameters Usage](http://www.baeldung.com/jpa-query-parameters-usage) - [Mapping Entitiy Class Names to SQL Table Names with JPA](https://www.baeldung.com/jpa-entity-table-names) +- More articles: [[<-- prev]](/java-jpa) diff --git a/persistence-modules/java-jpa/README.md b/persistence-modules/java-jpa/README.md index 5a99217f45..640753c2f2 100644 --- a/persistence-modules/java-jpa/README.md +++ b/persistence-modules/java-jpa/README.md @@ -1,4 +1,8 @@ -# Relevant Articles +## JPA in Java + +This module contains articles about JPA (Java Persistence API) in Java. + +### Relevant Articles - [A Guide to SqlResultSetMapping](http://www.baeldung.com/jpa-sql-resultset-mapping) - [A Guide to Stored Procedures with JPA](http://www.baeldung.com/jpa-stored-procedures) @@ -14,3 +18,4 @@ - [JPA @Basic Annotation](https://www.baeldung.com/jpa-basic-annotation) - [Default Column Values in JPA](https://www.baeldung.com/jpa-default-column-values) - [Persisting Enums in JPA](https://www.baeldung.com/jpa-persisting-enums-in-jpa) +- More articles: [[next -->]](/java-jpa-2) From abe15c28fe5c26c8ec9e30609f9718cf756c5e3c Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Sat, 28 Sep 2019 12:49:21 +0200 Subject: [PATCH 290/396] #BAEL-17505 Add README descriptions to several modules. --- .../spring-swagger-codegen-api-client/README.md | 4 +++- spring-swagger-codegen/spring-swagger-codegen-app/README.md | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 spring-swagger-codegen/spring-swagger-codegen-app/README.md diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/README.md b/spring-swagger-codegen/spring-swagger-codegen-api-client/README.md index 455a69b2f3..cffab6b9c7 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/README.md +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/README.md @@ -1,4 +1,6 @@ -# spring-swagger-codegen-api-client +## Spring Swagger Codegen API Client + +This module contains the code for [Generate Spring Boot REST Client with Swagger](http://www.baeldung.com/spring-boot-rest-client-swagger-codegen). ## Requirements diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/README.md b/spring-swagger-codegen/spring-swagger-codegen-app/README.md new file mode 100644 index 0000000000..1cb9e35d99 --- /dev/null +++ b/spring-swagger-codegen/spring-swagger-codegen-app/README.md @@ -0,0 +1,3 @@ +## Spring Swagger Codegen App + +This module contains the code for [Generate Spring Boot REST Client with Swagger](http://www.baeldung.com/spring-boot-rest-client-swagger-codegen). From d7107a5931a92570e7aa5be428e9e50ef0abf201 Mon Sep 17 00:00:00 2001 From: YassinHajaj Date: Sat, 28 Sep 2019 13:57:53 +0200 Subject: [PATCH 291/396] BAEL-3219 --- xml/pom.xml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/xml/pom.xml b/xml/pom.xml index 24969d1d6b..bbd607f9b5 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -325,7 +325,7 @@
    - maven-assembly-plugin @@ -345,9 +345,9 @@ - make-assembly - package attached From 83535d53c8a94286ef1d023edc7d0936ddd32b64 Mon Sep 17 00:00:00 2001 From: "yassin.hajaj" Date: Sat, 28 Sep 2019 14:19:11 +0200 Subject: [PATCH 292/396] BAEL-3219 --- xml/src/main/java/com/baeldung/sax/SaxParserMain.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java index 5aba9409de..4908c10386 100644 --- a/xml/src/main/java/com/baeldung/sax/SaxParserMain.java +++ b/xml/src/main/java/com/baeldung/sax/SaxParserMain.java @@ -21,7 +21,6 @@ public class SaxParserMain { System.out.println(baeldungHandler.getWebsite()); } - //@ToString public static class BaeldungHandler extends DefaultHandler { private static final String ARTICLES = "articles"; private static final String ARTICLE = "article"; @@ -75,7 +74,6 @@ public class SaxParserMain { } } - //@Data public static class Baeldung { private List articleList; @@ -88,7 +86,6 @@ public class SaxParserMain { } } - //@Data public static class BaeldungArticle { private String title; private String content; From 9cb83205fe4e4c46465a9672362c3e5da5d32faf Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 28 Sep 2019 20:31:00 +0530 Subject: [PATCH 293/396] [BAEL-17473] - Retired spring-boot-ops, spring-boot-ops-2, and spring-boot-management modules --- .../gracefulshutdown/GracefulShutdownApplication.java | 0 .../gracefulshutdown/beans/LongRunningProcessBean.java | 0 .../gracefulshutdown/config/SpringConfiguration.java | 0 spring-boot-management/README.md | 7 ------- spring-boot-runtime/README.md | 2 +- spring-mvc-simple-2/pom.xml | 6 ++++++ .../src/main/resources/application.properties | 1 + 7 files changed, 8 insertions(+), 8 deletions(-) rename {spring-boot-ops-2 => spring-boot-deployment}/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java (100%) rename {spring-boot-ops-2 => spring-boot-deployment}/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java (100%) rename {spring-boot-ops-2 => spring-boot-deployment}/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java (100%) delete mode 100644 spring-boot-management/README.md create mode 100644 spring-mvc-simple-2/src/main/resources/application.properties diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java b/spring-boot-deployment/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java similarity index 100% rename from spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java rename to spring-boot-deployment/src/main/java/com/baeldung/gracefulshutdown/GracefulShutdownApplication.java diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java b/spring-boot-deployment/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java similarity index 100% rename from spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java rename to spring-boot-deployment/src/main/java/com/baeldung/gracefulshutdown/beans/LongRunningProcessBean.java diff --git a/spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java b/spring-boot-deployment/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java similarity index 100% rename from spring-boot-ops-2/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java rename to spring-boot-deployment/src/main/java/com/baeldung/gracefulshutdown/config/SpringConfiguration.java diff --git a/spring-boot-management/README.md b/spring-boot-management/README.md deleted file mode 100644 index 53d4c439ff..0000000000 --- a/spring-boot-management/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## Spring Boot Logging HTTP Requests - -This module contains articles about the management of Spring Boot applications. - -### Relevant Articles: -- [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) - diff --git a/spring-boot-runtime/README.md b/spring-boot-runtime/README.md index fb5e0b14de..002615b934 100644 --- a/spring-boot-runtime/README.md +++ b/spring-boot-runtime/README.md @@ -2,4 +2,4 @@ - [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown) - [Comparing Embedded Servlet Containers in Spring Boot](https://www.baeldung.com/spring-boot-servlet-containers) - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - + - [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) \ No newline at end of file diff --git a/spring-mvc-simple-2/pom.xml b/spring-mvc-simple-2/pom.xml index 4b2eafe97f..3ae577cb03 100644 --- a/spring-mvc-simple-2/pom.xml +++ b/spring-mvc-simple-2/pom.xml @@ -20,6 +20,12 @@ org.springframework.boot spring-boot-starter-web
    + + + org.springframework.boot + spring-boot-starter-test + test + org.springframework.boot diff --git a/spring-mvc-simple-2/src/main/resources/application.properties b/spring-mvc-simple-2/src/main/resources/application.properties new file mode 100644 index 0000000000..709574239b --- /dev/null +++ b/spring-mvc-simple-2/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.main.allow-bean-definition-overriding=true \ No newline at end of file From c5e7773a5151fdbfae81939f1bb7c4d81c50c565 Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Sat, 28 Sep 2019 21:06:14 +0300 Subject: [PATCH 294/396] Split or move persistence-modules/java-jpa module (#7887) --- persistence-modules/java-jpa-2/README.md | 6 +- .../jpa/criteria}/CustomItemRepository.java | 22 ++- .../criteria}/CustomItemRepositoryImpl.java | 149 +++++++++--------- .../java/com/baeldung/jpa/criteria}/Item.java | 98 ++++++------ .../com/baeldung/jpa/defaultvalues/User.java | 0 .../jpa/defaultvalues/UserRepository.java | 0 .../com/baeldung/jpa/projections/Product.java | 0 .../jpa/projections/ProductRepository.java | 0 .../jpa/querytypes/QueryTypesExamples.java | 0 .../baeldung/jpa/querytypes/UserEntity.java | 0 .../main/resources/META-INF/persistence.xml | 87 ++++++++++ .../src/main}/resources/item.sql | 6 +- .../src/main/resources/products_jpa.sql | 0 .../CustomItemRepositoryIntegrationTest.java | 88 +++++------ .../UserDefaultValuesUnitTest.java | 0 .../HibernateProjectionsIntegrationTest.java | 0 .../ProductRepositoryIntegrationTest.java | 0 .../QueryTypesExamplesIntegrationTest.java | 0 .../src/test/resources/products.sql | 0 .../src/test/resources/users.sql | 0 persistence-modules/java-jpa/README.md | 8 +- .../convertdates}/LocalDateConverter.java | 2 +- .../baeldung/{util => jpa/entity}/Gender.java | 2 +- .../java/com/baeldung/jpa/entity/Student.java | 2 - .../jpa/{entity => primarykeys}/Account.java | 2 +- .../{entity => primarykeys}/AccountId.java | 2 +- .../jpa/{entity => primarykeys}/Book.java | 2 +- .../jpa/{entity => primarykeys}/BookId.java | 2 +- .../sqlresultsetmapping/Employee.java | 4 +- .../sqlresultsetmapping/ScheduledDay.java | 8 +- .../main/resources/META-INF/persistence.xml | 97 +----------- .../entity/StudentEntityIntegrationTest.java | 2 - .../CompositeKeysIntegrationTest.java | 6 +- .../SqlResultSetMappingUnitTest.java | 2 +- 34 files changed, 296 insertions(+), 301 deletions(-) rename persistence-modules/{java-jpa/src/main/java/com/baeldung/jpa/criteria/repository => java-jpa-2/src/main/java/com/baeldung/jpa/criteria}/CustomItemRepository.java (59%) rename persistence-modules/{java-jpa/src/main/java/com/baeldung/jpa/criteria/repository/impl => java-jpa-2/src/main/java/com/baeldung/jpa/criteria}/CustomItemRepositoryImpl.java (91%) rename persistence-modules/{java-jpa/src/main/java/com/baeldung/jpa/criteria/entity => java-jpa-2/src/main/java/com/baeldung/jpa/criteria}/Item.java (89%) rename persistence-modules/{java-jpa => java-jpa-2}/src/main/java/com/baeldung/jpa/defaultvalues/User.java (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/main/java/com/baeldung/jpa/defaultvalues/UserRepository.java (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/main/java/com/baeldung/jpa/projections/Product.java (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/main/java/com/baeldung/jpa/projections/ProductRepository.java (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/main/java/com/baeldung/jpa/querytypes/QueryTypesExamples.java (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/main/java/com/baeldung/jpa/querytypes/UserEntity.java (100%) rename persistence-modules/{java-jpa/src/test => java-jpa-2/src/main}/resources/item.sql (98%) rename persistence-modules/{java-jpa => java-jpa-2}/src/main/resources/products_jpa.sql (100%) rename persistence-modules/{java-jpa/src/test/java/com/baeldung/jpa/criteria/repository/impl => java-jpa-2/src/test/java/com/baeldung/jpa/criteria}/CustomItemRepositoryIntegrationTest.java (86%) rename persistence-modules/{java-jpa => java-jpa-2}/src/test/java/com/baeldung/jpa/defaultvalues/UserDefaultValuesUnitTest.java (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/test/java/com/baeldung/jpa/projections/HibernateProjectionsIntegrationTest.java (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/test/java/com/baeldung/jpa/projections/ProductRepositoryIntegrationTest.java (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/test/java/com/baeldung/jpa/querytypes/QueryTypesExamplesIntegrationTest.java (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/test/resources/products.sql (100%) rename persistence-modules/{java-jpa => java-jpa-2}/src/test/resources/users.sql (100%) rename persistence-modules/java-jpa/src/main/java/com/baeldung/{util => jpa/convertdates}/LocalDateConverter.java (94%) rename persistence-modules/java-jpa/src/main/java/com/baeldung/{util => jpa/entity}/Gender.java (54%) rename persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/{entity => primarykeys}/Account.java (95%) rename persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/{entity => primarykeys}/AccountId.java (97%) rename persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/{entity => primarykeys}/Book.java (93%) rename persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/{entity => primarykeys}/BookId.java (97%) rename persistence-modules/java-jpa/src/main/java/com/baeldung/{ => jpa}/sqlresultsetmapping/Employee.java (85%) rename persistence-modules/java-jpa/src/main/java/com/baeldung/{ => jpa}/sqlresultsetmapping/ScheduledDay.java (89%) rename persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/{entity => primarykeys}/CompositeKeysIntegrationTest.java (93%) rename persistence-modules/java-jpa/src/test/java/com/baeldung/{ => jpa}/sqlresultsetmapping/SqlResultSetMappingUnitTest.java (98%) diff --git a/persistence-modules/java-jpa-2/README.md b/persistence-modules/java-jpa-2/README.md index 579dcbdab0..0e1889c1fc 100644 --- a/persistence-modules/java-jpa-2/README.md +++ b/persistence-modules/java-jpa-2/README.md @@ -1,4 +1,8 @@ # Relevant Articles -- [JPA Query Parameters Usage](http://www.baeldung.com/jpa-query-parameters-usage) +- [JPA Query Parameters Usage](https://www.baeldung.com/jpa-query-parameters-usage) - [Mapping Entitiy Class Names to SQL Table Names with JPA](https://www.baeldung.com/jpa-entity-table-names) +- [Default Column Values in JPA](https://www.baeldung.com/jpa-default-column-values) +- [Types of JPA Queries](https://www.baeldung.com/jpa-queries) +- [JPA/Hibernate Projections](https://www.baeldung.com/jpa-hibernate-projections) +- [Combining JPA And/Or Criteria Predicates](https://www.baeldung.com/jpa-and-or-criteria-predicates) diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/criteria/repository/CustomItemRepository.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/criteria/CustomItemRepository.java similarity index 59% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/criteria/repository/CustomItemRepository.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/criteria/CustomItemRepository.java index c55dc4a592..c85ac53ac2 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/criteria/repository/CustomItemRepository.java +++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/criteria/CustomItemRepository.java @@ -1,12 +1,10 @@ -package com.baeldung.jpa.criteria.repository; - -import java.util.List; - -import com.baeldung.jpa.criteria.entity.Item; - -public interface CustomItemRepository { - - List findItemsByColorAndGrade(); - - List findItemByColorOrGrade(); -} +package com.baeldung.jpa.criteria; + +import java.util.List; + +public interface CustomItemRepository { + + List findItemsByColorAndGrade(); + + List findItemByColorOrGrade(); +} diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/criteria/repository/impl/CustomItemRepositoryImpl.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/criteria/CustomItemRepositoryImpl.java similarity index 91% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/criteria/repository/impl/CustomItemRepositoryImpl.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/criteria/CustomItemRepositoryImpl.java index bf1d3eed0b..c64cd14ca5 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/criteria/repository/impl/CustomItemRepositoryImpl.java +++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/criteria/CustomItemRepositoryImpl.java @@ -1,77 +1,72 @@ -package com.baeldung.jpa.criteria.repository.impl; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import javax.persistence.EntityManager; -import javax.persistence.EntityManagerFactory; -import javax.persistence.Persistence; -import javax.persistence.criteria.CriteriaBuilder; -import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Predicate; -import javax.persistence.criteria.Root; - -import com.baeldung.jpa.criteria.entity.Item; -import com.baeldung.jpa.criteria.repository.CustomItemRepository; - -public class CustomItemRepositoryImpl implements CustomItemRepository { - - private EntityManager entityManager; - - public CustomItemRepositoryImpl() { - super(); - EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2-criteria"); - entityManager = factory.createEntityManager(); - } - - @Override - public List findItemsByColorAndGrade() { - - CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); - CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Item.class); - Root itemRoot = criteriaQuery.from(Item.class); - - Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "blue"); - Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "red"); - Predicate predicateForColor = criteriaBuilder.or(predicateForBlueColor, predicateForRedColor); - - Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "A"); - Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B"); - Predicate predicateForGrade = criteriaBuilder.or(predicateForGradeA, predicateForGradeB); - - // final search filter - Predicate finalPredicate = criteriaBuilder.and(predicateForColor, predicateForGrade); - - criteriaQuery.where(finalPredicate); - - List items = entityManager.createQuery(criteriaQuery) - .getResultList(); - return items; - } - - @Override - public List findItemByColorOrGrade() { - - CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); - CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Item.class); - Root itemRoot = criteriaQuery.from(Item.class); - - Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "red"); - Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "D"); - Predicate predicateForBlueColorAndGradeA = criteriaBuilder.and(predicateForBlueColor, predicateForGradeA); - - Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "blue"); - Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B"); - Predicate predicateForRedColorAndGradeB = criteriaBuilder.and(predicateForRedColor, predicateForGradeB); - - // final search filter - Predicate finalPredicate = criteriaBuilder.or(predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB); - - criteriaQuery.where(finalPredicate); - - List items = entityManager.createQuery(criteriaQuery) - .getResultList(); - return items; - } -} +package com.baeldung.jpa.criteria; + +import java.util.List; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; + +public class CustomItemRepositoryImpl implements CustomItemRepository { + + private EntityManager entityManager; + + public CustomItemRepositoryImpl() { + super(); + EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa-h2-criteria"); + entityManager = factory.createEntityManager(); + } + + @Override + public List findItemsByColorAndGrade() { + + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Item.class); + Root itemRoot = criteriaQuery.from(Item.class); + + Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "blue"); + Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "red"); + Predicate predicateForColor = criteriaBuilder.or(predicateForBlueColor, predicateForRedColor); + + Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "A"); + Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B"); + Predicate predicateForGrade = criteriaBuilder.or(predicateForGradeA, predicateForGradeB); + + // final search filter + Predicate finalPredicate = criteriaBuilder.and(predicateForColor, predicateForGrade); + + criteriaQuery.where(finalPredicate); + + List items = entityManager.createQuery(criteriaQuery) + .getResultList(); + return items; + } + + @Override + public List findItemByColorOrGrade() { + + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Item.class); + Root itemRoot = criteriaQuery.from(Item.class); + + Predicate predicateForBlueColor = criteriaBuilder.equal(itemRoot.get("color"), "red"); + Predicate predicateForGradeA = criteriaBuilder.equal(itemRoot.get("grade"), "D"); + Predicate predicateForBlueColorAndGradeA = criteriaBuilder.and(predicateForBlueColor, predicateForGradeA); + + Predicate predicateForRedColor = criteriaBuilder.equal(itemRoot.get("color"), "blue"); + Predicate predicateForGradeB = criteriaBuilder.equal(itemRoot.get("grade"), "B"); + Predicate predicateForRedColorAndGradeB = criteriaBuilder.and(predicateForRedColor, predicateForGradeB); + + // final search filter + Predicate finalPredicate = criteriaBuilder.or(predicateForBlueColorAndGradeA, predicateForRedColorAndGradeB); + + criteriaQuery.where(finalPredicate); + + List items = entityManager.createQuery(criteriaQuery) + .getResultList(); + return items; + } +} diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/criteria/entity/Item.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/criteria/Item.java similarity index 89% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/criteria/entity/Item.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/criteria/Item.java index 64ef46f265..f6093e5735 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/criteria/entity/Item.java +++ b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/criteria/Item.java @@ -1,49 +1,49 @@ -package com.baeldung.jpa.criteria.entity; - -import javax.persistence.Entity; -import javax.persistence.Id; -import javax.persistence.Table; - -@Table(name = "item") -@Entity -public class Item { - - @Id - private Long id; - private String color; - private String grade; - private String name; - - public String getColor() { - return color; - } - - public String getGrade() { - return grade; - } - - public Long getId() { - return id; - } - - public String getName() { - return name; - } - - public void setColor(String color) { - this.color = color; - } - - public void setGrade(String grade) { - this.grade = grade; - } - - public void setId(Long id) { - this.id = id; - } - - public void setName(String name) { - this.name = name; - } - -} +package com.baeldung.jpa.criteria; + +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Table(name = "item") +@Entity +public class Item { + + @Id + private Long id; + private String color; + private String grade; + private String name; + + public String getColor() { + return color; + } + + public String getGrade() { + return grade; + } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public void setColor(String color) { + this.color = color; + } + + public void setGrade(String grade) { + this.grade = grade; + } + + public void setId(Long id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/defaultvalues/User.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/defaultvalues/User.java similarity index 100% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/defaultvalues/User.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/defaultvalues/User.java diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/defaultvalues/UserRepository.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/defaultvalues/UserRepository.java similarity index 100% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/defaultvalues/UserRepository.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/defaultvalues/UserRepository.java diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/projections/Product.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/projections/Product.java similarity index 100% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/projections/Product.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/projections/Product.java diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/projections/ProductRepository.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/projections/ProductRepository.java similarity index 100% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/projections/ProductRepository.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/projections/ProductRepository.java diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/querytypes/QueryTypesExamples.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/querytypes/QueryTypesExamples.java similarity index 100% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/querytypes/QueryTypesExamples.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/querytypes/QueryTypesExamples.java diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/querytypes/UserEntity.java b/persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/querytypes/UserEntity.java similarity index 100% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/querytypes/UserEntity.java rename to persistence-modules/java-jpa-2/src/main/java/com/baeldung/jpa/querytypes/UserEntity.java diff --git a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml index 560a75070c..62d7ce0f5e 100644 --- a/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa-2/src/main/resources/META-INF/persistence.xml @@ -32,4 +32,91 @@ value="queryparams.sql" />
    + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.defaultvalues.User + true + + + + + + + + + + + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.querytypes.UserEntity + true + + + + + + + + + + + + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.projections.Product + true + + + + + + + + + + + + + + + org.hibernate.jpa.HibernatePersistenceProvider + com.baeldung.jpa.criteria.Item + true + + + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/test/resources/item.sql b/persistence-modules/java-jpa-2/src/main/resources/item.sql similarity index 98% rename from persistence-modules/java-jpa/src/test/resources/item.sql rename to persistence-modules/java-jpa-2/src/main/resources/item.sql index faf50f6829..871dcee017 100644 --- a/persistence-modules/java-jpa/src/test/resources/item.sql +++ b/persistence-modules/java-jpa-2/src/main/resources/item.sql @@ -1,4 +1,4 @@ -insert into item(id,grade,color) values (10,'C','blue'); -insert into item(id,grade,color) values (11,'C','red'); -insert into item(id,grade,color) values (12,'A','blue'); +insert into item(id,grade,color) values (10,'C','blue'); +insert into item(id,grade,color) values (11,'C','red'); +insert into item(id,grade,color) values (12,'A','blue'); insert into item(id,grade,color) values (13,'D','red'); \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/main/resources/products_jpa.sql b/persistence-modules/java-jpa-2/src/main/resources/products_jpa.sql similarity index 100% rename from persistence-modules/java-jpa/src/main/resources/products_jpa.sql rename to persistence-modules/java-jpa-2/src/main/resources/products_jpa.sql diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/criteria/repository/impl/CustomItemRepositoryIntegrationTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/criteria/CustomItemRepositoryIntegrationTest.java similarity index 86% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/criteria/repository/impl/CustomItemRepositoryIntegrationTest.java rename to persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/criteria/CustomItemRepositoryIntegrationTest.java index 169fb44618..8d6bf3c4a7 100644 --- a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/criteria/repository/impl/CustomItemRepositoryIntegrationTest.java +++ b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/criteria/CustomItemRepositoryIntegrationTest.java @@ -1,44 +1,44 @@ -package com.baeldung.jpa.criteria.repository.impl; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; - -import java.util.List; - -import org.junit.Test; - -import com.baeldung.jpa.criteria.entity.Item; -import com.baeldung.jpa.criteria.repository.CustomItemRepository; - -public class CustomItemRepositoryIntegrationTest { - - CustomItemRepository customItemRepository = new CustomItemRepositoryImpl(); - - @Test - public void givenItems_whenFindItemsByColorAndGrade_thenReturnItems() { - - List items = customItemRepository.findItemsByColorAndGrade(); - - assertFalse("No items found", items.isEmpty()); - assertEquals("There should be only one item", 1, items.size()); - - Item item = items.get(0); - - assertEquals("this item do not have blue color", "blue", item.getColor()); - assertEquals("this item does not belong to A grade", "A", item.getGrade()); - } - - @Test - public void givenItems_whenFindItemByColorOrGrade_thenReturnItems() { - - List items = customItemRepository.findItemByColorOrGrade(); - - assertFalse("No items found", items.isEmpty()); - assertEquals("There should be only one item", 1, items.size()); - - Item item = items.get(0); - - assertEquals("this item do not have red color", "red", item.getColor()); - assertEquals("this item does not belong to D grade", "D", item.getGrade()); - } -} +package com.baeldung.jpa.criteria; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +import java.util.List; + +import org.junit.Test; + +import com.baeldung.jpa.criteria.Item; +import com.baeldung.jpa.criteria.CustomItemRepository; + +public class CustomItemRepositoryIntegrationTest { + + CustomItemRepository customItemRepository = new CustomItemRepositoryImpl(); + + @Test + public void givenItems_whenFindItemsByColorAndGrade_thenReturnItems() { + + List items = customItemRepository.findItemsByColorAndGrade(); + + assertFalse("No items found", items.isEmpty()); + assertEquals("There should be only one item", 1, items.size()); + + Item item = items.get(0); + + assertEquals("this item do not have blue color", "blue", item.getColor()); + assertEquals("this item does not belong to A grade", "A", item.getGrade()); + } + + @Test + public void givenItems_whenFindItemByColorOrGrade_thenReturnItems() { + + List items = customItemRepository.findItemByColorOrGrade(); + + assertFalse("No items found", items.isEmpty()); + assertEquals("There should be only one item", 1, items.size()); + + Item item = items.get(0); + + assertEquals("this item do not have red color", "red", item.getColor()); + assertEquals("this item does not belong to D grade", "D", item.getGrade()); + } +} diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/defaultvalues/UserDefaultValuesUnitTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/defaultvalues/UserDefaultValuesUnitTest.java similarity index 100% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/defaultvalues/UserDefaultValuesUnitTest.java rename to persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/defaultvalues/UserDefaultValuesUnitTest.java diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/projections/HibernateProjectionsIntegrationTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/projections/HibernateProjectionsIntegrationTest.java similarity index 100% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/projections/HibernateProjectionsIntegrationTest.java rename to persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/projections/HibernateProjectionsIntegrationTest.java diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/projections/ProductRepositoryIntegrationTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/projections/ProductRepositoryIntegrationTest.java similarity index 100% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/projections/ProductRepositoryIntegrationTest.java rename to persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/projections/ProductRepositoryIntegrationTest.java diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/querytypes/QueryTypesExamplesIntegrationTest.java b/persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/querytypes/QueryTypesExamplesIntegrationTest.java similarity index 100% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/querytypes/QueryTypesExamplesIntegrationTest.java rename to persistence-modules/java-jpa-2/src/test/java/com/baeldung/jpa/querytypes/QueryTypesExamplesIntegrationTest.java diff --git a/persistence-modules/java-jpa/src/test/resources/products.sql b/persistence-modules/java-jpa-2/src/test/resources/products.sql similarity index 100% rename from persistence-modules/java-jpa/src/test/resources/products.sql rename to persistence-modules/java-jpa-2/src/test/resources/products.sql diff --git a/persistence-modules/java-jpa/src/test/resources/users.sql b/persistence-modules/java-jpa-2/src/test/resources/users.sql similarity index 100% rename from persistence-modules/java-jpa/src/test/resources/users.sql rename to persistence-modules/java-jpa-2/src/test/resources/users.sql diff --git a/persistence-modules/java-jpa/README.md b/persistence-modules/java-jpa/README.md index 5a99217f45..670203f10d 100644 --- a/persistence-modules/java-jpa/README.md +++ b/persistence-modules/java-jpa/README.md @@ -1,16 +1,12 @@ # Relevant Articles -- [A Guide to SqlResultSetMapping](http://www.baeldung.com/jpa-sql-resultset-mapping) -- [A Guide to Stored Procedures with JPA](http://www.baeldung.com/jpa-stored-procedures) +- [A Guide to SqlResultSetMapping](https://www.baeldung.com/jpa-sql-resultset-mapping) +- [A Guide to Stored Procedures with JPA](https://www.baeldung.com/jpa-stored-procedures) - [Fixing the JPA error “java.lang.String cannot be cast to Ljava.lang.String;”](https://www.baeldung.com/jpa-error-java-lang-string-cannot-be-cast) - [JPA Entity Graph](https://www.baeldung.com/jpa-entity-graph) - [JPA 2.2 Support for Java 8 Date/Time Types](https://www.baeldung.com/jpa-java-time) - [Converting Between LocalDate and SQL Date](https://www.baeldung.com/java-convert-localdate-sql-date) -- [Combining JPA And/Or Criteria Predicates](https://www.baeldung.com/jpa-and-or-criteria-predicates) -- [Types of JPA Queries](https://www.baeldung.com/jpa-queries) -- [JPA/Hibernate Projections](https://www.baeldung.com/jpa-hibernate-projections) - [Composite Primary Keys in JPA](https://www.baeldung.com/jpa-composite-primary-keys) - [Defining JPA Entities](https://www.baeldung.com/jpa-entities) - [JPA @Basic Annotation](https://www.baeldung.com/jpa-basic-annotation) -- [Default Column Values in JPA](https://www.baeldung.com/jpa-default-column-values) - [Persisting Enums in JPA](https://www.baeldung.com/jpa-persisting-enums-in-jpa) diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/util/LocalDateConverter.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/convertdates/LocalDateConverter.java similarity index 94% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/util/LocalDateConverter.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/convertdates/LocalDateConverter.java index 00fd378b05..de6ada2361 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/util/LocalDateConverter.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/convertdates/LocalDateConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.util; +package com.baeldung.jpa.convertdates; import javax.persistence.AttributeConverter; import javax.persistence.Converter; diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/util/Gender.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Gender.java similarity index 54% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/util/Gender.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Gender.java index 13f08d995c..8f808f539d 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/util/Gender.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Gender.java @@ -1,4 +1,4 @@ -package com.baeldung.util; +package com.baeldung.jpa.entity; public enum Gender { MALE, diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Student.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Student.java index 531bae40c5..64e7ab586c 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Student.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Student.java @@ -14,8 +14,6 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; -import com.baeldung.util.Gender; - @Entity @Table(name="STUDENT") public class Student { diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Account.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/Account.java similarity index 95% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Account.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/Account.java index 48a98512fa..915c605e65 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Account.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/Account.java @@ -1,4 +1,4 @@ -package com.baeldung.jpa.entity; +package com.baeldung.jpa.primarykeys; import javax.persistence.Entity; import javax.persistence.Id; diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/AccountId.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/AccountId.java similarity index 97% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/AccountId.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/AccountId.java index 091c326367..1e8a06be63 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/AccountId.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/AccountId.java @@ -1,4 +1,4 @@ -package com.baeldung.jpa.entity; +package com.baeldung.jpa.primarykeys; import java.io.Serializable; diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Book.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/Book.java similarity index 93% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Book.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/Book.java index 460f302e28..a84eb3ef01 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/Book.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/Book.java @@ -1,4 +1,4 @@ -package com.baeldung.jpa.entity; +package com.baeldung.jpa.primarykeys; import javax.persistence.EmbeddedId; import javax.persistence.Entity; diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/BookId.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/BookId.java similarity index 97% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/BookId.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/BookId.java index ff587beaf2..d8c925c148 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entity/BookId.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/primarykeys/BookId.java @@ -1,4 +1,4 @@ -package com.baeldung.jpa.entity; +package com.baeldung.jpa.primarykeys; import java.io.Serializable; diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/Employee.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/sqlresultsetmapping/Employee.java similarity index 85% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/Employee.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/sqlresultsetmapping/Employee.java index bec1b8845a..b62a21d481 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/Employee.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/sqlresultsetmapping/Employee.java @@ -1,4 +1,4 @@ -package com.baeldung.sqlresultsetmapping; +package com.baeldung.jpa.sqlresultsetmapping; import javax.persistence.*; @@ -7,7 +7,7 @@ import javax.persistence.*; name="EmployeeResult", entities={ @EntityResult( - entityClass = com.baeldung.sqlresultsetmapping.Employee.class, + entityClass = com.baeldung.jpa.sqlresultsetmapping.Employee.class, fields={@FieldResult(name="id",column="employeeNumber"), @FieldResult(name="name", column="name")} ) diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/ScheduledDay.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/sqlresultsetmapping/ScheduledDay.java similarity index 89% rename from persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/ScheduledDay.java rename to persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/sqlresultsetmapping/ScheduledDay.java index 7e332bc67a..a7ca59ab3f 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/sqlresultsetmapping/ScheduledDay.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/sqlresultsetmapping/ScheduledDay.java @@ -1,18 +1,18 @@ -package com.baeldung.sqlresultsetmapping; +package com.baeldung.jpa.sqlresultsetmapping; import javax.persistence.*; @SqlResultSetMappings(value = { @SqlResultSetMapping(name = "ScheduleResult", - classes = { @ConstructorResult(targetClass = com.baeldung.sqlresultsetmapping.ScheduledDay.class, + classes = { @ConstructorResult(targetClass = com.baeldung.jpa.sqlresultsetmapping.ScheduledDay.class, columns = { @ColumnResult(name = "id", type = Long.class), @ColumnResult(name = "employeeId", type = Long.class), @ColumnResult(name = "dayOfWeek") }) }), @SqlResultSetMapping(name = "FridayEmployeeResult", columns = { @ColumnResult(name = "employeeId") }), @SqlResultSetMapping(name = "EmployeeScheduleResults", - entities = { @EntityResult(entityClass = com.baeldung.sqlresultsetmapping.Employee.class), - @EntityResult(entityClass = com.baeldung.sqlresultsetmapping.ScheduledDay.class) + entities = { @EntityResult(entityClass = com.baeldung.jpa.sqlresultsetmapping.Employee.class), + @EntityResult(entityClass = com.baeldung.jpa.sqlresultsetmapping.ScheduledDay.class) }) }) @NamedNativeQuery(name = "FridayEmployees", query = "SELECT employeeId FROM schedule_days WHERE dayOfWeek = 'FRIDAY'", diff --git a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml index 1f16bee3ba..b780a6f569 100644 --- a/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml +++ b/persistence-modules/java-jpa/src/main/resources/META-INF/persistence.xml @@ -7,8 +7,8 @@ org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.sqlresultsetmapping.ScheduledDay - com.baeldung.sqlresultsetmapping.Employee + com.baeldung.jpa.sqlresultsetmapping.ScheduledDay + com.baeldung.jpa.sqlresultsetmapping.Employee com.baeldung.jpa.basicannotation.Course true @@ -115,77 +115,13 @@ - - org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.jpa.criteria.entity.Item - true - - - - - - - - - - - - - - - org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.jpa.querytypes.UserEntity - true - - - - - - - - - - - - - - - org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.jpa.defaultvalues.User - true - - - - - - - - - - - - org.hibernate.jpa.HibernatePersistenceProvider com.baeldung.jpa.entity.Student - com.baeldung.jpa.entity.Book - com.baeldung.jpa.entity.BookId - com.baeldung.jpa.entity.Account - com.baeldung.jpa.entity.AccountId + com.baeldung.jpa.primarykeys.Book + com.baeldung.jpa.primarykeys.BookId + com.baeldung.jpa.primarykeys.Account + com.baeldung.jpa.primarykeys.AccountId true - - org.hibernate.jpa.HibernatePersistenceProvider - com.baeldung.jpa.projections.Product - true - - - - - - - - - - - - \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entity/StudentEntityIntegrationTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entity/StudentEntityIntegrationTest.java index fdaaba5439..3c7a82edc3 100644 --- a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entity/StudentEntityIntegrationTest.java +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entity/StudentEntityIntegrationTest.java @@ -16,8 +16,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import com.baeldung.util.Gender; - public class StudentEntityIntegrationTest { private EntityManagerFactory emf; diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entity/CompositeKeysIntegrationTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/primarykeys/CompositeKeysIntegrationTest.java similarity index 93% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entity/CompositeKeysIntegrationTest.java rename to persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/primarykeys/CompositeKeysIntegrationTest.java index 2d30ebab5e..be529ab81c 100644 --- a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entity/CompositeKeysIntegrationTest.java +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/primarykeys/CompositeKeysIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.jpa.entity; +package com.baeldung.jpa.primarykeys; import static org.junit.Assert.assertNotNull; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -7,6 +7,10 @@ import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; +import com.baeldung.jpa.primarykeys.Account; +import com.baeldung.jpa.primarykeys.AccountId; +import com.baeldung.jpa.primarykeys.Book; +import com.baeldung.jpa.primarykeys.BookId; import org.junit.AfterClass; import org.junit.BeforeClass; import org.junit.Test; diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/sqlresultsetmapping/SqlResultSetMappingUnitTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/sqlresultsetmapping/SqlResultSetMappingUnitTest.java similarity index 98% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/sqlresultsetmapping/SqlResultSetMappingUnitTest.java rename to persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/sqlresultsetmapping/SqlResultSetMappingUnitTest.java index 4e01095278..f318df3747 100644 --- a/persistence-modules/java-jpa/src/test/java/com/baeldung/sqlresultsetmapping/SqlResultSetMappingUnitTest.java +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/sqlresultsetmapping/SqlResultSetMappingUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.sqlresultsetmapping; +package com.baeldung.jpa.sqlresultsetmapping; import static org.junit.Assert.*; From 85a4c72414e7c0171b624ebd3f5a005e0643b1b4 Mon Sep 17 00:00:00 2001 From: Amit Pandey Date: Sat, 28 Sep 2019 23:43:11 +0530 Subject: [PATCH 295/396] [BAEL-16672] - Re-organize maven module (#7703) * [BAEL-16672] - Re-organize maven module * [BAEL-16672] - Added missed modules in main pom * [BAEL-16672] - Added commented compiler-plugin-java-9 module in main pom.xml --- maven-all/README.md | 3 + maven-all/compiler-plugin-java-9/README.md | 3 + .../compiler-plugin-java-9/pom.xml | 0 .../maven/java9/MavenCompilerPlugin.java | 0 .../src/main/java/module-info.java | 0 maven-all/maven-war-plugin/README.md | 3 + {maven => maven-all}/maven-war-plugin/pom.xml | 56 +++++++++--------- {maven => maven-all/maven}/.gitignore | 0 {maven => maven-all/maven}/README.md | 5 -- .../maven}/custom-rule/pom.xml | 0 .../com/baeldung/enforcer/MyCustomRule.java | 0 .../maven}/input-resources/baeldung.png | Bin .../maven}/input-resources/baeldung.txt | 0 .../maven}/input-resources/verifications.xml | 0 maven-all/maven/maven-enforcer/README.md | 3 + .../maven}/maven-enforcer/pom.xml | 0 {maven => maven-all/maven}/pom.xml | 1 + .../com/baeldung/maven/it/RestITCase.java | 0 .../com/baeldung/maven/plugins/Foo.java | 0 .../com/baeldung/maven/it/EndpointConfig.java | 0 .../com/baeldung/maven/it/RestEndpoint.java | 0 .../java/com/baeldung/maven/plugins/Data.java | 0 .../maven/plugins/MultipleSrcFolders.java | 0 .../maven}/src/main/resources/logback.xml | 0 .../maven}/src/main/webapp/WEB-INF/web.xml | 0 .../com/baeldung/maven/it/Integration.java | 0 .../java/com/baeldung/maven/it/RestIT.java | 0 .../maven/it/RestIntegrationTest.java | 0 .../com/baeldung/maven/it/RestJUnitTest.java | 0 .../com/baeldung/maven/plugins/DataCheck.java | 0 .../baeldung/maven/plugins/DataUnitTest.java | 0 .../src/test/java/testfail/TestFail.java | 0 maven-all/profiles/README.md | 3 + {maven => maven-all}/profiles/pom.xml | 0 maven-all/versions-maven-plugin/README.md | 3 + .../versions-maven-plugin/original/pom.xml | 0 .../versions-maven-plugin/pom.xml | 2 +- .../versions-maven-plugin/run-the-demo.sh | 0 pom.xml | 12 +++- 39 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 maven-all/README.md create mode 100644 maven-all/compiler-plugin-java-9/README.md rename {maven => maven-all}/compiler-plugin-java-9/pom.xml (100%) rename {maven => maven-all}/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java (100%) rename {maven => maven-all}/compiler-plugin-java-9/src/main/java/module-info.java (100%) create mode 100644 maven-all/maven-war-plugin/README.md rename {maven => maven-all}/maven-war-plugin/pom.xml (89%) rename {maven => maven-all/maven}/.gitignore (100%) rename {maven => maven-all/maven}/README.md (70%) rename {maven => maven-all/maven}/custom-rule/pom.xml (100%) rename {maven => maven-all/maven}/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java (100%) rename {maven => maven-all/maven}/input-resources/baeldung.png (100%) rename {maven => maven-all/maven}/input-resources/baeldung.txt (100%) rename {maven => maven-all/maven}/input-resources/verifications.xml (100%) create mode 100644 maven-all/maven/maven-enforcer/README.md rename {maven => maven-all/maven}/maven-enforcer/pom.xml (100%) rename {maven => maven-all/maven}/pom.xml (99%) rename {maven => maven-all/maven}/src/integration-test/java/com/baeldung/maven/it/RestITCase.java (100%) rename {maven => maven-all/maven}/src/main/another-src/com/baeldung/maven/plugins/Foo.java (100%) rename {maven => maven-all/maven}/src/main/java/com/baeldung/maven/it/EndpointConfig.java (100%) rename {maven => maven-all/maven}/src/main/java/com/baeldung/maven/it/RestEndpoint.java (100%) rename {maven => maven-all/maven}/src/main/java/com/baeldung/maven/plugins/Data.java (100%) rename {maven => maven-all/maven}/src/main/java/com/baeldung/maven/plugins/MultipleSrcFolders.java (100%) rename {maven => maven-all/maven}/src/main/resources/logback.xml (100%) rename {maven => maven-all/maven}/src/main/webapp/WEB-INF/web.xml (100%) rename {maven => maven-all/maven}/src/test/java/com/baeldung/maven/it/Integration.java (100%) rename {maven => maven-all/maven}/src/test/java/com/baeldung/maven/it/RestIT.java (100%) rename {maven => maven-all/maven}/src/test/java/com/baeldung/maven/it/RestIntegrationTest.java (100%) rename {maven => maven-all/maven}/src/test/java/com/baeldung/maven/it/RestJUnitTest.java (100%) rename {maven => maven-all/maven}/src/test/java/com/baeldung/maven/plugins/DataCheck.java (100%) rename {maven => maven-all/maven}/src/test/java/com/baeldung/maven/plugins/DataUnitTest.java (100%) rename {maven => maven-all/maven}/src/test/java/testfail/TestFail.java (100%) create mode 100644 maven-all/profiles/README.md rename {maven => maven-all}/profiles/pom.xml (100%) create mode 100644 maven-all/versions-maven-plugin/README.md rename {maven => maven-all}/versions-maven-plugin/original/pom.xml (100%) rename {maven => maven-all}/versions-maven-plugin/pom.xml (98%) rename {maven => maven-all}/versions-maven-plugin/run-the-demo.sh (100%) mode change 100755 => 100644 diff --git a/maven-all/README.md b/maven-all/README.md new file mode 100644 index 0000000000..d014f323d2 --- /dev/null +++ b/maven-all/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Apache Maven Tutorial](https://www.baeldung.com/maven) \ No newline at end of file diff --git a/maven-all/compiler-plugin-java-9/README.md b/maven-all/compiler-plugin-java-9/README.md new file mode 100644 index 0000000000..d0b7b72acc --- /dev/null +++ b/maven-all/compiler-plugin-java-9/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Maven Compiler Plugin](http://www.baeldung.com/maven-compiler-plugin) \ No newline at end of file diff --git a/maven/compiler-plugin-java-9/pom.xml b/maven-all/compiler-plugin-java-9/pom.xml similarity index 100% rename from maven/compiler-plugin-java-9/pom.xml rename to maven-all/compiler-plugin-java-9/pom.xml diff --git a/maven/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java b/maven-all/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java similarity index 100% rename from maven/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java rename to maven-all/compiler-plugin-java-9/src/main/java/com/baeldung/maven/java9/MavenCompilerPlugin.java diff --git a/maven/compiler-plugin-java-9/src/main/java/module-info.java b/maven-all/compiler-plugin-java-9/src/main/java/module-info.java similarity index 100% rename from maven/compiler-plugin-java-9/src/main/java/module-info.java rename to maven-all/compiler-plugin-java-9/src/main/java/module-info.java diff --git a/maven-all/maven-war-plugin/README.md b/maven-all/maven-war-plugin/README.md new file mode 100644 index 0000000000..d559fea80b --- /dev/null +++ b/maven-all/maven-war-plugin/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Eclipse Error: web.xml is missing and failOnMissingWebXml is set to true](https://www.baeldung.com/eclipse-error-web-xml-missing) \ No newline at end of file diff --git a/maven/maven-war-plugin/pom.xml b/maven-all/maven-war-plugin/pom.xml similarity index 89% rename from maven/maven-war-plugin/pom.xml rename to maven-all/maven-war-plugin/pom.xml index 517c08978f..25c2e1ba1b 100644 --- a/maven/maven-war-plugin/pom.xml +++ b/maven-all/maven-war-plugin/pom.xml @@ -1,29 +1,29 @@ - - 4.0.0 - com.baeldung - maven-war-plugin-property - 0.0.1-SNAPSHOT - war - maven-war-plugin-property - - - - - maven-war-plugin - - 3.1.0 - - - false - - - - - - - - false - + + 4.0.0 + com.baeldung + maven-war-plugin + 0.0.1-SNAPSHOT + war + maven-war-plugin + + + + + maven-war-plugin + + 3.1.0 + + + false + + + + + + + + false + \ No newline at end of file diff --git a/maven/.gitignore b/maven-all/maven/.gitignore similarity index 100% rename from maven/.gitignore rename to maven-all/maven/.gitignore diff --git a/maven/README.md b/maven-all/maven/README.md similarity index 70% rename from maven/README.md rename to maven-all/maven/README.md index 6d1a7081b7..abe7fc4a80 100644 --- a/maven/README.md +++ b/maven-all/maven/README.md @@ -11,9 +11,4 @@ - [Maven Project with Multiple Source Directories](https://www.baeldung.com/maven-project-multiple-src-directories) - [Integration Testing with Maven](https://www.baeldung.com/maven-integration-test) - [Apache Maven Standard Directory Layout](https://www.baeldung.com/maven-directory-structure) -- [Apache Maven Tutorial](https://www.baeldung.com/maven) -- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version) - [Multi-Module Project with Maven](https://www.baeldung.com/maven-multi-module) -- [Maven Enforcer Plugin](https://www.baeldung.com/maven-enforcer-plugin) -- [Eclipse Error: web.xml is missing and failOnMissingWebXml is set to true](https://www.baeldung.com/eclipse-error-web-xml-missing) -- [Guide to Maven Profiles](https://www.baeldung.com/maven-profiles) diff --git a/maven/custom-rule/pom.xml b/maven-all/maven/custom-rule/pom.xml similarity index 100% rename from maven/custom-rule/pom.xml rename to maven-all/maven/custom-rule/pom.xml diff --git a/maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java b/maven-all/maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java similarity index 100% rename from maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java rename to maven-all/maven/custom-rule/src/main/java/com/baeldung/enforcer/MyCustomRule.java diff --git a/maven/input-resources/baeldung.png b/maven-all/maven/input-resources/baeldung.png similarity index 100% rename from maven/input-resources/baeldung.png rename to maven-all/maven/input-resources/baeldung.png diff --git a/maven/input-resources/baeldung.txt b/maven-all/maven/input-resources/baeldung.txt similarity index 100% rename from maven/input-resources/baeldung.txt rename to maven-all/maven/input-resources/baeldung.txt diff --git a/maven/input-resources/verifications.xml b/maven-all/maven/input-resources/verifications.xml similarity index 100% rename from maven/input-resources/verifications.xml rename to maven-all/maven/input-resources/verifications.xml diff --git a/maven-all/maven/maven-enforcer/README.md b/maven-all/maven/maven-enforcer/README.md new file mode 100644 index 0000000000..7515647a3d --- /dev/null +++ b/maven-all/maven/maven-enforcer/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Maven Enforcer Plugin](https://www.baeldung.com/maven-enforcer-plugin) \ No newline at end of file diff --git a/maven/maven-enforcer/pom.xml b/maven-all/maven/maven-enforcer/pom.xml similarity index 100% rename from maven/maven-enforcer/pom.xml rename to maven-all/maven/maven-enforcer/pom.xml diff --git a/maven/pom.xml b/maven-all/maven/pom.xml similarity index 99% rename from maven/pom.xml rename to maven-all/maven/pom.xml index ef6e7b7d93..d34be04fcf 100644 --- a/maven/pom.xml +++ b/maven-all/maven/pom.xml @@ -11,6 +11,7 @@ parent-modules com.baeldung 1.0.0-SNAPSHOT + ../.. diff --git a/maven/src/integration-test/java/com/baeldung/maven/it/RestITCase.java b/maven-all/maven/src/integration-test/java/com/baeldung/maven/it/RestITCase.java similarity index 100% rename from maven/src/integration-test/java/com/baeldung/maven/it/RestITCase.java rename to maven-all/maven/src/integration-test/java/com/baeldung/maven/it/RestITCase.java diff --git a/maven/src/main/another-src/com/baeldung/maven/plugins/Foo.java b/maven-all/maven/src/main/another-src/com/baeldung/maven/plugins/Foo.java similarity index 100% rename from maven/src/main/another-src/com/baeldung/maven/plugins/Foo.java rename to maven-all/maven/src/main/another-src/com/baeldung/maven/plugins/Foo.java diff --git a/maven/src/main/java/com/baeldung/maven/it/EndpointConfig.java b/maven-all/maven/src/main/java/com/baeldung/maven/it/EndpointConfig.java similarity index 100% rename from maven/src/main/java/com/baeldung/maven/it/EndpointConfig.java rename to maven-all/maven/src/main/java/com/baeldung/maven/it/EndpointConfig.java diff --git a/maven/src/main/java/com/baeldung/maven/it/RestEndpoint.java b/maven-all/maven/src/main/java/com/baeldung/maven/it/RestEndpoint.java similarity index 100% rename from maven/src/main/java/com/baeldung/maven/it/RestEndpoint.java rename to maven-all/maven/src/main/java/com/baeldung/maven/it/RestEndpoint.java diff --git a/maven/src/main/java/com/baeldung/maven/plugins/Data.java b/maven-all/maven/src/main/java/com/baeldung/maven/plugins/Data.java similarity index 100% rename from maven/src/main/java/com/baeldung/maven/plugins/Data.java rename to maven-all/maven/src/main/java/com/baeldung/maven/plugins/Data.java diff --git a/maven/src/main/java/com/baeldung/maven/plugins/MultipleSrcFolders.java b/maven-all/maven/src/main/java/com/baeldung/maven/plugins/MultipleSrcFolders.java similarity index 100% rename from maven/src/main/java/com/baeldung/maven/plugins/MultipleSrcFolders.java rename to maven-all/maven/src/main/java/com/baeldung/maven/plugins/MultipleSrcFolders.java diff --git a/maven/src/main/resources/logback.xml b/maven-all/maven/src/main/resources/logback.xml similarity index 100% rename from maven/src/main/resources/logback.xml rename to maven-all/maven/src/main/resources/logback.xml diff --git a/maven/src/main/webapp/WEB-INF/web.xml b/maven-all/maven/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from maven/src/main/webapp/WEB-INF/web.xml rename to maven-all/maven/src/main/webapp/WEB-INF/web.xml diff --git a/maven/src/test/java/com/baeldung/maven/it/Integration.java b/maven-all/maven/src/test/java/com/baeldung/maven/it/Integration.java similarity index 100% rename from maven/src/test/java/com/baeldung/maven/it/Integration.java rename to maven-all/maven/src/test/java/com/baeldung/maven/it/Integration.java diff --git a/maven/src/test/java/com/baeldung/maven/it/RestIT.java b/maven-all/maven/src/test/java/com/baeldung/maven/it/RestIT.java similarity index 100% rename from maven/src/test/java/com/baeldung/maven/it/RestIT.java rename to maven-all/maven/src/test/java/com/baeldung/maven/it/RestIT.java diff --git a/maven/src/test/java/com/baeldung/maven/it/RestIntegrationTest.java b/maven-all/maven/src/test/java/com/baeldung/maven/it/RestIntegrationTest.java similarity index 100% rename from maven/src/test/java/com/baeldung/maven/it/RestIntegrationTest.java rename to maven-all/maven/src/test/java/com/baeldung/maven/it/RestIntegrationTest.java diff --git a/maven/src/test/java/com/baeldung/maven/it/RestJUnitTest.java b/maven-all/maven/src/test/java/com/baeldung/maven/it/RestJUnitTest.java similarity index 100% rename from maven/src/test/java/com/baeldung/maven/it/RestJUnitTest.java rename to maven-all/maven/src/test/java/com/baeldung/maven/it/RestJUnitTest.java diff --git a/maven/src/test/java/com/baeldung/maven/plugins/DataCheck.java b/maven-all/maven/src/test/java/com/baeldung/maven/plugins/DataCheck.java similarity index 100% rename from maven/src/test/java/com/baeldung/maven/plugins/DataCheck.java rename to maven-all/maven/src/test/java/com/baeldung/maven/plugins/DataCheck.java diff --git a/maven/src/test/java/com/baeldung/maven/plugins/DataUnitTest.java b/maven-all/maven/src/test/java/com/baeldung/maven/plugins/DataUnitTest.java similarity index 100% rename from maven/src/test/java/com/baeldung/maven/plugins/DataUnitTest.java rename to maven-all/maven/src/test/java/com/baeldung/maven/plugins/DataUnitTest.java diff --git a/maven/src/test/java/testfail/TestFail.java b/maven-all/maven/src/test/java/testfail/TestFail.java similarity index 100% rename from maven/src/test/java/testfail/TestFail.java rename to maven-all/maven/src/test/java/testfail/TestFail.java diff --git a/maven-all/profiles/README.md b/maven-all/profiles/README.md new file mode 100644 index 0000000000..22d5d7f70c --- /dev/null +++ b/maven-all/profiles/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Guide to Maven Profiles](https://www.baeldung.com/maven-profiles) \ No newline at end of file diff --git a/maven/profiles/pom.xml b/maven-all/profiles/pom.xml similarity index 100% rename from maven/profiles/pom.xml rename to maven-all/profiles/pom.xml diff --git a/maven-all/versions-maven-plugin/README.md b/maven-all/versions-maven-plugin/README.md new file mode 100644 index 0000000000..8f5670f802 --- /dev/null +++ b/maven-all/versions-maven-plugin/README.md @@ -0,0 +1,3 @@ +### Relevant Articles + +- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version) \ No newline at end of file diff --git a/maven/versions-maven-plugin/original/pom.xml b/maven-all/versions-maven-plugin/original/pom.xml similarity index 100% rename from maven/versions-maven-plugin/original/pom.xml rename to maven-all/versions-maven-plugin/original/pom.xml diff --git a/maven/versions-maven-plugin/pom.xml b/maven-all/versions-maven-plugin/pom.xml similarity index 98% rename from maven/versions-maven-plugin/pom.xml rename to maven-all/versions-maven-plugin/pom.xml index e0714bf0e0..c9f63a46f1 100644 --- a/maven/versions-maven-plugin/pom.xml +++ b/maven-all/versions-maven-plugin/pom.xml @@ -36,7 +36,7 @@ commons-beanutils commons-beanutils - 1.9.1-SNAPSHOT + 1.9.1 diff --git a/maven/versions-maven-plugin/run-the-demo.sh b/maven-all/versions-maven-plugin/run-the-demo.sh old mode 100755 new mode 100644 similarity index 100% rename from maven/versions-maven-plugin/run-the-demo.sh rename to maven-all/versions-maven-plugin/run-the-demo.sh diff --git a/pom.xml b/pom.xml index 79e5194ee8..4f40f8261f 100644 --- a/pom.xml +++ b/pom.xml @@ -544,7 +544,11 @@ lucene mapstruct - maven + + maven-all/maven + maven-all/maven-war-plugin + maven-all/profiles + maven-all/versions-maven-plugin maven-archetype maven-polyglot/maven-polyglot-json-extension @@ -1279,7 +1283,11 @@ lucene mapstruct - maven + + maven-all/maven + maven-all/maven-war-plugin + maven-all/profiles + maven-all/versions-maven-plugin maven-archetype From 4e31b4191900ca96056571fbafa15198d3b7cf3e Mon Sep 17 00:00:00 2001 From: smokeyrobot Date: Sat, 28 Sep 2019 15:19:11 -0400 Subject: [PATCH 296/396] Bael 624 (#7805) * Commit for Eval Article pull request * Revert "Commit for Eval Article pull request" * BAEL-46 - Deleted duplicate class. * BAEL-46 - Fixed old script version * BAEL-46 - Updated per editor review * BAEL-46 - Updated JMX for corrected parameters * BAEL-46 - Corrected Name and Directory * Bael-3000 - initial commit * Bael-3000 - update per review * Bael-3000 - Updated per code review * Bael-3000 - Updated per code review * Update core-java-modules/core-java-jndi/pom.xml Co-Authored-By: KevinGilmore * Update core-java-modules/core-java-jndi/pom.xml Co-Authored-By: KevinGilmore * Bael-624 Wildfly Setup * Update pom.xml * Bael-624 Review updates --- wildfly/pom.xml | 80 +++++++++++++++++++ wildfly/src/main/java/hello/Application.java | 40 ++++++++++ .../src/main/java/hello/HelloController.java | 14 ++++ 3 files changed, 134 insertions(+) create mode 100644 wildfly/pom.xml create mode 100644 wildfly/src/main/java/hello/Application.java create mode 100644 wildfly/src/main/java/hello/HelloController.java diff --git a/wildfly/pom.xml b/wildfly/pom.xml new file mode 100644 index 0000000000..bd2c93a633 --- /dev/null +++ b/wildfly/pom.xml @@ -0,0 +1,80 @@ + + + 4.0.0 + + org.springframework + gs-spring-boot-wildfly + 0.1.0 + + war + + + org.springframework.boot + spring-boot-starter-parent + 2.1.6.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + org.springframework.boot + spring-boot-starter-test + test + + + javax.servlet + javax.servlet-api + provided + + + + + + 1.8 + + + + + + maven-failsafe-plugin + + + + integration-test + verify + + + + + + + org.apache.maven.plugins + maven-war-plugin + + + + jdk.unsupported + + + + + + + diff --git a/wildfly/src/main/java/hello/Application.java b/wildfly/src/main/java/hello/Application.java new file mode 100644 index 0000000000..07b259e3a9 --- /dev/null +++ b/wildfly/src/main/java/hello/Application.java @@ -0,0 +1,40 @@ +package hello; + +import java.util.Arrays; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication +public class Application extends SpringBootServletInitializer { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + } + + @Bean + public CommandLineRunner commandLineRunner(ApplicationContext ctx) { + return args -> { + + System.out.println("Let's inspect the beans provided by Spring Boot:"); + + String[] beanNames = ctx.getBeanDefinitionNames(); + Arrays.sort(beanNames); + for (String beanName : beanNames) { + System.out.println(beanName); + } + + }; + } + +} diff --git a/wildfly/src/main/java/hello/HelloController.java b/wildfly/src/main/java/hello/HelloController.java new file mode 100644 index 0000000000..d9c1069cc5 --- /dev/null +++ b/wildfly/src/main/java/hello/HelloController.java @@ -0,0 +1,14 @@ +package hello; + +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.RequestMapping; + +@RestController +public class HelloController { + + @RequestMapping("/") + public String index() { + return "Greetings from Spring Boot!"; + } + +} From 2255577ffd842b5663876d233c0b891767f38855 Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Sat, 28 Sep 2019 22:23:52 +0300 Subject: [PATCH 297/396] [BAEL-16668] Split or move testing-modules/mockito module (#7835) * Split or move testing-modules/mockito module * [BAEL-16668] fix after merge with master --- testing-modules/hamcrest/README.md | 12 ++ testing-modules/hamcrest/pom.xml | 29 +++++ .../hamcrest/objectmatchers}/City.java | 2 +- .../hamcrest/objectmatchers/Location.java | 4 + .../hamcrest/HamcrestBeansUnitTest.java | 11 +- .../HamcrestCoreMatchersUnitTest.java | 5 +- .../hamcrest/HamcrestFileUnitTest.java | 21 +--- .../hamcrest/HamcrestNumberUnitTest.java | 12 +- .../hamcrest/HamcrestObjectUnitTest.java | 11 +- .../hamcrest/HamcrestTextUnitTest.java | 6 +- .../HamcrestCustomUnitTest.java | 8 +- .../custommatchers/IsDivisibleBy.java | 2 +- .../hamcrest/custommatchers/IsOnlyDigits.java | 2 +- .../hamcrest/custommatchers/IsUppercase.java | 2 +- .../src/test/resources/test1.in | 0 testing-modules/mockito-2/README.md | 6 +- .../bddmockito/BDDMockitoUnitTest.java | 8 +- .../bddmockito/PhoneBookRepository.java | 2 +- .../mockito}/bddmockito/PhoneBookService.java | 2 +- .../LazyVerificationUnitTest.java | 14 +-- .../mockito/spy}/MockitoMisusingUnitTest.java | 16 +-- .../mockito/spy/MockitoSpyUnitTest.java | 12 +- testing-modules/mockito/README.md | 30 ++--- testing-modules/mockito/pom.xml | 8 +- .../mockito/callbacks}/ActionHandler.java | 2 +- .../baeldung/mockito/callbacks}/Callback.java | 2 +- .../baeldung/mockito/callbacks}/Data.java | 2 +- .../baeldung/mockito/callbacks}/Response.java | 2 +- .../baeldung/mockito/callbacks}/Service.java | 2 +- .../java/org/baeldung/hamcrest/Location.java | 4 - .../baeldung/mockito/FinalList.java | 4 +- .../java/com/baeldung/mockito/MockFinals.java | 35 ++++++ .../baeldung/mockito/MockFinalsUnitTest.java | 4 +- .../MockitoAnnotationIntegrationTest.java | 114 +++++++++++++++++ .../mockito/MockitoAnnotationUnitTest.java | 2 +- .../MockitoConfigExamplesIntegrationTest.java | 95 ++++++++++++++ .../MockitoConfigExamplesUnitTest.java | 4 +- .../MockitoExceptionIntegrationTest.java | 55 ++++++++ .../mockito/MockitoExceptionUnitTest.java | 2 +- .../mockito/MockitoInjectIntoSpyUnitTest.java | 5 +- .../mockito/MockitoMockIntegrationTest.java | 69 +++++++++++ .../baeldung/mockito/MockitoMockUnitTest.java | 4 +- .../MockitoVerifyExamplesIntegrationTest.java | 117 ++++++++++++++++++ .../MockitoVerifyExamplesUnitTest.java | 4 +- .../baeldung/mockito/MyDictionary.java | 2 +- .../baeldung/mockito}/MyList.java | 2 +- .../callbacks}/ActionHandlerUnitTest.java | 16 +-- .../MockitoVoidMethodsUnitTest.java | 19 +-- testing-modules/pom.xml | 1 + 49 files changed, 634 insertions(+), 159 deletions(-) create mode 100644 testing-modules/hamcrest/README.md create mode 100644 testing-modules/hamcrest/pom.xml rename testing-modules/{mockito/src/main/java/org/baeldung/hamcrest => hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers}/City.java (94%) create mode 100644 testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/Location.java rename testing-modules/{mockito/src/test/java/org => hamcrest/src/test/java/com}/baeldung/hamcrest/HamcrestBeansUnitTest.java (86%) rename testing-modules/{mockito/src/test/java/org => hamcrest/src/test/java/com}/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java (99%) rename testing-modules/{mockito/src/test/java/org => hamcrest/src/test/java/com}/baeldung/hamcrest/HamcrestFileUnitTest.java (72%) rename testing-modules/{mockito/src/test/java/org => hamcrest/src/test/java/com}/baeldung/hamcrest/HamcrestNumberUnitTest.java (90%) rename testing-modules/{mockito/src/test/java/org => hamcrest/src/test/java/com}/baeldung/hamcrest/HamcrestObjectUnitTest.java (81%) rename testing-modules/{mockito/src/test/java/org => hamcrest/src/test/java/com}/baeldung/hamcrest/HamcrestTextUnitTest.java (99%) rename testing-modules/{mockito/src/test/java/org/baeldung/hamcrest => hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers}/HamcrestCustomUnitTest.java (82%) rename testing-modules/{mockito/src/main/java/org => hamcrest/src/test/java/com}/baeldung/hamcrest/custommatchers/IsDivisibleBy.java (93%) rename testing-modules/{mockito/src/main/java/org => hamcrest/src/test/java/com}/baeldung/hamcrest/custommatchers/IsOnlyDigits.java (92%) rename testing-modules/{mockito/src/main/java/org => hamcrest/src/test/java/com}/baeldung/hamcrest/custommatchers/IsUppercase.java (91%) rename testing-modules/{mockito => hamcrest}/src/test/resources/test1.in (100%) rename testing-modules/{mockito/src/test/java/org/baeldung => mockito-2/src/test/java/com/baeldung/mockito}/bddmockito/BDDMockitoUnitTest.java (98%) rename testing-modules/{mockito/src/test/java/org/baeldung => mockito-2/src/test/java/com/baeldung/mockito}/bddmockito/PhoneBookRepository.java (93%) rename testing-modules/{mockito/src/test/java/org/baeldung => mockito-2/src/test/java/com/baeldung/mockito}/bddmockito/PhoneBookService.java (95%) rename testing-modules/mockito-2/src/test/java/com/baeldung/mockito/{java8 => lazyverification}/LazyVerificationUnitTest.java (95%) rename testing-modules/{mockito/src/test/java/org/baeldung/mockito/misusing => mockito-2/src/test/java/com/baeldung/mockito/spy}/MockitoMisusingUnitTest.java (96%) rename testing-modules/{mockito/src/test/java/org => mockito-2/src/test/java/com}/baeldung/mockito/spy/MockitoSpyUnitTest.java (98%) rename testing-modules/mockito/src/main/java/{org/baeldung/mockito/service => com/baeldung/mockito/callbacks}/ActionHandler.java (93%) rename testing-modules/mockito/src/main/java/{org/baeldung/mockito/service => com/baeldung/mockito/callbacks}/Callback.java (61%) rename testing-modules/mockito/src/main/java/{org/baeldung/mockito/service => com/baeldung/mockito/callbacks}/Data.java (82%) rename testing-modules/mockito/src/main/java/{org/baeldung/mockito/service => com/baeldung/mockito/callbacks}/Response.java (90%) rename testing-modules/mockito/src/main/java/{org/baeldung/mockito/service => com/baeldung/mockito/callbacks}/Service.java (70%) delete mode 100644 testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/FinalList.java (56%) create mode 100644 testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinals.java rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/MockFinalsUnitTest.java (90%) create mode 100644 testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/MockitoAnnotationUnitTest.java (98%) create mode 100644 testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/MockitoConfigExamplesUnitTest.java (97%) create mode 100644 testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/MockitoExceptionUnitTest.java (98%) rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java (90%) create mode 100644 testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/MockitoMockUnitTest.java (96%) create mode 100644 testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/MockitoVerifyExamplesUnitTest.java (97%) rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/MyDictionary.java (93%) rename testing-modules/mockito/src/test/java/{org/baeldung/mockito/voidmethods => com/baeldung/mockito}/MyList.java (90%) rename testing-modules/mockito/src/test/java/{org/baeldung/mockito/service => com/baeldung/mockito/callbacks}/ActionHandlerUnitTest.java (98%) rename testing-modules/mockito/src/test/java/{org => com}/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java (79%) diff --git a/testing-modules/hamcrest/README.md b/testing-modules/hamcrest/README.md new file mode 100644 index 0000000000..f2ff6b996d --- /dev/null +++ b/testing-modules/hamcrest/README.md @@ -0,0 +1,12 @@ +## Hamcrest + +This module contains articles about Hamcrest + +### Relevant articles +- [Hamcrest Text Matchers](https://www.baeldung.com/hamcrest-text-matchers) +- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers) +- [Hamcrest Object Matchers](https://www.baeldung.com/hamcrest-object-matchers) +- [Hamcrest Bean Matchers](https://www.baeldung.com/hamcrest-bean-matchers) +- [Hamcrest Number Matchers](https://www.baeldung.com/hamcrest-number-matchers) +- [Hamcrest Common Core Matchers](https://www.baeldung.com/hamcrest-core-matchers) +- [Hamcrest Custom Matchers](https://www.baeldung.com/hamcrest-custom-matchers) diff --git a/testing-modules/hamcrest/pom.xml b/testing-modules/hamcrest/pom.xml new file mode 100644 index 0000000000..2136702b3a --- /dev/null +++ b/testing-modules/hamcrest/pom.xml @@ -0,0 +1,29 @@ + + 4.0.0 + com.baeldung + hamcrest + 0.0.1-SNAPSHOT + hamcrest + jar + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + + + + + org.hamcrest + java-hamcrest + ${hamcrest.version} + test + + + + + 2.0.0.0 + + diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java b/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/City.java similarity index 94% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java rename to testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/City.java index d6369189c1..cc4fba8154 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/City.java +++ b/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/City.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest.objectmatchers; public class City extends Location { String name; diff --git a/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/Location.java b/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/Location.java new file mode 100644 index 0000000000..bb9c369c60 --- /dev/null +++ b/testing-modules/hamcrest/src/main/java/com/baeldung/hamcrest/objectmatchers/Location.java @@ -0,0 +1,4 @@ +package com.baeldung.hamcrest.objectmatchers; + +public class Location { +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestBeansUnitTest.java similarity index 86% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestBeansUnitTest.java index e7eb9bda1b..7f0c5290ba 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestBeansUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestBeansUnitTest.java @@ -1,5 +1,6 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; +import com.baeldung.hamcrest.objectmatchers.City; import org.junit.Test; import java.beans.PropertyDescriptor; @@ -8,13 +9,7 @@ import java.util.List; import static java.util.stream.Collectors.toList; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasProperty; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.equalTo; -import static org.hamcrest.Matchers.equalToIgnoringCase; -import static org.hamcrest.Matchers.samePropertyValuesAs; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.containsInAnyOrder; +import static org.hamcrest.Matchers.*; import static org.hamcrest.beans.PropertyUtil.getPropertyDescriptor; import static org.hamcrest.beans.PropertyUtil.propertyDescriptorsFor; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java similarity index 99% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java index d66ed98e8d..5da6a77144 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestCoreMatchersUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; import com.google.common.collect.Lists; @@ -145,7 +145,6 @@ public class HamcrestCoreMatchersUnitTest { @Test public void givenString_WhenContainsStringIgnoringCase_ThenCorrect() { - // GIVEN String testString = "hamcrest core"; @@ -164,7 +163,6 @@ public class HamcrestCoreMatchersUnitTest { assertThat(list, hasItem(isA(String.class))); } - @Test public void givenTestInput_WhenUsingHasItemsInCollection() { @@ -223,7 +221,6 @@ public class HamcrestCoreMatchersUnitTest { assertThat(testString, either(startsWith("Bael")).or(containsString("Core"))); } - @Test public void givenTestInput_WhenUsingEveryItemForMatchInCollection() { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestFileUnitTest.java similarity index 72% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestFileUnitTest.java index 9973e325d6..73e2da52b5 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestFileUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestFileUnitTest.java @@ -1,22 +1,13 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; -import static org.hamcrest.core.StringContains.containsString; -import static org.hamcrest.io.FileMatchers.aFileNamed; -import static org.hamcrest.io.FileMatchers.aFileWithAbsolutePath; -import static org.hamcrest.io.FileMatchers.aFileWithCanonicalPath; -import static org.hamcrest.io.FileMatchers.aFileWithSize; -import static org.hamcrest.io.FileMatchers.aReadableFile; -import static org.hamcrest.io.FileMatchers.aWritableFile; -import static org.hamcrest.io.FileMatchers.anExistingDirectory; -import static org.hamcrest.io.FileMatchers.anExistingFile; -import static org.hamcrest.io.FileMatchers.anExistingFileOrDirectory; -import static org.hamcrest.number.OrderingComparison.greaterThan; -import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; -import static org.junit.Assert.assertThat; +import org.junit.Test; import java.io.File; -import org.junit.Test; +import static org.hamcrest.io.FileMatchers.*; +import static org.hamcrest.number.OrderingComparison.greaterThan; +import static org.hamcrest.text.IsEqualIgnoringCase.equalToIgnoringCase; +import static org.junit.Assert.assertThat; public class HamcrestFileUnitTest { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestNumberUnitTest.java similarity index 90% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestNumberUnitTest.java index fbba6b94d2..d2b3392537 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestNumberUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestNumberUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; import org.junit.Test; @@ -6,15 +6,7 @@ import java.math.BigDecimal; import java.time.LocalDate; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.closeTo; -import static org.hamcrest.Matchers.not; -import static org.hamcrest.Matchers.greaterThan; -import static org.hamcrest.Matchers.greaterThanOrEqualTo; -import static org.hamcrest.Matchers.lessThan; -import static org.hamcrest.Matchers.lessThanOrEqualTo; -import static org.hamcrest.Matchers.comparesEqualTo; -import static org.hamcrest.Matchers.notANumber; +import static org.hamcrest.Matchers.*; public class HamcrestNumberUnitTest { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestObjectUnitTest.java similarity index 81% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestObjectUnitTest.java index 8d30ff297b..c07fc422f6 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestObjectUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestObjectUnitTest.java @@ -1,14 +1,11 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; +import com.baeldung.hamcrest.objectmatchers.City; +import com.baeldung.hamcrest.objectmatchers.Location; import org.junit.Test; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.hasToString; -import static org.hamcrest.Matchers.equalToIgnoringCase; -import static org.hamcrest.Matchers.emptyOrNullString; -import static org.hamcrest.Matchers.is; -import static org.hamcrest.Matchers.typeCompatibleWith; -import static org.hamcrest.Matchers.not; +import static org.hamcrest.Matchers.*; public class HamcrestObjectUnitTest { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestTextUnitTest.java similarity index 99% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestTextUnitTest.java index e336b1bba3..593fdf82b6 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestTextUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/HamcrestTextUnitTest.java @@ -1,4 +1,6 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; + +import org.junit.Test; import static org.hamcrest.core.StringContains.containsString; import static org.hamcrest.core.StringContains.containsStringIgnoringCase; @@ -16,8 +18,6 @@ import static org.hamcrest.text.MatchesPattern.matchesPattern; import static org.hamcrest.text.StringContainsInOrder.stringContainsInOrder; import static org.junit.Assert.assertThat; -import org.junit.Test; - public class HamcrestTextUnitTest { @Test diff --git a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/HamcrestCustomUnitTest.java similarity index 82% rename from testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/HamcrestCustomUnitTest.java index 6cc8692bc7..62c68d4561 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/hamcrest/HamcrestCustomUnitTest.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/HamcrestCustomUnitTest.java @@ -1,10 +1,10 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest.custommatchers; import org.junit.Test; -import static org.baeldung.hamcrest.custommatchers.IsDivisibleBy.divisibleBy; -import static org.baeldung.hamcrest.custommatchers.IsOnlyDigits.onlyDigits; -import static org.baeldung.hamcrest.custommatchers.IsUppercase.uppercase; +import static com.baeldung.hamcrest.custommatchers.IsDivisibleBy.divisibleBy; +import static com.baeldung.hamcrest.custommatchers.IsOnlyDigits.onlyDigits; +import static com.baeldung.hamcrest.custommatchers.IsUppercase.uppercase; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.not; diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsDivisibleBy.java similarity index 93% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsDivisibleBy.java index ea12ce0006..f865523be4 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsDivisibleBy.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsDivisibleBy.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest.custommatchers; +package com.baeldung.hamcrest.custommatchers; import org.hamcrest.Description; import org.hamcrest.Matcher; diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsOnlyDigits.java similarity index 92% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsOnlyDigits.java index 7515dfbf6d..f113c92983 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsOnlyDigits.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsOnlyDigits.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest.custommatchers; +package com.baeldung.hamcrest.custommatchers; import org.hamcrest.Description; import org.hamcrest.Matcher; diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsUppercase.java similarity index 91% rename from testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java rename to testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsUppercase.java index 859e7006b7..4ffacd939c 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/custommatchers/IsUppercase.java +++ b/testing-modules/hamcrest/src/test/java/com/baeldung/hamcrest/custommatchers/IsUppercase.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest.custommatchers; +package com.baeldung.hamcrest.custommatchers; import org.hamcrest.Description; import org.hamcrest.Matcher; diff --git a/testing-modules/mockito/src/test/resources/test1.in b/testing-modules/hamcrest/src/test/resources/test1.in similarity index 100% rename from testing-modules/mockito/src/test/resources/test1.in rename to testing-modules/hamcrest/src/test/resources/test1.in diff --git a/testing-modules/mockito-2/README.md b/testing-modules/mockito-2/README.md index 5c9e8fc81a..1d1bd6af7c 100644 --- a/testing-modules/mockito-2/README.md +++ b/testing-modules/mockito-2/README.md @@ -1,5 +1,7 @@ ### Relevant articles -- [Mockito’s Java 8 Features](http://www.baeldung.com/mockito-2-java-8) -- [Lazy Verification with Mockito 2](http://www.baeldung.com/mockito-2-lazy-verification) +- [Mockito’s Java 8 Features](https://www.baeldung.com/mockito-2-java-8) +- [Lazy Verification with Mockito 2](https://www.baeldung.com/mockito-2-lazy-verification) - [Mockito Strict Stubbing and The UnnecessaryStubbingException](https://www.baeldung.com/mockito-unnecessary-stubbing-exception) +- [Quick Guide to BDDMockito](https://www.baeldung.com/bdd-mockito) +- [Mockito – Using Spies](https://www.baeldung.com/mockito-spy) diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java index 977a60933f..fd7f04870b 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/BDDMockitoUnitTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/BDDMockitoUnitTest.java @@ -1,7 +1,4 @@ -package org.baeldung.bddmockito; - -import static org.junit.Assert.fail; -import static org.mockito.BDDMockito.*; +package com.baeldung.mockito.bddmockito; import org.junit.Assert; import org.junit.Before; @@ -9,6 +6,9 @@ import org.junit.Test; import org.mockito.Mockito; import org.mockito.invocation.InvocationOnMock; +import static org.junit.Assert.fail; +import static org.mockito.BDDMockito.*; + public class BDDMockitoUnitTest { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java similarity index 93% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java index 94d4a90d4b..dd44e5e3cc 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookRepository.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookRepository.java @@ -1,4 +1,4 @@ -package org.baeldung.bddmockito; +package com.baeldung.mockito.bddmockito; public interface PhoneBookRepository { diff --git a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java similarity index 95% rename from testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java index 8fc49b026d..b96cf4efb7 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/bddmockito/PhoneBookService.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/bddmockito/PhoneBookService.java @@ -1,4 +1,4 @@ -package org.baeldung.bddmockito; +package com.baeldung.mockito.bddmockito; public class PhoneBookService { diff --git a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java similarity index 95% rename from testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java index 0e6921c7a1..c7a9d84191 100644 --- a/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/java8/LazyVerificationUnitTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/lazyverification/LazyVerificationUnitTest.java @@ -1,16 +1,16 @@ -package com.baeldung.mockito.java8; - -import static org.junit.Assert.assertTrue; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -import java.util.List; +package com.baeldung.mockito.lazyverification; import org.junit.Test; import org.mockito.exceptions.base.MockitoAssertionError; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.VerificationCollector; +import java.util.List; + +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; + public class LazyVerificationUnitTest { @Test diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java similarity index 96% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java index 306f53297a..ea12061fc6 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/misusing/MockitoMisusingUnitTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoMisusingUnitTest.java @@ -1,11 +1,4 @@ -package org.baeldung.mockito.misusing; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertThat; -import static org.junit.jupiter.api.Assertions.fail; - -import java.util.ArrayList; -import java.util.List; +package com.baeldung.mockito.spy; import org.junit.After; import org.junit.Test; @@ -13,6 +6,13 @@ import org.mockito.Mockito; import org.mockito.exceptions.misusing.NotAMockException; import org.mockito.internal.progress.ThreadSafeMockingProgress; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.containsString; +import static org.junit.Assert.assertThat; +import static org.junit.jupiter.api.Assertions.fail; + public class MockitoMisusingUnitTest { @After diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyUnitTest.java b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyUnitTest.java rename to testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java index 068a4c6de9..d4696e482b 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/spy/MockitoSpyUnitTest.java +++ b/testing-modules/mockito-2/src/test/java/com/baeldung/mockito/spy/MockitoSpyUnitTest.java @@ -1,9 +1,4 @@ -package org.baeldung.mockito.spy; - -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; -import java.util.List; +package com.baeldung.mockito.spy; import org.junit.Test; import org.junit.runner.RunWith; @@ -11,6 +6,11 @@ import org.mockito.Mockito; import org.mockito.Spy; import org.mockito.junit.MockitoJUnitRunner; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; + @RunWith(MockitoJUnitRunner.class) public class MockitoSpyUnitTest { diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index 9c6407f9da..6b8f53ffee 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -4,23 +4,13 @@ ### Relevant Articles: -- [Mockito Verify Cookbook](http://www.baeldung.com/mockito-verify) -- [Mockito When/Then Cookbook](http://www.baeldung.com/mockito-behavior) -- [Mockito – Using Spies](http://www.baeldung.com/mockito-spy) -- [Getting Started with Mockito @Mock, @Spy, @Captor and @InjectMocks](http://www.baeldung.com/mockito-annotations) -- [Mockito’s Mock Methods](http://www.baeldung.com/mockito-mock-methods) -- [Introduction to PowerMock](http://www.baeldung.com/intro-to-powermock) -- [Mocking Exception Throwing using Mockito](http://www.baeldung.com/mockito-exceptions) -- [Mocking Void Methods with Mockito](http://www.baeldung.com/mockito-void-methods) -- [Mocking of Private Methods Using PowerMock](http://www.baeldung.com/powermock-private-method) -- [Mock Final Classes and Methods with Mockito](http://www.baeldung.com/mockito-final) -- [Hamcrest Custom Matchers](http://www.baeldung.com/hamcrest-custom-matchers) -- [Hamcrest Common Core Matchers](http://www.baeldung.com/hamcrest-core-matchers) -- [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) -- [Using Hamcrest Number Matchers](https://www.baeldung.com/hamcrest-number-matchers) -- [Quick Guide to BDDMockito](http://www.baeldung.com/bdd-mockito) -- [Hamcrest Bean Matchers](http://www.baeldung.com/hamcrest-bean-matchers) -- [Hamcrest Object Matchers](http://www.baeldung.com/hamcrest-object-matchers) -- [Hamcrest File Matchers](https://www.baeldung.com/hamcrest-file-matchers) -- [Hamcrest Text Matchers](http://www.baeldung.com/hamcrest-text-matchers) -- [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) +- [Mockito Verify Cookbook](https://www.baeldung.com/mockito-verify) +- [Mockito When/Then Cookbook](https://www.baeldung.com/mockito-behavior) +- [Getting Started with Mockito @Mock, @Spy, @Captor and @InjectMocks](https://www.baeldung.com/mockito-annotations) +- [Mockito’s Mock Methods](https://www.baeldung.com/mockito-mock-methods) +- [Introduction to PowerMock](https://www.baeldung.com/intro-to-powermock) +- [Mocking of Private Methods Using PowerMock](https://www.baeldung.com/powermock-private-method) +- [Mocking Exception Throwing using Mockito](https://www.baeldung.com/mockito-exceptions) +- [Mocking Void Methods with Mockito](https://www.baeldung.com/mockito-void-methods) +- [Mock Final Classes and Methods with Mockito](https://www.baeldung.com/mockito-final) +- [Testing Callbacks with Mockito](https://www.baeldung.com/mockito-callbacks) diff --git a/testing-modules/mockito/pom.xml b/testing-modules/mockito/pom.xml index f307b80370..e0f32d88bf 100644 --- a/testing-modules/mockito/pom.xml +++ b/testing-modules/mockito/pom.xml @@ -1,7 +1,7 @@ 4.0.0 - org.baeldung + com.baeldung mockito 0.1-SNAPSHOT mockito @@ -58,12 +58,6 @@ ${powermock.version} test - - org.hamcrest - java-hamcrest - ${hamcrest.version} - - org.springframework.boot spring-boot-starter diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/ActionHandler.java similarity index 93% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/ActionHandler.java index 289dcff399..d70fc2b690 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/ActionHandler.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/ActionHandler.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public class ActionHandler { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Callback.java similarity index 61% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Callback.java index fb8d01ce2e..cc6180c249 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Callback.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Callback.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public interface Callback { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Data.java similarity index 82% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Data.java index 665c05382c..9549995469 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Data.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Data.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public class Data { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Response.java similarity index 90% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Response.java index 22474a5ba7..03aded3895 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Response.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Response.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public class Response { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Service.java similarity index 70% rename from testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java rename to testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Service.java index 63434e53fb..d9f1a44422 100644 --- a/testing-modules/mockito/src/main/java/org/baeldung/mockito/service/Service.java +++ b/testing-modules/mockito/src/main/java/com/baeldung/mockito/callbacks/Service.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.service; +package com.baeldung.mockito.callbacks; public interface Service { diff --git a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java b/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java deleted file mode 100644 index 52561d07dc..0000000000 --- a/testing-modules/mockito/src/main/java/org/baeldung/hamcrest/Location.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.baeldung.hamcrest; - -public class Location { -} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/FinalList.java similarity index 56% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/FinalList.java index e01f189f0b..27b7534978 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/FinalList.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/FinalList.java @@ -1,6 +1,4 @@ -package org.baeldung.mockito; - -import org.baeldung.mockito.voidmethods.MyList; +package com.baeldung.mockito; public final class FinalList extends MyList { diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinals.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinals.java new file mode 100644 index 0000000000..6ff791ae06 --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinals.java @@ -0,0 +1,35 @@ +package com.baeldung.mockito; + +import org.junit.Test; + +import static org.junit.Assert.assertNotEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +public class MockFinals { + + @Test + public void whenMockFinalClassMockWorks() { + + FinalList finalList = new FinalList(); + + FinalList mock = mock(FinalList.class); + when(mock.size()).thenReturn(2); + + assertNotEquals(mock.size(), finalList.size()); + + } + + @Test + public void whenMockFinalMethodMockWorks() { + + MyList myList = new MyList(); + + MyList mock = mock(MyList.class); + when(mock.finalMethod()).thenReturn(1); + + assertNotEquals(mock.finalMethod(), myList.finalMethod()); + } + + + } diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinalsUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java similarity index 90% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinalsUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java index 000774592c..bb03fca06f 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockFinalsUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockFinalsUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import org.junit.Test; @@ -6,7 +6,7 @@ import static org.junit.Assert.assertNotEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import org.baeldung.mockito.voidmethods.MyList; +import com.baeldung.mockito.MyList; public class MockFinalsUnitTest { diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java new file mode 100644 index 0000000000..94054d1cbb --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationIntegrationTest.java @@ -0,0 +1,114 @@ +package com.baeldung.mockito; + +import org.junit.Before; +import org.junit.Test; +import org.mockito.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import static org.junit.Assert.assertEquals; + +//@RunWith(MockitoJUnitRunner.class) +public class MockitoAnnotationIntegrationTest { + + @Mock + private List mockedList; + + @Spy + private List spiedList = new ArrayList<>(); + + @Before + public void init() { + MockitoAnnotations.initMocks(this); + } + + // tests + + @Test + public void whenNotUseMockAnnotation_thenCorrect() { + final List mockList = Mockito.mock(List.class); + mockList.add("one"); + Mockito.verify(mockList).add("one"); + assertEquals(0, mockList.size()); + + Mockito.when(mockList.size()).thenReturn(100); + assertEquals(100, mockList.size()); + } + + @Test + public void whenUseMockAnnotation_thenMockIsInjected() { + mockedList.add("one"); + Mockito.verify(mockedList).add("one"); + assertEquals(0, mockedList.size()); + + Mockito.when(mockedList.size()).thenReturn(100); + assertEquals(100, mockedList.size()); + } + + @Test + public void whenNotUseSpyAnnotation_thenCorrect() { + final List spyList = Mockito.spy(new ArrayList()); + spyList.add("one"); + spyList.add("two"); + + Mockito.verify(spyList).add("one"); + Mockito.verify(spyList).add("two"); + + assertEquals(2, spyList.size()); + + Mockito.doReturn(100).when(spyList).size(); + assertEquals(100, spyList.size()); + } + + @Test + public void whenUseSpyAnnotation_thenSpyIsInjectedCorrectly() { + spiedList.add("one"); + spiedList.add("two"); + + Mockito.verify(spiedList).add("one"); + Mockito.verify(spiedList).add("two"); + + assertEquals(2, spiedList.size()); + + Mockito.doReturn(100).when(spiedList).size(); + assertEquals(100, spiedList.size()); + } + + @Test + public void whenNotUseCaptorAnnotation_thenCorrect() { + final List mockList = Mockito.mock(List.class); + final ArgumentCaptor arg = ArgumentCaptor.forClass(String.class); + mockList.add("one"); + Mockito.verify(mockList).add(arg.capture()); + + assertEquals("one", arg.getValue()); + } + + @Captor + private + ArgumentCaptor argCaptor; + + @Test + public void whenUseCaptorAnnotation_thenTheSam() { + mockedList.add("one"); + Mockito.verify(mockedList).add(argCaptor.capture()); + + assertEquals("one", argCaptor.getValue()); + } + + @Mock + private Map wordMap; + + @InjectMocks + private MyDictionary dic = new MyDictionary(); + + @Test + public void whenUseInjectMocksAnnotation_thenCorrect() { + Mockito.when(wordMap.get("aWord")).thenReturn("aMeaning"); + + assertEquals("aMeaning", dic.getMeaning("aWord")); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java index 6bc0e69e65..731183bae2 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoAnnotationUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoAnnotationUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import org.junit.Before; import org.junit.Test; diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java new file mode 100644 index 0000000000..5d3c009edc --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesIntegrationTest.java @@ -0,0 +1,95 @@ +package com.baeldung.mockito; + +import org.junit.Test; +import org.mockito.Mockito; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.*; + +public class MockitoConfigExamplesIntegrationTest { + + // tests + + @Test + public final void whenMockReturnBehaviorIsConfigured_thenBehaviorIsVerified() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.add(anyString())).thenReturn(false); + + final boolean added = listMock.add(randomAlphabetic(6)); + assertThat(added, is(false)); + } + + @Test + public final void whenMockReturnBehaviorIsConfigured2_thenBehaviorIsVerified() { + final MyList listMock = Mockito.mock(MyList.class); + doReturn(false).when(listMock).add(anyString()); + + final boolean added = listMock.add(randomAlphabetic(6)); + assertThat(added, is(false)); + } + + @Test(expected = IllegalStateException.class) + public final void givenMethodIsConfiguredToThrowException_whenCallingMethod_thenExceptionIsThrown() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.add(anyString())).thenThrow(IllegalStateException.class); + + listMock.add(randomAlphabetic(6)); + } + + @Test(expected = NullPointerException.class) + public final void whenMethodHasNoReturnType_whenConfiguringBehaviorOfMethod_thenPossible() { + final MyList listMock = Mockito.mock(MyList.class); + doThrow(NullPointerException.class).when(listMock).clear(); + + listMock.clear(); + } + + @Test + public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingOnlyOnce_thenNoExceptionIsThrown() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.add(anyString())).thenReturn(false).thenThrow(IllegalStateException.class); + + listMock.add(randomAlphabetic(6)); + } + + @Test(expected = IllegalStateException.class) + public final void givenBehaviorIsConfiguredToThrowExceptionOnSecondCall_whenCallingTwice_thenExceptionIsThrown() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.add(anyString())).thenReturn(false).thenThrow(IllegalStateException.class); + + listMock.add(randomAlphabetic(6)); + listMock.add(randomAlphabetic(6)); + } + + @Test + public final void whenMockMethodCallIsConfiguredToCallTheRealMethod_thenRealMethodIsCalled() { + final MyList listMock = Mockito.mock(MyList.class); + when(listMock.size()).thenCallRealMethod(); + + assertThat(listMock.size(), equalTo(1)); + } + + @Test + public final void whenMockMethodCallIsConfiguredWithCustomAnswer_thenRealMethodIsCalled() { + final MyList listMock = Mockito.mock(MyList.class); + doAnswer(invocation -> "Always the same").when(listMock).get(anyInt()); + + final String element = listMock.get(1); + assertThat(element, is(equalTo("Always the same"))); + } + + @Test(expected = NullPointerException.class) + public final void givenSpy_whenConfiguringBehaviorOfSpy_thenCorrectlyConfigured() { + final MyList instance = new MyList(); + final MyList spy = Mockito.spy(instance); + + doThrow(NullPointerException.class).when(spy).size(); + spy.size(); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java similarity index 97% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java index c065e164c5..389dc231c1 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoConfigExamplesUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoConfigExamplesUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import org.junit.Test; import org.mockito.Mockito; @@ -11,7 +11,7 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.anyString; import static org.mockito.Mockito.*; -import org.baeldung.mockito.voidmethods.MyList; +import com.baeldung.mockito.MyList; public class MockitoConfigExamplesUnitTest { diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java new file mode 100644 index 0000000000..23fcba60b8 --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionIntegrationTest.java @@ -0,0 +1,55 @@ +package com.baeldung.mockito; + +import org.junit.Test; +import org.mockito.Mockito; + +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +public class MockitoExceptionIntegrationTest { + + @Test(expected = NullPointerException.class) + public void whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + when(dictMock.getMeaning(anyString())).thenThrow(NullPointerException.class); + + dictMock.getMeaning("word"); + } + + @Test(expected = IllegalStateException.class) + public void whenConfigVoidRetunMethodToThrowEx_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + doThrow(IllegalStateException.class).when(dictMock) + .add(anyString(), anyString()); + + dictMock.add("word", "meaning"); + } + + @Test(expected = NullPointerException.class) + public void whenConfigNonVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + when(dictMock.getMeaning(anyString())).thenThrow(new NullPointerException("Error occurred")); + + dictMock.getMeaning("word"); + } + + @Test(expected = IllegalStateException.class) + public void whenConfigVoidRetunMethodToThrowExWithNewExObj_thenExIsThrown() { + MyDictionary dictMock = mock(MyDictionary.class); + doThrow(new IllegalStateException("Error occurred")).when(dictMock) + .add(anyString(), anyString()); + + dictMock.add("word", "meaning"); + } + + // ===== + + @Test(expected = NullPointerException.class) + public void givenSpy_whenConfigNonVoidRetunMethodToThrowEx_thenExIsThrown() { + MyDictionary dict = new MyDictionary(); + MyDictionary spy = Mockito.spy(dict); + + when(spy.getMeaning(anyString())).thenThrow(NullPointerException.class); + spy.getMeaning("word"); + } +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java index 88da16ae2b..7ed4fbdf37 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoExceptionUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoExceptionUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.doThrow; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java similarity index 90% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java index 568492ca10..d6a11bbc7d 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoInjectIntoSpyUnitTest.java @@ -1,13 +1,12 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnitRunner; import org.mockito.*; import org.mockito.junit.MockitoJUnitRunner; -import java.util.ArrayList; -import java.util.List; import java.util.Map; import static org.junit.Assert.assertEquals; diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java new file mode 100644 index 0000000000..e8cbcc4e8c --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockIntegrationTest.java @@ -0,0 +1,69 @@ +package com.baeldung.mockito; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.mockito.MockSettings; +import org.mockito.exceptions.verification.TooLittleActualInvocations; +import org.mockito.invocation.InvocationOnMock; +import org.mockito.stubbing.Answer; + +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.is; +import static org.junit.Assert.assertThat; +import static org.mockito.Mockito.*; + +public class MockitoMockIntegrationTest { + + private static class CustomAnswer implements Answer { + @Override + public Boolean answer(InvocationOnMock invocation) throws Throwable { + return false; + } + } + + @Rule + public ExpectedException thrown = ExpectedException.none(); + + @Test + public void whenUsingSimpleMock_thenCorrect() { + MyList listMock = mock(MyList.class); + when(listMock.add(anyString())).thenReturn(false); + boolean added = listMock.add(randomAlphabetic(6)); + + verify(listMock).add(anyString()); + assertThat(added, is(false)); + } + + @Test + public void whenUsingMockWithName_thenCorrect() { + MyList listMock = mock(MyList.class, "myMock"); + when(listMock.add(anyString())).thenReturn(false); + listMock.add(randomAlphabetic(6)); + + thrown.expect(TooLittleActualInvocations.class); + thrown.expectMessage(containsString("myMock.add")); + + verify(listMock, times(2)).add(anyString()); + } + + @Test + public void whenUsingMockWithAnswer_thenCorrect() { + MyList listMock = mock(MyList.class, new CustomAnswer()); + boolean added = listMock.add(randomAlphabetic(6)); + + verify(listMock).add(anyString()); + assertThat(added, is(false)); + } + + @Test + public void whenUsingMockWithSettings_thenCorrect() { + MockSettings customSettings = withSettings().defaultAnswer(new CustomAnswer()); + MyList listMock = mock(MyList.class, customSettings); + boolean added = listMock.add(randomAlphabetic(6)); + + verify(listMock).add(anyString()); + assertThat(added, is(false)); + } +} \ No newline at end of file diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java similarity index 96% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java index 30c843ff13..e1d99f80a2 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoMockUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoMockUnitTest.java @@ -1,8 +1,8 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import static org.mockito.Mockito.*; -import org.baeldung.mockito.voidmethods.MyList; +import com.baeldung.mockito.MyList; import static org.junit.Assert.assertThat; import static org.hamcrest.Matchers.is; diff --git a/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java new file mode 100644 index 0000000000..b5075d7db2 --- /dev/null +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesIntegrationTest.java @@ -0,0 +1,117 @@ +package com.baeldung.mockito; + +import com.google.common.collect.Lists; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.InOrder; +import org.mockito.Mockito; +import org.mockito.exceptions.verification.NoInteractionsWanted; + +import java.util.List; + +import static org.hamcrest.Matchers.hasItem; +import static org.junit.Assert.assertThat; +import static org.mockito.Matchers.anyString; +import static org.mockito.Mockito.*; + +public class MockitoVerifyExamplesIntegrationTest { + + // tests + + @Test + public final void givenInteractionWithMockOccurred_whenVerifyingInteraction_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.size(); + verify(mockedList).size(); + } + + @Test + public final void givenOneInteractionWithMockOccurred_whenVerifyingNumberOfInteractions_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.size(); + verify(mockedList, times(1)).size(); + } + + @Test + public final void givenNoInteractionWithMockOccurred_whenVerifyingInteractions_thenCorrect() { + final List mockedList = mock(MyList.class); + verifyZeroInteractions(mockedList); + } + + @Test + public final void givenNoInteractionWithMethodOfMockOccurred_whenVerifyingInteractions_thenCorrect() { + final List mockedList = mock(MyList.class); + verify(mockedList, times(0)).size(); + } + + @Test(expected = NoInteractionsWanted.class) + public final void givenUnverifiedInteraction_whenVerifyingNoUnexpectedInteractions_thenFail() { + final List mockedList = mock(MyList.class); + mockedList.size(); + mockedList.clear(); + + verify(mockedList).size(); + verifyNoMoreInteractions(mockedList); + } + + @Test + public final void whenVerifyingOrderOfInteractions_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.size(); + mockedList.add("a parameter"); + mockedList.clear(); + + final InOrder inOrder = Mockito.inOrder(mockedList); + inOrder.verify(mockedList).size(); + inOrder.verify(mockedList).add("a parameter"); + inOrder.verify(mockedList).clear(); + } + + @Test + public final void whenVerifyingAnInteractionHasNotOccurred_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.size(); + + verify(mockedList, never()).clear(); + } + + @Test + public final void whenVerifyingAnInteractionHasOccurredAtLeastOnce_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.clear(); + mockedList.clear(); + mockedList.clear(); + + verify(mockedList, atLeast(1)).clear(); + verify(mockedList, atMost(10)).clear(); + } + + // with arguments + + @Test + public final void whenVerifyingAnInteractionWithExactArgument_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.add("test"); + + verify(mockedList).add("test"); + } + + @Test + public final void whenVerifyingAnInteractionWithAnyArgument_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.add("test"); + + verify(mockedList).add(anyString()); + } + + @Test + public final void whenVerifyingAnInteractionWithArgumentCapture_thenCorrect() { + final List mockedList = mock(MyList.class); + mockedList.addAll(Lists.newArrayList("someElement")); + final ArgumentCaptor argumentCaptor = ArgumentCaptor.forClass(List.class); + verify(mockedList).addAll(argumentCaptor.capture()); + final List capturedArgument = argumentCaptor.>getValue(); + assertThat(capturedArgument, hasItem("someElement")); + } + +} diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java similarity index 97% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java index a6e40b84e1..ca09f77d2d 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MockitoVerifyExamplesUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MockitoVerifyExamplesUnitTest.java @@ -1,8 +1,8 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import com.google.common.collect.Lists; -import org.baeldung.mockito.voidmethods.MyList; +import com.baeldung.mockito.MyList; import org.junit.Test; import org.mockito.ArgumentCaptor; import org.mockito.InOrder; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyDictionary.java similarity index 93% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MyDictionary.java index 9492c90d11..92a4498696 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/MyDictionary.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyDictionary.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito; +package com.baeldung.mockito; import java.util.HashMap; import java.util.Map; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MyList.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyList.java similarity index 90% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MyList.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/MyList.java index f28c9b732f..ac3a76e04a 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MyList.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/MyList.java @@ -1,4 +1,4 @@ -package org.baeldung.mockito.voidmethods; +package com.baeldung.mockito; import java.util.AbstractList; diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/callbacks/ActionHandlerUnitTest.java similarity index 98% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/callbacks/ActionHandlerUnitTest.java index c34a9a4a09..5ffe4ab28d 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/service/ActionHandlerUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/callbacks/ActionHandlerUnitTest.java @@ -1,11 +1,4 @@ -package org.baeldung.mockito.service; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.verify; +package com.baeldung.mockito.callbacks; import org.junit.Before; import org.junit.Test; @@ -15,6 +8,13 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.stubbing.Answer; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.verify; + public class ActionHandlerUnitTest { @Mock diff --git a/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java b/testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java similarity index 79% rename from testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java rename to testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java index 0393490f9a..dd41d98b57 100644 --- a/testing-modules/mockito/src/test/java/org/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java +++ b/testing-modules/mockito/src/test/java/com/baeldung/mockito/voidmethods/MockitoVoidMethodsUnitTest.java @@ -1,23 +1,16 @@ -package org.baeldung.mockito.voidmethods; - -import static org.junit.Assert.assertEquals; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.isA; -import static org.mockito.ArgumentMatchers.isNull; -import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.doCallRealMethod; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; +package com.baeldung.mockito.voidmethods; +import com.baeldung.mockito.MyList; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.junit.MockitoJUnitRunner; import org.mockito.stubbing.Answer; +import static org.junit.Assert.assertEquals; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.*; + @RunWith(MockitoJUnitRunner.class) public class MockitoVoidMethodsUnitTest { diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index c0eb59f15e..6400a2d7e7 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -23,6 +23,7 @@ load-testing-comparison mockito mockito-2 + hamcrest mocks mockserver parallel-tests-junit From 39e99cd907e348165249388c9002a297e89c782f Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Sat, 28 Sep 2019 22:26:32 +0300 Subject: [PATCH 298/396] Split or move core-java-collections module (#7893) --- core-java-modules/core-java-arrays-2/README.MD | 1 + .../baeldung/array}/removefirst/RemoveFirstElementUnitTest.java | 2 +- core-java-modules/core-java-collections-list/README.md | 1 - 3 files changed, 2 insertions(+), 2 deletions(-) rename core-java-modules/{core-java-collections-list/src/test/java/com/baeldung/list => core-java-arrays-2/src/test/java/com/baeldung/array}/removefirst/RemoveFirstElementUnitTest.java (97%) diff --git a/core-java-modules/core-java-arrays-2/README.MD b/core-java-modules/core-java-arrays-2/README.MD index 280fb33dc3..952770a2da 100644 --- a/core-java-modules/core-java-arrays-2/README.MD +++ b/core-java-modules/core-java-arrays-2/README.MD @@ -7,3 +7,4 @@ - [Array Operations in Java](https://www.baeldung.com/java-common-array-operations) - [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) +- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) diff --git a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java similarity index 97% rename from core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java rename to core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java index f2b1bd9d88..83a97973f3 100644 --- a/core-java-modules/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java +++ b/core-java-modules/core-java-arrays-2/src/test/java/com/baeldung/array/removefirst/RemoveFirstElementUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.list.removefirst; +package com.baeldung.array.removefirst; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.*; diff --git a/core-java-modules/core-java-collections-list/README.md b/core-java-modules/core-java-collections-list/README.md index 1542a352fe..367f62780d 100644 --- a/core-java-modules/core-java-collections-list/README.md +++ b/core-java-modules/core-java-collections-list/README.md @@ -12,4 +12,3 @@ - [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java) - [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) - [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list) -- [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) From 7a70863a29d48b810436f9dfb77028b710195619 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 29 Sep 2019 00:59:40 +0530 Subject: [PATCH 299/396] [BAEL-17473] - Retired spring-boot-disable-console-logging --- pom.xml | 22 ++++++++++++------- spring-boot-disable-console-logging/README.md | 6 ----- spring-boot-disable-console-logging/pom.xml | 21 ------------------ spring-boot-runtime/README.md | 3 ++- .../disabling-console-jul/.gitignore | 0 .../disabling-console-jul/pom.xml | 0 .../properties/DisablingConsoleJulApp.java | 0 .../DisabledConsoleRestController.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/logging.properties | 0 .../disabling-console-log4j2/.gitignore | 0 .../disabling-console-log4j2/pom.xml | 0 .../log4j2/xml/DisablingConsoleLog4j2App.java | 0 .../DisabledConsoleRestController.java | 0 .../src/main/resources/log4j2.xml | 0 .../disabling-console-logback/.gitignore | 0 .../disabling-console-logback/pom.xml | 0 .../xml/DisablingConsoleLogbackApp.java | 0 .../DisabledConsoleRestController.java | 0 .../src/main/resources/application.properties | 0 .../src/main/resources/logback-spring.xml | 0 21 files changed, 16 insertions(+), 36 deletions(-) delete mode 100644 spring-boot-disable-console-logging/README.md delete mode 100644 spring-boot-disable-console-logging/pom.xml rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-jul/.gitignore (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-jul/pom.xml (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-jul/src/main/resources/application.properties (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-jul/src/main/resources/logging.properties (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-log4j2/.gitignore (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-log4j2/pom.xml (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-log4j2/src/main/resources/log4j2.xml (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-logback/.gitignore (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-logback/pom.xml (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-logback/src/main/resources/application.properties (100%) rename {spring-boot-disable-console-logging => spring-boot-runtime}/disabling-console-logback/src/main/resources/logback-spring.xml (100%) diff --git a/pom.xml b/pom.xml index 4f40f8261f..b5607da6bd 100644 --- a/pom.xml +++ b/pom.xml @@ -684,17 +684,20 @@ spring-boot-crud spring-boot-ctx-fluent spring-boot-custom-starter - spring-boot-disable-console-logging spring-boot-jasypt spring-boot-keycloak spring-boot-kotlin spring-boot-logging-log4j2 - spring-boot-management spring-boot-mvc spring-boot-mvc-birt - spring-boot-ops - spring-boot-ops-2 + spring-boot-environment + spring-boot-deployment + spring-boot-runtime + spring-boot-runtime/disabling-console-jul + spring-boot-runtime/disabling-console-log4j2 + spring-boot-runtime/disabling-console-logback + spring-boot-artifacts spring-boot-rest spring-boot-data spring-boot-parent @@ -1404,16 +1407,19 @@ spring-boot-crud spring-boot-ctx-fluent spring-boot-custom-starter - spring-boot-disable-console-logging spring-boot-jasypt spring-boot-keycloak spring-boot-logging-log4j2 - spring-boot-management spring-boot-mvc spring-boot-mvc-birt - spring-boot-ops - spring-boot-ops-2 + spring-boot-environment + spring-boot-deployment + spring-boot-runtime + spring-boot-runtime/disabling-console-jul + spring-boot-runtime/disabling-console-log4j2 + spring-boot-runtime/disabling-console-logback + spring-boot-artifacts spring-boot-rest spring-boot-data spring-boot-parent diff --git a/spring-boot-disable-console-logging/README.md b/spring-boot-disable-console-logging/README.md deleted file mode 100644 index 7f1c06042f..0000000000 --- a/spring-boot-disable-console-logging/README.md +++ /dev/null @@ -1,6 +0,0 @@ -## Spring Boot Disable Console Logging - -This module contains articles about disabling Spring Boot console logging. - -### Relevant Articles: -- [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) diff --git a/spring-boot-disable-console-logging/pom.xml b/spring-boot-disable-console-logging/pom.xml deleted file mode 100644 index 63ed129347..0000000000 --- a/spring-boot-disable-console-logging/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - 4.0.0 - spring-boot-disable-console-logging - spring-boot-disable-console-logging - pom - Projects for Disabling Spring Boot Console Logging tutorials - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - disabling-console-logback - disabling-console-log4j2 - disabling-console-jul - - \ No newline at end of file diff --git a/spring-boot-runtime/README.md b/spring-boot-runtime/README.md index 002615b934..f9ca12c605 100644 --- a/spring-boot-runtime/README.md +++ b/spring-boot-runtime/README.md @@ -2,4 +2,5 @@ - [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown) - [Comparing Embedded Servlet Containers in Spring Boot](https://www.baeldung.com/spring-boot-servlet-containers) - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - - [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) \ No newline at end of file + - [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) + - [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) \ No newline at end of file diff --git a/spring-boot-disable-console-logging/disabling-console-jul/.gitignore b/spring-boot-runtime/disabling-console-jul/.gitignore similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-jul/.gitignore rename to spring-boot-runtime/disabling-console-jul/.gitignore diff --git a/spring-boot-disable-console-logging/disabling-console-jul/pom.xml b/spring-boot-runtime/disabling-console-jul/pom.xml similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-jul/pom.xml rename to spring-boot-runtime/disabling-console-jul/pom.xml diff --git a/spring-boot-disable-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java b/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java rename to spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/DisablingConsoleJulApp.java diff --git a/spring-boot-disable-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java b/spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java rename to spring-boot-runtime/disabling-console-jul/src/main/java/com/baeldung/springbootlogging/disablingconsole/jul/properties/controllers/DisabledConsoleRestController.java diff --git a/spring-boot-disable-console-logging/disabling-console-jul/src/main/resources/application.properties b/spring-boot-runtime/disabling-console-jul/src/main/resources/application.properties similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-jul/src/main/resources/application.properties rename to spring-boot-runtime/disabling-console-jul/src/main/resources/application.properties diff --git a/spring-boot-disable-console-logging/disabling-console-jul/src/main/resources/logging.properties b/spring-boot-runtime/disabling-console-jul/src/main/resources/logging.properties similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-jul/src/main/resources/logging.properties rename to spring-boot-runtime/disabling-console-jul/src/main/resources/logging.properties diff --git a/spring-boot-disable-console-logging/disabling-console-log4j2/.gitignore b/spring-boot-runtime/disabling-console-log4j2/.gitignore similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-log4j2/.gitignore rename to spring-boot-runtime/disabling-console-log4j2/.gitignore diff --git a/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml b/spring-boot-runtime/disabling-console-log4j2/pom.xml similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml rename to spring-boot-runtime/disabling-console-log4j2/pom.xml diff --git a/spring-boot-disable-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java b/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java rename to spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/DisablingConsoleLog4j2App.java diff --git a/spring-boot-disable-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java b/spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java rename to spring-boot-runtime/disabling-console-log4j2/src/main/java/com/baeldung/springbootlogging/disablingconsole/log4j2/xml/controllers/DisabledConsoleRestController.java diff --git a/spring-boot-disable-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml b/spring-boot-runtime/disabling-console-log4j2/src/main/resources/log4j2.xml similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-log4j2/src/main/resources/log4j2.xml rename to spring-boot-runtime/disabling-console-log4j2/src/main/resources/log4j2.xml diff --git a/spring-boot-disable-console-logging/disabling-console-logback/.gitignore b/spring-boot-runtime/disabling-console-logback/.gitignore similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-logback/.gitignore rename to spring-boot-runtime/disabling-console-logback/.gitignore diff --git a/spring-boot-disable-console-logging/disabling-console-logback/pom.xml b/spring-boot-runtime/disabling-console-logback/pom.xml similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-logback/pom.xml rename to spring-boot-runtime/disabling-console-logback/pom.xml diff --git a/spring-boot-disable-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java b/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java rename to spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/DisablingConsoleLogbackApp.java diff --git a/spring-boot-disable-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java b/spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java rename to spring-boot-runtime/disabling-console-logback/src/main/java/com/baeldung/springbootlogging/disablingconsole/logback/xml/controllers/DisabledConsoleRestController.java diff --git a/spring-boot-disable-console-logging/disabling-console-logback/src/main/resources/application.properties b/spring-boot-runtime/disabling-console-logback/src/main/resources/application.properties similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-logback/src/main/resources/application.properties rename to spring-boot-runtime/disabling-console-logback/src/main/resources/application.properties diff --git a/spring-boot-disable-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml b/spring-boot-runtime/disabling-console-logback/src/main/resources/logback-spring.xml similarity index 100% rename from spring-boot-disable-console-logging/disabling-console-logback/src/main/resources/logback-spring.xml rename to spring-boot-runtime/disabling-console-logback/src/main/resources/logback-spring.xml From a50e35565b864c7bd172b79de9e1f22f0a80713f Mon Sep 17 00:00:00 2001 From: Maiklins Date: Sat, 28 Sep 2019 22:51:16 +0200 Subject: [PATCH 300/396] Update java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java Co-Authored-By: KevinGilmore --- .../src/test/java/com/baeldung/map/ProductUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java index 28ac06e166..2015909870 100644 --- a/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java +++ b/java-collections-maps-2/src/test/java/com/baeldung/map/ProductUnitTest.java @@ -36,7 +36,7 @@ class ProductUnitTest { Product nextPurchase = productsByName.get("Car"); - assertEquals(null, nextPurchase); + assertNull(nextPurchase); } @Test @@ -121,4 +121,4 @@ class ProductUnitTest { assertNull(productsByName.get("E-Bike")); } -} \ No newline at end of file +} From 58244611f06bd2733df1873cdcb352bfebacf330 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Sun, 29 Sep 2019 08:58:41 +0200 Subject: [PATCH 301/396] #BAEL-17505 minor change in Hibernate mapping description. --- persistence-modules/hibernate-mapping/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/hibernate-mapping/README.md b/persistence-modules/hibernate-mapping/README.md index 658f758709..3271f0c1b6 100644 --- a/persistence-modules/hibernate-mapping/README.md +++ b/persistence-modules/hibernate-mapping/README.md @@ -1,6 +1,6 @@ ## Hibernate Mapping -This module contains articles about Object-Relational Mapping with Hibernate. +This module contains articles about Object-relational Mapping (ORM) with Hibernate. ### Relevant Articles: From dad2aeba0f1437f8ee12eeeb79902eef9e5713dc Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Sun, 29 Sep 2019 09:30:37 +0200 Subject: [PATCH 302/396] #BAEL-17506 include libraries-2 and slightly edit a few descriptions --- libraries-2/README.md | 11 ++++++++++- libraries/README.md | 7 ++++--- persistence-modules/java-jpa-2/README.md | 2 +- persistence-modules/java-jpa/README.md | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/libraries-2/README.md b/libraries-2/README.md index 7d7fc67fa7..ea95b18d72 100644 --- a/libraries-2/README.md +++ b/libraries-2/README.md @@ -1,5 +1,13 @@ -## Relevant Articles: +## Libraries +This module contains articles about various Java libraries. +These are small libraries that are relatively easy to use and do not require any separate module of their own. + +The code examples related to different libraries are each in their own module. + +Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases. + +### Relevant articles - [A Guide to jBPM with Java](https://www.baeldung.com/jbpm-java) - [Guide to Classgraph Library](https://www.baeldung.com/classgraph) - [Create a Java Command Line Program with Picocli](https://www.baeldung.com/java-picocli-create-command-line-program) @@ -10,3 +18,4 @@ - [Key Value Store with Chronicle Map](https://www.baeldung.com/java-chronicle-map) - [Guide to MapDB](https://www.baeldung.com/mapdb) - [A Guide to Apache Mesos](https://www.baeldung.com/apache-mesos) +- More articles [[<-- prev]](/libraries) diff --git a/libraries/README.md b/libraries/README.md index 5bd53731f1..5d44247728 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -1,11 +1,11 @@ ## Libraries This module contains articles about various Java libraries. -These are small libraries that are relatively easy to use and does not require any separate module of their own. +These are small libraries that are relatively easy to use and do not require any separate module of their own. -The code examples related to different libraries should go in a new package. +The code examples related to different libraries are each in their own module. -Remember, for advanced libraries like JUnit, Jackson, etc. we already have separate modules. Please make sure to have a look at the existing modules in such cases. +Remember, for advanced libraries like [Jackson](/jackson) and [JUnit](/testing-modules) we already have separate modules. Please make sure to have a look at the existing modules in such cases. ### Relevant articles @@ -46,3 +46,4 @@ Remember, for advanced libraries like JUnit, Jackson, etc. we already have separ - [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) - [Introduction to Functional Java](https://www.baeldung.com/java-functional-library) - [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library) +- More articles [[next -->]](/libraries-2) diff --git a/persistence-modules/java-jpa-2/README.md b/persistence-modules/java-jpa-2/README.md index 9a677901c2..c3be046fc0 100644 --- a/persistence-modules/java-jpa-2/README.md +++ b/persistence-modules/java-jpa-2/README.md @@ -1,6 +1,6 @@ ## JPA in Java -This module contains articles about JPA (Java Persistence API) in Java. +This module contains articles about the Java Persistence API (JPA) in Java. ### Relevant Articles diff --git a/persistence-modules/java-jpa/README.md b/persistence-modules/java-jpa/README.md index 640753c2f2..b28aec5afb 100644 --- a/persistence-modules/java-jpa/README.md +++ b/persistence-modules/java-jpa/README.md @@ -1,6 +1,6 @@ ## JPA in Java -This module contains articles about JPA (Java Persistence API) in Java. +This module contains articles about the Java Persistence API (JPA) in Java. ### Relevant Articles From b86270a6aa9eb8093f740d763653468df66cd68a Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Sun, 29 Sep 2019 12:18:58 +0300 Subject: [PATCH 303/396] Ignoring unmapped properties with MapStruct (#7809) --- mapstruct/pom.xml | 7 +++ .../unmappedproperties/dto/CarDTO.java | 23 ++++++++ .../unmappedproperties/dto/DocumentDTO.java | 52 +++++++++++++++++++ .../unmappedproperties/entity/Car.java | 23 ++++++++ .../unmappedproperties/entity/Document.java | 42 +++++++++++++++ .../unmappedproperties/mapper/CarMapper.java | 13 +++++ .../mapper/DocumentMapper.java | 16 ++++++ .../mapper/DocumentMapperMappingIgnore.java | 20 +++++++ .../mapper/DocumentMapperUnmappedPolicy.java | 17 ++++++ .../mapper/DocumentMapperWithConfig.java | 16 ++++++ .../mapper/IgnoreUnmappedMapperConfig.java | 8 +++ .../unmappedproperties/CarMapperUnitTest.java | 23 ++++++++ .../DocumentMapperMappingIgnoreUnitTest.java | 45 ++++++++++++++++ .../DocumentMapperUnitTest.java | 45 ++++++++++++++++ .../DocumentMapperUnmappedPolicyUnitTest.java | 45 ++++++++++++++++ .../DocumentMapperWithConfigUnitTest.java | 45 ++++++++++++++++ 16 files changed, 440 insertions(+) create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/CarDTO.java create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/DocumentDTO.java create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Car.java create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Document.java create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/CarMapper.java create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapper.java create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperMappingIgnore.java create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperUnmappedPolicy.java create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperWithConfig.java create mode 100644 mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/IgnoreUnmappedMapperConfig.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/CarMapperUnitTest.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperMappingIgnoreUnitTest.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnitTest.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnmappedPolicyUnitTest.java create mode 100644 mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperWithConfigUnitTest.java diff --git a/mapstruct/pom.xml b/mapstruct/pom.xml index 2613dcf083..e98c4a318b 100644 --- a/mapstruct/pom.xml +++ b/mapstruct/pom.xml @@ -35,6 +35,12 @@ lombok ${org.projectlombok.version} + + org.assertj + assertj-core + ${assertj.version} + test + @@ -70,6 +76,7 @@ 1.8 1.8 1.18.4 + 3.11.1 diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/CarDTO.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/CarDTO.java new file mode 100644 index 0000000000..8f324f5a15 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/CarDTO.java @@ -0,0 +1,23 @@ +package com.baeldung.unmappedproperties.dto; + +public class CarDTO { + private int id; + private String name; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/DocumentDTO.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/DocumentDTO.java new file mode 100644 index 0000000000..8df306eb13 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/dto/DocumentDTO.java @@ -0,0 +1,52 @@ +package com.baeldung.unmappedproperties.dto; + +import java.util.List; + +public class DocumentDTO { + private int id; + private String title; + private String text; + private List comments; + private String author; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public List getComments() { + return comments; + } + + public void setComments(List comments) { + this.comments = comments; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } + +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Car.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Car.java new file mode 100644 index 0000000000..c23ced3a6a --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Car.java @@ -0,0 +1,23 @@ +package com.baeldung.unmappedproperties.entity; + +public class Car { + private int id; + private String name; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Document.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Document.java new file mode 100644 index 0000000000..89457133a3 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/entity/Document.java @@ -0,0 +1,42 @@ +package com.baeldung.unmappedproperties.entity; + +import java.util.Date; + +public class Document { + private int id; + private String title; + private String text; + private Date modificationTime; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Date getModificationTime() { + return modificationTime; + } + + public void setModificationTime(Date modificationTime) { + this.modificationTime = modificationTime; + } +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/CarMapper.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/CarMapper.java new file mode 100644 index 0000000000..714301b811 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/CarMapper.java @@ -0,0 +1,13 @@ +package com.baeldung.unmappedproperties.mapper; + +import com.baeldung.unmappedproperties.dto.CarDTO; +import com.baeldung.unmappedproperties.entity.Car; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface CarMapper { + CarMapper INSTANCE = Mappers.getMapper(CarMapper.class); + + CarDTO carToCarDTO(Car car); +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapper.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapper.java new file mode 100644 index 0000000000..fe233ed172 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapper.java @@ -0,0 +1,16 @@ +package com.baeldung.unmappedproperties.mapper; + +import com.baeldung.unmappedproperties.dto.DocumentDTO; +import com.baeldung.unmappedproperties.entity.Document; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface DocumentMapper { + + DocumentMapper INSTANCE = Mappers.getMapper(DocumentMapper.class); + + DocumentDTO documentToDocumentDTO(Document entity); + + Document documentDTOToDocument(DocumentDTO dto); +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperMappingIgnore.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperMappingIgnore.java new file mode 100644 index 0000000000..bf3b0b49c4 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperMappingIgnore.java @@ -0,0 +1,20 @@ +package com.baeldung.unmappedproperties.mapper; + +import com.baeldung.unmappedproperties.dto.DocumentDTO; +import com.baeldung.unmappedproperties.entity.Document; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface DocumentMapperMappingIgnore { + + DocumentMapperMappingIgnore INSTANCE = Mappers.getMapper(DocumentMapperMappingIgnore.class); + + @Mapping(target = "comments", ignore = true) + DocumentDTO documentToDocumentDTO(Document entity); + + @Mapping(target = "modificationTime", ignore = true) + Document documentDTOToDocument(DocumentDTO dto); + +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperUnmappedPolicy.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperUnmappedPolicy.java new file mode 100644 index 0000000000..b44f714774 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperUnmappedPolicy.java @@ -0,0 +1,17 @@ +package com.baeldung.unmappedproperties.mapper; + +import com.baeldung.unmappedproperties.dto.DocumentDTO; +import com.baeldung.unmappedproperties.entity.Document; +import org.mapstruct.Mapper; +import org.mapstruct.ReportingPolicy; +import org.mapstruct.factory.Mappers; + +@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface DocumentMapperUnmappedPolicy { + + DocumentMapperUnmappedPolicy INSTANCE = Mappers.getMapper(DocumentMapperUnmappedPolicy.class); + + DocumentDTO documentToDocumentDTO(Document entity); + + Document documentDTOToDocument(DocumentDTO dto); +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperWithConfig.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperWithConfig.java new file mode 100644 index 0000000000..dfaab7e1a1 --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/DocumentMapperWithConfig.java @@ -0,0 +1,16 @@ +package com.baeldung.unmappedproperties.mapper; + +import com.baeldung.unmappedproperties.dto.DocumentDTO; +import com.baeldung.unmappedproperties.entity.Document; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +@Mapper(config = IgnoreUnmappedMapperConfig.class) +public interface DocumentMapperWithConfig { + + DocumentMapperWithConfig INSTANCE = Mappers.getMapper(DocumentMapperWithConfig.class); + + DocumentDTO documentToDocumentDTO(Document entity); + + Document documentDTOToDocument(DocumentDTO dto); +} \ No newline at end of file diff --git a/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/IgnoreUnmappedMapperConfig.java b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/IgnoreUnmappedMapperConfig.java new file mode 100644 index 0000000000..804ce9c03a --- /dev/null +++ b/mapstruct/src/main/java/com/baeldung/unmappedproperties/mapper/IgnoreUnmappedMapperConfig.java @@ -0,0 +1,8 @@ +package com.baeldung.unmappedproperties.mapper; + +import org.mapstruct.MapperConfig; +import org.mapstruct.ReportingPolicy; + +@MapperConfig(unmappedTargetPolicy = ReportingPolicy.IGNORE) +public interface IgnoreUnmappedMapperConfig { +} \ No newline at end of file diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/CarMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/CarMapperUnitTest.java new file mode 100644 index 0000000000..4ce04015f1 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/CarMapperUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.mapper.unmappedproperties; + +import com.baeldung.unmappedproperties.dto.CarDTO; +import com.baeldung.unmappedproperties.entity.Car; +import com.baeldung.unmappedproperties.mapper.CarMapper; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class CarMapperUnitTest { + + @Test + public void givenCarEntitytoCar_whenMaps_thenCorrect() { + Car entity = new Car(); + entity.setId(1); + entity.setName("Toyota"); + + CarDTO carDto = CarMapper.INSTANCE.carToCarDTO(entity); + + assertThat(carDto.getId()).isEqualTo(entity.getId()); + assertThat(carDto.getName()).isEqualTo(entity.getName()); + } +} diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperMappingIgnoreUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperMappingIgnoreUnitTest.java new file mode 100644 index 0000000000..493c7f8686 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperMappingIgnoreUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.mapper.unmappedproperties; + +import com.baeldung.unmappedproperties.dto.DocumentDTO; +import com.baeldung.unmappedproperties.entity.Document; +import com.baeldung.unmappedproperties.mapper.DocumentMapperMappingIgnore; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Date; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DocumentMapperMappingIgnoreUnitTest { + + @Test + public void givenDocumentEntityToDocumentDto_whenMaps_thenCorrect() { + Document entity = new Document(); + entity.setId(1); + entity.setTitle("Price 13-42"); + entity.setText("List of positions......."); + entity.setModificationTime(new Date()); + + DocumentDTO dto = DocumentMapperMappingIgnore.INSTANCE.documentToDocumentDTO(entity); + + assertThat(dto.getId()).isEqualTo(entity.getId()); + assertThat(dto.getTitle()).isEqualTo(entity.getTitle()); + assertThat(dto.getText()).isEqualTo(entity.getText()); + } + + @Test + public void givenDocumentDtoToDocumentEntity_whenMaps_thenCorrect() { + DocumentDTO dto = new DocumentDTO(); + dto.setId(1); + dto.setTitle("Price 13-42"); + dto.setText("List of positions......."); + dto.setComments(Arrays.asList("Not all positions", "Wrong price values")); + dto.setAuthor("Author1"); + + Document entity = DocumentMapperMappingIgnore.INSTANCE.documentDTOToDocument(dto); + + assertThat(entity.getId()).isEqualTo(dto.getId()); + assertThat(entity.getTitle()).isEqualTo(dto.getTitle()); + assertThat(entity.getText()).isEqualTo(dto.getText()); + } +} \ No newline at end of file diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnitTest.java new file mode 100644 index 0000000000..1d3645ca96 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.mapper.unmappedproperties; + +import com.baeldung.unmappedproperties.dto.DocumentDTO; +import com.baeldung.unmappedproperties.entity.Document; +import com.baeldung.unmappedproperties.mapper.DocumentMapper; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Date; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DocumentMapperUnitTest { + + @Test + public void givenDocumentEntityToDocumentDto_whenMaps_thenCorrect() { + Document entity = new Document(); + entity.setId(1); + entity.setTitle("Price 13-42"); + entity.setText("List of positions......."); + entity.setModificationTime(new Date()); + + DocumentDTO dto = DocumentMapper.INSTANCE.documentToDocumentDTO(entity); + + assertThat(dto.getId()).isEqualTo(entity.getId()); + assertThat(dto.getTitle()).isEqualTo(entity.getTitle()); + assertThat(dto.getText()).isEqualTo(entity.getText()); + } + + @Test + public void givenDocumentDtoToDocumentEntity_whenMaps_thenCorrect() { + DocumentDTO dto = new DocumentDTO(); + dto.setId(1); + dto.setTitle("Price 13-42"); + dto.setText("List of positions......."); + dto.setComments(Arrays.asList("Not all positions", "Wrong price values")); + dto.setAuthor("Author1"); + + Document entity = DocumentMapper.INSTANCE.documentDTOToDocument(dto); + + assertThat(entity.getId()).isEqualTo(dto.getId()); + assertThat(entity.getTitle()).isEqualTo(dto.getTitle()); + assertThat(entity.getText()).isEqualTo(dto.getText()); + } +} \ No newline at end of file diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnmappedPolicyUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnmappedPolicyUnitTest.java new file mode 100644 index 0000000000..f6666a52ec --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperUnmappedPolicyUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.mapper.unmappedproperties; + +import com.baeldung.unmappedproperties.dto.DocumentDTO; +import com.baeldung.unmappedproperties.entity.Document; +import com.baeldung.unmappedproperties.mapper.DocumentMapperUnmappedPolicy; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Date; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DocumentMapperUnmappedPolicyUnitTest { + + @Test + public void givenDocumentEntityToDocumentDto_whenMaps_thenCorrect() { + Document entity = new Document(); + entity.setId(1); + entity.setTitle("Price 13-42"); + entity.setText("List of positions......."); + entity.setModificationTime(new Date()); + + DocumentDTO dto = DocumentMapperUnmappedPolicy.INSTANCE.documentToDocumentDTO(entity); + + assertThat(dto.getId()).isEqualTo(entity.getId()); + assertThat(dto.getTitle()).isEqualTo(entity.getTitle()); + assertThat(dto.getText()).isEqualTo(entity.getText()); + } + + @Test + public void givenDocumentDtoToDocumentEntity_whenMaps_thenCorrect() { + DocumentDTO dto = new DocumentDTO(); + dto.setId(1); + dto.setTitle("Price 13-42"); + dto.setText("List of positions......."); + dto.setComments(Arrays.asList("Not all positions", "Wrong price values")); + dto.setAuthor("Author1"); + + Document entity = DocumentMapperUnmappedPolicy.INSTANCE.documentDTOToDocument(dto); + + assertThat(entity.getId()).isEqualTo(dto.getId()); + assertThat(entity.getTitle()).isEqualTo(dto.getTitle()); + assertThat(entity.getText()).isEqualTo(dto.getText()); + } +} \ No newline at end of file diff --git a/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperWithConfigUnitTest.java b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperWithConfigUnitTest.java new file mode 100644 index 0000000000..c9409225f5 --- /dev/null +++ b/mapstruct/src/test/java/com/baeldung/mapper/unmappedproperties/DocumentMapperWithConfigUnitTest.java @@ -0,0 +1,45 @@ +package com.baeldung.mapper.unmappedproperties; + +import com.baeldung.unmappedproperties.dto.DocumentDTO; +import com.baeldung.unmappedproperties.entity.Document; +import com.baeldung.unmappedproperties.mapper.DocumentMapperWithConfig; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Date; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DocumentMapperWithConfigUnitTest { + + @Test + public void givenDocumentEntityToDocumentDto_whenMaps_thenCorrect() { + Document entity = new Document(); + entity.setId(1); + entity.setTitle("Price 13-42"); + entity.setText("List of positions......."); + entity.setModificationTime(new Date()); + + DocumentDTO dto = DocumentMapperWithConfig.INSTANCE.documentToDocumentDTO(entity); + + assertThat(dto.getId()).isEqualTo(entity.getId()); + assertThat(dto.getTitle()).isEqualTo(entity.getTitle()); + assertThat(dto.getText()).isEqualTo(entity.getText()); + } + + @Test + public void givenDocumentDtoToDocumentEntity_whenMaps_thenCorrect() { + DocumentDTO dto = new DocumentDTO(); + dto.setId(1); + dto.setTitle("Price 13-42"); + dto.setText("List of positions......."); + dto.setComments(Arrays.asList("Not all positions", "Wrong price values")); + dto.setAuthor("Author1"); + + Document entity = DocumentMapperWithConfig.INSTANCE.documentDTOToDocument(dto); + + assertThat(entity.getId()).isEqualTo(dto.getId()); + assertThat(entity.getTitle()).isEqualTo(dto.getTitle()); + assertThat(entity.getText()).isEqualTo(dto.getText()); + } +} \ No newline at end of file From fcf0841011fa904444ca70bf2935b0caca069f8e Mon Sep 17 00:00:00 2001 From: fejera Date: Sun, 29 Sep 2019 15:05:42 +0200 Subject: [PATCH 304/396] changed all article links from http to https in spring-5-reactive --- spring-5-reactive/README.md | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index 89ff4fea9f..fd8b4c9ad4 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -3,20 +3,21 @@ This module contains articles about reactive Spring 5 ### The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring +The "REST With Spring" Classes: https://bit.ly/restwithspring ### Relevant Articles -- [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web) -- [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) -- [Exploring the Spring 5 WebFlux URL Matching](http://www.baeldung.com/spring-5-mvc-url-matching) -- [Reactive WebSockets with Spring 5](http://www.baeldung.com/spring-5-reactive-websockets) -- [Spring Webflux Filters](http://www.baeldung.com/spring-webflux-filters) -- [How to Set a Header on a Response with Spring 5](http://www.baeldung.com/spring-response-header) -- [Spring Webflux and CORS](http://www.baeldung.com/spring-webflux-cors) -- [Handling Errors in Spring WebFlux](http://www.baeldung.com/spring-webflux-errors) +- [Introduction to the Functional Web Framework in Spring 5](https://www.baeldung.com/spring-5-functional-web) +- [Spring 5 WebClient](https://www.baeldung.com/spring-5-webclient) +- [Exploring the Spring 5 WebFlux URL Matching](https://www.baeldung.com/spring-5-mvc-url-matching) +- [Reactive WebSockets with Spring 5](https://www.baeldung.com/spring-5-reactive-websockets) +- [Spring Webflux Filters](https://www.baeldung.com/spring-webflux-filters) +- [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) +- [Spring Webflux and CORS](https://www.baeldung.com/spring-webflux-cors) +- [Handling Errors in Spring WebFlux](https://www.baeldung.com/spring-webflux-errors) - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) + - [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) - [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) From 4c3af61952a52886164ee4448d6e54de65eaca30 Mon Sep 17 00:00:00 2001 From: fejera Date: Sun, 29 Sep 2019 15:22:55 +0200 Subject: [PATCH 305/396] fixed FunctionalEndpointValidationsLiveTest --- .../handlers/impl/AnnotatedRequestEntityValidationHandler.java | 1 - .../functional/FunctionalEndpointValidationsLiveTest.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java index 2011679741..9fec15142e 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java +++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java @@ -1,7 +1,6 @@ package com.baeldung.validations.functional.handlers.impl; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.MediaType; import org.springframework.stereotype.Component; import org.springframework.validation.Validator; diff --git a/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java index 73968cdf05..92257f2850 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java @@ -11,7 +11,7 @@ import com.baeldung.validations.functional.model.CustomRequestEntity; import reactor.core.publisher.Mono; -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) public class FunctionalEndpointValidationsLiveTest { private static final String BASE_URL = "http://localhost:8080"; From 79cc747844781ffe97f978adf8f213a79ca99f40 Mon Sep 17 00:00:00 2001 From: fejera Date: Sun, 29 Sep 2019 15:35:59 +0200 Subject: [PATCH 306/396] moved functional validation examples from spring-5-reactive to spring-5-reactive-2 --- spring-5-reactive-2/README.md | 1 + spring-5-reactive-2/pom.xml | 10 ++++++++-- .../functional/FunctionalValidationsApplication.java | 0 .../handlers/AbstractValidationHandler.java | 0 .../functional/handlers/FunctionalHandler.java | 0 .../AnnotatedRequestEntityValidationHandler.java | 0 .../impl/CustomRequestEntityValidationHandler.java | 0 .../handlers/impl/OtherEntityValidationHandler.java | 0 .../functional/model/AnnotatedRequestEntity.java | 0 .../functional/model/CustomRequestEntity.java | 0 .../validations/functional/model/OtherEntity.java | 0 .../functional/routers/ValidationsRouters.java | 0 .../validators/CustomRequestEntityValidator.java | 0 .../functional/validators/OtherEntityValidator.java | 0 .../com/baeldung/webclient/WebClientApplication.java | 12 ++++++++++++ .../FunctionalEndpointValidationsLiveTest.java | 0 spring-5-reactive/README.md | 1 - 17 files changed, 21 insertions(+), 3 deletions(-) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java (100%) diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md index 1d21425fb8..15eba8d0d9 100644 --- a/spring-5-reactive-2/README.md +++ b/spring-5-reactive-2/README.md @@ -3,4 +3,5 @@ This module contains articles about reactive Spring 5 - [Spring WebClient vs. RestTemplate](https://www.baeldung.com/spring-webclient-resttemplate) +- [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) - More articles: [[<-- prev]](/spring-5-reactive) diff --git a/spring-5-reactive-2/pom.xml b/spring-5-reactive-2/pom.xml index f1407ee1ad..edda43747c 100644 --- a/spring-5-reactive-2/pom.xml +++ b/spring-5-reactive-2/pom.xml @@ -23,9 +23,9 @@ org.springframework.boot - spring-boot-starter-test - test + spring-boot-starter-security + org.projectlombok lombok @@ -33,6 +33,12 @@ provided + + org.springframework.boot + spring-boot-starter-test + test + + com.github.tomakehurst wiremock-jre8 diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/AbstractValidationHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/FunctionalHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/AnnotatedRequestEntityValidationHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/CustomRequestEntityValidationHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/handlers/impl/OtherEntityValidationHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/AnnotatedRequestEntity.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/CustomRequestEntity.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/model/OtherEntity.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/validators/CustomRequestEntityValidator.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java b/spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java rename to spring-5-reactive-2/src/main/java/com/baeldung/validations/functional/validators/OtherEntityValidator.java diff --git a/spring-5-reactive-2/src/main/java/com/baeldung/webclient/WebClientApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/webclient/WebClientApplication.java index 751e3a9487..3c53a2c1d3 100644 --- a/spring-5-reactive-2/src/main/java/com/baeldung/webclient/WebClientApplication.java +++ b/spring-5-reactive-2/src/main/java/com/baeldung/webclient/WebClientApplication.java @@ -2,10 +2,22 @@ package com.baeldung.webclient; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; @SpringBootApplication public class WebClientApplication { public static void main(String[] args) { SpringApplication.run(WebClientApplication.class, args); } + + @Bean + public SecurityWebFilterChain functionalValidationsSpringSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() + .anyExchange() + .permitAll(); + http.csrf().disable(); + return http.build(); + } } diff --git a/spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/validations/functional/FunctionalEndpointValidationsLiveTest.java diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index fd8b4c9ad4..a8d4436049 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -18,7 +18,6 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) -- [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) - [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) - [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) From 6b346d3f5f16a802fd3cd224dcfb5d9c49e2301c Mon Sep 17 00:00:00 2001 From: fejera Date: Sun, 29 Sep 2019 15:40:57 +0200 Subject: [PATCH 307/396] moved reactive logging examples from spring-5-reactive to spring-5-reactive-2 --- spring-5-reactive-2/README.md | 1 + .../java/com/baeldung/webflux/logging/WebFluxLoggingExample.java | 0 spring-5-reactive/README.md | 1 - 3 files changed, 1 insertion(+), 1 deletion(-) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java (100%) diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md index 15eba8d0d9..ffa101ba47 100644 --- a/spring-5-reactive-2/README.md +++ b/spring-5-reactive-2/README.md @@ -4,4 +4,5 @@ This module contains articles about reactive Spring 5 - [Spring WebClient vs. RestTemplate](https://www.baeldung.com/spring-webclient-resttemplate) - [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) +- [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - More articles: [[<-- prev]](/spring-5-reactive) diff --git a/spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java b/spring-5-reactive-2/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java rename to spring-5-reactive-2/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index a8d4436049..d77283d4b7 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -18,7 +18,6 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) -- [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) - [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) - [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) From 8a3b8a7e18a394e07f429c9e1526bde799484868 Mon Sep 17 00:00:00 2001 From: fejera Date: Sun, 29 Sep 2019 15:48:52 +0200 Subject: [PATCH 308/396] moved stepverifier examples from spring-5-reactive to spring-5-reactive-2 --- spring-5-reactive-2/README.md | 1 + spring-5-reactive-2/pom.xml | 12 +++++++++++- .../stepverifier/PostExecutionUnitTest.java | 0 .../stepverifier/StepByStepUnitTest.java | 0 .../TestingTestPublisherUnitTest.java | 0 .../baeldung/stepverifier/TimeBasedUnitTest.java | 0 spring-5-reactive/README.md | 1 - spring-5-reactive/pom.xml | 16 ---------------- 8 files changed, 12 insertions(+), 18 deletions(-) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java (100%) diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md index ffa101ba47..78a70078f5 100644 --- a/spring-5-reactive-2/README.md +++ b/spring-5-reactive-2/README.md @@ -5,4 +5,5 @@ This module contains articles about reactive Spring 5 - [Spring WebClient vs. RestTemplate](https://www.baeldung.com/spring-webclient-resttemplate) - [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) - [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) +- [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) - More articles: [[<-- prev]](/spring-5-reactive) diff --git a/spring-5-reactive-2/pom.xml b/spring-5-reactive-2/pom.xml index edda43747c..37c9ad3579 100644 --- a/spring-5-reactive-2/pom.xml +++ b/spring-5-reactive-2/pom.xml @@ -25,11 +25,15 @@ org.springframework.boot spring-boot-starter-security + + org.projectreactor + reactor-spring + ${reactor-spring.version} + org.projectlombok lombok - ${lombok.version} provided @@ -45,6 +49,11 @@ ${wiremock.version} test + + io.projectreactor + reactor-test + test + @@ -61,6 +70,7 @@ + 1.0.1.RELEASE 2.24.0 diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index d77283d4b7..cb0ec65246 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -18,7 +18,6 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) -- [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) - [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) - [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) - More articles: [[next -->]](/spring-5-reactive-2) \ No newline at end of file diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml index 99cdd11f24..e6690baf54 100644 --- a/spring-5-reactive/pom.xml +++ b/spring-5-reactive/pom.xml @@ -29,11 +29,6 @@ org.springframework.boot spring-boot-starter-webflux - - org.projectreactor - reactor-spring - ${reactor-spring.version} - javax.json.bind javax.json.bind-api @@ -112,18 +107,10 @@ io.reactivex.rxjava2 rxjava - ${rxjava-version} - - - io.projectreactor - reactor-test - ${project-reactor-test} - test org.apache.httpcomponents httpclient - ${httpclient.version} @@ -165,13 +152,10 @@ 1.0.1.RELEASE - 2.1.12 1.1.3 1.0 1.0 4.1 - 3.2.3.RELEASE - 4.5.8 From c4c59a08ddbaf61cf6a4e03049923daa26291fa3 Mon Sep 17 00:00:00 2001 From: fejera Date: Sun, 29 Sep 2019 16:08:53 +0200 Subject: [PATCH 309/396] moved reactive debugging examples from spring-5-reactive to spring-5-reactive-2 --- spring-5-reactive-2/README.md | 1 + .../debugging/consumer/ConsumerDebuggingApplication.java | 1 + .../com/baeldung/debugging/consumer/chronjobs/ChronJobs.java | 0 .../controllers/ReactiveConfigsToggleRestController.java | 0 .../main/java/com/baeldung/debugging/consumer/model/Foo.java | 4 ---- .../java/com/baeldung/debugging/consumer/model/FooDto.java | 0 .../baeldung/debugging/consumer/service/FooNameHelper.java | 0 .../debugging/consumer/service/FooQuantityHelper.java | 0 .../com/baeldung/debugging/consumer/service/FooReporter.java | 0 .../com/baeldung/debugging/consumer/service/FooService.java | 0 .../baeldung/debugging/server/ServerDebuggingApplication.java | 0 .../com/baeldung/debugging/server/handlers/ServerHandler.java | 0 .../main/java/com/baeldung/debugging/server/model/Foo.java | 3 --- .../com/baeldung/debugging/server/routers/ServerRouter.java | 0 .../debugging/consumer/ConsumerFooServiceIntegrationTest.java | 0 .../debugging/consumer/ConsumerFooServiceLiveTest.java | 0 .../com/baeldung/debugging/consumer/utils/ListAppender.java | 0 .../src/test/resources/logback-test.xml | 0 spring-5-reactive/README.md | 1 - 19 files changed, 2 insertions(+), 8 deletions(-) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java (97%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/consumer/model/Foo.java (89%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/consumer/service/FooService.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/server/model/Foo.java (77%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/resources/logback-test.xml (100%) diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md index 78a70078f5..57190f077b 100644 --- a/spring-5-reactive-2/README.md +++ b/spring-5-reactive-2/README.md @@ -6,4 +6,5 @@ This module contains articles about reactive Spring 5 - [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) - [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) +- [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) - More articles: [[<-- prev]](/spring-5-reactive) diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java similarity index 97% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java index 486c5e77eb..3f01310006 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java +++ b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java @@ -28,6 +28,7 @@ public class ConsumerDebuggingApplication { http.authorizeExchange() .anyExchange() .permitAll(); + http.csrf().disable(); return http.build(); } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/Foo.java similarity index 89% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/Foo.java index ac5093c261..916ca93bfc 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java +++ b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/Foo.java @@ -2,10 +2,7 @@ package com.baeldung.debugging.consumer.model; import java.util.concurrent.ThreadLocalRandom; -import org.springframework.data.annotation.Id; - import lombok.AllArgsConstructor; -import lombok.Data; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -16,7 +13,6 @@ import lombok.Setter; @AllArgsConstructor public class Foo { - @Id private Integer id; private String formattedName; private Integer quantity; diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooService.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/consumer/service/FooService.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/model/Foo.java similarity index 77% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/model/Foo.java index a60e468e7f..2d9491f3dd 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java +++ b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/model/Foo.java @@ -1,7 +1,5 @@ package com.baeldung.debugging.server.model; -import org.springframework.data.annotation.Id; - import lombok.AllArgsConstructor; import lombok.Data; @@ -9,7 +7,6 @@ import lombok.Data; @AllArgsConstructor public class Foo { - @Id private Long id; private String name; diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java b/spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java rename to spring-5-reactive-2/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java b/spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java rename to spring-5-reactive-2/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java diff --git a/spring-5-reactive/src/test/resources/logback-test.xml b/spring-5-reactive-2/src/test/resources/logback-test.xml similarity index 100% rename from spring-5-reactive/src/test/resources/logback-test.xml rename to spring-5-reactive-2/src/test/resources/logback-test.xml diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index cb0ec65246..74156a993e 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -18,6 +18,5 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) -- [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) - [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) - More articles: [[next -->]](/spring-5-reactive-2) \ No newline at end of file From c391435c3cc4c8b95d3621f98dde547ee4266dc2 Mon Sep 17 00:00:00 2001 From: fejera Date: Sun, 29 Sep 2019 16:19:12 +0200 Subject: [PATCH 310/396] moved webflux static content examples from spring-5-reactive to spring-5-reactive-2 --- spring-5-reactive-2/README.md | 1 + .../staticcontent/StaticContentApplication.java | 0 .../baeldung/staticcontent/StaticContentConfig.java | 0 .../application-assets-custom-location.properties | 0 .../StaticContentCustomLocationIntegrationTest.java | 0 ...StaticContentDefaultLocationIntegrationTest.java | 0 .../src/test/resources/assets}/index.html | 0 .../src/test}/resources/img/example-image.png | Bin .../src/test/resources/public/index.html | 10 ++++++++++ spring-5-reactive/README.md | 2 -- 10 files changed, 11 insertions(+), 2 deletions(-) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/main/resources/application-assets-custom-location.properties (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java (100%) rename {spring-5-reactive => spring-5-reactive-2}/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java (100%) rename {spring-5-reactive/src/main/resources/public => spring-5-reactive-2/src/test/resources/assets}/index.html (100%) rename {spring-5-reactive/src/main => spring-5-reactive-2/src/test}/resources/img/example-image.png (100%) create mode 100644 spring-5-reactive-2/src/test/resources/public/index.html diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md index 57190f077b..31483c5c0e 100644 --- a/spring-5-reactive-2/README.md +++ b/spring-5-reactive-2/README.md @@ -7,4 +7,5 @@ This module contains articles about reactive Spring 5 - [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) - [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) - [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) +- [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) - More articles: [[<-- prev]](/spring-5-reactive) diff --git a/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java b/spring-5-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java rename to spring-5-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentApplication.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java b/spring-5-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java similarity index 100% rename from spring-5-reactive/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java rename to spring-5-reactive-2/src/main/java/com/baeldung/staticcontent/StaticContentConfig.java diff --git a/spring-5-reactive/src/main/resources/application-assets-custom-location.properties b/spring-5-reactive-2/src/main/resources/application-assets-custom-location.properties similarity index 100% rename from spring-5-reactive/src/main/resources/application-assets-custom-location.properties rename to spring-5-reactive-2/src/main/resources/application-assets-custom-location.properties diff --git a/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/staticcontent/StaticContentCustomLocationIntegrationTest.java diff --git a/spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java b/spring-5-reactive-2/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java similarity index 100% rename from spring-5-reactive/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java rename to spring-5-reactive-2/src/test/java/com/baeldung/staticcontent/StaticContentDefaultLocationIntegrationTest.java diff --git a/spring-5-reactive/src/main/resources/public/index.html b/spring-5-reactive-2/src/test/resources/assets/index.html similarity index 100% rename from spring-5-reactive/src/main/resources/public/index.html rename to spring-5-reactive-2/src/test/resources/assets/index.html diff --git a/spring-5-reactive/src/main/resources/img/example-image.png b/spring-5-reactive-2/src/test/resources/img/example-image.png similarity index 100% rename from spring-5-reactive/src/main/resources/img/example-image.png rename to spring-5-reactive-2/src/test/resources/img/example-image.png diff --git a/spring-5-reactive-2/src/test/resources/public/index.html b/spring-5-reactive-2/src/test/resources/public/index.html new file mode 100644 index 0000000000..7a3b9413cd --- /dev/null +++ b/spring-5-reactive-2/src/test/resources/public/index.html @@ -0,0 +1,10 @@ + + + + + Baeldung: Static Content in Spring WebFlux + + +Example HTML file + + \ No newline at end of file diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index 74156a993e..997795ca9a 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -17,6 +17,4 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring - [Handling Errors in Spring WebFlux](https://www.baeldung.com/spring-webflux-errors) - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) - -- [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) - More articles: [[next -->]](/spring-5-reactive-2) \ No newline at end of file From 56cae916aa5dcc5167b3687be0270d109233bd57 Mon Sep 17 00:00:00 2001 From: Devender Kumar <47500074+kumar-devender@users.noreply.github.com> Date: Sun, 29 Sep 2019 17:38:58 +0200 Subject: [PATCH 311/396] remove sys and added test cases (#7894) * BAEL-3286 added component scan filter example * Remove unused class * Corrected formatting * formatted code * Update code * added test cases * Fix tests name --- spring-boot-di/pom.xml | 5 +++ .../filter/annotation/Animal.java | 3 +- .../ComponentScanAnnotationFilterApp.java | 8 ----- .../filter/annotation/Elephant.java | 3 +- .../componentscan/filter/aspectj/Cat.java | 3 +- .../ComponentScanAspectJFilterApp.java | 15 +++++++++ .../aspectj/ComponentScanCustomFilterApp.java | 24 -------------- .../filter/aspectj/Elephant.java | 3 +- .../componentscan/filter/aspectj/Loin.java | 3 +- .../filter/assignable/Animal.java | 3 +- .../componentscan/filter/assignable/Cat.java | 3 +- .../ComponentScanAssignableTypeFilterApp.java | 8 ----- .../filter/assignable/Elephant.java | 3 +- .../componentscan/filter/custom/Cat.java | 3 +- .../custom/ComponentScanCustomFilter.java | 6 ++-- .../custom/ComponentScanCustomFilterApp.java | 8 ----- .../componentscan/filter/custom/Loin.java | 3 +- .../componentscan/filter/custom/Pet.java | 3 +- .../componentscan/filter/regex/Cat.java | 3 +- .../regex/ComponentScanRegexFilterApp.java | 7 ----- .../componentscan/filter/regex/Elephant.java | 3 +- .../componentscan/filter/regex/Loin.java | 3 +- .../springapp/SpringComponentScanApp.java | 8 ++--- .../SpringBootComponentScanApp.java | 6 ++-- ...canAnnotationFilterAppIntegrationTest.java | 30 ++++++++++++++++++ ...ntScanAspectJFilterAppIntegrationTest.java | 30 ++++++++++++++++++ ...ssignableTypeFilterAppIntegrationTest.java | 31 +++++++++++++++++++ ...entScanCustomFilterAppIntegrationTest.java | 30 ++++++++++++++++++ ...nentScanRegexFilterAppIntegrationTest.java | 31 +++++++++++++++++++ 29 files changed, 210 insertions(+), 79 deletions(-) create mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java delete mode 100644 spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanCustomFilterApp.java create mode 100644 spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java create mode 100644 spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java create mode 100644 spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java create mode 100644 spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java create mode 100644 spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java diff --git a/spring-boot-di/pom.xml b/spring-boot-di/pom.xml index c0faf44335..31ccff03da 100644 --- a/spring-boot-di/pom.xml +++ b/spring-boot-di/pom.xml @@ -36,6 +36,11 @@ tomcat-embed-jasper provided + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java index 73bd0e3673..7ec076abc7 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Animal.java @@ -7,4 +7,5 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) -public @interface Animal { } +public @interface Animal { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java index 7e89870d4b..7849e4e10a 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterApp.java @@ -1,21 +1,13 @@ package com.baeldung.componentscan.filter.annotation; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; -import java.util.Arrays; - @Configuration @ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Animal.class)) public class ComponentScanAnnotationFilterApp { - private static ApplicationContext applicationContext; public static void main(String[] args) { - applicationContext = new AnnotationConfigApplicationContext(ComponentScanAnnotationFilterApp.class); - Arrays.stream(applicationContext.getBeanDefinitionNames()) - .forEach(System.out::println); } } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java index 8ad8111d6b..758775a737 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/annotation/Elephant.java @@ -1,4 +1,5 @@ package com.baeldung.componentscan.filter.annotation; @Animal -public class Elephant { } +public class Elephant { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java index b34a2d7112..ababe4fea9 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Cat.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.aspectj; -public class Cat { } +public class Cat { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java new file mode 100644 index 0000000000..aea7c0a2cd --- /dev/null +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterApp.java @@ -0,0 +1,15 @@ +package com.baeldung.componentscan.filter.aspectj; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.FilterType; + +@Configuration +@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, +pattern = "com.baeldung.componentscan.filter.aspectj.* " + + "&& !(com.baeldung.componentscan.filter.aspectj.L* " + + "|| com.baeldung.componentscan.filter.aspectj.C*)")) +public class ComponentScanAspectJFilterApp { + public static void main(String[] args) { + } +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanCustomFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanCustomFilterApp.java deleted file mode 100644 index 3674c09531..0000000000 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/ComponentScanCustomFilterApp.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.componentscan.filter.aspectj; - -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; - -import java.util.Arrays; - -@Configuration -@ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ASPECTJ, - pattern = "com.baeldung.componentscan.filter.aspectj.* " - + "&& !(com.baeldung.componentscan.filter.aspectj.L* " - + "|| com.baeldung.componentscan.filter.aspectj.E*)")) -public class ComponentScanCustomFilterApp { - private static ApplicationContext applicationContext; - - public static void main(String[] args) { - applicationContext = new AnnotationConfigApplicationContext(ComponentScanCustomFilterApp.class); - Arrays.stream(applicationContext.getBeanDefinitionNames()) - .forEach(System.out::println); - } -} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java index 30abc9dcd4..ade1b5903c 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Elephant.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.aspectj; -public class Elephant { } +public class Elephant { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java index cf442e981e..6bfdfeb321 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/aspectj/Loin.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.aspectj; -public class Loin { } +public class Loin { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java index 77cf2e72f0..faf4121834 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Animal.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.assignable; -public interface Animal { } +public interface Animal { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java index 262ae154f8..568ac8045f 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Cat.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.assignable; -public class Cat implements Animal { } +public class Cat implements Animal { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java index a5fa2b0942..b0155a882b 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterApp.java @@ -1,21 +1,13 @@ package com.baeldung.componentscan.filter.assignable; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; -import java.util.Arrays; - @Configuration @ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = Animal.class)) public class ComponentScanAssignableTypeFilterApp { - private static ApplicationContext applicationContext; public static void main(String[] args) { - applicationContext = new AnnotationConfigApplicationContext(ComponentScanAssignableTypeFilterApp.class); - Arrays.stream(applicationContext.getBeanDefinitionNames()) - .forEach(System.out::println); } } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java index 815e0d762a..74637c86ba 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/assignable/Elephant.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.assignable; -public class Elephant implements Animal { } +public class Elephant implements Animal { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java index 282d6bb641..17a8e87b7a 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Cat.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.custom; -public class Cat extends Pet { } +public class Cat extends Pet { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java index ebaccf7838..30ccb19276 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilter.java @@ -10,11 +10,11 @@ import java.io.IOException; public class ComponentScanCustomFilter implements TypeFilter { @Override - public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) - throws IOException { + public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException { ClassMetadata classMetadata = metadataReader.getClassMetadata(); String superClass = classMetadata.getSuperClassName(); - if (Pet.class.getName().equalsIgnoreCase(superClass)) { + if (Pet.class.getName() + .equalsIgnoreCase(superClass)) { return true; } return false; diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java index 1a4f5dbf4e..3a87b6a807 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterApp.java @@ -1,21 +1,13 @@ package com.baeldung.componentscan.filter.custom; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; -import java.util.Arrays; - @Configuration @ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM, classes = ComponentScanCustomFilter.class)) public class ComponentScanCustomFilterApp { - private static ApplicationContext applicationContext; public static void main(String[] args) { - applicationContext = new AnnotationConfigApplicationContext(ComponentScanCustomFilterApp.class); - Arrays.stream(applicationContext.getBeanDefinitionNames()) - .forEach(System.out::println); } } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java index 0e2f9e0692..5deb4af9f3 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Loin.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.custom; -public class Loin { } +public class Loin { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java index 9b4497221d..c9be5a39c2 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/custom/Pet.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.custom; -public class Pet { } +public class Pet { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java index 87341cae9d..4569f91787 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Cat.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.regex; -public class Cat { } +public class Cat { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java index 36e94446b2..d2b7bd03fb 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterApp.java @@ -1,20 +1,13 @@ package com.baeldung.componentscan.filter.regex; -import org.springframework.context.ApplicationContext; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.FilterType; -import java.util.Arrays; - @Configuration @ComponentScan(includeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = ".*[t]")) public class ComponentScanRegexFilterApp { - private static ApplicationContext applicationContext; public static void main(String[] args) { - applicationContext = new AnnotationConfigApplicationContext(ComponentScanRegexFilterApp.class); - Arrays.stream(applicationContext.getBeanDefinitionNames()).forEach(System.out::println); } } diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java index 314dca5b77..4910be41ad 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Elephant.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.regex; -public class Elephant { } +public class Elephant { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java index 1b75fc1b43..5b7949be38 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/filter/regex/Loin.java @@ -1,3 +1,4 @@ package com.baeldung.componentscan.filter.regex; -public class Loin { } +public class Loin { +} diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java index 83b91f7860..8873f1214c 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/springapp/SpringComponentScanApp.java @@ -10,10 +10,10 @@ import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan -//@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class)) -//@ComponentScan(basePackages = "com.baeldung.componentscan.springapp") -//@ComponentScan(basePackages = "com.baeldung.componentscan.springapp.animals") -//@ComponentScan (excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX,pattern="com\\.baeldung\\.componentscan\\.springapp\\.flowers\\..*")) +// @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class)) +// @ComponentScan(basePackages = "com.baeldung.componentscan.springapp") +// @ComponentScan(basePackages = "com.baeldung.componentscan.springapp.animals") +// @ComponentScan (excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX,pattern="com\\.baeldung\\.componentscan\\.springapp\\.flowers\\..*")) public class SpringComponentScanApp { private static ApplicationContext applicationContext; diff --git a/spring-boot-di/src/main/java/com/baeldung/componentscan/springbootapp/SpringBootComponentScanApp.java b/spring-boot-di/src/main/java/com/baeldung/componentscan/springbootapp/SpringBootComponentScanApp.java index 4362caefbb..c48f8c5e54 100644 --- a/spring-boot-di/src/main/java/com/baeldung/componentscan/springbootapp/SpringBootComponentScanApp.java +++ b/spring-boot-di/src/main/java/com/baeldung/componentscan/springbootapp/SpringBootComponentScanApp.java @@ -8,9 +8,9 @@ import org.springframework.context.annotation.Bean; import com.baeldung.componentscan.ExampleBean; @SpringBootApplication -//@ComponentScan(basePackages = "com.baeldung.componentscan.springbootapp.animals") -//@ComponentScan ( excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX,pattern="com\\.baeldung\\.componentscan\\.springbootapp\\.flowers\\..*")) -//@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class)) +// @ComponentScan(basePackages = "com.baeldung.componentscan.springbootapp.animals") +// @ComponentScan ( excludeFilters = @ComponentScan.Filter(type=FilterType.REGEX,pattern="com\\.baeldung\\.componentscan\\.springbootapp\\.flowers\\..*")) +// @ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = Rose.class)) public class SpringBootComponentScanApp { private static ApplicationContext applicationContext; diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java new file mode 100644 index 0000000000..ed984a3beb --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.componentscan.filter.annotation; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanAnnotationFilterApp.class) +public class ComponentScanAnnotationFilterAppIntegrationTest { + + @Test + public void testBean() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAnnotationFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanAnnotationFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(1)); + assertThat(beans.get(0), equalTo("elephant")); + } +} diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java new file mode 100644 index 0000000000..fa8d12723f --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.componentscan.filter.aspectj; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanAspectJFilterApp.class) +public class ComponentScanAspectJFilterAppIntegrationTest { + + @Test + public void testBean() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAspectJFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanCustomFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(1)); + assertThat(beans.get(0), equalTo("elephant")); + } +} diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java new file mode 100644 index 0000000000..460be8e8ba --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java @@ -0,0 +1,31 @@ +package com.baeldung.componentscan.filter.assignable; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanAssignableTypeFilterApp.class) +public class ComponentScanAssignableTypeFilterAppIntegrationTest { + + @Test + public void testBean() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAssignableTypeFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanAssignableTypeFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(2)); + assertThat(beans.contains("cat"), equalTo(true)); + assertThat(beans.contains("elephant"), equalTo(true)); + } +} diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java new file mode 100644 index 0000000000..f47c0123fa --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java @@ -0,0 +1,30 @@ +package com.baeldung.componentscan.filter.custom; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanCustomFilterApp.class) +public class ComponentScanCustomFilterAppIntegrationTest { + + @Test + public void testBean() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanCustomFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanCustomFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(1)); + assertThat(beans.get(0), equalTo("cat")); + } +} diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java new file mode 100644 index 0000000000..4fccbd776e --- /dev/null +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java @@ -0,0 +1,31 @@ +package com.baeldung.componentscan.filter.regex; + +import static org.junit.Assert.assertThat; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.context.ApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; +import org.springframework.test.context.junit4.SpringRunner; +import static org.hamcrest.CoreMatchers.*; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = ComponentScanRegexFilterApp.class) +public class ComponentScanRegexFilterAppIntegrationTest { + + @Test + public void testBean() { + ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanRegexFilterApp.class); + List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanRegexFilterApp")) + .collect(Collectors.toList()); + assertThat(beans.size(), equalTo(2)); + assertThat(beans.contains("cat"), equalTo(true)); + assertThat(beans.contains("elephant"), equalTo(true)); + } +} From 230b2db438eb991de795be57daf08c08245399be Mon Sep 17 00:00:00 2001 From: Afshin Date: Sun, 29 Sep 2019 18:30:31 +0200 Subject: [PATCH 312/396] MalformedInputException test functions are added --- .../encoding/CharacterEncodingExamples.java | 20 +++++-- .../CharacterEncodingExamplesUnitTest.java | 55 +++++++++++++++++++ 2 files changed, 70 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java index bdd92e37f6..51b2347823 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java @@ -1,10 +1,9 @@ package com.baeldung.encoding; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; +import java.io.*; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; public class CharacterEncodingExamples { @@ -29,4 +28,15 @@ public class CharacterEncodingExamples { } return buffer.toString(); } + + static String decodeText(String input, Charset charset, CodingErrorAction codingErrorAction) throws IOException { + CharsetDecoder charsetDecoder = charset.newDecoder(); + charsetDecoder.onMalformedInput(codingErrorAction); + return new BufferedReader( + new InputStreamReader( + new ByteArrayInputStream(input.getBytes()), + charsetDecoder)) + .readLine(); + + } } diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index 95b3605d95..1a875738d0 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -1,9 +1,21 @@ package com.baeldung.encoding; +import java.io.BufferedReader; import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.*; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import org.junit.Assert; import org.junit.Test; +import org.junit.jupiter.api.Assertions; + +import static java.nio.file.Files.newInputStream; public class CharacterEncodingExamplesUnitTest { @@ -58,4 +70,47 @@ public class CharacterEncodingExamplesUnitTest { "0 0 10001010 10011110 "); } + @Test + public void givenUTF8String_decodeByUS_ASCII_ReplaceMalformedInputSequence() throws IOException { + String input = "The façade pattern is a software design pattern."; + Assertions.assertEquals(CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPLACE), + "The fa��ade pattern is a software design pattern."); + } + + @Test + public void givenUTF8String_decodeByUS_ASCII_IgnoreMalformedInputSequence() throws IOException { + String input = "The façade pattern is a software design pattern."; + Assertions.assertEquals( + CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.IGNORE), + "The faade pattern is a software design pattern."); + } + + @Test + public void givenUTF8String_decodeByUS_ASCII_ReportMalformedInputSequence() { + String input = "The façade pattern is a software design pattern."; + Assertions.assertThrows(MalformedInputException.class, + () -> CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); + } + + @Test + public void givenTextFile_FindSuitableCandidateEncodings() { + Path path = Paths.get("src/test/resources/encoding.txt"); + List allCandidateCharSets = Arrays.asList(StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); + List suitableCharsets = new ArrayList<>(); + allCandidateCharSets.forEach(charset -> { + try { + CharsetDecoder charsetDecoder = charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT); + Reader reader = new InputStreamReader(newInputStream(path), charsetDecoder); + BufferedReader bufferedReader = new BufferedReader(reader); + while (bufferedReader.readLine() != null) { + } + suitableCharsets.add(charset); + } catch (MalformedInputException ignored) { + } catch (IOException ex) { + ex.printStackTrace(); + } + }); + Assertions.assertEquals(suitableCharsets, Arrays.asList(StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1)); + } + } From 83e27dd408840939e20b80fee628aed8e05e2a24 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sun, 29 Sep 2019 17:47:21 +0100 Subject: [PATCH 313/396] Add README descriptions 26 --- apache-tika/README.md | 6 +++++- apache-velocity/README.md | 6 +++++- apache-zookeeper/README.md | 6 +++++- asciidoctor/README.md | 6 +++++- asm/README.md | 4 ++++ atomix/README.md | 6 +++++- autovalue/README.md | 5 +++++ aws-lambda/README.md | 4 ++++ aws/README.md | 4 ++++ axon/README.md | 4 ++++ 10 files changed, 46 insertions(+), 5 deletions(-) diff --git a/apache-tika/README.md b/apache-tika/README.md index b92a7bebf1..02d60c3dd6 100644 --- a/apache-tika/README.md +++ b/apache-tika/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Apache Tika + +This module contains articles about Apache Tika + +### Relevant articles: - [Content Analysis with Apache Tika](http://www.baeldung.com/apache-tika) diff --git a/apache-velocity/README.md b/apache-velocity/README.md index 53c67f847e..f3b1a0fb29 100644 --- a/apache-velocity/README.md +++ b/apache-velocity/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Apache Velocity + +This module contains articles about Apache Velocity + +### Relevant articles: - [Introduction to Apache Velocity](http://www.baeldung.com/apache-velocity) diff --git a/apache-zookeeper/README.md b/apache-zookeeper/README.md index 6bddcfd5a8..039d935767 100644 --- a/apache-zookeeper/README.md +++ b/apache-zookeeper/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Apache Zookeeper + +This module contains articles about Apache Zookeeper + +### Relevant articles: - [Getting Started with Java and Zookeeper](http://www.baeldung.com/java-zookeeper) diff --git a/asciidoctor/README.md b/asciidoctor/README.md index 2124907e87..0619a4d272 100644 --- a/asciidoctor/README.md +++ b/asciidoctor/README.md @@ -1,4 +1,8 @@ -### Relevant articles +## Asciidoctor + +This module contains articles about Asciidoctor + +### Relevant articles: - [Generating a Book with Asciidoctor](http://www.baeldung.com/asciidoctor-book) - [Introduction to Asciidoctor in Java](http://www.baeldung.com/asciidoctor) diff --git a/asm/README.md b/asm/README.md index 50d9c34324..679ce89ec2 100644 --- a/asm/README.md +++ b/asm/README.md @@ -1,3 +1,7 @@ +## ASM + +This module contains articles about ASM + ### Relevant Articles: - [A Guide to Java Bytecode Manipulation with ASM](http://www.baeldung.com/java-asm) diff --git a/atomix/README.md b/atomix/README.md index fb22eec8dc..e0aa618ed7 100644 --- a/atomix/README.md +++ b/atomix/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Atomix + +This module contains articles about Atomix + +### Relevant articles: - [Introduction to Atomix](http://www.baeldung.com/atomix) diff --git a/autovalue/README.md b/autovalue/README.md index f33ff6899f..51d508907e 100644 --- a/autovalue/README.md +++ b/autovalue/README.md @@ -1,4 +1,9 @@ +## AutoValue + +This module contains articles about automatic code generation + ### Relevant Articles: + - [Introduction to AutoValue](http://www.baeldung.com/introduction-to-autovalue) - [Introduction to AutoFactory](http://www.baeldung.com/autofactory) - [Google AutoService](https://www.baeldung.com/google-autoservice) diff --git a/aws-lambda/README.md b/aws-lambda/README.md index 921b699bdd..ce67756dcf 100644 --- a/aws-lambda/README.md +++ b/aws-lambda/README.md @@ -1,3 +1,7 @@ +## AWS Lambda + +This module contains articles about AWS Lambda + ### Relevant Articles: - [Using AWS Lambda with API Gateway](http://www.baeldung.com/aws-lambda-api-gateway) - [Introduction to AWS Serverless Application Model](http://www.baeldung.com/aws-serverless) diff --git a/aws/README.md b/aws/README.md index d14ea8a75e..37707cb30c 100644 --- a/aws/README.md +++ b/aws/README.md @@ -1,3 +1,7 @@ +## AWS + +This module contains articles about AWS + ### Relevant articles - [AWS Lambda Using DynamoDB With Java](http://www.baeldung.com/aws-lambda-dynamodb-java) diff --git a/axon/README.md b/axon/README.md index f1ae5d00d8..38c03e8418 100644 --- a/axon/README.md +++ b/axon/README.md @@ -1,3 +1,7 @@ +## Axon + +This module contains articles about Axon + ### Relevant articles - [A Guide to the Axon Framework](http://www.baeldung.com/axon-cqrs-event-sourcing) From b2908200f137c3dc7a47bc41cc497a2aa6aa8b0b Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Sun, 29 Sep 2019 23:28:45 -0400 Subject: [PATCH 314/396] BAEL-3225: Added Spring example for error handling best practices. (#7854) --- .../baeldung/repository/BookRepository.java | 25 +++++++ .../web/controller/ApiExceptionHandler.java | 22 ++++++ .../web/controller/BookController.java | 25 +++++++ .../main/java/com/baeldung/web/dto/Book.java | 32 ++++++++ .../baeldung/web/error/ApiErrorResponse.java | 29 ++++++++ .../web/error/BookNotFoundException.java | 19 +++++ .../repository/BookRepositoryUnitTest.java | 60 +++++++++++++++ .../BookControllerIntegrationTest.java | 74 +++++++++++++++++++ 8 files changed, 286 insertions(+) create mode 100644 spring-rest-simple/src/main/java/com/baeldung/repository/BookRepository.java create mode 100644 spring-rest-simple/src/main/java/com/baeldung/web/controller/ApiExceptionHandler.java create mode 100644 spring-rest-simple/src/main/java/com/baeldung/web/controller/BookController.java create mode 100644 spring-rest-simple/src/main/java/com/baeldung/web/dto/Book.java create mode 100644 spring-rest-simple/src/main/java/com/baeldung/web/error/ApiErrorResponse.java create mode 100644 spring-rest-simple/src/main/java/com/baeldung/web/error/BookNotFoundException.java create mode 100644 spring-rest-simple/src/test/java/com/baeldung/repository/BookRepositoryUnitTest.java create mode 100644 spring-rest-simple/src/test/java/com/baeldung/web/controller/BookControllerIntegrationTest.java diff --git a/spring-rest-simple/src/main/java/com/baeldung/repository/BookRepository.java b/spring-rest-simple/src/main/java/com/baeldung/repository/BookRepository.java new file mode 100644 index 0000000000..239d74b19c --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/repository/BookRepository.java @@ -0,0 +1,25 @@ +package com.baeldung.repository; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +import org.springframework.stereotype.Repository; + +import com.baeldung.web.dto.Book; + +@Repository +public class BookRepository { + + private List books = new ArrayList<>(); + + public Optional findById(long id) { + return books.stream() + .filter(book -> book.getId() == id) + .findFirst(); + } + + public void add(Book book) { + books.add(book); + } +} diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/controller/ApiExceptionHandler.java b/spring-rest-simple/src/main/java/com/baeldung/web/controller/ApiExceptionHandler.java new file mode 100644 index 0000000000..e7f0ac3510 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/controller/ApiExceptionHandler.java @@ -0,0 +1,22 @@ +package com.baeldung.web.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import com.baeldung.web.error.ApiErrorResponse; +import com.baeldung.web.error.BookNotFoundException; + +@RestControllerAdvice +public class ApiExceptionHandler { + + @ExceptionHandler(BookNotFoundException.class) + public ResponseEntity handleApiException( + BookNotFoundException ex) { + ApiErrorResponse response = + new ApiErrorResponse("error-0001", + "No book found with ID " + ex.getId()); + return new ResponseEntity<>(response, HttpStatus.NOT_FOUND); + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/controller/BookController.java b/spring-rest-simple/src/main/java/com/baeldung/web/controller/BookController.java new file mode 100644 index 0000000000..126b40517d --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/controller/BookController.java @@ -0,0 +1,25 @@ +package com.baeldung.web.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.repository.BookRepository; +import com.baeldung.web.dto.Book; +import com.baeldung.web.error.BookNotFoundException; + +@RestController +@RequestMapping("/api/book") +public class BookController { + + @Autowired + private BookRepository repository; + + @GetMapping("/{id}") + public Book findById(@PathVariable long id) { + return repository.findById(id) + .orElseThrow(() -> new BookNotFoundException(id)); + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/dto/Book.java b/spring-rest-simple/src/main/java/com/baeldung/web/dto/Book.java new file mode 100644 index 0000000000..9ccd640319 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/dto/Book.java @@ -0,0 +1,32 @@ +package com.baeldung.web.dto; + +public class Book { + + private long id; + private String title; + private String author; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getAuthor() { + return author; + } + + public void setAuthor(String author) { + this.author = author; + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/error/ApiErrorResponse.java b/spring-rest-simple/src/main/java/com/baeldung/web/error/ApiErrorResponse.java new file mode 100644 index 0000000000..a67a7a3f2f --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/error/ApiErrorResponse.java @@ -0,0 +1,29 @@ +package com.baeldung.web.error; + +public class ApiErrorResponse { + + private String error; + private String message; + + public ApiErrorResponse(String error, String message) { + super(); + this.error = error; + this.message = message; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/main/java/com/baeldung/web/error/BookNotFoundException.java b/spring-rest-simple/src/main/java/com/baeldung/web/error/BookNotFoundException.java new file mode 100644 index 0000000000..ad93ef7f20 --- /dev/null +++ b/spring-rest-simple/src/main/java/com/baeldung/web/error/BookNotFoundException.java @@ -0,0 +1,19 @@ +package com.baeldung.web.error; + +@SuppressWarnings("serial") +public class BookNotFoundException extends RuntimeException { + + private long id; + + public BookNotFoundException(long id) { + this.id = id; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/test/java/com/baeldung/repository/BookRepositoryUnitTest.java b/spring-rest-simple/src/test/java/com/baeldung/repository/BookRepositoryUnitTest.java new file mode 100644 index 0000000000..dd64f302fe --- /dev/null +++ b/spring-rest-simple/src/test/java/com/baeldung/repository/BookRepositoryUnitTest.java @@ -0,0 +1,60 @@ +package com.baeldung.repository; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.Optional; + +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.web.dto.Book; + +public class BookRepositoryUnitTest { + + private BookRepository repository; + + @Before + public void setUp() { + repository = new BookRepository(); + } + + @Test + public void givenNoBooks_WhenFindById_ThenReturnEmptyOptional() { + assertFalse(repository.findById(1).isPresent()); + } + + @Test + public void givenOneMatchingBook_WhenFindById_ThenReturnEmptyOptional() { + + long id = 1; + Book expected = bookWithId(id); + + repository.add(expected); + + Optional found = repository.findById(id); + + assertTrue(found.isPresent()); + assertEquals(expected, found.get()); + } + + private static Book bookWithId(long id) { + Book book = new Book(); + book.setId(id); + return book; + } + + @Test + public void givenOneNonMatchingBook_WhenFindById_ThenReturnEmptyOptional() { + + long id = 1; + Book expected = bookWithId(id); + + repository.add(expected); + + Optional found = repository.findById(id + 1); + + assertFalse(found.isPresent()); + } +} \ No newline at end of file diff --git a/spring-rest-simple/src/test/java/com/baeldung/web/controller/BookControllerIntegrationTest.java b/spring-rest-simple/src/test/java/com/baeldung/web/controller/BookControllerIntegrationTest.java new file mode 100644 index 0000000000..3bf5ce3c3d --- /dev/null +++ b/spring-rest-simple/src/test/java/com/baeldung/web/controller/BookControllerIntegrationTest.java @@ -0,0 +1,74 @@ +package com.baeldung.web.controller; + +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.doReturn; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import java.util.Optional; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; + +import com.baeldung.Application; +import com.baeldung.repository.BookRepository; +import com.baeldung.web.dto.Book; +import com.baeldung.web.error.ApiErrorResponse; +import com.fasterxml.jackson.databind.ObjectMapper; + +@RunWith(SpringRunner.class) +@WebMvcTest(BookController.class) +@ComponentScan(basePackageClasses = Application.class) +public class BookControllerIntegrationTest { + + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Autowired + private MockMvc mvc; + + @MockBean + private BookRepository repository; + + @Test + public void givenNoExistingBooks_WhenGetBookWithId1_ThenErrorReturned() throws Exception { + + long id = 1; + + doReturn(Optional.empty()).when(repository).findById(eq(id)); + + mvc.perform(get("/api/book/{id}", id)) + .andExpect(status().isNotFound()) + .andExpect(content().json(MAPPER.writeValueAsString(new ApiErrorResponse("error-0001", "No book found with ID " + id)))); + } + + @Test + public void givenMatchingBookExists_WhenGetBookWithId1_ThenBookReturned() throws Exception { + + long id = 1; + Book book = book(id, "foo", "bar"); + + doReturn(Optional.of(book)).when(repository).findById(eq(id)); + + mvc.perform(get("/api/book/{id}", id)) + .andExpect(status().isOk()) + .andExpect(content().json(MAPPER.writeValueAsString(book))); + } + + private static Book book(long id, String title, String author) { + + Book book = new Book(); + + book.setId(id); + book.setTitle(title); + book.setAuthor(author); + + return book; + } +} \ No newline at end of file From 4881c701fd60ba7daad0d7578f2cfce8588d1ce1 Mon Sep 17 00:00:00 2001 From: at508 Date: Sun, 29 Sep 2019 23:39:09 -0400 Subject: [PATCH 315/396] [BAEL-2998] - ordering and renaming tests for @DirtiesContext example --- testing-modules/spring-testing/pom.xml | 22 ++++++++++--- .../DirtiesContextIntegrationTest.java | 33 +++++++++++-------- 2 files changed, 36 insertions(+), 19 deletions(-) diff --git a/testing-modules/spring-testing/pom.xml b/testing-modules/spring-testing/pom.xml index bb7d54218a..8a76dc903c 100644 --- a/testing-modules/spring-testing/pom.xml +++ b/testing-modules/spring-testing/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 org.baeldung spring-testing @@ -21,7 +22,7 @@ ${hamcrest.version} - + org.projectlombok lombok ${lombok.version} @@ -33,7 +34,7 @@ spring-boot-starter LATEST - + org.springframework.boot @@ -52,7 +53,7 @@ LATEST - org.springframework + org.springframework spring-webmvc ${spring.version} @@ -72,6 +73,17 @@ ${junit.jupiter.version} test + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + test + org.awaitility awaitility diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java index 7fad754b8f..f3e7b8c228 100644 --- a/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java +++ b/testing-modules/spring-testing/src/test/java/com/baeldung/dirtiescontext/DirtiesContextIntegrationTest.java @@ -1,17 +1,18 @@ package com.baeldung.dirtiescontext; -import org.junit.FixMethodOrder; +import org.junit.jupiter.api.MethodOrderer.OrderAnnotation; +import org.junit.jupiter.api.Order; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; -import org.junit.runners.MethodSorters; +import org.junit.jupiter.api.TestMethodOrder; +import org.junit.jupiter.api.extension.ExtendWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.annotation.DirtiesContext.MethodMode; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.junit.jupiter.SpringExtension; -@FixMethodOrder(MethodSorters.NAME_ASCENDING) -@RunWith(SpringJUnit4ClassRunner.class) +@TestMethodOrder(OrderAnnotation.class) +@ExtendWith(SpringExtension.class) @SpringBootTest(classes = SpringDataRestApplication.class) class DirtiesContextIntegrationTest { @@ -19,26 +20,30 @@ class DirtiesContextIntegrationTest { protected UserCache userCache; @Test - void testA() { + @Order(1) + void addJaneDoeAndPrintCache() { userCache.addUser("Jane Doe"); - userCache.printUserList("Test A"); + userCache.printUserList("addJaneDoeAndPrintCache"); } @Test - void testB() { - userCache.printUserList("Test B"); + @Order(2) + void printCache() { + userCache.printUserList("printCache"); } @DirtiesContext(methodMode = MethodMode.AFTER_METHOD) @Test - void testC() { + @Order(3) + void addJohnDoeAndPrintCache() { userCache.addUser("John Doe"); - userCache.printUserList("Test C"); + userCache.printUserList("addJohnDoeAndPrintCache"); } @Test - void testD() { - userCache.printUserList("Test D"); + @Order(4) + void printCacheAgain() { + userCache.printUserList("printCacheAgain"); } } From ff75b7ace2d4476ea7e4ba3d98e733286060617e Mon Sep 17 00:00:00 2001 From: dhruba619 Date: Mon, 30 Sep 2019 09:24:04 +0200 Subject: [PATCH 316/396] BAEL-2974 Logger vs System.out --- .../log4j2/Log4j2ComparisonSysout.java | 18 ++++++++++++++++++ .../logging/log4j2/Log4j2Example.java | 19 +++++++++++++++++++ .../log4j2/src/test/resources/log4j2.xml | 3 +-- 3 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2ComparisonSysout.java create mode 100644 logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2Example.java diff --git a/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2ComparisonSysout.java b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2ComparisonSysout.java new file mode 100644 index 0000000000..53592082b6 --- /dev/null +++ b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2ComparisonSysout.java @@ -0,0 +1,18 @@ +package com.baeldung.logging.log4j2; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.PrintStream; + +public class Log4j2ComparisonSysout { + + public static void main(String[] args) throws FileNotFoundException { + PrintStream outStream = new PrintStream(new File("outFile.txt")); + System.setOut(outStream); + System.out.println("This is a baeldung article"); + + PrintStream errStream = new PrintStream(new File("errFile.txt")); + System.setErr(errStream); + System.err.println("This is a baeldung article error"); + } +} diff --git a/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2Example.java b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2Example.java new file mode 100644 index 0000000000..b870924cf3 --- /dev/null +++ b/logging-modules/log4j2/src/main/java/com/baeldung/logging/log4j2/Log4j2Example.java @@ -0,0 +1,19 @@ +package com.baeldung.logging.log4j2; + +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.LogManager; + +public class Log4j2Example { + + private static final Logger logger = LogManager.getLogger(Log4j2Example.class); + + public static void main(String[] args) { + logger.debug("Debug log message"); + logger.info("Info log message"); + logger.error("Error log message"); + logger.warn("Warn log message"); + logger.fatal("Fatal log message"); + logger.trace("Trace log message"); + } + +} diff --git a/logging-modules/log4j2/src/test/resources/log4j2.xml b/logging-modules/log4j2/src/test/resources/log4j2.xml index 246ffb0707..ee26bcecf2 100644 --- a/logging-modules/log4j2/src/test/resources/log4j2.xml +++ b/logging-modules/log4j2/src/test/resources/log4j2.xml @@ -5,8 +5,7 @@ - + From d3cbbf0725b01f2a126e83873dfcb58487e43b9f Mon Sep 17 00:00:00 2001 From: Amy DeGregorio Date: Mon, 30 Sep 2019 10:17:53 -0400 Subject: [PATCH 317/396] BAEL-3329 (#7915) * BAEL-3222 Example Code and update to spring-boot-admin examples * BAEL-3329 Fix integration tests * BAEL-3329 Fix integration tests * Upgrade to Spring Boot 2.1.8.RELEASE --- spring-boot-admin/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-admin/pom.xml b/spring-boot-admin/pom.xml index b2ced767eb..1c933723e7 100644 --- a/spring-boot-admin/pom.xml +++ b/spring-boot-admin/pom.xml @@ -30,7 +30,7 @@ - 2.1.7.RELEASE + 2.1.8.RELEASE \ No newline at end of file From d4d31dcc4b588cb8881f4c29cfdc84f1a8505447 Mon Sep 17 00:00:00 2001 From: Justin Albano Date: Mon, 30 Sep 2019 18:00:44 -0400 Subject: [PATCH 318/396] BAEL-3225: Corrected failing integration tests. --- .../java/com/baeldung/web/controller/mediatypes/TestConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-rest-simple/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java b/spring-rest-simple/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java index 4bbfa2818e..bc644af428 100644 --- a/spring-rest-simple/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java +++ b/spring-rest-simple/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java @@ -5,7 +5,7 @@ import org.springframework.context.annotation.Configuration; @Configuration -@ComponentScan({ "com.baeldung.web" }) +@ComponentScan({ "com.baeldung.web", "com.baeldung.repository" }) public class TestConfig { } From ccb9aea14f2bc34490263651372b39266b3378f2 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Tue, 1 Oct 2019 16:16:00 +0100 Subject: [PATCH 319/396] Add README descriptions 30 --- core-java-modules/README.md | 4 ++++ core-java-modules/core-java-lang-2/README.md | 7 ++++--- core-java-modules/core-java-lang-oop-2/README.md | 7 ++++--- core-java-modules/core-java-lang-oop-3/README.md | 7 ++++--- core-java-modules/core-java-lang-oop/README.md | 5 +++-- core-java-modules/core-java-lang-syntax/README.md | 5 +++-- core-java-modules/core-java-lang/README.md | 5 +++-- core-java-modules/core-java-networking-2/README.md | 5 +++++ core-java-modules/core-java-networking/README.md | 5 +++-- core-java-modules/core-java-perf/README.md | 2 ++ core-java-modules/core-java-sun/README.md | 5 +++-- core-scala/README.md | 4 ++++ 12 files changed, 42 insertions(+), 19 deletions(-) diff --git a/core-java-modules/README.md b/core-java-modules/README.md index 9ce6057f32..55dacca916 100644 --- a/core-java-modules/README.md +++ b/core-java-modules/README.md @@ -1,3 +1,7 @@ +## Core Java Modules + +This module contains modules about core Java + ## Relevant articles: - [Multi-Module Maven Application with Java Modules](https://www.baeldung.com/maven-multi-module-project-java-jpms) diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md index d925e81d87..b03abe38f4 100644 --- a/core-java-modules/core-java-lang-2/README.md +++ b/core-java-modules/core-java-lang-2/README.md @@ -1,6 +1,7 @@ -========= +## Core Java Lang (Part 2) -## Core Java Lang Cookbooks and Examples +This module contains articles about core Java language ### Relevant Articles: -- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects) \ No newline at end of file +- [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects) +- [[<-- Prev]](/core-java-modules/core-java-lang) \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md index 096e4ee002..80f97221d5 100644 --- a/core-java-modules/core-java-lang-oop-2/README.md +++ b/core-java-modules/core-java-lang-oop-2/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Lang OOP (Part 2) -## Core Java Lang OOP 2 Cookbooks and Examples +This module contains articles about Object-oriented programming (OOP) in Java ### Relevant Articles: - [Generic Constructors in Java](https://www.baeldung.com/java-generic-constructors) @@ -13,4 +13,5 @@ - [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object) - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition) - [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) -- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods) \ No newline at end of file +- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods) +- [[<-- Prev]](/core-java-modules/core-java-lang-oop)[[More -->]](/core-java-modules/core-java-lang-oop-3) \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop-3/README.md b/core-java-modules/core-java-lang-oop-3/README.md index 15876d124f..c3a32124b5 100644 --- a/core-java-modules/core-java-lang-oop-3/README.md +++ b/core-java-modules/core-java-lang-oop-3/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Lang OOP (Part 3) -## Core Java Lang OOP 3 Cookbooks and Examples +This module contains articles about Object-oriented programming (OOP) in Java ### Relevant Articles: - [Pass-By-Value as a Parameter Passing Mechanism in Java](https://www.baeldung.com/java-pass-by-value-or-pass-by-reference) @@ -8,4 +8,5 @@ - [Guide to the super Java Keyword](https://www.baeldung.com/java-super) - [Guide to the this Java Keyword](https://www.baeldung.com/java-this) - [Java Public Access Modifier](https://www.baeldung.com/java-public-keyword) -- [Composition, Aggregation and Association in Java](https://www.baeldung.com/java-composition-aggregation-association) \ No newline at end of file +- [Composition, Aggregation and Association in Java](https://www.baeldung.com/java-composition-aggregation-association) +- [[<-- Prev]](/core-java-modules/core-java-lang-oop-2) \ No newline at end of file diff --git a/core-java-modules/core-java-lang-oop/README.md b/core-java-modules/core-java-lang-oop/README.md index 2e7fa4d689..0fb044138d 100644 --- a/core-java-modules/core-java-lang-oop/README.md +++ b/core-java-modules/core-java-lang-oop/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Lang OOP -## Core Java Lang OOP Cookbooks and Examples +This module contains articles about Object-oriented programming (OOP) in Java ### Relevant Articles: - [Guide to hashCode() in Java](https://www.baeldung.com/java-hashcode) @@ -13,3 +13,4 @@ - [The “final” Keyword in Java](https://www.baeldung.com/java-final) - [Type Erasure in Java Explained](https://www.baeldung.com/java-type-erasure) - [Variable and Method Hiding in Java](https://www.baeldung.com/java-variable-method-hiding) +- [[More -->]](/core-java-modules/core-java-lang-oop-2) diff --git a/core-java-modules/core-java-lang-syntax/README.md b/core-java-modules/core-java-lang-syntax/README.md index 3293e9b23d..1c95997bd5 100644 --- a/core-java-modules/core-java-lang-syntax/README.md +++ b/core-java-modules/core-java-lang-syntax/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Lang Syntax -## Core Java Lang Syntax Cookbooks and Examples +This module contains articles about core Java syntax ### Relevant Articles: - [The Basics of Java Generics](http://www.baeldung.com/java-generics) @@ -19,3 +19,4 @@ - [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator) - [Java instanceof Operator](https://www.baeldung.com/java-instanceof) - [Breaking Out of Nested Loops](https://www.baeldung.com/java-breaking-out-nested-loop) +- [[More -->]](/core-java-modules/core-java-lang-syntax-2) diff --git a/core-java-modules/core-java-lang/README.md b/core-java-modules/core-java-lang/README.md index f3b6d3d8e5..312423ecee 100644 --- a/core-java-modules/core-java-lang/README.md +++ b/core-java-modules/core-java-lang/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Lang -## Core Java Lang Cookbooks and Examples +This module contains articles about core Java language ### Relevant Articles: @@ -38,3 +38,4 @@ - [Attaching Values to Java Enum](https://www.baeldung.com/java-enum-values) - [Variable Scope in Java](https://www.baeldung.com/java-variable-scope) - [Java Classes and Objects](https://www.baeldung.com/java-classes-objects) +- [[More --> ]](/core-java-modules/core-java-lang-2) diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md index 62dec41356..8fac91a0ae 100644 --- a/core-java-modules/core-java-networking-2/README.md +++ b/core-java-modules/core-java-networking-2/README.md @@ -1,3 +1,7 @@ +## Core Java Networking (Part 2) + +This module contains articles about core Java networking + ### Relevant Articles - [Checking if a URL Exists in Java](https://www.baeldung.com/java-check-url-exists) @@ -5,3 +9,4 @@ - [Using Curl in Java](https://www.baeldung.com/java-curl) - [Do a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) - [Sending Emails with Java](http://www.baeldung.com/java-email) +- [[<-- Prev]](/core-java-modules/core-java-networking) diff --git a/core-java-modules/core-java-networking/README.md b/core-java-modules/core-java-networking/README.md index 33fc3684a3..c766e5d635 100644 --- a/core-java-modules/core-java-networking/README.md +++ b/core-java-modules/core-java-networking/README.md @@ -1,7 +1,7 @@ -========= - ## Core Java Networking +This module contains articles about core Java networking + ### Relevant Articles - [Connecting Through Proxy Servers in Core Java](https://www.baeldung.com/java-connect-via-proxy-server) @@ -14,3 +14,4 @@ - [Guide to Java URL Encoding/Decoding](http://www.baeldung.com/java-url-encoding-decoding) - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) - [Read an InputStream using the Java Server Socket](https://www.baeldung.com/java-inputstream-server-socket) +- [[More -->]](/core-java-modules/core-java-networking-2) diff --git a/core-java-modules/core-java-perf/README.md b/core-java-modules/core-java-perf/README.md index 1b3b590bf8..e644c73eea 100644 --- a/core-java-modules/core-java-perf/README.md +++ b/core-java-modules/core-java-perf/README.md @@ -1,5 +1,7 @@ ## Core Java Performance +This module contains articles about core Java performance + ### Relevant Articles: - [Verbose Garbage Collection in Java](https://www.baeldung.com/java-verbose-gc) - [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture) diff --git a/core-java-modules/core-java-sun/README.md b/core-java-modules/core-java-sun/README.md index e2dba76b41..107035cbe8 100644 --- a/core-java-modules/core-java-sun/README.md +++ b/core-java-modules/core-java-sun/README.md @@ -1,7 +1,8 @@ -========= +## Core Java Sun -## Core Java Cookbooks and Examples +This module contains articles about the sun package ### Relevant Articles: + - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) \ No newline at end of file diff --git a/core-scala/README.md b/core-scala/README.md index eed344193f..cfdb0c44ed 100644 --- a/core-scala/README.md +++ b/core-scala/README.md @@ -1,3 +1,7 @@ +## Core Scala + +This module contains articles about core Scala + ### Relevant Articles: - [Introduction to Scala](https://www.baeldung.com/scala-intro) From fad7aa6a66e40ec48213bc9a13fa8a01da155103 Mon Sep 17 00:00:00 2001 From: Maciej Andrearczyk Date: Tue, 1 Oct 2019 19:05:07 +0200 Subject: [PATCH 320/396] BAEL-3285 - code reformatted --- .../simultaneous}/Client.java | 15 ++++++--------- .../simultaneous}/Item.java | 2 +- .../simultaneous}/User.java | 2 +- .../simultaneous}/UserWithItem.java | 2 +- .../simultaneous}/ClientIntegrationTest.java | 11 ++++------- 5 files changed, 13 insertions(+), 19 deletions(-) rename spring-5-reactive-client/src/main/java/com/baeldung/reactive/{simultaneouswebclient => webclient/simultaneous}/Client.java (87%) rename spring-5-reactive-client/src/main/java/com/baeldung/reactive/{simultaneouswebclient => webclient/simultaneous}/Item.java (84%) rename spring-5-reactive-client/src/main/java/com/baeldung/reactive/{simultaneouswebclient => webclient/simultaneous}/User.java (84%) rename spring-5-reactive-client/src/main/java/com/baeldung/reactive/{simultaneouswebclient => webclient/simultaneous}/UserWithItem.java (84%) rename spring-5-reactive-client/src/test/java/com/baeldung/reactive/{simultaneouswebclient => webclient/simultaneous}/ClientIntegrationTest.java (87%) diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Client.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java similarity index 87% rename from spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Client.java rename to spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java index 4fbb904564..3c6623cb02 100644 --- a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Client.java +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java @@ -1,4 +1,4 @@ -package com.baeldung.reactive.simultaneouswebclient; +package com.baeldung.reactive.webclient.simultaneous; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; @@ -16,24 +16,21 @@ public class Client { } public Mono getUser(int id) { - return webClient - .get() + return webClient.get() .uri("/user/{id}", id) .retrieve() .bodyToMono(User.class); } public Mono getItem(int id) { - return webClient - .get() + return webClient.get() .uri("/item/{id}", id) .retrieve() .bodyToMono(Item.class); } public Mono getOtherUser(int id) { - return webClient - .get() + return webClient.get() .uri("/otheruser/{id}", id) .retrieve() .bodyToMono(User.class); @@ -45,7 +42,7 @@ public class Client { .runOn(Schedulers.elastic()) .flatMap(this::getUser) .collectSortedList((u1, u2) -> u2.id() - u1.id()) - .block(); + .block(); } public List fetchUserAndOtherUser(int id) { @@ -61,6 +58,6 @@ public class Client { Mono item = getItem(itemId).subscribeOn(Schedulers.elastic()); return Mono.zip(user, item, UserWithItem::new) - .block(); + .block(); } } diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Item.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Item.java similarity index 84% rename from spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Item.java rename to spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Item.java index 5584e1896d..5b8260743b 100644 --- a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/Item.java +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Item.java @@ -1,4 +1,4 @@ -package com.baeldung.reactive.simultaneouswebclient; +package com.baeldung.reactive.webclient.simultaneous; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/User.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/User.java similarity index 84% rename from spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/User.java rename to spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/User.java index e080538227..0e1cc2cd76 100644 --- a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/User.java +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/User.java @@ -1,4 +1,4 @@ -package com.baeldung.reactive.simultaneouswebclient; +package com.baeldung.reactive.webclient.simultaneous; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/UserWithItem.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/UserWithItem.java similarity index 84% rename from spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/UserWithItem.java rename to spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/UserWithItem.java index d19a324e55..96dcfe994e 100644 --- a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/simultaneouswebclient/UserWithItem.java +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/UserWithItem.java @@ -1,4 +1,4 @@ -package com.baeldung.reactive.simultaneouswebclient; +package com.baeldung.reactive.webclient.simultaneous; public class UserWithItem { private User user; diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/simultaneouswebclient/ClientIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java similarity index 87% rename from spring-5-reactive-client/src/test/java/com/baeldung/reactive/simultaneouswebclient/ClientIntegrationTest.java rename to spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java index e5b707d384..99efd34f9f 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/simultaneouswebclient/ClientIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.reactive.simultaneouswebclient; +package com.baeldung.reactive.webclient.simultaneous; import org.junit.Test; import org.junit.Before; @@ -8,7 +8,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import com.github.tomakehurst.wiremock.WireMockServer; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -43,17 +42,15 @@ public class ClientIntegrationTest { int singleRequestTime = 1000; for (int i = 1; i <= requestsNumber; i++) { - stubFor( - get(urlEqualTo("/user/" + i)).willReturn(aResponse() - .withFixedDelay(singleRequestTime) + stubFor(get(urlEqualTo("/user/" + i)).willReturn(aResponse().withFixedDelay(singleRequestTime) .withStatus(200) .withHeader("Content-Type", "application/json") .withBody(String.format("{ \"id\": %d }", i)))); } List userIds = IntStream.rangeClosed(1, requestsNumber) - .boxed() - .collect(Collectors.toList()); + .boxed() + .collect(Collectors.toList()); Client client = new Client("http://localhost:8089"); From 40159003668e73275dc8629e1040a33bca0b5adb Mon Sep 17 00:00:00 2001 From: "devender.kumar" Date: Tue, 1 Oct 2019 07:30:43 +0200 Subject: [PATCH 321/396] rename test cases to follow BDD style --- .../ComponentScanAnnotationFilterAppIntegrationTest.java | 2 +- .../aspectj/ComponentScanAspectJFilterAppIntegrationTest.java | 2 +- .../ComponentScanAssignableTypeFilterAppIntegrationTest.java | 2 +- .../custom/ComponentScanCustomFilterAppIntegrationTest.java | 2 +- .../regex/ComponentScanRegexFilterAppIntegrationTest.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java index ed984a3beb..9eb0b67c21 100644 --- a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/annotation/ComponentScanAnnotationFilterAppIntegrationTest.java @@ -19,7 +19,7 @@ import static org.hamcrest.CoreMatchers.*; public class ComponentScanAnnotationFilterAppIntegrationTest { @Test - public void testBean() { + public void whenAnnotationFilterIsUsed_thenComponentScanShouldRegisterBeanAnnotatedWithAnimalAnootation() { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAnnotationFilterApp.class); List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanAnnotationFilterApp")) diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java index fa8d12723f..44ee7534a8 100644 --- a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java @@ -19,7 +19,7 @@ import static org.hamcrest.CoreMatchers.*; public class ComponentScanAspectJFilterAppIntegrationTest { @Test - public void testBean() { + public void whenAspectJFilterIsUsed_thenComponentScanShouldRegisterBeanMatchingAspectJCreteria() { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAspectJFilterApp.class); List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanCustomFilterApp")) diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java index 460be8e8ba..3e5c7ee4f7 100644 --- a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/assignable/ComponentScanAssignableTypeFilterAppIntegrationTest.java @@ -19,7 +19,7 @@ import static org.hamcrest.CoreMatchers.*; public class ComponentScanAssignableTypeFilterAppIntegrationTest { @Test - public void testBean() { + public void whenAssignableTypeFilterIsUsed_thenComponentScanShouldRegisterBeanOfAssignableTypeAndItsSubClass() { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAssignableTypeFilterApp.class); List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanAssignableTypeFilterApp")) diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java index f47c0123fa..097214a2cf 100644 --- a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/custom/ComponentScanCustomFilterAppIntegrationTest.java @@ -19,7 +19,7 @@ import static org.hamcrest.CoreMatchers.*; public class ComponentScanCustomFilterAppIntegrationTest { @Test - public void testBean() { + public void whenCustomFilterIsUsed_thenComponentScanShouldRegisterBeanMatchingCustomFilter() { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanCustomFilterApp.class); List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanCustomFilterApp")) diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java index 4fccbd776e..3163581c37 100644 --- a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/regex/ComponentScanRegexFilterAppIntegrationTest.java @@ -19,7 +19,7 @@ import static org.hamcrest.CoreMatchers.*; public class ComponentScanRegexFilterAppIntegrationTest { @Test - public void testBean() { + public void whenRegexFilterIsUsed_thenComponentScanShouldRegisterBeanMatchingRegex() { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanRegexFilterApp.class); List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanRegexFilterApp")) From b4e41095c13f981a6adf331e7c1502285e98c0ed Mon Sep 17 00:00:00 2001 From: "devender.kumar" Date: Tue, 1 Oct 2019 16:40:50 +0200 Subject: [PATCH 322/396] Fix test case --- .../aspectj/ComponentScanAspectJFilterAppIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java index 44ee7534a8..945a0085f6 100644 --- a/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java +++ b/spring-boot-di/src/test/java/com/baeldung/componentscan/filter/aspectj/ComponentScanAspectJFilterAppIntegrationTest.java @@ -22,7 +22,7 @@ public class ComponentScanAspectJFilterAppIntegrationTest { public void whenAspectJFilterIsUsed_thenComponentScanShouldRegisterBeanMatchingAspectJCreteria() { ApplicationContext applicationContext = new AnnotationConfigApplicationContext(ComponentScanAspectJFilterApp.class); List beans = Arrays.stream(applicationContext.getBeanDefinitionNames()) - .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanCustomFilterApp")) + .filter(bean -> !bean.contains("org.springframework") && !bean.contains("componentScanAspectJFilterApp")) .collect(Collectors.toList()); assertThat(beans.size(), equalTo(1)); assertThat(beans.get(0), equalTo("elephant")); From da1db18bc939e05c0ae67fdddc48e2398623f78c Mon Sep 17 00:00:00 2001 From: Yuriy Artamonov Date: Tue, 1 Oct 2019 22:33:11 +0300 Subject: [PATCH 323/396] Fix CDI package names (#7715) * Fix beans.xsd location for JavaEE 7 * Fix cdi2observers package names --- .../application/BootstrappingApplication.java | 31 ++++++++++--------- .../cdi2observers/events/ExampleEvent.java | 28 ++++++++--------- .../events/ExampleEventSource.java | 28 ++++++++--------- .../AnotherExampleEventObserver.java | 25 ++++++++------- .../observers/ExampleEventObserver.java | 26 ++++++++-------- .../cdi2observers/services/TextService.java | 16 +++++----- cdi/src/main/resources/META-INF/beans.xml | 7 +++-- .../tests/TextServiceUnitTest.java | 29 ++++++++--------- .../TimeLoggerFactoryUnitTest.java | 1 - 9 files changed, 97 insertions(+), 94 deletions(-) diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java index 4896408502..dc0bdeb951 100644 --- a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java +++ b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java @@ -1,15 +1,16 @@ -package com.baeldung.cdi.cdi2observers.application; - -import com.baeldung.cdi.cdi2observers.events.ExampleEvent; -import javax.enterprise.inject.se.SeContainer; -import javax.enterprise.inject.se.SeContainerInitializer; - -public class BootstrappingApplication { - - public static void main(String... args) { - SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance(); - try (SeContainer container = containerInitializer.initialize()) { - container.getBeanManager().fireEvent(new ExampleEvent("Welcome to Baeldung!")); - } - } -} +package com.baeldung.cdi2observers.application; + +import com.baeldung.cdi2observers.events.ExampleEvent; + +import javax.enterprise.inject.se.SeContainer; +import javax.enterprise.inject.se.SeContainerInitializer; + +public class BootstrappingApplication { + + public static void main(String... args) { + SeContainerInitializer containerInitializer = SeContainerInitializer.newInstance(); + try (SeContainer container = containerInitializer.initialize()) { + container.getBeanManager().fireEvent(new ExampleEvent("Welcome to Baeldung!")); + } + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java index a2329d2ef1..9adfad4d39 100644 --- a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java +++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java @@ -1,14 +1,14 @@ -package com.baeldung.cdi.cdi2observers.events; - -public class ExampleEvent { - - private final String eventMessage; - - public ExampleEvent(String eventMessage) { - this.eventMessage = eventMessage; - } - - public String getEventMessage() { - return eventMessage; - } -} +package com.baeldung.cdi2observers.events; + +public class ExampleEvent { + + private final String eventMessage; + + public ExampleEvent(String eventMessage) { + this.eventMessage = eventMessage; + } + + public String getEventMessage() { + return eventMessage; + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java index f37030778a..5a0aa0b5e3 100644 --- a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java +++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java @@ -1,14 +1,14 @@ -package com.baeldung.cdi.cdi2observers.events; - -import javax.enterprise.event.Event; -import javax.inject.Inject; - -public class ExampleEventSource { - - @Inject - Event exampleEvent; - - public void fireEvent() { - exampleEvent.fireAsync(new ExampleEvent("Welcome to Baeldung!")); - } -} +package com.baeldung.cdi2observers.events; + +import javax.enterprise.event.Event; +import javax.inject.Inject; + +public class ExampleEventSource { + + @Inject + Event exampleEvent; + + public void fireEvent() { + exampleEvent.fireAsync(new ExampleEvent("Welcome to Baeldung!")); + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java index 34520c2b3d..3af48af13f 100644 --- a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java +++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java @@ -1,12 +1,13 @@ -package com.baeldung.cdi.cdi2observers.observers; - -import com.baeldung.cdi.cdi2observers.events.ExampleEvent; -import javax.annotation.Priority; -import javax.enterprise.event.Observes; - -public class AnotherExampleEventObserver { - - public String onEvent(@Observes @Priority(2) ExampleEvent event) { - return event.getEventMessage(); - } -} +package com.baeldung.cdi2observers.observers; + +import com.baeldung.cdi2observers.events.ExampleEvent; + +import javax.annotation.Priority; +import javax.enterprise.event.Observes; + +public class AnotherExampleEventObserver { + + public String onEvent(@Observes @Priority(2) ExampleEvent event) { + return event.getEventMessage(); + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java index b3522b2ad0..33fdc43bbb 100644 --- a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java +++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java @@ -1,13 +1,13 @@ -package com.baeldung.cdi.cdi2observers.observers; - -import com.baeldung.cdi.cdi2observers.events.ExampleEvent; -import com.baeldung.cdi.cdi2observers.services.TextService; -import javax.annotation.Priority; -import javax.enterprise.event.Observes; - -public class ExampleEventObserver { - - public String onEvent(@Observes @Priority(1) ExampleEvent event, TextService textService) { - return textService.parseText(event.getEventMessage()); - } -} +package com.baeldung.cdi2observers.observers; + +import com.baeldung.cdi2observers.events.ExampleEvent; +import com.baeldung.cdi2observers.services.TextService; +import javax.annotation.Priority; +import javax.enterprise.event.Observes; + +public class ExampleEventObserver { + + public String onEvent(@Observes @Priority(1) ExampleEvent event, TextService textService) { + return textService.parseText(event.getEventMessage()); + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java index 47788a0657..eabe031223 100644 --- a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java +++ b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java @@ -1,8 +1,8 @@ -package com.baeldung.cdi.cdi2observers.services; - -public class TextService { - - public String parseText(String text) { - return text.toUpperCase(); - } -} +package com.baeldung.cdi2observers.services; + +public class TextService { + + public String parseText(String text) { + return text.toUpperCase(); + } +} diff --git a/cdi/src/main/resources/META-INF/beans.xml b/cdi/src/main/resources/META-INF/beans.xml index d41b35e7d9..144e9e567f 100644 --- a/cdi/src/main/resources/META-INF/beans.xml +++ b/cdi/src/main/resources/META-INF/beans.xml @@ -1,7 +1,8 @@ - + + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" + bean-discovery-mode="all"> com.baeldung.interceptor.AuditedInterceptor diff --git a/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java index deecf13f9a..1b976144aa 100644 --- a/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java +++ b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java @@ -1,14 +1,15 @@ -package com.baeldung.cdi.cdi2observers.tests; - -import com.baeldung.cdi.cdi2observers.services.TextService; -import static org.assertj.core.api.Assertions.assertThat; -import org.junit.Test; - -public class TextServiceUnitTest { - - @Test - public void givenTextServiceInstance_whenCalledparseText_thenCorrect() { - TextService textService = new TextService(); - assertThat(textService.parseText("Baeldung")).isEqualTo("BAELDUNG"); - } -} +package com.baeldung.test.cdi2observers.tests; + +import com.baeldung.cdi2observers.services.TextService; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class TextServiceUnitTest { + + @Test + public void givenTextServiceInstance_whenCalledparseText_thenCorrect() { + TextService textService = new TextService(); + assertThat(textService.parseText("Baeldung")).isEqualTo("BAELDUNG"); + } +} diff --git a/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java b/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java index caf2ed32b5..b22f189373 100644 --- a/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java +++ b/cdi/src/test/java/com/baeldung/test/dependencyinjection/TimeLoggerFactoryUnitTest.java @@ -6,7 +6,6 @@ import static org.assertj.core.api.Assertions.assertThat; import org.junit.Test; public class TimeLoggerFactoryUnitTest { - @Test public void givenTimeLoggerFactory_whenCalledgetTimeLogger_thenOneAssertion() { TimeLoggerFactory timeLoggerFactory = new TimeLoggerFactory(); From daad1ef9221c6598e6626eeb56ec8750baf26740 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Oct 2019 05:47:40 +0900 Subject: [PATCH 324/396] remove obsolete runfromjunit module (#7751) --- testing-modules/junit-4/README.md | 1 + testing-modules/pom.xml | 1 - .../src/main/resources/logback.xml | 13 ---------- .../junit4/runfromjava/FirstUnitTest.java | 25 ------------------- .../junit4/runfromjava/SecondUnitTest.java | 18 ------------- .../junit5/runfromjava/FirstUnitTest.java | 24 ------------------ .../junit5/runfromjava/SecondUnitTest.java | 18 ------------- testing-modules/testing-libraries/README.md | 2 +- 8 files changed, 2 insertions(+), 100 deletions(-) delete mode 100644 testing-modules/runjunitfromjava/src/main/resources/logback.xml delete mode 100644 testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java delete mode 100644 testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java delete mode 100644 testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java delete mode 100644 testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java diff --git a/testing-modules/junit-4/README.md b/testing-modules/junit-4/README.md index dd975daf58..d19a0a1e47 100644 --- a/testing-modules/junit-4/README.md +++ b/testing-modules/junit-4/README.md @@ -3,3 +3,4 @@ - [Guide to JUnit 4 Rules](https://www.baeldung.com/junit-4-rules) - [Custom JUnit 4 Test Runners](http://www.baeldung.com/junit-4-custom-runners) - [Introduction to JUnitParams](http://www.baeldung.com/junit-params) +- [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index 6400a2d7e7..5934db00ff 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -29,7 +29,6 @@ parallel-tests-junit rest-assured rest-testing - selenium-junit-testng spring-testing test-containers diff --git a/testing-modules/runjunitfromjava/src/main/resources/logback.xml b/testing-modules/runjunitfromjava/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/testing-modules/runjunitfromjava/src/main/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java deleted file mode 100644 index 588a1e5d66..0000000000 --- a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/FirstUnitTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.junit4.runfromjava; - -import org.junit.Test; - -import static org.junit.Assert.assertTrue; - - -public class FirstUnitTest { - - @Test - public void whenThis_thenThat() { - assertTrue(true); - } - - @Test - public void whenSomething_thenSomething() { - assertTrue(true); - } - - @Test - public void whenSomethingElse_thenSomethingElse() { - assertTrue(true); - } - -} diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java deleted file mode 100644 index e2d75021cf..0000000000 --- a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit4/runfromjava/SecondUnitTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.junit4.runfromjava; - -import org.junit.Test; - -import static org.junit.Assert.assertTrue; - -public class SecondUnitTest { - - @Test - public void whenSomething_thenSomething() { - assertTrue(true); - } - - @Test - public void whensomethingElse_thenSomethingElse() { - assertTrue(true); - } -} diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java deleted file mode 100644 index 57c505781d..0000000000 --- a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/FirstUnitTest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.junit5.runfromjava; - -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -class FirstUnitTest { - - @Test - void whenThis_thenThat() { - assertTrue(true); - } - - @Test - void whenSomething_thenSomething() { - assertTrue(true); - } - - @Test - void whenSomethingElse_thenSomethingElse() { - assertTrue(true); - } - -} diff --git a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java b/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java deleted file mode 100644 index fbfb68898b..0000000000 --- a/testing-modules/runjunitfromjava/src/test/java/com/baeldung/junit5/runfromjava/SecondUnitTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.junit5.runfromjava; - -import org.junit.jupiter.api.RepeatedTest; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -class SecondUnitTest { - - @RepeatedTest(10) - void whenSomething_thenSomething() { - assertTrue(true); - } - - @RepeatedTest(5) - void whenSomethingElse_thenSomethingElse() { - assertTrue(true); - } -} diff --git a/testing-modules/testing-libraries/README.md b/testing-modules/testing-libraries/README.md index 0cd9ca7f2e..7191989224 100644 --- a/testing-modules/testing-libraries/README.md +++ b/testing-modules/testing-libraries/README.md @@ -6,5 +6,5 @@ - [Cucumber and Scenario Outline](http://www.baeldung.com/cucumber-scenario-outline) - [Cucumber Java 8 Support](http://www.baeldung.com/cucumber-java-8-support) - [Introduction to Lambda Behave](http://www.baeldung.com/lambda-behave) -- [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) + From dc9a78ab18018f55764b4e64ca26c706211876c5 Mon Sep 17 00:00:00 2001 From: David Calap Date: Tue, 1 Oct 2019 23:33:50 +0200 Subject: [PATCH 325/396] BAEL-3323 Finding an element in a list using Kotlin - Initial commit --- .../kotlin/com/baeldung/lists/ListsTest.kt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsTest.kt diff --git a/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsTest.kt b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsTest.kt new file mode 100644 index 0000000000..8515a6f078 --- /dev/null +++ b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsTest.kt @@ -0,0 +1,25 @@ +package com.baeldung.lambda + +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class ListsTest { + + var batmans: List = listOf("Christian Bale", "Michael Keaton", "Ben Affleck", "George Clooney") + + @Test + fun whenFindASpecificItem_thenItemIsReturned() { + //Returns the first element matching the given predicate, or null if no such element was found. + val theFirstBatman = batmans.find { actor -> "Michael Keaton".equals(actor) } + assertEquals(theFirstBatman, "Michael Keaton") + } + + @Test + fun whenFilterWithPredicate_thenMatchingItemsAreReturned() { + //Returns a list containing only elements matching the given predicate. + val theCoolestBatmans = batmans.filter { actor -> actor.contains("a") } + assertTrue(theCoolestBatmans.contains("Christian Bale") && theCoolestBatmans.contains("Michael Keaton")) + } + +} \ No newline at end of file From 30bf670ba4514a54d082f726965e1ca092a93f8e Mon Sep 17 00:00:00 2001 From: David Calap Date: Wed, 2 Oct 2019 09:19:21 +0200 Subject: [PATCH 326/396] BAEL-3323 filterNot example added. Rename package, class and file --- .../baeldung/lists/{ListsTest.kt => ListsUnitTest.kt} | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) rename core-kotlin-2/src/test/kotlin/com/baeldung/lists/{ListsTest.kt => ListsUnitTest.kt} (68%) diff --git a/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsTest.kt b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt similarity index 68% rename from core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsTest.kt rename to core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt index 8515a6f078..1e7136d08b 100644 --- a/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsTest.kt +++ b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt @@ -1,10 +1,10 @@ -package com.baeldung.lambda +package com.baeldung.lists import org.junit.jupiter.api.Test import kotlin.test.assertEquals import kotlin.test.assertTrue -class ListsTest { +class ListsUnitTest { var batmans: List = listOf("Christian Bale", "Michael Keaton", "Ben Affleck", "George Clooney") @@ -22,4 +22,11 @@ class ListsTest { assertTrue(theCoolestBatmans.contains("Christian Bale") && theCoolestBatmans.contains("Michael Keaton")) } + @Test + fun whenFilterNotWithPredicate_thenMatchingItemsAreReturned() { + //Returns a list containing only elements not matching the given predicate. + val theMehBatmans = batmans.filterNot { actor -> actor.contains("a") } + assertTrue(!theMehBatmans.contains("Christian Bale") && !theMehBatmans.contains("Michael Keaton")) + } + } \ No newline at end of file From 0478d4600794329e08b22a67c07daca5dad9404b Mon Sep 17 00:00:00 2001 From: David Calap Date: Wed, 2 Oct 2019 09:22:55 +0200 Subject: [PATCH 327/396] BAEL-3323 new check added to example --- .../src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt index 1e7136d08b..6fa7983689 100644 --- a/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt +++ b/core-kotlin-2/src/test/kotlin/com/baeldung/lists/ListsUnitTest.kt @@ -2,6 +2,7 @@ package com.baeldung.lists import org.junit.jupiter.api.Test import kotlin.test.assertEquals +import kotlin.test.assertFalse import kotlin.test.assertTrue class ListsUnitTest { @@ -26,7 +27,8 @@ class ListsUnitTest { fun whenFilterNotWithPredicate_thenMatchingItemsAreReturned() { //Returns a list containing only elements not matching the given predicate. val theMehBatmans = batmans.filterNot { actor -> actor.contains("a") } - assertTrue(!theMehBatmans.contains("Christian Bale") && !theMehBatmans.contains("Michael Keaton")) + assertFalse(theMehBatmans.contains("Christian Bale") && theMehBatmans.contains("Michael Keaton")) + assertTrue(theMehBatmans.contains("Ben Affleck") && theMehBatmans.contains("George Clooney")) } } \ No newline at end of file From f3537acf6b7e7e2b4d90f1a21ec9ad841dc23dae Mon Sep 17 00:00:00 2001 From: IgorNB Date: Wed, 2 Oct 2019 12:52:46 +0300 Subject: [PATCH 328/396] SemaPhoreDemo double acquire fix tryAcquire() already acquires a permit, if one is available (no need to call acquire() after it) --- .../java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java index 3a1d8555d3..211ae78c1f 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java @@ -12,7 +12,6 @@ public class SemaPhoreDemo { System.out.println("Number of threads waiting to acquire: " + semaphore.getQueueLength()); if (semaphore.tryAcquire()) { - semaphore.acquire(); // perform some critical operations semaphore.release(); } From 4aeef357e3e46b54474919ea60bf18f8ee1820cc Mon Sep 17 00:00:00 2001 From: johnA1331 <53036378+johnA1331@users.noreply.github.com> Date: Wed, 2 Oct 2019 21:16:24 +0800 Subject: [PATCH 329/396] Bi-monthly test fix - BAEL-16797 (#7822) * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Create README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Create README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md * Update README.md --- algorithms-miscellaneous-2/README.md | 4 ++-- algorithms-sorting/README.md | 1 + apache-olingo/README.md | 1 + core-groovy-2/README.md | 1 + core-java-modules/core-java-8-2/README.md | 2 +- core-java-modules/core-java-arrays/README.md | 3 ++- core-java-modules/core-java-lang-oop-2/README.md | 3 ++- core-java-modules/core-java-lang-operators/README.md | 6 ++++++ core-java-modules/core-java-lang/README.md | 1 + core-java-modules/core-java-security/README.md | 1 + docker/README.md | 3 +++ java-numbers-2/README.md | 1 + java-strings-2/README.md | 1 + javax-servlets/README.md | 1 + javaxval/README.md | 1 + jhipster/jhipster-monolithic/README.md | 1 + libraries-data/README.md | 1 + patterns/dipmodular/README.md | 3 +++ persistence-modules/spring-data-eclipselink/README.md | 1 + spring-5-mvc/README.md | 1 + spring-5-reactive-2/README.md | 1 + spring-boot-bootstrap/README.md | 1 + spring-boot-ops/README.md | 3 ++- spring-mvc-java/README.md | 1 + .../src/main/java/org/baeldung/jdbcauthentication/README.md | 3 +++ testing-modules/easymock/README.md | 3 +++ xml/README.md | 1 + 27 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 core-java-modules/core-java-lang-operators/README.md create mode 100644 docker/README.md create mode 100644 patterns/dipmodular/README.md create mode 100644 spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md create mode 100644 testing-modules/easymock/README.md diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md index 745b106963..76727a1d4f 100644 --- a/algorithms-miscellaneous-2/README.md +++ b/algorithms-miscellaneous-2/README.md @@ -1,10 +1,10 @@ ## Relevant articles: -- [Dijkstra Algorithm in Java](https://www.baeldung.com/java-dijkstra) +- [Dijkstra Shortest Path Algorithm in Java](https://www.baeldung.com/java-dijkstra) - [Introduction to Cobertura](https://www.baeldung.com/cobertura) - [Test a Linked List for Cyclicity](https://www.baeldung.com/java-linked-list-cyclicity) - [Introduction to JGraphT](https://www.baeldung.com/jgrapht) - [A Maze Solver in Java](https://www.baeldung.com/java-solve-maze) - [Create a Sudoku Solver in Java](https://www.baeldung.com/java-sudoku) - [Displaying Money Amounts in Words](https://www.baeldung.com/java-money-into-words) -- [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations) \ No newline at end of file +- [A Collaborative Filtering Recommendation System in Java](https://www.baeldung.com/java-collaborative-filtering-recommendations) diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md index 968d51aecf..49130d7e52 100644 --- a/algorithms-sorting/README.md +++ b/algorithms-sorting/README.md @@ -7,3 +7,4 @@ - [Heap Sort in Java](https://www.baeldung.com/java-heap-sort) - [Shell Sort in Java](https://www.baeldung.com/java-shell-sort) - [Counting Sort in Java](https://www.baeldung.com/java-counting-sort) +- [Sorting Strings by Contained Numbers in Java](https://www.baeldung.com/java-sort-strings-contained-numbers) diff --git a/apache-olingo/README.md b/apache-olingo/README.md index bfbdc97700..22fa6b3b51 100644 --- a/apache-olingo/README.md +++ b/apache-olingo/README.md @@ -1,3 +1,4 @@ ## Relevant articles: - [OData Protocol Guide](https://www.baeldung.com/odata) +- [Intro to OData with Olingo](https://www.baeldung.com/olingo) diff --git a/core-groovy-2/README.md b/core-groovy-2/README.md index 1211dae76d..2eb542a1ac 100644 --- a/core-groovy-2/README.md +++ b/core-groovy-2/README.md @@ -9,3 +9,4 @@ - [Working with XML in Groovy](https://www.baeldung.com/groovy-xml) - [Integrating Groovy into Java Applications](https://www.baeldung.com/groovy-java-applications) - [Concatenate Strings with Groovy](https://www.baeldung.com/groovy-concatenate-strings) +- [Metaprogramming in Groovy](https://www.baeldung.com/groovy-metaprogramming) diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md index d11510b2aa..4952cf4eb7 100644 --- a/core-java-modules/core-java-8-2/README.md +++ b/core-java-modules/core-java-8-2/README.md @@ -5,6 +5,6 @@ ### Relevant Articles: - [Anonymous Classes in Java](http://www.baeldung.com/) - [How to Delay Code Execution in Java](https://www.baeldung.com/java-delay-code-execution) -- [Run JAR Application With Command Line Arguments](https://www.baeldung.com/java-run-jar-with-arguments) +- [Run a Java Application from the Command Line](https://www.baeldung.com/java-run-jar-with-arguments) - [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit) - [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface) diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 088e927910..36d2d4c4ad 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -10,6 +10,7 @@ - [Multi-Dimensional Arrays In Java](https://www.baeldung.com/java-jagged-arrays) - [Find Sum and Average in a Java Array](https://www.baeldung.com/java-array-sum-average) - [Arrays in Java: A Reference Guide](https://www.baeldung.com/java-arrays-guide) -- [How to Invert an Array in Java](https://www.baeldung.com/java-invert-array) +- [Read and Write User Input in Java](https://www.baeldung.com/java-console-input-output) +- [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array) - [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays) - [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array) diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md index 096e4ee002..3d2ecc3a09 100644 --- a/core-java-modules/core-java-lang-oop-2/README.md +++ b/core-java-modules/core-java-lang-oop-2/README.md @@ -13,4 +13,5 @@ - [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object) - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](https://www.baeldung.com/java-inheritance-composition) - [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) -- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods) \ No newline at end of file +- [Composition, Aggregation, and Association in Java](https://www.baeldung.com/java-composition-aggregation-association) +- [Static and Default Methods in Interfaces in Java](https://www.baeldung.com/java-static-default-methods) diff --git a/core-java-modules/core-java-lang-operators/README.md b/core-java-modules/core-java-lang-operators/README.md new file mode 100644 index 0000000000..280c630882 --- /dev/null +++ b/core-java-modules/core-java-lang-operators/README.md @@ -0,0 +1,6 @@ +## Relevant Articles: +- [Guide to the Diamond Operator in Java](https://www.baeldung.com/java-diamond-operator) +- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator) +- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java) +- [Java instanceof Operator](https://www.baeldung.com/java-instanceof) +- [A Guide to Increment and Decrement Unary Operators in Java](https://www.baeldung.com/java-unary-operators) diff --git a/core-java-modules/core-java-lang/README.md b/core-java-modules/core-java-lang/README.md index f3b6d3d8e5..ac91751600 100644 --- a/core-java-modules/core-java-lang/README.md +++ b/core-java-modules/core-java-lang/README.md @@ -38,3 +38,4 @@ - [Attaching Values to Java Enum](https://www.baeldung.com/java-enum-values) - [Variable Scope in Java](https://www.baeldung.com/java-variable-scope) - [Java Classes and Objects](https://www.baeldung.com/java-classes-objects) +- [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums) diff --git a/core-java-modules/core-java-security/README.md b/core-java-modules/core-java-security/README.md index a833ca30bb..00449575b0 100644 --- a/core-java-modules/core-java-security/README.md +++ b/core-java-modules/core-java-security/README.md @@ -11,3 +11,4 @@ - [SHA-256 and SHA3-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) - [Enabling TLS v1.2 in Java 7](https://www.baeldung.com/java-7-tls-v12) - [The Java SecureRandom Class](https://www.baeldung.com/java-secure-random) +- [An Introduction to Java SASL](https://www.baeldung.com/java-sasl) diff --git a/docker/README.md b/docker/README.md new file mode 100644 index 0000000000..7948b3d663 --- /dev/null +++ b/docker/README.md @@ -0,0 +1,3 @@ +## Relevant Articles: + +- [Introduction to Docker Compose](https://www.baeldung.com/docker-compose) diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md index 1d2919aa63..9872497950 100644 --- a/java-numbers-2/README.md +++ b/java-numbers-2/README.md @@ -8,3 +8,4 @@ - [Check If a Number Is Prime in Java](http://www.baeldung.com/java-prime-numbers) - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) - [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple) +- [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) diff --git a/java-strings-2/README.md b/java-strings-2/README.md index ad0a46fd96..1afecf0d74 100644 --- a/java-strings-2/README.md +++ b/java-strings-2/README.md @@ -24,3 +24,4 @@ - [Checking If a String Is a Repeated Substring](https://www.baeldung.com/java-repeated-substring) - [How to Reverse a String in Java](https://www.baeldung.com/java-reverse-string) - [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case) +- [Guide to StreamTokenizer](https://www.baeldung.com/java-streamtokenizer) diff --git a/javax-servlets/README.md b/javax-servlets/README.md index 3c3b17996b..7db11c4d3a 100644 --- a/javax-servlets/README.md +++ b/javax-servlets/README.md @@ -7,3 +7,4 @@ - [Returning a JSON Response from a Servlet](http://www.baeldung.com/servlet-json-response) - [Java EE Servlet Exception Handling](http://www.baeldung.com/servlet-exceptions) - [Context and Servlet Initialization Parameters](http://www.baeldung.com/context-servlet-initialization-param) +- [The Difference between getRequestURI and getPathInfo in HttpServletRequest](https://www.baeldung.com/http-servlet-request-requesturi-pathinfo) diff --git a/javaxval/README.md b/javaxval/README.md index fadd174166..ed9a5024c3 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -7,3 +7,4 @@ - [Validating Container Elements with Bean Validation 2.0](http://www.baeldung.com/bean-validation-container-elements) - [Method Constraints with Bean Validation 2.0](http://www.baeldung.com/javax-validation-method-constraints) - [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank) +- [Javax BigDecimal Validation](https://www.baeldung.com/javax-bigdecimal-validation) diff --git a/jhipster/jhipster-monolithic/README.md b/jhipster/jhipster-monolithic/README.md index 65cc51ad88..de7c6ded74 100644 --- a/jhipster/jhipster-monolithic/README.md +++ b/jhipster/jhipster-monolithic/README.md @@ -1,6 +1,7 @@ ## Relevant Articles - [Intro to JHipster](https://www.baeldung.com/jhipster) +- [Creating New Roles and Authorities in JHipster](https://www.baeldung.com/jhipster-new-roles) # baeldung diff --git a/libraries-data/README.md b/libraries-data/README.md index 92c546c258..c7eb028b4c 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -14,3 +14,4 @@ - [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm) - [Introduction to Kafka Connectors](https://www.baeldung.com/kafka-connectors-guide) - [Kafka Connect Example with MQTT and MongoDB](https://www.baeldung.com/kafka-connect-mqtt-mongodb) +- [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline) diff --git a/patterns/dipmodular/README.md b/patterns/dipmodular/README.md new file mode 100644 index 0000000000..ba46158b8c --- /dev/null +++ b/patterns/dipmodular/README.md @@ -0,0 +1,3 @@ +## Relevant Articles: + +- [The Dependency Inversion Principle in Java](https://www.baeldung.com/java-dependency-inversion-principle) diff --git a/persistence-modules/spring-data-eclipselink/README.md b/persistence-modules/spring-data-eclipselink/README.md index 7981470488..a2518fdb99 100644 --- a/persistence-modules/spring-data-eclipselink/README.md +++ b/persistence-modules/spring-data-eclipselink/README.md @@ -1,3 +1,4 @@ ### Relevant articles - [A Guide to EclipseLink with Spring](http://www.baeldung.com/spring-eclipselink) +- [Pessimistic Locking in JPA](https://www.baeldung.com/jpa-pessimistic-locking) diff --git a/spring-5-mvc/README.md b/spring-5-mvc/README.md index 2b57df3b71..d3216187f9 100644 --- a/spring-5-mvc/README.md +++ b/spring-5-mvc/README.md @@ -5,3 +5,4 @@ This module contains articles about Spring 5 model-view-controller (MVC) pattern ### Relevant Articles: - [Spring Boot and Kotlin](http://www.baeldung.com/spring-boot-kotlin) - [Spring MVC Streaming and SSE Request Processing](https://www.baeldung.com/spring-mvc-sse-streams) +- [Interface Driven Controllers in Spring](https://www.baeldung.com/spring-interface-driven-controllers) diff --git a/spring-5-reactive-2/README.md b/spring-5-reactive-2/README.md index 1d21425fb8..8d1d9e1f8e 100644 --- a/spring-5-reactive-2/README.md +++ b/spring-5-reactive-2/README.md @@ -3,4 +3,5 @@ This module contains articles about reactive Spring 5 - [Spring WebClient vs. RestTemplate](https://www.baeldung.com/spring-webclient-resttemplate) +- [Spring WebClient Filters](https://www.baeldung.com/spring-webclient-filters) - More articles: [[<-- prev]](/spring-5-reactive) diff --git a/spring-boot-bootstrap/README.md b/spring-boot-bootstrap/README.md index 82ec384c86..6dd1582a20 100644 --- a/spring-boot-bootstrap/README.md +++ b/spring-boot-bootstrap/README.md @@ -9,3 +9,4 @@ This module contains articles about bootstrapping Spring Boot applications. - [Deploy a Spring Boot Application to Google App Engine](https://www.baeldung.com/spring-boot-google-app-engine) - [Deploy a Spring Boot Application to OpenShift](https://www.baeldung.com/spring-boot-deploy-openshift) - [Deploy a Spring Boot Application to AWS Beanstalk](https://www.baeldung.com/spring-boot-deploy-aws-beanstalk) +- [Guide to @SpringBootConfiguration in Spring Boot](https://www.baeldung.com/springbootconfiguration-annotation) diff --git a/spring-boot-ops/README.md b/spring-boot-ops/README.md index 58e63bcdc7..71b00b63b0 100644 --- a/spring-boot-ops/README.md +++ b/spring-boot-ops/README.md @@ -16,4 +16,5 @@ This module contains articles about Spring Boot Operations - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar) - [EnvironmentPostProcessor in Spring Boot](https://www.baeldung.com/spring-boot-environmentpostprocessor) - - More articles: [[next -->]](/spring-boot-ops-2) \ No newline at end of file + - [Running a Spring Boot App with Maven vs an Executable War/Jar](https://www.baeldung.com/spring-boot-run-maven-vs-executable-jar) + - More articles: [[next -->]](/spring-boot-ops-2) diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index e946fab3f2..ed9ee20f66 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -20,3 +20,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [A Quick Example of Spring Websockets’ @SendToUser Annotation](http://www.baeldung.com/spring-websockets-sendtouser) - [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters) - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) +- [The HttpMediaTypeNotAcceptableException in Spring MVC](https://www.baeldung.com/spring-httpmediatypenotacceptable) diff --git a/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md b/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md new file mode 100644 index 0000000000..a7cdfec7d8 --- /dev/null +++ b/spring-security-mvc-boot/src/main/java/org/baeldung/jdbcauthentication/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Spring Security: Exploring JDBC Authentication](https://www.baeldung.com/spring-security-jdbc-authentication) diff --git a/testing-modules/easymock/README.md b/testing-modules/easymock/README.md new file mode 100644 index 0000000000..c24ffa9099 --- /dev/null +++ b/testing-modules/easymock/README.md @@ -0,0 +1,3 @@ +## Relevant Articles + +- [Mocking a Void Method with EasyMock](https://www.baeldung.com/easymock-mocking-void-method) diff --git a/xml/README.md b/xml/README.md index f125955089..1872568574 100644 --- a/xml/README.md +++ b/xml/README.md @@ -8,4 +8,5 @@ This module contains articles about eXtensible Markup Language (XML) - [XML Libraries Support in Java](http://www.baeldung.com/java-xml-libraries) - [DOM parsing with Xerces](http://www.baeldung.com/java-xerces-dom-parsing) - [Write an org.w3.dom.Document to a File](https://www.baeldung.com/java-write-xml-document-file) +- [Modifying an XML Attribute in Java](https://www.baeldung.com/java-modify-xml-attribute) - [Convert XML to HTML in Java](https://www.baeldung.com/java-convert-xml-to-html) From 93f31a8ac2bbc166d71c8ed84bb14d16ef0f1b05 Mon Sep 17 00:00:00 2001 From: Maciej Andrearczyk Date: Wed, 2 Oct 2019 18:32:00 +0200 Subject: [PATCH 330/396] BAEL-3285 | Fixed test name, added logging --- .../com/baeldung/reactive/webclient/simultaneous/Client.java | 5 +++++ .../webclient/simultaneous/ClientIntegrationTest.java | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java index 3c6623cb02..9afe50af58 100644 --- a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java @@ -6,9 +6,12 @@ import reactor.core.publisher.Flux; import reactor.core.scheduler.Schedulers; import java.util.List; +import java.util.logging.Logger; public class Client { + private static final Logger LOG = Logger.getLogger(Client.class.getName()); + private WebClient webClient; public Client(String uri) { @@ -16,6 +19,8 @@ public class Client { } public Mono getUser(int id) { + LOG.info(String.format("Calling getUser(%d)", id)); + return webClient.get() .uri("/user/{id}", id) .retrieve() diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java index 99efd34f9f..0acedf15b0 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java @@ -36,7 +36,7 @@ public class ClientIntegrationTest { } @Test - public void checkIfCallsAreExecutedSimultaneously() { + public void givenClient_whenFetchingUsers_thenExecutionTimeIsLessThanDouble() { // Arrange int requestsNumber = 5; int singleRequestTime = 1000; From efb631f0176e7179212c9d98d5a70a24e901ace2 Mon Sep 17 00:00:00 2001 From: IgorNB Date: Wed, 2 Oct 2019 19:55:06 +0300 Subject: [PATCH 331/396] safe semaphore.release in finally block --- .../com/baeldung/concurrent/semaphore/SemaPhoreDemo.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java index 211ae78c1f..153853a5b8 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java @@ -11,9 +11,12 @@ public class SemaPhoreDemo { System.out.println("Available permit : " + semaphore.availablePermits()); System.out.println("Number of threads waiting to acquire: " + semaphore.getQueueLength()); - if (semaphore.tryAcquire()) { + if (semaphore.tryAcquire()) + try { // perform some critical operations - semaphore.release(); + } finally { + semaphore.release(); + } } } From 7f51ae04c015d47b3bb4bbab0500192bdde9de93 Mon Sep 17 00:00:00 2001 From: IgorNB Date: Wed, 2 Oct 2019 19:56:19 +0300 Subject: [PATCH 332/396] Update SemaPhoreDemo.java --- .../java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java index 153853a5b8..43261e5ee4 100644 --- a/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java +++ b/core-java-modules/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java @@ -11,7 +11,7 @@ public class SemaPhoreDemo { System.out.println("Available permit : " + semaphore.availablePermits()); System.out.println("Number of threads waiting to acquire: " + semaphore.getQueueLength()); - if (semaphore.tryAcquire()) + if (semaphore.tryAcquire()) { try { // perform some critical operations } finally { From e2f6187f35a327ac9e762cba7c167dcf97167c2a Mon Sep 17 00:00:00 2001 From: Josh Cummings Date: Wed, 2 Oct 2019 11:30:08 -0600 Subject: [PATCH 333/396] Update links to https (#7931) * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * Update README.md * https added * https added * Update README.md * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added * https added --- akka-streams/README.md | 2 +- algorithms-genetic/README.md | 4 +- algorithms-miscellaneous-3/README.md | 6 +- algorithms-sorting/README.md | 2 +- animal-sniffer-mvn-plugin/README.md | 2 +- annotations/readme.md | 2 +- antlr/README.md | 2 +- apache-avro/README.md | 2 +- apache-bval/README.md | 2 +- apache-curator/README.md | 2 +- apache-cxf/README.md | 8 +-- apache-meecrowave/README.md | 2 +- apache-opennlp/README.md | 2 +- apache-poi/README.md | 6 +- apache-shiro/README.md | 2 +- apache-solrj/README.md | 2 +- apache-spark/README.md | 2 +- apache-thrift/README.md | 2 +- apache-tika/README.md | 2 +- apache-velocity/README.md | 2 +- apache-zookeeper/README.md | 2 +- asciidoctor/README.md | 4 +- asm/README.md | 2 +- atomix/README.md | 2 +- autovalue/README.md | 4 +- aws-lambda/README.md | 4 +- aws/README.md | 16 ++--- axon/README.md | 2 +- azure/README.md | 2 +- blade/README.md | 2 +- bootique/README.md | 2 +- cdi/README.md | 4 +- checker-plugin/README.md | 2 +- core-groovy-2/README.md | 1 - core-groovy/README.md | 6 +- core-kotlin/README.md | 62 ++++++++--------- couchbase/README.md | 10 +-- dagger/README.md | 2 +- deeplearning4j/README.md | 2 +- disruptor/README.md | 2 +- dozer/README.md | 2 +- drools/README.MD | 6 +- dubbo/README.md | 2 +- ethereum/README.md | 6 +- feign/README.md | 4 +- geotools/README.md | 2 +- google-cloud/README.md | 2 +- google-web-toolkit/README.md | 2 +- gradle/README.md | 8 +-- grails/README.md | 2 +- graphql/graphql-java/README.md | 2 +- grpc/README.md | 2 +- gson/README.md | 6 +- guava-collections-set/README.md | 6 +- guava-collections/README.md | 26 +++---- guava-io/README.md | 4 +- guava/README.md | 20 +++--- guice/README.md | 2 +- hazelcast/README.md | 2 +- httpclient-simple/README.md | 12 ++-- httpclient/README.md | 20 +++--- hystrix/README.md | 4 +- image-processing/README.md | 2 +- immutables/README.md | 2 +- jackson-simple/README.md | 12 ++-- jackson/README.md | 46 ++++++------- java-collections-conversions/README.md | 12 ++-- java-dates/README.md | 40 +++++------ java-ee-8-security-api/README.md | 2 +- java-lite/README.md | 4 +- java-numbers-2/README.md | 8 +-- java-rmi/README.md | 2 +- java-spi/README.md | 2 +- java-streams/README.md | 18 ++--- java-strings-2/README.md | 6 +- java-strings-ops/README.md | 22 +++--- java-strings/README.md | 18 ++--- java-vavr-stream/README.md | 2 +- java-websocket/README.md | 2 +- javafx/README.md | 2 +- javax-servlets/README.md | 16 ++--- javaxval/README.md | 6 +- jaxb/README.md | 2 +- jee-7-security/README.md | 2 +- jee-7/README.md | 12 ++-- jersey/README.md | 2 +- jgit/README.md | 2 +- jgroups/README.md | 2 +- jjwt/README.md | 2 +- jmeter/README.md | 4 +- jmh/README.md | 2 +- jni/README.md | 2 +- jooby/README.md | 2 +- jsf/README.md | 8 +-- json-path/README.md | 4 +- json/README.md | 12 ++-- jsoup/README.md | 2 +- jws/README.md | 2 +- kotlin-js/README.md | 2 +- kotlin-libraries/README.md | 12 ++-- lagom/README.md | 2 +- libraries-apache-commons/README.md | 2 +- libraries-data-2/README.md | 18 ++--- libraries-data-3/README.md | 2 +- libraries-data/README.md | 20 +++--- libraries-http/README.md | 16 ++--- libraries-server/README.md | 12 ++-- libraries-testing/README.md | 14 ++-- libraries/README.md | 68 +++++++++---------- linkrest/README.md | 2 +- logging-modules/README.md | 4 +- lombok/README.md | 4 +- lucene/README.md | 4 +- mapstruct/README.md | 2 +- maven-all/maven/README.md | 16 ++--- maven-archetype/README.md | 2 +- mesos-marathon/README.md | 2 +- metrics/README.md | 6 +- micronaut/README.md | 2 +- microprofile/README.md | 2 +- ml/README.md | 2 +- msf4j/README.md | 2 +- muleesb/README.md | 2 +- mustache/README.md | 4 +- mybatis/README.md | 2 +- orika/README.md | 2 +- osgi/readme.md | 2 +- pdf/README.md | 4 +- performance-tests/README.md | 4 +- play-framework/README.md | 6 +- protobuffer/README.md | 2 +- rabbitmq/README.md | 2 +- raml/README.MD | 2 +- ratpack/README.md | 6 +- reactor-core/README.md | 4 +- resteasy/README.md | 6 +- rule-engines/README.md | 2 +- rxjava-2/README.md | 8 +-- rxjava/README.md | 24 +++---- saas/README.md | 2 +- spark-java/README.md | 2 +- spring-4/README.md | 4 +- spring-5-data-reactive/README.md | 4 +- spring-5-mvc/README.md | 2 +- spring-5-reactive-security/README.md | 6 +- spring-5-reactive/README.md | 18 ++--- spring-5-security-oauth/README.md | 2 +- spring-5-security/README.md | 6 +- spring-5/README.md | 14 ++-- spring-activiti/README.md | 8 +-- spring-akka/README.md | 2 +- spring-all/README.md | 40 +++++------ spring-aop/README.md | 8 +-- spring-batch/README.md | 8 +-- spring-bom/README.md | 2 +- spring-boot-admin/README.md | 2 +- spring-boot-autoconfiguration/README.md | 2 +- spring-boot-bootstrap/README.md | 4 +- spring-boot-camel/README.md | 2 +- spring-boot-cli/README.md | 2 +- spring-boot-client/README.MD | 4 +- spring-boot-ctx-fluent/README.md | 2 +- spring-boot-custom-starter/README.md | 4 +- spring-boot-flowable/README.md | 2 +- spring-boot-gradle/README.md | 4 +- spring-boot-jasypt/README.md | 2 +- spring-boot-keycloak/README.md | 2 +- spring-boot-kotlin/README.md | 2 +- spring-boot-logging-log4j2/README.md | 2 +- spring-boot-mvc/README.md | 18 ++--- spring-boot-ops/README.md | 20 +++--- spring-boot-properties/README.md | 12 ++-- spring-boot-property-exp/README.md | 4 +- spring-boot-rest/README.md | 24 +++---- spring-boot-security/README.md | 4 +- spring-boot-vue/README.md | 2 +- spring-boot/README.MD | 48 ++++++------- spring-cloud-bus/README.md | 2 +- spring-cloud-cli/README.md | 2 +- spring-core-2/README.md | 6 +- spring-core/README.md | 14 ++-- spring-cucumber/README.md | 2 +- spring-data-rest-querydsl/README.md | 2 +- spring-data-rest/README.md | 14 ++-- spring-di/README.md | 10 +-- spring-dispatcher-servlet/README.md | 2 +- spring-drools/README.md | 2 +- spring-ejb/README.md | 12 ++-- spring-exceptions/README.md | 12 ++-- spring-freemarker/README.md | 2 +- spring-integration/README.md | 4 +- spring-jenkins-pipeline/README.md | 4 +- spring-jersey/README.md | 4 +- spring-jinq/README.md | 2 +- spring-jms/README.md | 2 +- spring-jooq/README.md | 4 +- spring-kafka/README.md | 2 +- spring-katharsis/README.md | 4 +- spring-ldap/README.md | 4 +- spring-mobile/README.md | 2 +- spring-mockito/README.md | 4 +- spring-mvc-basics/README.md | 18 ++--- spring-mvc-forms-jsp/README.md | 8 +-- spring-mvc-forms-thymeleaf/README.md | 4 +- spring-mvc-java/README.md | 22 +++--- spring-mvc-kotlin/README.md | 6 +- spring-mvc-simple/README.md | 12 ++-- spring-mvc-velocity/README.md | 2 +- spring-mvc-webflow/README.md | 2 +- spring-mvc-xml/README.md | 13 ++-- spring-protobuf/README.md | 2 +- spring-quartz/README.md | 4 +- spring-reactive-kotlin/README.md | 2 +- spring-reactor/README.md | 2 +- spring-remoting/README.md | 10 +-- spring-rest-angular/README.md | 2 +- spring-rest-full/README.md | 6 +- spring-rest-hal-browser/README.md | 2 +- spring-rest-query-language/README.md | 12 ++-- spring-rest-shell/README.md | 2 +- spring-rest-simple/README.md | 10 +-- spring-rest/README.md | 34 +++++----- spring-resttemplate/README.md | 8 +-- spring-roo/README.md | 2 +- spring-security-acl/README.md | 2 +- spring-security-cache-control/README.md | 2 +- spring-security-core/README.md | 8 +-- spring-security-mvc-boot/README.md | 14 ++-- spring-security-mvc-custom/README.md | 14 ++-- spring-security-mvc-digest-auth/README.md | 4 +- spring-security-mvc-ldap/README.md | 4 +- spring-security-mvc-login/README.md | 14 ++-- .../README.md | 2 +- spring-security-mvc-socket/README.md | 4 +- spring-security-mvc/README.md | 4 +- spring-security-openid/README.md | 2 +- spring-security-react/README.md | 2 +- spring-security-rest-basic-auth/README.md | 6 +- spring-security-rest-custom/README.md | 4 +- spring-security-rest/README.md | 14 ++-- spring-security-sso/README.md | 2 +- spring-security-stormpath/README.md | 2 +- spring-security-thymeleaf/README.MD | 2 +- spring-security-x509/README.md | 2 +- spring-sleuth/README.md | 2 +- spring-social-login/README.md | 2 +- spring-spel/README.md | 2 +- spring-state-machine/README.md | 2 +- spring-static-resources/README.md | 6 +- spring-swagger-codegen/README.md | 2 +- spring-thymeleaf/README.md | 28 ++++---- spring-vertx/README.md | 2 +- spring-webflux-amqp/README.md | 2 +- spring-zuul/README.md | 2 +- static-analysis/README.md | 4 +- stripe/README.md | 2 +- structurizr/README.md | 2 +- struts-2/README.md | 2 +- twilio/README.md | 2 +- twitter4j/README.md | 2 +- undertow/README.md | 2 +- vaadin/README.md | 2 +- vavr/README.md | 24 +++---- vertx-and-rxjava/README.md | 2 +- vertx/README.md | 2 +- vraptor/README.md | 5 +- wicket/README.md | 4 +- xml/README.md | 8 +-- xstream/README.md | 6 +- 269 files changed, 861 insertions(+), 882 deletions(-) diff --git a/akka-streams/README.md b/akka-streams/README.md index 7f2751422b..5f71991def 100644 --- a/akka-streams/README.md +++ b/akka-streams/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [Guide to Akka Streams](http://www.baeldung.com/akka-streams) +- [Guide to Akka Streams](https://www.baeldung.com/akka-streams) diff --git a/algorithms-genetic/README.md b/algorithms-genetic/README.md index 39f8d59eee..124e9c09e5 100644 --- a/algorithms-genetic/README.md +++ b/algorithms-genetic/README.md @@ -1,6 +1,6 @@ ## Relevant articles: -- [Introduction to Jenetics Library](http://www.baeldung.com/jenetics) -- [Ant Colony Optimization](http://www.baeldung.com/java-ant-colony-optimization) +- [Introduction to Jenetics Library](https://www.baeldung.com/jenetics) +- [Ant Colony Optimization](https://www.baeldung.com/java-ant-colony-optimization) - [Design a Genetic Algorithm in Java](https://www.baeldung.com/java-genetic-algorithm) - [The Traveling Salesman Problem in Java](https://www.baeldung.com/java-simulated-annealing-for-traveling-salesman) diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-miscellaneous-3/README.md index 843407f047..d2d73ec8a1 100644 --- a/algorithms-miscellaneous-3/README.md +++ b/algorithms-miscellaneous-3/README.md @@ -2,10 +2,10 @@ - [Java Two Pointer Technique](https://www.baeldung.com/java-two-pointer-technique) - [Implementing Simple State Machines with Java Enums](https://www.baeldung.com/java-enum-simple-state-machine) -- [Converting Between Roman and Arabic Numerals in Java](http://www.baeldung.com/java-convert-roman-arabic) -- [Practical Java Examples of the Big O Notation](http://www.baeldung.com/java-algorithm-complexity) +- [Converting Between Roman and Arabic Numerals in Java](https://www.baeldung.com/java-convert-roman-arabic) +- [Practical Java Examples of the Big O Notation](https://www.baeldung.com/java-algorithm-complexity) - [Checking If a List Is Sorted in Java](https://www.baeldung.com/java-check-if-list-sorted) - [Checking if a Java Graph has a Cycle](https://www.baeldung.com/java-graph-has-a-cycle) - [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique) - [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle) -- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency) \ No newline at end of file +- [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency) diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md index 49130d7e52..903865046a 100644 --- a/algorithms-sorting/README.md +++ b/algorithms-sorting/README.md @@ -1,6 +1,6 @@ ## Relevant articles: -- [Bubble Sort in Java](http://www.baeldung.com/java-bubble-sort) +- [Bubble Sort in Java](https://www.baeldung.com/java-bubble-sort) - [Merge Sort in Java](https://www.baeldung.com/java-merge-sort) - [Quicksort Algorithm Implementation in Java](https://www.baeldung.com/java-quicksort) - [Insertion Sort in Java](https://www.baeldung.com/java-insertion-sort) diff --git a/animal-sniffer-mvn-plugin/README.md b/animal-sniffer-mvn-plugin/README.md index 4c7c381da4..e292fe29ca 100644 --- a/animal-sniffer-mvn-plugin/README.md +++ b/animal-sniffer-mvn-plugin/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -[Introduction to Animal Sniffer Maven Plugin](http://www.baeldung.com/maven-animal-sniffer) +[Introduction to Animal Sniffer Maven Plugin](https://www.baeldung.com/maven-animal-sniffer) diff --git a/annotations/readme.md b/annotations/readme.md index 2b052803e6..dc40a7e116 100644 --- a/annotations/readme.md +++ b/annotations/readme.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Java Annotation Processing and Creating a Builder](http://www.baeldung.com/java-annotation-processing-builder) +- [Java Annotation Processing and Creating a Builder](https://www.baeldung.com/java-annotation-processing-builder) diff --git a/antlr/README.md b/antlr/README.md index 419d9ddfbb..b6dac4aa4b 100644 --- a/antlr/README.md +++ b/antlr/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Java with ANTLR](http://www.baeldung.com/java-antlr) +- [Java with ANTLR](https://www.baeldung.com/java-antlr) diff --git a/apache-avro/README.md b/apache-avro/README.md index 32d84ecc76..45ae6e2b9b 100644 --- a/apache-avro/README.md +++ b/apache-avro/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Guide to Apache Avro](http://www.baeldung.com/java-apache-avro) +- [Guide to Apache Avro](https://www.baeldung.com/java-apache-avro) diff --git a/apache-bval/README.md b/apache-bval/README.md index 80ea149993..a9b3979828 100644 --- a/apache-bval/README.md +++ b/apache-bval/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Intro to Apache BVal](http://www.baeldung.com/apache-bval) +- [Intro to Apache BVal](https://www.baeldung.com/apache-bval) diff --git a/apache-curator/README.md b/apache-curator/README.md index 9bda573292..30336d7cdc 100644 --- a/apache-curator/README.md +++ b/apache-curator/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Introduction to Apache Curator](http://www.baeldung.com/apache-curator) +- [Introduction to Apache Curator](https://www.baeldung.com/apache-curator) diff --git a/apache-cxf/README.md b/apache-cxf/README.md index d03999dce3..87413df8c9 100644 --- a/apache-cxf/README.md +++ b/apache-cxf/README.md @@ -1,6 +1,6 @@ ## Relevant Articles: -- [Introduction to Apache CXF Aegis Data Binding](http://www.baeldung.com/aegis-data-binding-in-apache-cxf) -- [Apache CXF Support for RESTful Web Services](http://www.baeldung.com/apache-cxf-rest-api) -- [A Guide to Apache CXF with Spring](http://www.baeldung.com/apache-cxf-with-spring) -- [Introduction to Apache CXF](http://www.baeldung.com/introduction-to-apache-cxf) +- [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf) +- [Apache CXF Support for RESTful Web Services](https://www.baeldung.com/apache-cxf-rest-api) +- [A Guide to Apache CXF with Spring](https://www.baeldung.com/apache-cxf-with-spring) +- [Introduction to Apache CXF](https://www.baeldung.com/introduction-to-apache-cxf) - [Server-Sent Events (SSE) In JAX-RS](https://www.baeldung.com/java-ee-jax-rs-sse) diff --git a/apache-meecrowave/README.md b/apache-meecrowave/README.md index 42b93a383e..0dea60816b 100644 --- a/apache-meecrowave/README.md +++ b/apache-meecrowave/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: ================================ -- [Building a Microservice with Apache Meecrowave](http://www.baeldung.com/apache-meecrowave) +- [Building a Microservice with Apache Meecrowave](https://www.baeldung.com/apache-meecrowave) diff --git a/apache-opennlp/README.md b/apache-opennlp/README.md index 2e9fa0e384..006ca588f2 100644 --- a/apache-opennlp/README.md +++ b/apache-opennlp/README.md @@ -1,3 +1,3 @@ ### Relevant Articles -- [Intro to Apache OpenNLP](http://www.baeldung.com/apache-open-nlp) +- [Intro to Apache OpenNLP](https://www.baeldung.com/apache-open-nlp) diff --git a/apache-poi/README.md b/apache-poi/README.md index 862981991d..8ffd8ef517 100644 --- a/apache-poi/README.md +++ b/apache-poi/README.md @@ -1,4 +1,4 @@ ### Relevant Articles: -- [Microsoft Word Processing in Java with Apache POI](http://www.baeldung.com/java-microsoft-word-with-apache-poi) -- [Working with Microsoft Excel in Java](http://www.baeldung.com/java-microsoft-excel) -- [Creating a MS PowerPoint Presentation in Java](http://www.baeldung.com/apache-poi-slideshow) +- [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi) +- [Working with Microsoft Excel in Java](https://www.baeldung.com/java-microsoft-excel) +- [Creating a MS PowerPoint Presentation in Java](https://www.baeldung.com/apache-poi-slideshow) diff --git a/apache-shiro/README.md b/apache-shiro/README.md index bc3480b266..85f2a99a59 100644 --- a/apache-shiro/README.md +++ b/apache-shiro/README.md @@ -1,2 +1,2 @@ ### Relevant articles -- [Introduction to Apache Shiro](http://www.baeldung.com/apache-shiro) +- [Introduction to Apache Shiro](https://www.baeldung.com/apache-shiro) diff --git a/apache-solrj/README.md b/apache-solrj/README.md index 7a32becb64..55f35b90a7 100644 --- a/apache-solrj/README.md +++ b/apache-solrj/README.md @@ -1,4 +1,4 @@ ## Apache Solrj Tutorials Project ### Relevant Articles -- [Guide to Solr in Java with Apache Solrj](http://www.baeldung.com/apache-solrj) +- [Guide to Solr in Java with Apache Solrj](https://www.baeldung.com/apache-solrj) diff --git a/apache-spark/README.md b/apache-spark/README.md index a4dce212b4..a867fd57ff 100644 --- a/apache-spark/README.md +++ b/apache-spark/README.md @@ -1,4 +1,4 @@ ### Relevant articles -- [Introduction to Apache Spark](http://www.baeldung.com/apache-spark) +- [Introduction to Apache Spark](https://www.baeldung.com/apache-spark) - [Building a Data Pipeline with Kafka, Spark Streaming and Cassandra](https://www.baeldung.com/kafka-spark-data-pipeline) diff --git a/apache-thrift/README.md b/apache-thrift/README.md index d8b9195dcc..b90192f342 100644 --- a/apache-thrift/README.md +++ b/apache-thrift/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [Working with Apache Thrift](http://www.baeldung.com/apache-thrift) +- [Working with Apache Thrift](https://www.baeldung.com/apache-thrift) diff --git a/apache-tika/README.md b/apache-tika/README.md index b92a7bebf1..6f5fd054ca 100644 --- a/apache-tika/README.md +++ b/apache-tika/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [Content Analysis with Apache Tika](http://www.baeldung.com/apache-tika) +- [Content Analysis with Apache Tika](https://www.baeldung.com/apache-tika) diff --git a/apache-velocity/README.md b/apache-velocity/README.md index 53c67f847e..0d659a0381 100644 --- a/apache-velocity/README.md +++ b/apache-velocity/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [Introduction to Apache Velocity](http://www.baeldung.com/apache-velocity) +- [Introduction to Apache Velocity](https://www.baeldung.com/apache-velocity) diff --git a/apache-zookeeper/README.md b/apache-zookeeper/README.md index 6bddcfd5a8..d3ef944b0e 100644 --- a/apache-zookeeper/README.md +++ b/apache-zookeeper/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [Getting Started with Java and Zookeeper](http://www.baeldung.com/java-zookeeper) +- [Getting Started with Java and Zookeeper](https://www.baeldung.com/java-zookeeper) diff --git a/asciidoctor/README.md b/asciidoctor/README.md index 2124907e87..e8bf55792b 100644 --- a/asciidoctor/README.md +++ b/asciidoctor/README.md @@ -1,4 +1,4 @@ ### Relevant articles -- [Generating a Book with Asciidoctor](http://www.baeldung.com/asciidoctor-book) -- [Introduction to Asciidoctor in Java](http://www.baeldung.com/asciidoctor) +- [Generating a Book with Asciidoctor](https://www.baeldung.com/asciidoctor-book) +- [Introduction to Asciidoctor in Java](https://www.baeldung.com/asciidoctor) diff --git a/asm/README.md b/asm/README.md index 50d9c34324..d12ee1ce13 100644 --- a/asm/README.md +++ b/asm/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [A Guide to Java Bytecode Manipulation with ASM](http://www.baeldung.com/java-asm) +- [A Guide to Java Bytecode Manipulation with ASM](https://www.baeldung.com/java-asm) diff --git a/atomix/README.md b/atomix/README.md index fb22eec8dc..c544458974 100644 --- a/atomix/README.md +++ b/atomix/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [Introduction to Atomix](http://www.baeldung.com/atomix) +- [Introduction to Atomix](https://www.baeldung.com/atomix) diff --git a/autovalue/README.md b/autovalue/README.md index f33ff6899f..7defca1161 100644 --- a/autovalue/README.md +++ b/autovalue/README.md @@ -1,4 +1,4 @@ ### Relevant Articles: -- [Introduction to AutoValue](http://www.baeldung.com/introduction-to-autovalue) -- [Introduction to AutoFactory](http://www.baeldung.com/autofactory) +- [Introduction to AutoValue](https://www.baeldung.com/introduction-to-autovalue) +- [Introduction to AutoFactory](https://www.baeldung.com/autofactory) - [Google AutoService](https://www.baeldung.com/google-autoservice) diff --git a/aws-lambda/README.md b/aws-lambda/README.md index 921b699bdd..a8f9f3e98a 100644 --- a/aws-lambda/README.md +++ b/aws-lambda/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Using AWS Lambda with API Gateway](http://www.baeldung.com/aws-lambda-api-gateway) -- [Introduction to AWS Serverless Application Model](http://www.baeldung.com/aws-serverless) +- [Using AWS Lambda with API Gateway](https://www.baeldung.com/aws-lambda-api-gateway) +- [Introduction to AWS Serverless Application Model](https://www.baeldung.com/aws-serverless) diff --git a/aws/README.md b/aws/README.md index d14ea8a75e..b97db02723 100644 --- a/aws/README.md +++ b/aws/README.md @@ -1,11 +1,11 @@ ### Relevant articles -- [AWS Lambda Using DynamoDB With Java](http://www.baeldung.com/aws-lambda-dynamodb-java) -- [AWS S3 with Java](http://www.baeldung.com/aws-s3-java) -- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda) -- [Managing EC2 Instances in Java](http://www.baeldung.com/ec2-java) -- [Multipart Uploads in Amazon S3 with Java](http://www.baeldung.com/aws-s3-multipart-upload) -- [Integration Testing with a Local DynamoDB Instance](http://www.baeldung.com/dynamodb-local-integration-tests) -- [Using the JetS3t Java Client With Amazon S3](http://www.baeldung.com/jets3t-amazon-s3) -- [Managing Amazon SQS Queues in Java](http://www.baeldung.com/aws-queues-java) +- [AWS Lambda Using DynamoDB With Java](https://www.baeldung.com/aws-lambda-dynamodb-java) +- [AWS S3 with Java](https://www.baeldung.com/aws-s3-java) +- [AWS Lambda With Java](https://www.baeldung.com/java-aws-lambda) +- [Managing EC2 Instances in Java](https://www.baeldung.com/ec2-java) +- [Multipart Uploads in Amazon S3 with Java](https://www.baeldung.com/aws-s3-multipart-upload) +- [Integration Testing with a Local DynamoDB Instance](https://www.baeldung.com/dynamodb-local-integration-tests) +- [Using the JetS3t Java Client With Amazon S3](https://www.baeldung.com/jets3t-amazon-s3) +- [Managing Amazon SQS Queues in Java](https://www.baeldung.com/aws-queues-java) - [Guide to AWS Aurora RDS with Java](https://www.baeldung.com/aws-aurora-rds-java) diff --git a/axon/README.md b/axon/README.md index f1ae5d00d8..8938be7ec2 100644 --- a/axon/README.md +++ b/axon/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [A Guide to the Axon Framework](http://www.baeldung.com/axon-cqrs-event-sourcing) +- [A Guide to the Axon Framework](https://www.baeldung.com/axon-cqrs-event-sourcing) diff --git a/azure/README.md b/azure/README.md index ae8c443660..3c70622b85 100644 --- a/azure/README.md +++ b/azure/README.md @@ -1,4 +1,4 @@ ### Relevant Articles: -- [Deploy a Spring Boot App to Azure](http://www.baeldung.com/spring-boot-azure) +- [Deploy a Spring Boot App to Azure](https://www.baeldung.com/spring-boot-azure) diff --git a/blade/README.md b/blade/README.md index 1f2a00ed3f..202494330f 100644 --- a/blade/README.md +++ b/blade/README.md @@ -1,5 +1,5 @@ ### Relevant Articles: -- [Blade – A Complete Guidebook](http://www.baeldung.com/blade) +- [Blade – A Complete Guidebook](https://www.baeldung.com/blade) Run Integration Tests with `mvn integration-test` diff --git a/bootique/README.md b/bootique/README.md index 2ef898fcf7..beb61c2a78 100644 --- a/bootique/README.md +++ b/bootique/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Introduction to Bootique](http://www.baeldung.com/bootique) +- [Introduction to Bootique](https://www.baeldung.com/bootique) diff --git a/cdi/README.md b/cdi/README.md index bfb635be9e..69ce285d7b 100644 --- a/cdi/README.md +++ b/cdi/README.md @@ -1,5 +1,5 @@ ### Relevant Articles: -- [CDI Interceptor vs Spring AspectJ](http://www.baeldung.com/cdi-interceptor-vs-spring-aspectj) -- [An Introduction to CDI (Contexts and Dependency Injection) in Java](http://www.baeldung.com/java-ee-cdi) +- [CDI Interceptor vs Spring AspectJ](https://www.baeldung.com/cdi-interceptor-vs-spring-aspectj) +- [An Introduction to CDI (Contexts and Dependency Injection) in Java](https://www.baeldung.com/java-ee-cdi) - [Introduction to the Event Notification Model in CDI 2.0](https://www.baeldung.com/cdi-event-notification) diff --git a/checker-plugin/README.md b/checker-plugin/README.md index f4534b09e8..5c73b86f91 100644 --- a/checker-plugin/README.md +++ b/checker-plugin/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [The Checker Framework – Pluggable Type Systems for Java](http://www.baeldung.com/checker-framework) +- [The Checker Framework – Pluggable Type Systems for Java](https://www.baeldung.com/checker-framework) diff --git a/core-groovy-2/README.md b/core-groovy-2/README.md index 2eb542a1ac..1dbfbd07a5 100644 --- a/core-groovy-2/README.md +++ b/core-groovy-2/README.md @@ -2,7 +2,6 @@ ## Relevant articles: -- [String Matching in Groovy](http://www.baeldung.com/) - [Template Engines in Groovy](https://www.baeldung.com/groovy-template-engines) - [Groovy def Keyword](https://www.baeldung.com/groovy-def-keyword) - [Pattern Matching in Strings in Groovy](https://www.baeldung.com/groovy-pattern-matching) diff --git a/core-groovy/README.md b/core-groovy/README.md index 321c37be8d..2e62884b1f 100644 --- a/core-groovy/README.md +++ b/core-groovy/README.md @@ -2,8 +2,8 @@ ## Relevant articles: -- [JDBC with Groovy](http://www.baeldung.com/jdbc-groovy) -- [Working with JSON in Groovy](http://www.baeldung.com/groovy-json) +- [JDBC with Groovy](https://www.baeldung.com/jdbc-groovy) +- [Working with JSON in Groovy](https://www.baeldung.com/groovy-json) - [Reading a File in Groovy](https://www.baeldung.com/groovy-file-read) - [Types of Strings in Groovy](https://www.baeldung.com/groovy-strings) - [A Quick Guide to Iterating a Map in Groovy](https://www.baeldung.com/groovy-map-iterating) @@ -12,4 +12,4 @@ - [Finding Elements in Collections in Groovy](https://www.baeldung.com/groovy-collections-find-elements) - [Lists in Groovy](https://www.baeldung.com/groovy-lists) - [Converting a String to a Date in Groovy](https://www.baeldung.com/groovy-string-to-date) -- [Guide to I/O in Groovy](https://www.baeldung.com/groovy-io) \ No newline at end of file +- [Guide to I/O in Groovy](https://www.baeldung.com/groovy-io) diff --git a/core-kotlin/README.md b/core-kotlin/README.md index 3392db9171..2728fd4ea0 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -1,36 +1,36 @@ ## Relevant articles: -- [Introduction to the Kotlin Language](http://www.baeldung.com/kotlin) -- [Guide to the “when{}” Block in Kotlin](http://www.baeldung.com/kotlin-when) -- [Comprehensive Guide to Null Safety in Kotlin](http://www.baeldung.com/kotlin-null-safety) -- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability) -- [Difference Between “==” and “===” operators in Kotlin](http://www.baeldung.com/kotlin-equality-operators) -- [Generics in Kotlin](http://www.baeldung.com/kotlin-generics) -- [Introduction to Kotlin Coroutines](http://www.baeldung.com/kotlin-coroutines) -- [Destructuring Declarations in Kotlin](http://www.baeldung.com/kotlin-destructuring-declarations) -- [Lazy Initialization in Kotlin](http://www.baeldung.com/kotlin-lazy-initialization) -- [Overview of Kotlin Collections API](http://www.baeldung.com/kotlin-collections-api) -- [Converting a List to Map in Kotlin](http://www.baeldung.com/kotlin-list-to-map) -- [Data Classes in Kotlin](http://www.baeldung.com/kotlin-data-classes) -- [Delegated Properties in Kotlin](http://www.baeldung.com/kotlin-delegated-properties) -- [Sealed Classes in Kotlin](http://www.baeldung.com/kotlin-sealed-classes) -- [JUnit 5 for Kotlin Developers](http://www.baeldung.com/junit-5-kotlin) -- [Extension Methods in Kotlin](http://www.baeldung.com/kotlin-extension-methods) -- [Infix Functions in Kotlin](http://www.baeldung.com/kotlin-infix-functions) -- [Try-with-resources in Kotlin](http://www.baeldung.com/kotlin-try-with-resources) -- [Regular Expressions in Kotlin](http://www.baeldung.com/kotlin-regular-expressions) -- [Objects in Kotlin](http://www.baeldung.com/kotlin-objects) -- [Reading from a File in Kotlin](http://www.baeldung.com/kotlin-read-file) -- [Guide to Kotlin @JvmField](http://www.baeldung.com/kotlin-jvm-field-annotation) -- [Filtering Kotlin Collections](http://www.baeldung.com/kotlin-filter-collection) -- [Writing to a File in Kotlin](http://www.baeldung.com/kotlin-write-file) -- [Lambda Expressions in Kotlin](http://www.baeldung.com/kotlin-lambda-expressions) -- [Kotlin String Templates](http://www.baeldung.com/kotlin-string-template) -- [Working with Enums in Kotlin](http://www.baeldung.com/kotlin-enum) -- [Create a Java and Kotlin Project with Maven](http://www.baeldung.com/kotlin-maven-java-project) -- [Reflection with Kotlin](http://www.baeldung.com/kotlin-reflection) -- [Get a Random Number in Kotlin](http://www.baeldung.com/kotlin-random-number) -- [Idiomatic Logging in Kotlin](http://www.baeldung.com/kotlin-logging) +- [Introduction to the Kotlin Language](https://www.baeldung.com/kotlin) +- [Guide to the “when{}” Block in Kotlin](https://www.baeldung.com/kotlin-when) +- [Comprehensive Guide to Null Safety in Kotlin](https://www.baeldung.com/kotlin-null-safety) +- [Kotlin Java Interoperability](https://www.baeldung.com/kotlin-java-interoperability) +- [Difference Between “==” and “===” operators in Kotlin](https://www.baeldung.com/kotlin-equality-operators) +- [Generics in Kotlin](https://www.baeldung.com/kotlin-generics) +- [Introduction to Kotlin Coroutines](https://www.baeldung.com/kotlin-coroutines) +- [Destructuring Declarations in Kotlin](https://www.baeldung.com/kotlin-destructuring-declarations) +- [Lazy Initialization in Kotlin](https://www.baeldung.com/kotlin-lazy-initialization) +- [Overview of Kotlin Collections API](https://www.baeldung.com/kotlin-collections-api) +- [Converting a List to Map in Kotlin](https://www.baeldung.com/kotlin-list-to-map) +- [Data Classes in Kotlin](https://www.baeldung.com/kotlin-data-classes) +- [Delegated Properties in Kotlin](https://www.baeldung.com/kotlin-delegated-properties) +- [Sealed Classes in Kotlin](https://www.baeldung.com/kotlin-sealed-classes) +- [JUnit 5 for Kotlin Developers](https://www.baeldung.com/junit-5-kotlin) +- [Extension Methods in Kotlin](https://www.baeldung.com/kotlin-extension-methods) +- [Infix Functions in Kotlin](https://www.baeldung.com/kotlin-infix-functions) +- [Try-with-resources in Kotlin](https://www.baeldung.com/kotlin-try-with-resources) +- [Regular Expressions in Kotlin](https://www.baeldung.com/kotlin-regular-expressions) +- [Objects in Kotlin](https://www.baeldung.com/kotlin-objects) +- [Reading from a File in Kotlin](https://www.baeldung.com/kotlin-read-file) +- [Guide to Kotlin @JvmField](https://www.baeldung.com/kotlin-jvm-field-annotation) +- [Filtering Kotlin Collections](https://www.baeldung.com/kotlin-filter-collection) +- [Writing to a File in Kotlin](https://www.baeldung.com/kotlin-write-file) +- [Lambda Expressions in Kotlin](https://www.baeldung.com/kotlin-lambda-expressions) +- [Kotlin String Templates](https://www.baeldung.com/kotlin-string-template) +- [Working with Enums in Kotlin](https://www.baeldung.com/kotlin-enum) +- [Create a Java and Kotlin Project with Maven](https://www.baeldung.com/kotlin-maven-java-project) +- [Reflection with Kotlin](https://www.baeldung.com/kotlin-reflection) +- [Get a Random Number in Kotlin](https://www.baeldung.com/kotlin-random-number) +- [Idiomatic Logging in Kotlin](https://www.baeldung.com/kotlin-logging) - [Kotlin Constructors](https://www.baeldung.com/kotlin-constructors) - [Creational Design Patterns in Kotlin: Builder](https://www.baeldung.com/kotlin-builder-pattern) - [Kotlin Nested and Inner Classes](https://www.baeldung.com/kotlin-inner-classes) diff --git a/couchbase/README.md b/couchbase/README.md index 7a99ce4299..c4c7df97da 100644 --- a/couchbase/README.md +++ b/couchbase/README.md @@ -1,11 +1,11 @@ ## Couchbase SDK Tutorial Project ### Relevant Articles: -- [Introduction to Couchbase SDK for Java](http://www.baeldung.com/java-couchbase-sdk) -- [Using Couchbase in a Spring Application](http://www.baeldung.com/couchbase-sdk-spring) -- [Asynchronous Batch Operations in Couchbase](http://www.baeldung.com/async-batch-operations-in-couchbase) -- [Querying Couchbase with MapReduce Views](http://www.baeldung.com/couchbase-query-mapreduce-view) -- [Querying Couchbase with N1QL](http://www.baeldung.com/n1ql-couchbase) +- [Introduction to Couchbase SDK for Java](https://www.baeldung.com/java-couchbase-sdk) +- [Using Couchbase in a Spring Application](https://www.baeldung.com/couchbase-sdk-spring) +- [Asynchronous Batch Operations in Couchbase](https://www.baeldung.com/async-batch-operations-in-couchbase) +- [Querying Couchbase with MapReduce Views](https://www.baeldung.com/couchbase-query-mapreduce-view) +- [Querying Couchbase with N1QL](https://www.baeldung.com/n1ql-couchbase) ### Overview This Maven project contains the Java code for the Couchbase entities and Spring services diff --git a/dagger/README.md b/dagger/README.md index 72cba3d3f2..81dc161ca1 100644 --- a/dagger/README.md +++ b/dagger/README.md @@ -1,3 +1,3 @@ ### Relevant articles: -- [Introduction to Dagger 2](http://www.baeldung.com/dagger-2) +- [Introduction to Dagger 2](https://www.baeldung.com/dagger-2) diff --git a/deeplearning4j/README.md b/deeplearning4j/README.md index 14e585cd97..eb1e19daa1 100644 --- a/deeplearning4j/README.md +++ b/deeplearning4j/README.md @@ -2,4 +2,4 @@ This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library. ### Relevant Articles: -- [A Guide to Deeplearning4j](http://www.baeldung.com/deeplearning4j) +- [A Guide to Deeplearning4j](https://www.baeldung.com/deeplearning4j) diff --git a/disruptor/README.md b/disruptor/README.md index 779b1e89c4..8f977d090a 100644 --- a/disruptor/README.md +++ b/disruptor/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [Concurrency with LMAX Disruptor – An Introduction](http://www.baeldung.com/lmax-disruptor-concurrency) +- [Concurrency with LMAX Disruptor – An Introduction](https://www.baeldung.com/lmax-disruptor-concurrency) diff --git a/dozer/README.md b/dozer/README.md index 5e104d914c..2e610b836a 100644 --- a/dozer/README.md +++ b/dozer/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [A Guide to Mapping With Dozer](http://www.baeldung.com/dozer) +- [A Guide to Mapping With Dozer](https://www.baeldung.com/dozer) diff --git a/drools/README.MD b/drools/README.MD index 5efbe0d3c3..1ff3dfba20 100644 --- a/drools/README.MD +++ b/drools/README.MD @@ -1,4 +1,4 @@ ### Relevant Articles: -- [Introduction to Drools](http://www.baeldung.com/drools) -- [Drools Using Rules from Excel Files](http://www.baeldung.com/drools-excel) -- [An Example of Backward Chaining in Drools](http://www.baeldung.com/drools-backward-chaining) +- [Introduction to Drools](https://www.baeldung.com/drools) +- [Drools Using Rules from Excel Files](https://www.baeldung.com/drools-excel) +- [An Example of Backward Chaining in Drools](https://www.baeldung.com/drools-backward-chaining) diff --git a/dubbo/README.md b/dubbo/README.md index 0a4cd9a204..566efe28f5 100644 --- a/dubbo/README.md +++ b/dubbo/README.md @@ -1,4 +1,4 @@ ## Relevant articles: -- [Introduction to Dubbo](http://www.baeldung.com/dubbo) +- [Introduction to Dubbo](https://www.baeldung.com/dubbo) diff --git a/ethereum/README.md b/ethereum/README.md index d06ca09636..7eccea7135 100644 --- a/ethereum/README.md +++ b/ethereum/README.md @@ -1,6 +1,6 @@ ## Ethereum ### Relevant Articles: -- [Introduction to EthereumJ](http://www.baeldung.com/ethereumj) -- [Creating and Deploying Smart Contracts with Solidity](http://www.baeldung.com/smart-contracts-ethereum-solidity) -- [Lightweight Ethereum Clients Using Web3j](http://www.baeldung.com/web3j) +- [Introduction to EthereumJ](https://www.baeldung.com/ethereumj) +- [Creating and Deploying Smart Contracts with Solidity](https://www.baeldung.com/smart-contracts-ethereum-solidity) +- [Lightweight Ethereum Clients Using Web3j](https://www.baeldung.com/web3j) diff --git a/feign/README.md b/feign/README.md index da04c40cdc..5aa0e3f56f 100644 --- a/feign/README.md +++ b/feign/README.md @@ -6,5 +6,5 @@ This is the implementation of a [spring-hypermedia-api][1] client using Feign. ### Relevant Articles: -- [Intro to Feign](http://www.baeldung.com/intro-to-feign) -- [Introduction to SLF4J](http://www.baeldung.com/slf4j-with-log4j2-logback) +- [Intro to Feign](https://www.baeldung.com/intro-to-feign) +- [Introduction to SLF4J](https://www.baeldung.com/slf4j-with-log4j2-logback) diff --git a/geotools/README.md b/geotools/README.md index 188ff0fddb..98f1e2c283 100644 --- a/geotools/README.md +++ b/geotools/README.md @@ -1,3 +1,3 @@ ### Relevant Articles -[Introduction to GeoTools](http://www.baeldung.com/geo-tools) +[Introduction to GeoTools](https://www.baeldung.com/geo-tools) diff --git a/google-cloud/README.md b/google-cloud/README.md index 87ca17eac4..c6c49b88bf 100644 --- a/google-cloud/README.md +++ b/google-cloud/README.md @@ -1,7 +1,7 @@ ## Google Cloud Tutorial Project ### Relevant Article: -- [Intro to Google Cloud Storage With Java](http://www.baeldung.com/java-google-cloud-storage) +- [Intro to Google Cloud Storage With Java](https://www.baeldung.com/java-google-cloud-storage) ### Overview This Maven project contains the Java code for the article linked above. diff --git a/google-web-toolkit/README.md b/google-web-toolkit/README.md index 3526fe9962..d2a8b324ec 100644 --- a/google-web-toolkit/README.md +++ b/google-web-toolkit/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Introduction to GWT](http://www.baeldung.com/gwt) +- [Introduction to GWT](https://www.baeldung.com/gwt) diff --git a/gradle/README.md b/gradle/README.md index 14e460f225..0ad0ff3e45 100644 --- a/gradle/README.md +++ b/gradle/README.md @@ -1,6 +1,6 @@ ## Relevant articles: -- [Introduction to Gradle](http://www.baeldung.com/gradle) -- [Writing Custom Gradle Plugins](http://www.baeldung.com/gradle-create-plugin) -- [Creating a Fat Jar in Gradle](http://www.baeldung.com/gradle-fat-jar) -- [A Custom Task in Gradle](http://www.baeldung.com/gradle-custom-task) +- [Introduction to Gradle](https://www.baeldung.com/gradle) +- [Writing Custom Gradle Plugins](https://www.baeldung.com/gradle-create-plugin) +- [Creating a Fat Jar in Gradle](https://www.baeldung.com/gradle-fat-jar) +- [A Custom Task in Gradle](https://www.baeldung.com/gradle-custom-task) - [Using JUnit 5 with Gradle](https://www.baeldung.com/junit-5-gradle) diff --git a/grails/README.md b/grails/README.md index faa50a7efd..b93ac5de2e 100644 --- a/grails/README.md +++ b/grails/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [Build an MVC Web Application with Grails](http://www.baeldung.com/grails-mvc-application) +- [Build an MVC Web Application with Grails](https://www.baeldung.com/grails-mvc-application) diff --git a/graphql/graphql-java/README.md b/graphql/graphql-java/README.md index 0033524209..240b62f6b4 100644 --- a/graphql/graphql-java/README.md +++ b/graphql/graphql-java/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [Introduction to GraphQL](http://www.baeldung.com/graphql) +- [Introduction to GraphQL](https://www.baeldung.com/graphql) diff --git a/grpc/README.md b/grpc/README.md index 5a60ca2e7e..17128dd19f 100644 --- a/grpc/README.md +++ b/grpc/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Introduction to gRPC](http://www.baeldung.com/grpc-introduction) +- [Introduction to gRPC](https://www.baeldung.com/grpc-introduction) diff --git a/gson/README.md b/gson/README.md index 268116a2ac..8b882f2d3e 100644 --- a/gson/README.md +++ b/gson/README.md @@ -4,9 +4,9 @@ ### Relevant Articles: -- [Gson Deserialization Cookbook](http://www.baeldung.com/gson-deserialization-guide) -- [Jackson vs Gson](http://www.baeldung.com/jackson-vs-gson) -- [Exclude Fields from Serialization in Gson](http://www.baeldung.com/gson-exclude-fields-serialization) +- [Gson Deserialization Cookbook](https://www.baeldung.com/gson-deserialization-guide) +- [Jackson vs Gson](https://www.baeldung.com/jackson-vs-gson) +- [Exclude Fields from Serialization in Gson](https://www.baeldung.com/gson-exclude-fields-serialization) - [Save Data to a JSON File with Gson](https://www.baeldung.com/gson-save-file) - [Convert JSON to a Map Using Gson](https://www.baeldung.com/gson-json-to-map) - [Working with Primitive Values in Gson](https://www.baeldung.com/java-gson-primitives) diff --git a/guava-collections-set/README.md b/guava-collections-set/README.md index c36d9e0b61..e24552aae8 100644 --- a/guava-collections-set/README.md +++ b/guava-collections-set/README.md @@ -2,7 +2,7 @@ ## Relevant Articles: -- [Guava – Sets](http://www.baeldung.com/guava-sets) -- [Guide to Guava RangeSet](http://www.baeldung.com/guava-rangeset) -- [Guava Set + Function = Map](http://www.baeldung.com/guava-set-function-map-tutorial) +- [Guava – Sets](https://www.baeldung.com/guava-sets) +- [Guide to Guava RangeSet](https://www.baeldung.com/guava-rangeset) +- [Guava Set + Function = Map](https://www.baeldung.com/guava-set-function-map-tutorial) - [Guide to Guava Multiset](https://www.baeldung.com/guava-multiset) diff --git a/guava-collections/README.md b/guava-collections/README.md index e919a98c2b..95397f0ff0 100644 --- a/guava-collections/README.md +++ b/guava-collections/README.md @@ -4,17 +4,17 @@ ### Relevant Articles: -- [Guava Collections Cookbook](http://www.baeldung.com/guava-collections) -- [Guava Ordering Cookbook](http://www.baeldung.com/guava-order) -- [Hamcrest Collections Cookbook](http://www.baeldung.com/hamcrest-collections-arrays) -- [Partition a List in Java](http://www.baeldung.com/java-list-split) -- [Filtering and Transforming Collections in Guava](http://www.baeldung.com/guava-filter-and-transform-a-collection) -- [Guava – Join and Split Collections](http://www.baeldung.com/guava-joiner-and-splitter-tutorial) -- [Guava – Lists](http://www.baeldung.com/guava-lists) -- [Guava – Maps](http://www.baeldung.com/guava-maps) -- [Guide to Guava Multimap](http://www.baeldung.com/guava-multimap) -- [Guide to Guava RangeMap](http://www.baeldung.com/guava-rangemap) -- [Guide to Guava MinMaxPriorityQueue and EvictingQueue](http://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue) +- [Guava Collections Cookbook](https://www.baeldung.com/guava-collections) +- [Guava Ordering Cookbook](https://www.baeldung.com/guava-order) +- [Hamcrest Collections Cookbook](https://www.baeldung.com/hamcrest-collections-arrays) +- [Partition a List in Java](https://www.baeldung.com/java-list-split) +- [Filtering and Transforming Collections in Guava](https://www.baeldung.com/guava-filter-and-transform-a-collection) +- [Guava – Join and Split Collections](https://www.baeldung.com/guava-joiner-and-splitter-tutorial) +- [Guava – Lists](https://www.baeldung.com/guava-lists) +- [Guava – Maps](https://www.baeldung.com/guava-maps) +- [Guide to Guava Multimap](https://www.baeldung.com/guava-multimap) +- [Guide to Guava RangeMap](https://www.baeldung.com/guava-rangemap) +- [Guide to Guava MinMaxPriorityQueue and EvictingQueue](https://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue) - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) -- [Guide to Guava Table](http://www.baeldung.com/guava-table) -- [Guide to Guava ClassToInstanceMap](http://www.baeldung.com/guava-class-to-instance-map) \ No newline at end of file +- [Guide to Guava Table](https://www.baeldung.com/guava-table) +- [Guide to Guava ClassToInstanceMap](https://www.baeldung.com/guava-class-to-instance-map) diff --git a/guava-io/README.md b/guava-io/README.md index df7775a36d..0737accbed 100644 --- a/guava-io/README.md +++ b/guava-io/README.md @@ -1,4 +1,4 @@ ### Relevant Articles: -- [Using Guava CountingOutputStream](http://www.baeldung.com/guava-counting-outputstream) -- [Guava – Write to File, Read from File](http://www.baeldung.com/guava-write-to-file-read-from-file) +- [Using Guava CountingOutputStream](https://www.baeldung.com/guava-counting-outputstream) +- [Guava – Write to File, Read from File](https://www.baeldung.com/guava-write-to-file-read-from-file) diff --git a/guava/README.md b/guava/README.md index d3bbbf6de5..a9694daf0b 100644 --- a/guava/README.md +++ b/guava/README.md @@ -2,14 +2,14 @@ ## Guava Examples ### Relevant Articles: -- [Guava Functional Cookbook](http://www.baeldung.com/guava-functions-predicates) -- [Guide to Guava’s Ordering](http://www.baeldung.com/guava-ordering) -- [Guide to Guava’s PreConditions](http://www.baeldung.com/guava-preconditions) -- [Introduction to Guava CacheLoader](http://www.baeldung.com/guava-cacheloader) -- [Introduction to Guava Memoizer](http://www.baeldung.com/guava-memoizer) -- [Guide to Guava’s EventBus](http://www.baeldung.com/guava-eventbus) -- [Guide to Guava’s Reflection Utilities](http://www.baeldung.com/guava-reflection) -- [Guide to Mathematical Utilities in Guava](http://www.baeldung.com/guava-math) -- [Bloom Filter in Java using Guava](http://www.baeldung.com/guava-bloom-filter) -- [Quick Guide to the Guava RateLimiter](http://www.baeldung.com/guava-rate-limiter) +- [Guava Functional Cookbook](https://www.baeldung.com/guava-functions-predicates) +- [Guide to Guava’s Ordering](https://www.baeldung.com/guava-ordering) +- [Guide to Guava’s PreConditions](https://www.baeldung.com/guava-preconditions) +- [Introduction to Guava CacheLoader](https://www.baeldung.com/guava-cacheloader) +- [Introduction to Guava Memoizer](https://www.baeldung.com/guava-memoizer) +- [Guide to Guava’s EventBus](https://www.baeldung.com/guava-eventbus) +- [Guide to Guava’s Reflection Utilities](https://www.baeldung.com/guava-reflection) +- [Guide to Mathematical Utilities in Guava](https://www.baeldung.com/guava-math) +- [Bloom Filter in Java using Guava](https://www.baeldung.com/guava-bloom-filter) +- [Quick Guide to the Guava RateLimiter](https://www.baeldung.com/guava-rate-limiter) diff --git a/guice/README.md b/guice/README.md index 77c788c363..cc3a8755c0 100644 --- a/guice/README.md +++ b/guice/README.md @@ -1,5 +1,5 @@ ## Google Guice Tutorials Project ### Relevant Articles -- [Guide to Google Guice](http://www.baeldung.com/guice) +- [Guide to Google Guice](https://www.baeldung.com/guice) - [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection) diff --git a/hazelcast/README.md b/hazelcast/README.md index 7adb13f2af..8ba6dc122b 100644 --- a/hazelcast/README.md +++ b/hazelcast/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Guide to Hazelcast with Java](http://www.baeldung.com/java-hazelcast) +- [Guide to Hazelcast with Java](https://www.baeldung.com/java-hazelcast) - [Introduction to Hazelcast Jet](https://www.baeldung.com/hazelcast-jet) diff --git a/httpclient-simple/README.md b/httpclient-simple/README.md index e3535a133e..13a539d794 100644 --- a/httpclient-simple/README.md +++ b/httpclient-simple/README.md @@ -1,12 +1,12 @@ ========= ## This module contains articles that are part of the HTTPClient Ebook -- [HttpClient 4 – Get the Status Code](http://www.baeldung.com/httpclient-status-code) -- [HttpClient with SSL](http://www.baeldung.com/httpclient-ssl) -- [HttpClient Timeout](http://www.baeldung.com/httpclient-timeout) -- [HttpClient 4 – Send Custom Cookie](http://www.baeldung.com/httpclient-4-cookies) -- [Custom HTTP Header with the HttpClient](http://www.baeldung.com/httpclient-custom-http-header) -- [HttpClient Basic Authentication](http://www.baeldung.com/httpclient-4-basic-authentication) +- [HttpClient 4 – Get the Status Code](https://www.baeldung.com/httpclient-status-code) +- [HttpClient with SSL](https://www.baeldung.com/httpclient-ssl) +- [HttpClient Timeout](https://www.baeldung.com/httpclient-timeout) +- [HttpClient 4 – Send Custom Cookie](https://www.baeldung.com/httpclient-4-cookies) +- [Custom HTTP Header with the HttpClient](https://www.baeldung.com/httpclient-custom-http-header) +- [HttpClient Basic Authentication](https://www.baeldung.com/httpclient-4-basic-authentication) - [Posting with HttpClient](https://www.baeldung.com/httpclient-post-http-request) diff --git a/httpclient/README.md b/httpclient/README.md index a5fc29b089..6bce5567ec 100644 --- a/httpclient/README.md +++ b/httpclient/README.md @@ -7,13 +7,13 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [HttpClient 4 – Cancel Request](http://www.baeldung.com/httpclient-cancel-request) -- [HttpClient 4 Cookbook](http://www.baeldung.com/httpclient4) -- [Unshorten URLs with HttpClient](http://www.baeldung.com/unshorten-url-httpclient) -- [HttpClient 4 – Follow Redirects for POST](http://www.baeldung.com/httpclient-redirect-on-http-post) -- [Multipart Upload with HttpClient 4](http://www.baeldung.com/httpclient-multipart-upload) -- [HttpAsyncClient Tutorial](http://www.baeldung.com/httpasyncclient-tutorial) -- [HttpClient 4 Tutorial](http://www.baeldung.com/httpclient-guide) -- [Advanced HttpClient Configuration](http://www.baeldung.com/httpclient-advanced-config) -- [HttpClient 4 – Do Not Follow Redirects](http://www.baeldung.com/httpclient-stop-follow-redirect) -- [Custom User-Agent in HttpClient 4](http://www.baeldung.com/httpclient-user-agent-header) +- [HttpClient 4 – Cancel Request](https://www.baeldung.com/httpclient-cancel-request) +- [HttpClient 4 Cookbook](https://www.baeldung.com/httpclient4) +- [Unshorten URLs with HttpClient](https://www.baeldung.com/unshorten-url-httpclient) +- [HttpClient 4 – Follow Redirects for POST](https://www.baeldung.com/httpclient-redirect-on-http-post) +- [Multipart Upload with HttpClient 4](https://www.baeldung.com/httpclient-multipart-upload) +- [HttpAsyncClient Tutorial](https://www.baeldung.com/httpasyncclient-tutorial) +- [HttpClient 4 Tutorial](https://www.baeldung.com/httpclient-guide) +- [Advanced HttpClient Configuration](https://www.baeldung.com/httpclient-advanced-config) +- [HttpClient 4 – Do Not Follow Redirects](https://www.baeldung.com/httpclient-stop-follow-redirect) +- [Custom User-Agent in HttpClient 4](https://www.baeldung.com/httpclient-user-agent-header) diff --git a/hystrix/README.md b/hystrix/README.md index cc5c8a197f..f35518bce3 100644 --- a/hystrix/README.md +++ b/hystrix/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Hystrix Integration with Existing Spring Application](http://www.baeldung.com/hystrix-integration-with-spring-aop) -- [Introduction to Hystrix](http://www.baeldung.com/introduction-to-hystrix) +- [Hystrix Integration with Existing Spring Application](https://www.baeldung.com/hystrix-integration-with-spring-aop) +- [Introduction to Hystrix](https://www.baeldung.com/introduction-to-hystrix) diff --git a/image-processing/README.md b/image-processing/README.md index 48604bdb1f..2dd74d7c47 100644 --- a/image-processing/README.md +++ b/image-processing/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Working with Images in Java](http://www.baeldung.com/java-images) +- [Working with Images in Java](https://www.baeldung.com/java-images) diff --git a/immutables/README.md b/immutables/README.md index b69a14f035..2ea4f4fe50 100644 --- a/immutables/README.md +++ b/immutables/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Introduction to Immutables](http://www.baeldung.com/immutables) +- [Introduction to Immutables](https://www.baeldung.com/immutables) diff --git a/jackson-simple/README.md b/jackson-simple/README.md index be647e22d5..79538c6929 100644 --- a/jackson-simple/README.md +++ b/jackson-simple/README.md @@ -5,9 +5,9 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Jackson Ignore Properties on Marshalling](http://www.baeldung.com/jackson-ignore-properties-on-serialization) -- [Jackson Unmarshalling json with Unknown Properties](http://www.baeldung.com/jackson-deserialize-json-unknown-properties) -- [Jackson Annotation Examples](http://www.baeldung.com/jackson-annotations) -- [Intro to the Jackson ObjectMapper](http://www.baeldung.com/jackson-object-mapper-tutorial) -- [Ignore Null Fields with Jackson](http://www.baeldung.com/jackson-ignore-null-fields) -- [Jackson – Change Name of Field](http://www.baeldung.com/jackson-name-of-property) +- [Jackson Ignore Properties on Marshalling](https://www.baeldung.com/jackson-ignore-properties-on-serialization) +- [Jackson Unmarshalling json with Unknown Properties](https://www.baeldung.com/jackson-deserialize-json-unknown-properties) +- [Jackson Annotation Examples](https://www.baeldung.com/jackson-annotations) +- [Intro to the Jackson ObjectMapper](https://www.baeldung.com/jackson-object-mapper-tutorial) +- [Ignore Null Fields with Jackson](https://www.baeldung.com/jackson-ignore-null-fields) +- [Jackson – Change Name of Field](https://www.baeldung.com/jackson-name-of-property) diff --git a/jackson/README.md b/jackson/README.md index 01d9419a27..fb7f6c4127 100644 --- a/jackson/README.md +++ b/jackson/README.md @@ -6,29 +6,29 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Jackson – Unmarshall to Collection/Array](http://www.baeldung.com/jackson-collection-array) -- [Jackson – Custom Serializer](http://www.baeldung.com/jackson-custom-serialization) -- [Getting Started with Custom Deserialization in Jackson](http://www.baeldung.com/jackson-deserialization) -- [Jackson Exceptions – Problems and Solutions](http://www.baeldung.com/jackson-exception) -- [Jackson Date](http://www.baeldung.com/jackson-serialize-dates) -- [Jackson – Bidirectional Relationships](http://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion) -- [Jackson JSON Tutorial](http://www.baeldung.com/jackson) -- [Jackson – Working with Maps and nulls](http://www.baeldung.com/jackson-map-null-values-or-null-key) -- [Jackson – Decide What Fields Get Serialized/Deserialized](http://www.baeldung.com/jackson-field-serializable-deserializable-or-not) -- [Jackson vs Gson](http://www.baeldung.com/jackson-vs-gson) -- [XML Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-xml-serialization-and-deserialization) -- [More Jackson Annotations](http://www.baeldung.com/jackson-advanced-annotations) -- [Inheritance with Jackson](http://www.baeldung.com/jackson-inheritance) -- [Guide to @JsonFormat in Jackson](http://www.baeldung.com/jackson-jsonformat) -- [Using Optional with Jackson](http://www.baeldung.com/jackson-optional) -- [Map Serialization and Deserialization with Jackson](http://www.baeldung.com/jackson-map) -- [Jackson Streaming API](http://www.baeldung.com/jackson-streaming-api) -- [Jackson – JsonMappingException (No serializer found for class)](http://www.baeldung.com/jackson-jsonmappingexception) -- [How To Serialize Enums as JSON Objects with Jackson](http://www.baeldung.com/jackson-serialize-enums) -- [Jackson – Marshall String to JsonNode](http://www.baeldung.com/jackson-json-to-jsonnode) -- [Jackson – Unmarshall to Collection/Array](http://www.baeldung.com/jackson-collection-array) -- [Serialize Only Fields that meet a Custom Criteria with Jackson](http://www.baeldung.com/jackson-serialize-field-custom-criteria) -- [Mapping Nested Values with Jackson](http://www.baeldung.com/jackson-nested-values) +- [Jackson – Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array) +- [Jackson – Custom Serializer](https://www.baeldung.com/jackson-custom-serialization) +- [Getting Started with Custom Deserialization in Jackson](https://www.baeldung.com/jackson-deserialization) +- [Jackson Exceptions – Problems and Solutions](https://www.baeldung.com/jackson-exception) +- [Jackson Date](https://www.baeldung.com/jackson-serialize-dates) +- [Jackson – Bidirectional Relationships](https://www.baeldung.com/jackson-bidirectional-relationships-and-infinite-recursion) +- [Jackson JSON Tutorial](https://www.baeldung.com/jackson) +- [Jackson – Working with Maps and nulls](https://www.baeldung.com/jackson-map-null-values-or-null-key) +- [Jackson – Decide What Fields Get Serialized/Deserialized](https://www.baeldung.com/jackson-field-serializable-deserializable-or-not) +- [Jackson vs Gson](https://www.baeldung.com/jackson-vs-gson) +- [XML Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-xml-serialization-and-deserialization) +- [More Jackson Annotations](https://www.baeldung.com/jackson-advanced-annotations) +- [Inheritance with Jackson](https://www.baeldung.com/jackson-inheritance) +- [Guide to @JsonFormat in Jackson](https://www.baeldung.com/jackson-jsonformat) +- [Using Optional with Jackson](https://www.baeldung.com/jackson-optional) +- [Map Serialization and Deserialization with Jackson](https://www.baeldung.com/jackson-map) +- [Jackson Streaming API](https://www.baeldung.com/jackson-streaming-api) +- [Jackson – JsonMappingException (No serializer found for class)](https://www.baeldung.com/jackson-jsonmappingexception) +- [How To Serialize Enums as JSON Objects with Jackson](https://www.baeldung.com/jackson-serialize-enums) +- [Jackson – Marshall String to JsonNode](https://www.baeldung.com/jackson-json-to-jsonnode) +- [Jackson – Unmarshall to Collection/Array](https://www.baeldung.com/jackson-collection-array) +- [Serialize Only Fields that meet a Custom Criteria with Jackson](https://www.baeldung.com/jackson-serialize-field-custom-criteria) +- [Mapping Nested Values with Jackson](https://www.baeldung.com/jackson-nested-values) - [Convert XML to JSON Using Jackson](https://www.baeldung.com/jackson-convert-xml-json) - [Deserialize Immutable Objects with Jackson](https://www.baeldung.com/jackson-deserialize-immutable-objects) - [Mapping a Dynamic JSON Object with Jackson](https://www.baeldung.com/jackson-mapping-dynamic-object) diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md index 614f20f186..e80f29f519 100644 --- a/java-collections-conversions/README.md +++ b/java-collections-conversions/README.md @@ -3,12 +3,12 @@ ## Java Collections Cookbooks and Examples ### Relevant Articles: -- [Converting between an Array and a List in Java](http://www.baeldung.com/convert-array-to-list-and-list-to-array) -- [Converting between an Array and a Set in Java](http://www.baeldung.com/convert-array-to-set-and-set-to-array) -- [Converting between a List and a Set in Java](http://www.baeldung.com/convert-list-to-set-and-set-to-list) -- [Convert a Map to an Array, List or Set in Java](http://www.baeldung.com/convert-map-values-to-array-list-set) -- [Converting a List to String in Java](http://www.baeldung.com/java-list-to-string) -- [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map) +- [Converting between an Array and a List in Java](https://www.baeldung.com/convert-array-to-list-and-list-to-array) +- [Converting between an Array and a Set in Java](https://www.baeldung.com/convert-array-to-set-and-set-to-array) +- [Converting between a List and a Set in Java](https://www.baeldung.com/convert-list-to-set-and-set-to-list) +- [Convert a Map to an Array, List or Set in Java](https://www.baeldung.com/convert-map-values-to-array-list-set) +- [Converting a List to String in Java](https://www.baeldung.com/java-list-to-string) +- [How to Convert List to Map in Java](https://www.baeldung.com/java-list-to-map) - [Array to String Conversions](https://www.baeldung.com/java-array-to-string) - [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist) - [Java 8 Collectors toMap](https://www.baeldung.com/java-collectors-tomap) diff --git a/java-dates/README.md b/java-dates/README.md index 7da309924d..3a215f9094 100644 --- a/java-dates/README.md +++ b/java-dates/README.md @@ -3,25 +3,25 @@ ## Java Dates Cookbooks and Examples ### Relevant Articles: -- [TemporalAdjuster in Java](http://www.baeldung.com/java-temporal-adjuster) -- [Handling Daylight Savings Time in Java](http://www.baeldung.com/java-daylight-savings) -- [Period and Duration in Java](http://www.baeldung.com/java-period-duration) -- [Difference Between Two Dates in Java](http://www.baeldung.com/java-date-difference) -- [RegEx for matching Date Pattern in Java](http://www.baeldung.com/java-date-regular-expressions) -- [Migrating to the New Java 8 Date Time API](http://www.baeldung.com/migrating-to-java-8-date-time-api) -- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro) -- [Get the Current Date, Time and Timestamp in Java 8](http://www.baeldung.com/current-date-time-and-timestamp-in-java-8) -- [Get Date Without Time in Java](http://www.baeldung.com/java-date-without-time) -- [How to Get All Dates Between Two Dates?](http://www.baeldung.com/java-between-dates) -- [Convert Date to LocalDate or LocalDateTime and Back](http://www.baeldung.com/java-date-to-localdate-and-localdatetime) -- [Display All Time Zones With GMT And UTC in Java](http://www.baeldung.com/java-time-zones) -- [Extracting Year, Month and Day from Date in Java](http://www.baeldung.com/java-year-month-day) -- [Guide to java.util.GregorianCalendar](http://www.baeldung.com/java-gregorian-calendar) -- [Measure Elapsed Time in Java](http://www.baeldung.com/java-measure-elapsed-time) -- [How to Get the Start and the End of a Day using Java](http://www.baeldung.com/java-day-start-end) -- [Calculate Age in Java](http://www.baeldung.com/java-get-age) -- [Increment Date in Java](http://www.baeldung.com/java-increment-date) -- [Add Hours To a Date In Java](http://www.baeldung.com/java-add-hours-date) +- [TemporalAdjuster in Java](https://www.baeldung.com/java-temporal-adjuster) +- [Handling Daylight Savings Time in Java](https://www.baeldung.com/java-daylight-savings) +- [Period and Duration in Java](https://www.baeldung.com/java-period-duration) +- [Difference Between Two Dates in Java](https://www.baeldung.com/java-date-difference) +- [RegEx for matching Date Pattern in Java](https://www.baeldung.com/java-date-regular-expressions) +- [Migrating to the New Java 8 Date Time API](https://www.baeldung.com/migrating-to-java-8-date-time-api) +- [Introduction to the Java 8 Date/Time API](https://www.baeldung.com/java-8-date-time-intro) +- [Get the Current Date, Time and Timestamp in Java 8](https://www.baeldung.com/current-date-time-and-timestamp-in-java-8) +- [Get Date Without Time in Java](https://www.baeldung.com/java-date-without-time) +- [How to Get All Dates Between Two Dates?](https://www.baeldung.com/java-between-dates) +- [Convert Date to LocalDate or LocalDateTime and Back](https://www.baeldung.com/java-date-to-localdate-and-localdatetime) +- [Display All Time Zones With GMT And UTC in Java](https://www.baeldung.com/java-time-zones) +- [Extracting Year, Month and Day from Date in Java](https://www.baeldung.com/java-year-month-day) +- [Guide to java.util.GregorianCalendar](https://www.baeldung.com/java-gregorian-calendar) +- [Measure Elapsed Time in Java](https://www.baeldung.com/java-measure-elapsed-time) +- [How to Get the Start and the End of a Day using Java](https://www.baeldung.com/java-day-start-end) +- [Calculate Age in Java](https://www.baeldung.com/java-get-age) +- [Increment Date in Java](https://www.baeldung.com/java-increment-date) +- [Add Hours To a Date In Java](https://www.baeldung.com/java-add-hours-date) - [Guide to DateTimeFormatter](https://www.baeldung.com/java-datetimeformatter) - [Format ZonedDateTime to String](https://www.baeldung.com/java-format-zoned-datetime-string) - [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp) @@ -29,4 +29,4 @@ - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) - [Differences Between ZonedDateTime and OffsetDateTime](https://www.baeldung.com/java-zoneddatetime-offsetdatetime) -- [Introduction to Joda-Time](http://www.baeldung.com/joda-time) +- [Introduction to Joda-Time](https://www.baeldung.com/joda-time) diff --git a/java-ee-8-security-api/README.md b/java-ee-8-security-api/README.md index 1735419236..5ecce2b4cc 100644 --- a/java-ee-8-security-api/README.md +++ b/java-ee-8-security-api/README.md @@ -1,3 +1,3 @@ ### Relevant articles - - [Java EE 8 Security API](http://www.baeldung.com/java-ee-8-security) + - [Java EE 8 Security API](https://www.baeldung.com/java-ee-8-security) diff --git a/java-lite/README.md b/java-lite/README.md index a4e2edd49f..5221b832f9 100644 --- a/java-lite/README.md +++ b/java-lite/README.md @@ -1,4 +1,4 @@ ### Relevant Articles: -- [A Guide to JavaLite – Building a RESTful CRUD application](http://www.baeldung.com/javalite-rest) -- [Introduction to ActiveWeb](http://www.baeldung.com/activeweb) +- [A Guide to JavaLite – Building a RESTful CRUD application](https://www.baeldung.com/javalite-rest) +- [Introduction to ActiveWeb](https://www.baeldung.com/activeweb) diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md index 9872497950..5c6f46b05b 100644 --- a/java-numbers-2/README.md +++ b/java-numbers-2/README.md @@ -2,10 +2,10 @@ - [Lossy Conversion in Java](https://www.baeldung.com/java-lossy-conversion) - [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math) - [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area) -- [NaN in Java](http://www.baeldung.com/java-not-a-number) -- [Generating Prime Numbers in Java](http://www.baeldung.com/java-generate-prime-numbers) -- [Using Math.pow in Java](http://www.baeldung.com/java-math-pow) -- [Check If a Number Is Prime in Java](http://www.baeldung.com/java-prime-numbers) +- [NaN in Java](https://www.baeldung.com/java-not-a-number) +- [Generating Prime Numbers in Java](https://www.baeldung.com/java-generate-prime-numbers) +- [Using Math.pow in Java](https://www.baeldung.com/java-math-pow) +- [Check If a Number Is Prime in Java](https://www.baeldung.com/java-prime-numbers) - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) - [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple) - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) diff --git a/java-rmi/README.md b/java-rmi/README.md index 4d12060395..201c4c8e66 100644 --- a/java-rmi/README.md +++ b/java-rmi/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [Getting Started with Java RMI](http://www.baeldung.com/java-rmi) +- [Getting Started with Java RMI](https://www.baeldung.com/java-rmi) diff --git a/java-spi/README.md b/java-spi/README.md index d2658c42fe..25e2d10da4 100644 --- a/java-spi/README.md +++ b/java-spi/README.md @@ -1,4 +1,4 @@ ### Relevant Articles: -- [Java Service Provider Interface](http://www.baeldung.com/java-spi) +- [Java Service Provider Interface](https://www.baeldung.com/java-spi) diff --git a/java-streams/README.md b/java-streams/README.md index 0c9588c47e..0d26c182ba 100644 --- a/java-streams/README.md +++ b/java-streams/README.md @@ -3,15 +3,15 @@ ## Java Streams Cookbooks and Examples ### Relevant Articles: -- [The Java 8 Stream API Tutorial](http://www.baeldung.com/java-8-streams) -- [Introduction to Java 8 Streams](http://www.baeldung.com/java-8-streams-introduction) -- [Java 8 and Infinite Streams](http://www.baeldung.com/java-inifinite-streams) -- [Java 8 Stream findFirst() vs. findAny()](http://www.baeldung.com/java-stream-findfirst-vs-findany) -- [How to Get the Last Element of a Stream in Java?](http://www.baeldung.com/java-stream-last-element) -- [“Stream has already been operated upon or closed” Exception in Java](http://www.baeldung.com/java-stream-operated-upon-or-closed-exception) -- [Iterable to Stream in Java](http://www.baeldung.com/java-iterable-to-stream) -- [How to Iterate Over a Stream With Indices](http://www.baeldung.com/java-stream-indices) -- [Primitive Type Streams in Java 8](http://www.baeldung.com/java-8-primitive-streams) +- [The Java 8 Stream API Tutorial](https://www.baeldung.com/java-8-streams) +- [Introduction to Java 8 Streams](https://www.baeldung.com/java-8-streams-introduction) +- [Java 8 and Infinite Streams](https://www.baeldung.com/java-inifinite-streams) +- [Java 8 Stream findFirst() vs. findAny()](https://www.baeldung.com/java-stream-findfirst-vs-findany) +- [How to Get the Last Element of a Stream in Java?](https://www.baeldung.com/java-stream-last-element) +- [“Stream has already been operated upon or closed” Exception in Java](https://www.baeldung.com/java-stream-operated-upon-or-closed-exception) +- [Iterable to Stream in Java](https://www.baeldung.com/java-iterable-to-stream) +- [How to Iterate Over a Stream With Indices](https://www.baeldung.com/java-stream-indices) +- [Primitive Type Streams in Java 8](https://www.baeldung.com/java-8-primitive-streams) - [Stream Ordering in Java](https://www.baeldung.com/java-stream-ordering) - [Introduction to Protonpack](https://www.baeldung.com/java-protonpack) - [Java Stream Filter with Lambda Expression](https://www.baeldung.com/java-stream-filter-lambda) diff --git a/java-strings-2/README.md b/java-strings-2/README.md index 1afecf0d74..166a8a2b1f 100644 --- a/java-strings-2/README.md +++ b/java-strings-2/README.md @@ -3,8 +3,8 @@ - [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting) - [Check If a String Contains a Substring](https://www.baeldung.com/java-string-contains-substring) - [Removing Stopwords from a String in Java](https://www.baeldung.com/java-string-remove-stopwords) -- [Java – Generate Random String](http://www.baeldung.com/java-random-string) -- [Image to Base64 String Conversion](http://www.baeldung.com/java-base64-image-string) +- [Java – Generate Random String](https://www.baeldung.com/java-random-string) +- [Image to Base64 String Conversion](https://www.baeldung.com/java-base64-image-string) - [Java Base64 Encoding and Decoding](https://www.baeldung.com/java-base64-encode-and-decode) - [Generate a Secure Random Password in Java](https://www.baeldung.com/java-generate-secure-password) - [Removing Repeated Characters from a String](https://www.baeldung.com/java-remove-repeated-char) @@ -12,7 +12,7 @@ - [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string) - [Remove Emojis from a Java String](https://www.baeldung.com/java-string-remove-emojis) - [Convert a Comma Separated String to a List in Java](https://www.baeldung.com/java-string-with-separator-to-list) -- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) +- [Guide to java.util.Formatter](https://www.baeldung.com/java-string-formatter) - [Remove Leading and Trailing Characters from a String](https://www.baeldung.com/java-remove-trailing-characters) - [Concatenating Strings In Java](https://www.baeldung.com/java-strings-concatenation) - [Java String Interview Questions and Answers](https://www.baeldung.com/java-string-interview-questions) diff --git a/java-strings-ops/README.md b/java-strings-ops/README.md index d909f171a7..d9c28dab0d 100644 --- a/java-strings-ops/README.md +++ b/java-strings-ops/README.md @@ -3,20 +3,20 @@ ## Java Strings Cookbooks and Examples ### Relevant Articles: -- [Convert char to String in Java](http://www.baeldung.com/java-convert-char-to-string) -- [Convert String to int or Integer in Java](http://www.baeldung.com/java-convert-string-to-int-or-integer) +- [Convert char to String in Java](https://www.baeldung.com/java-convert-char-to-string) +- [Convert String to int or Integer in Java](https://www.baeldung.com/java-convert-string-to-int-or-integer) - [Java String Conversions](https://www.baeldung.com/java-string-conversions) -- [Check if a String is a Palindrome](http://www.baeldung.com/java-palindrome) -- [Comparing Strings in Java](http://www.baeldung.com/java-compare-strings) -- [Check If a String Is Numeric in Java](http://www.baeldung.com/java-check-string-number) +- [Check if a String is a Palindrome](https://www.baeldung.com/java-palindrome) +- [Comparing Strings in Java](https://www.baeldung.com/java-compare-strings) +- [Check If a String Is Numeric in Java](https://www.baeldung.com/java-check-string-number) - [Get Substring from String in Java](https://www.baeldung.com/java-substring) -- [How to Remove the Last Character of a String?](http://www.baeldung.com/java-remove-last-character-of-string) +- [How to Remove the Last Character of a String?](https://www.baeldung.com/java-remove-last-character-of-string) - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) -- [Count Occurrences of a Char in a String](http://www.baeldung.com/java-count-chars) -- [Guide to Java String Pool](http://www.baeldung.com/java-string-pool) -- [Split a String in Java](http://www.baeldung.com/java-split-string) +- [Count Occurrences of a Char in a String](https://www.baeldung.com/java-count-chars) +- [Guide to Java String Pool](https://www.baeldung.com/java-string-pool) +- [Split a String in Java](https://www.baeldung.com/java-split-string) - [Common String Operations in Java](https://www.baeldung.com/java-string-operations) - [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array) - [Java toString() Method](https://www.baeldung.com/java-tostring) -- [CharSequence vs. String in Java](http://www.baeldung.com/java-char-sequence-string) -- [StringBuilder and StringBuffer in Java](http://www.baeldung.com/java-string-builder-string-buffer) \ No newline at end of file +- [CharSequence vs. String in Java](https://www.baeldung.com/java-char-sequence-string) +- [StringBuilder and StringBuffer in Java](https://www.baeldung.com/java-string-builder-string-buffer) diff --git a/java-strings/README.md b/java-strings/README.md index ef536b4099..5b2a327877 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -3,14 +3,14 @@ ## Java Strings Cookbooks and Examples ### Relevant Articles: -- [String Operations with Java Streams](http://www.baeldung.com/java-stream-operations-on-strings) -- [Converting String to Stream of chars](http://www.baeldung.com/java-string-to-stream) -- [Java 8 StringJoiner](http://www.baeldung.com/java-string-joiner) -- [Converting Strings to Enums in Java](http://www.baeldung.com/java-string-to-enum) -- [Quick Guide to the Java StringTokenizer](http://www.baeldung.com/java-stringtokenizer) -- [Use char[] Array Over a String for Manipulating Passwords in Java?](http://www.baeldung.com/java-storing-passwords) -- [Convert a String to Title Case](http://www.baeldung.com/java-string-title-case) -- [Compact Strings in Java 9](http://www.baeldung.com/java-9-compact-string) +- [String Operations with Java Streams](https://www.baeldung.com/java-stream-operations-on-strings) +- [Converting String to Stream of chars](https://www.baeldung.com/java-string-to-stream) +- [Java 8 StringJoiner](https://www.baeldung.com/java-string-joiner) +- [Converting Strings to Enums in Java](https://www.baeldung.com/java-string-to-enum) +- [Quick Guide to the Java StringTokenizer](https://www.baeldung.com/java-stringtokenizer) +- [Use char[] Array Over a String for Manipulating Passwords in Java?](https://www.baeldung.com/java-storing-passwords) +- [Convert a String to Title Case](https://www.baeldung.com/java-string-title-case) +- [Compact Strings in Java 9](https://www.baeldung.com/java-9-compact-string) - [Java Check a String for Lowercase/Uppercase Letter, Special Character and Digit](https://www.baeldung.com/java-lowercase-uppercase-special-character-digit-regex) - [Convert java.util.Date to String](https://www.baeldung.com/java-util-date-to-string) - [Converting a Stack Trace to a String in Java](https://www.baeldung.com/java-stacktrace-to-string) @@ -20,4 +20,4 @@ - [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences) - [Adding a Newline Character to a String in Java](https://www.baeldung.com/java-string-newline) - [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) -- [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index) \ No newline at end of file +- [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index) diff --git a/java-vavr-stream/README.md b/java-vavr-stream/README.md index 64299cde11..901978a1d8 100644 --- a/java-vavr-stream/README.md +++ b/java-vavr-stream/README.md @@ -1,5 +1,5 @@ ### Relevant Articles: -- [Java Streams vs Vavr Streams](http://www.baeldung.com/vavr-java-streams) +- [Java Streams vs Vavr Streams](https://www.baeldung.com/vavr-java-streams) diff --git a/java-websocket/README.md b/java-websocket/README.md index f9f0784043..87cbb3fa5c 100644 --- a/java-websocket/README.md +++ b/java-websocket/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [A Guide to the Java API for WebSocket](http://www.baeldung.com/java-websockets) +- [A Guide to the Java API for WebSocket](https://www.baeldung.com/java-websockets) diff --git a/javafx/README.md b/javafx/README.md index 66c81f17ad..7214321141 100644 --- a/javafx/README.md +++ b/javafx/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: --[Introduction to JavaFX](http://www.baeldung.com/javafx) +-[Introduction to JavaFX](https://www.baeldung.com/javafx) diff --git a/javax-servlets/README.md b/javax-servlets/README.md index 7db11c4d3a..8254a78c4c 100644 --- a/javax-servlets/README.md +++ b/javax-servlets/README.md @@ -1,10 +1,10 @@ ### Relevant Articles: -- [Introduction to Java Servlets](http://www.baeldung.com/intro-to-servlets) -- [An MVC Example with Servlets and JSP](http://www.baeldung.com/mvc-servlet-jsp) -- [Handling Cookies and a Session in a Java Servlet](http://www.baeldung.com/java-servlet-cookies-session) -- [Uploading Files with Servlets and JSP](http://www.baeldung.com/upload-file-servlet) -- [Example of Downloading File in a Servlet](http://www.baeldung.com/servlet-download-file) -- [Returning a JSON Response from a Servlet](http://www.baeldung.com/servlet-json-response) -- [Java EE Servlet Exception Handling](http://www.baeldung.com/servlet-exceptions) -- [Context and Servlet Initialization Parameters](http://www.baeldung.com/context-servlet-initialization-param) +- [Introduction to Java Servlets](https://www.baeldung.com/intro-to-servlets) +- [An MVC Example with Servlets and JSP](https://www.baeldung.com/mvc-servlet-jsp) +- [Handling Cookies and a Session in a Java Servlet](https://www.baeldung.com/java-servlet-cookies-session) +- [Uploading Files with Servlets and JSP](https://www.baeldung.com/upload-file-servlet) +- [Example of Downloading File in a Servlet](https://www.baeldung.com/servlet-download-file) +- [Returning a JSON Response from a Servlet](https://www.baeldung.com/servlet-json-response) +- [Java EE Servlet Exception Handling](https://www.baeldung.com/servlet-exceptions) +- [Context and Servlet Initialization Parameters](https://www.baeldung.com/context-servlet-initialization-param) - [The Difference between getRequestURI and getPathInfo in HttpServletRequest](https://www.baeldung.com/http-servlet-request-requesturi-pathinfo) diff --git a/javaxval/README.md b/javaxval/README.md index ed9a5024c3..b141bc7859 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -3,8 +3,8 @@ ## Java Bean Validation Examples ### Relevant Articles: -- [Java Bean Validation Basics](http://www.baeldung.com/javax-validation) -- [Validating Container Elements with Bean Validation 2.0](http://www.baeldung.com/bean-validation-container-elements) -- [Method Constraints with Bean Validation 2.0](http://www.baeldung.com/javax-validation-method-constraints) +- [Java Bean Validation Basics](https://www.baeldung.com/javax-validation) +- [Validating Container Elements with Bean Validation 2.0](https://www.baeldung.com/bean-validation-container-elements) +- [Method Constraints with Bean Validation 2.0](https://www.baeldung.com/javax-validation-method-constraints) - [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank) - [Javax BigDecimal Validation](https://www.baeldung.com/javax-bigdecimal-validation) diff --git a/jaxb/README.md b/jaxb/README.md index 4b603fca00..bdaef90279 100644 --- a/jaxb/README.md +++ b/jaxb/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Guide to JAXB](http://www.baeldung.com/jaxb) +- [Guide to JAXB](https://www.baeldung.com/jaxb) diff --git a/jee-7-security/README.md b/jee-7-security/README.md index 314de6d957..70d451382c 100644 --- a/jee-7-security/README.md +++ b/jee-7-security/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Securing Java EE with Spring Security](http://www.baeldung.com/java-ee-spring-security) +- [Securing Java EE with Spring Security](https://www.baeldung.com/java-ee-spring-security) diff --git a/jee-7/README.md b/jee-7/README.md index c57863651d..2ae7335ce0 100644 --- a/jee-7/README.md +++ b/jee-7/README.md @@ -1,9 +1,9 @@ ### Relevant Articles: -- [Scheduling in Java EE](http://www.baeldung.com/scheduling-in-java-enterprise-edition) -- [JSON Processing in Java EE 7](http://www.baeldung.com/jee7-json) -- [Converters, Listeners and Validators in Java EE 7](http://www.baeldung.com/java-ee7-converter-listener-validator) -- [Introduction to JAX-WS](http://www.baeldung.com/jax-ws) -- [A Guide to Java EE Web-Related Annotations](http://www.baeldung.com/javaee-web-annotations) -- [Introduction to Testing with Arquillian](http://www.baeldung.com/arquillian) +- [Scheduling in Java EE](https://www.baeldung.com/scheduling-in-java-enterprise-edition) +- [JSON Processing in Java EE 7](https://www.baeldung.com/jee7-json) +- [Converters, Listeners and Validators in Java EE 7](https://www.baeldung.com/java-ee7-converter-listener-validator) +- [Introduction to JAX-WS](https://www.baeldung.com/jax-ws) +- [A Guide to Java EE Web-Related Annotations](https://www.baeldung.com/javaee-web-annotations) +- [Introduction to Testing with Arquillian](https://www.baeldung.com/arquillian) - [Java EE 7 Batch Processing](https://www.baeldung.com/java-ee-7-batch-processing) - [The Difference Between CDI and EJB Singleton](https://www.baeldung.com/jee-cdi-vs-ejb-singleton) diff --git a/jersey/README.md b/jersey/README.md index 126dc542ba..1db89ec723 100644 --- a/jersey/README.md +++ b/jersey/README.md @@ -1,4 +1,4 @@ -- [Jersey Filters and Interceptors](http://www.baeldung.com/jersey-filters-interceptors) +- [Jersey Filters and Interceptors](https://www.baeldung.com/jersey-filters-interceptors) - [Jersey MVC Support](https://www.baeldung.com/jersey-mvc) - [Bean Validation in Jersey](https://www.baeldung.com/jersey-bean-validation) - [Set a Response Body in JAX-RS](https://www.baeldung.com/jax-rs-response) diff --git a/jgit/README.md b/jgit/README.md index 5c65f1101b..d89104293d 100644 --- a/jgit/README.md +++ b/jgit/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [A Guide to JGit](http://www.baeldung.com/jgit) +- [A Guide to JGit](https://www.baeldung.com/jgit) diff --git a/jgroups/README.md b/jgroups/README.md index 0921fa98a1..128007bb7e 100644 --- a/jgroups/README.md +++ b/jgroups/README.md @@ -1,7 +1,7 @@ ## Reliable Messaging with JGroups Tutorial Project ### Relevant Article: -- [Reliable Messaging with JGroups](http://www.baeldung.com/jgroups) +- [Reliable Messaging with JGroups](https://www.baeldung.com/jgroups) ### Overview This Maven project contains the Java code for the article linked above. diff --git a/jjwt/README.md b/jjwt/README.md index ed18363dfc..04a85f3ded 100644 --- a/jjwt/README.md +++ b/jjwt/README.md @@ -45,4 +45,4 @@ Available commands (assumes httpie - https://github.com/jkbrzt/httpie): ## Relevant articles: -- [Supercharge Java Authentication with JSON Web Tokens (JWTs)](http://www.baeldung.com/java-json-web-tokens-jjwt) +- [Supercharge Java Authentication with JSON Web Tokens (JWTs)](https://www.baeldung.com/java-json-web-tokens-jjwt) diff --git a/jmeter/README.md b/jmeter/README.md index e3f9d1a4db..58522067b2 100644 --- a/jmeter/README.md +++ b/jmeter/README.md @@ -42,5 +42,5 @@ Enjoy it :) ### Relevant Articles: -- [Intro to Performance Testing using JMeter](http://www.baeldung.com/jmeter) -- [Configure Jenkins to Run and Show JMeter Tests](http://www.baeldung.com/jenkins-and-jmeter) +- [Intro to Performance Testing using JMeter](https://www.baeldung.com/jmeter) +- [Configure Jenkins to Run and Show JMeter Tests](https://www.baeldung.com/jenkins-and-jmeter) diff --git a/jmh/README.md b/jmh/README.md index 9c5a70e3c2..6876615328 100644 --- a/jmh/README.md +++ b/jmh/README.md @@ -1,4 +1,4 @@ ## Relevant articles: -- [Microbenchmarking with Java](http://www.baeldung.com/java-microbenchmark-harness) +- [Microbenchmarking with Java](https://www.baeldung.com/java-microbenchmark-harness) diff --git a/jni/README.md b/jni/README.md index 663cafb0c0..daaeb7819f 100644 --- a/jni/README.md +++ b/jni/README.md @@ -1,4 +1,4 @@ ### Relevant Articles: -- [Guide to JNI (Java Native Interface)](http://www.baeldung.com/jni) +- [Guide to JNI (Java Native Interface)](https://www.baeldung.com/jni) diff --git a/jooby/README.md b/jooby/README.md index aa867b2c56..bf8c580633 100644 --- a/jooby/README.md +++ b/jooby/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [Introduction to Jooby](http://www.baeldung.com/jooby) +- [Introduction to Jooby](https://www.baeldung.com/jooby) diff --git a/jsf/README.md b/jsf/README.md index d96c1eb8e3..65735cc406 100644 --- a/jsf/README.md +++ b/jsf/README.md @@ -1,5 +1,5 @@ ### Relevant Articles: -- [Guide to JSF Expression Language 3.0](http://www.baeldung.com/jsf-expression-language-el-3) -- [Introduction to JSF EL 2](http://www.baeldung.com/intro-to-jsf-expression-language) -- [JavaServer Faces (JSF) with Spring](http://www.baeldung.com/spring-jsf) -- [Introduction to Primefaces](http://www.baeldung.com/jsf-primefaces) +- [Guide to JSF Expression Language 3.0](https://www.baeldung.com/jsf-expression-language-el-3) +- [Introduction to JSF EL 2](https://www.baeldung.com/intro-to-jsf-expression-language) +- [JavaServer Faces (JSF) with Spring](https://www.baeldung.com/spring-jsf) +- [Introduction to Primefaces](https://www.baeldung.com/jsf-primefaces) diff --git a/json-path/README.md b/json-path/README.md index 7a84ea7bde..41cc72a842 100644 --- a/json-path/README.md +++ b/json-path/README.md @@ -1,4 +1,4 @@ ## Relevant articles: -- [Introduction to JsonPath](http://www.baeldung.com/guide-to-jayway-jsonpath) -- [Count with JsonPath](http://www.baeldung.com/jsonpath-count) +- [Introduction to JsonPath](https://www.baeldung.com/guide-to-jayway-jsonpath) +- [Count with JsonPath](https://www.baeldung.com/jsonpath-count) diff --git a/json/README.md b/json/README.md index 7ef4cc9b01..96acedd0b1 100644 --- a/json/README.md +++ b/json/README.md @@ -3,13 +3,13 @@ ## Fast-Json ### Relevant Articles: -- [Introduction to JSON Schema in Java](http://www.baeldung.com/introduction-to-json-schema-in-java) -- [A Guide to FastJson](http://www.baeldung.com/fastjson) -- [Introduction to JSONForms](http://www.baeldung.com/introduction-to-jsonforms) -- [Introduction to JsonPath](http://www.baeldung.com/guide-to-jayway-jsonpath) -- [Introduction to JSON-Java (org.json)](http://www.baeldung.com/java-org-json) +- [Introduction to JSON Schema in Java](https://www.baeldung.com/introduction-to-json-schema-in-java) +- [A Guide to FastJson](https://www.baeldung.com/fastjson) +- [Introduction to JSONForms](https://www.baeldung.com/introduction-to-jsonforms) +- [Introduction to JsonPath](https://www.baeldung.com/guide-to-jayway-jsonpath) +- [Introduction to JSON-Java (org.json)](https://www.baeldung.com/java-org-json) - [Overview of JSON Pointer](https://www.baeldung.com/json-pointer) -- [Introduction to the JSON Binding API (JSR 367) in Java](http://www.baeldung.com/java-json-binding-api) +- [Introduction to the JSON Binding API (JSR 367) in Java](https://www.baeldung.com/java-json-binding-api) - [Get a Value by Key in a JSONArray](https://www.baeldung.com/java-jsonarray-get-value-by-key) - [Iterating Over an Instance of org.json.JSONObject](https://www.baeldung.com/jsonobject-iteration) - [Escape JSON String in Java](https://www.baeldung.com/java-json-escaping) diff --git a/jsoup/README.md b/jsoup/README.md index 8728cc7c4e..7624ce77bf 100644 --- a/jsoup/README.md +++ b/jsoup/README.md @@ -3,7 +3,7 @@ ## jsoup Example Project ### Relevant Articles: -- [Parsing HTML in Java with Jsoup](http://www.baeldung.com/java-with-jsoup) +- [Parsing HTML in Java with Jsoup](https://www.baeldung.com/java-with-jsoup) ### Build the Project diff --git a/jws/README.md b/jws/README.md index 428d8b650d..b939941d22 100644 --- a/jws/README.md +++ b/jws/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [A Guide to the Java Web Start](http://www.baeldung.com/java-web-start) +- [A Guide to the Java Web Start](https://www.baeldung.com/java-web-start) diff --git a/kotlin-js/README.md b/kotlin-js/README.md index 445ad6da9a..84d0c70427 100644 --- a/kotlin-js/README.md +++ b/kotlin-js/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Kotlin and Javascript](http://www.baeldung.com/kotlin-javascript) +- [Kotlin and Javascript](https://www.baeldung.com/kotlin-javascript) diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md index 94359193b6..6ad90c1cd2 100644 --- a/kotlin-libraries/README.md +++ b/kotlin-libraries/README.md @@ -1,14 +1,14 @@ ## Relevant articles: -- [Kotlin with Mockito](http://www.baeldung.com/kotlin-mockito) -- [HTTP Requests with Kotlin and khttp](http://www.baeldung.com/kotlin-khttp) -- [Kotlin Dependency Injection with Kodein](http://www.baeldung.com/kotlin-kodein-dependency-injection) -- [Writing Specifications with Kotlin and Spek](http://www.baeldung.com/kotlin-spek) -- [Processing JSON with Kotlin and Klaxson](http://www.baeldung.com/kotlin-json-klaxson) +- [Kotlin with Mockito](https://www.baeldung.com/kotlin-mockito) +- [HTTP Requests with Kotlin and khttp](https://www.baeldung.com/kotlin-khttp) +- [Kotlin Dependency Injection with Kodein](https://www.baeldung.com/kotlin-kodein-dependency-injection) +- [Writing Specifications with Kotlin and Spek](https://www.baeldung.com/kotlin-spek) +- [Processing JSON with Kotlin and Klaxson](https://www.baeldung.com/kotlin-json-klaxson) - [Guide to the Kotlin Exposed Framework](https://www.baeldung.com/kotlin-exposed-persistence) - [Working with Dates in Kotlin](https://www.baeldung.com/kotlin-dates) - [Introduction to Arrow in Kotlin](https://www.baeldung.com/kotlin-arrow) - [Kotlin with Ktor](https://www.baeldung.com/kotlin-ktor) - [REST API With Kotlin and Kovert](https://www.baeldung.com/kotlin-kovert) - [MockK: A Mocking Library for Kotlin](https://www.baeldung.com/kotlin-mockk) -- [Kotlin Immutable Collections](https://www.baeldung.com/kotlin-immutable-collections) \ No newline at end of file +- [Kotlin Immutable Collections](https://www.baeldung.com/kotlin-immutable-collections) diff --git a/lagom/README.md b/lagom/README.md index 909fe0dff4..a8070c047c 100644 --- a/lagom/README.md +++ b/lagom/README.md @@ -1,6 +1,6 @@ ### Relevant articles -- [Guide to Reactive Microservices Using Lagom Framework](http://www.baeldung.com/lagom-reactive-microservices) +- [Guide to Reactive Microservices Using Lagom Framework](https://www.baeldung.com/lagom-reactive-microservices) diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md index ae424cb6c5..7d1f5b8333 100644 --- a/libraries-apache-commons/README.md +++ b/libraries-apache-commons/README.md @@ -8,4 +8,4 @@ - [Apache Commons Chain](https://www.baeldung.com/apache-commons-chain) - [Apache Commons BeanUtils](https://www.baeldung.com/apache-commons-beanutils) - [Histograms with Apache Commons Frequency](https://www.baeldung.com/apache-commons-frequency) -- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) \ No newline at end of file +- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md index 8101138c0e..ae113e7f70 100644 --- a/libraries-data-2/README.md +++ b/libraries-data-2/README.md @@ -1,11 +1,11 @@ ### Relevant articles -- [Introduction to Apache Flink with Java](http://www.baeldung.com/apache-flink) -- [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog) -- [Introduction to Conflict-Free Replicated Data Types](http://www.baeldung.com/java-conflict-free-replicated-data-types) -- [Introduction to javax.measure](http://www.baeldung.com/javax-measure) -- [Introduction To Docx4J](http://www.baeldung.com/docx4j) -- [Interact with Google Sheets from Java](http://www.baeldung.com/google-sheets-java-client) -- [Introduction To OpenCSV](http://www.baeldung.com/opencsv) -- [Introduction to Smooks](http://www.baeldung.com/smooks) -- [A Guide to Infinispan in Java](http://www.baeldung.com/infinispan) +- [Introduction to Apache Flink with Java](https://www.baeldung.com/apache-flink) +- [Guide to the HyperLogLog Algorithm](https://www.baeldung.com/java-hyperloglog) +- [Introduction to Conflict-Free Replicated Data Types](https://www.baeldung.com/java-conflict-free-replicated-data-types) +- [Introduction to javax.measure](https://www.baeldung.com/javax-measure) +- [Introduction To Docx4J](https://www.baeldung.com/docx4j) +- [Interact with Google Sheets from Java](https://www.baeldung.com/google-sheets-java-client) +- [Introduction To OpenCSV](https://www.baeldung.com/opencsv) +- [Introduction to Smooks](https://www.baeldung.com/smooks) +- [A Guide to Infinispan in Java](https://www.baeldung.com/infinispan) diff --git a/libraries-data-3/README.md b/libraries-data-3/README.md index 7f939e7909..6be6eae4a8 100644 --- a/libraries-data-3/README.md +++ b/libraries-data-3/README.md @@ -1,5 +1,5 @@ ### Relevant articles -- [Parsing YAML with SnakeYAML](http://www.baeldung.com/java-snake-yaml) +- [Parsing YAML with SnakeYAML](https://www.baeldung.com/java-snake-yaml) - [Guide to JMapper](https://www.baeldung.com/jmapper) - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) - [Intro to Derive4J](https://www.baeldung.com/derive4j) diff --git a/libraries-data/README.md b/libraries-data/README.md index c7eb028b4c..e1d3c40222 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -1,14 +1,14 @@ ### Relevant articles -- [Introduction to Reladomo](http://www.baeldung.com/reladomo) -- [Introduction to ORMLite](http://www.baeldung.com/ormlite) -- [Introduction To Kryo](http://www.baeldung.com/kryo) -- [Introduction to KafkaStreams in Java](http://www.baeldung.com/java-kafka-streams) -- [Guide to Java Data Objects](http://www.baeldung.com/jdo) -- [Intro to JDO Queries 2/2](http://www.baeldung.com/jdo-queries) -- [Introduction to HikariCP](http://www.baeldung.com/hikaricp) -- [Introduction to JCache](http://www.baeldung.com/jcache) -- [A Guide to Apache Ignite](http://www.baeldung.com/apache-ignite) -- [Apache Ignite with Spring Data](http://www.baeldung.com/apache-ignite-spring-data) +- [Introduction to Reladomo](https://www.baeldung.com/reladomo) +- [Introduction to ORMLite](https://www.baeldung.com/ormlite) +- [Introduction To Kryo](https://www.baeldung.com/kryo) +- [Introduction to KafkaStreams in Java](https://www.baeldung.com/java-kafka-streams) +- [Guide to Java Data Objects](https://www.baeldung.com/jdo) +- [Intro to JDO Queries 2/2](https://www.baeldung.com/jdo-queries) +- [Introduction to HikariCP](https://www.baeldung.com/hikaricp) +- [Introduction to JCache](https://www.baeldung.com/jcache) +- [A Guide to Apache Ignite](https://www.baeldung.com/apache-ignite) +- [Apache Ignite with Spring Data](https://www.baeldung.com/apache-ignite-spring-data) - [A Guide to Apache Crunch](https://www.baeldung.com/apache-crunch) - [Intro to Apache Storm](https://www.baeldung.com/apache-storm) - [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm) diff --git a/libraries-http/README.md b/libraries-http/README.md index d5eaed0736..436268e707 100644 --- a/libraries-http/README.md +++ b/libraries-http/README.md @@ -1,11 +1,11 @@ ### Relevant Articles: -- [A Guide to OkHttp](http://www.baeldung.com/guide-to-okhttp) -- [A Guide to Google-Http-Client](http://www.baeldung.com/google-http-client) -- [Asynchronous HTTP with async-http-client in Java](http://www.baeldung.com/async-http-client) -- [WebSockets with AsyncHttpClient](http://www.baeldung.com/async-http-client-websockets) -- [Integrating Retrofit with RxJava](http://www.baeldung.com/retrofit-rxjava) -- [Introduction to Retrofit](http://www.baeldung.com/retrofit) -- [A Guide to Unirest](http://www.baeldung.com/unirest) -- [Creating REST Microservices with Javalin](http://www.baeldung.com/javalin-rest-microservices) \ No newline at end of file +- [A Guide to OkHttp](https://www.baeldung.com/guide-to-okhttp) +- [A Guide to Google-Http-Client](https://www.baeldung.com/google-http-client) +- [Asynchronous HTTP with async-http-client in Java](https://www.baeldung.com/async-http-client) +- [WebSockets with AsyncHttpClient](https://www.baeldung.com/async-http-client-websockets) +- [Integrating Retrofit with RxJava](https://www.baeldung.com/retrofit-rxjava) +- [Introduction to Retrofit](https://www.baeldung.com/retrofit) +- [A Guide to Unirest](https://www.baeldung.com/unirest) +- [Creating REST Microservices with Javalin](https://www.baeldung.com/javalin-rest-microservices) diff --git a/libraries-server/README.md b/libraries-server/README.md index b5392f5883..5245b98139 100644 --- a/libraries-server/README.md +++ b/libraries-server/README.md @@ -1,11 +1,11 @@ ## Relevant Articles: -- [Embedded Jetty Server in Java](http://www.baeldung.com/jetty-embedded) -- [Introduction to Netty](http://www.baeldung.com/netty) -- [Exceptions in Netty](http://www.baeldung.com/netty-exception-handling) -- [Programmatically Create, Configure and Run a Tomcat Server](http://www.baeldung.com/tomcat-programmatic-setup) -- [Creating and Configuring Jetty 9 Server in Java](http://www.baeldung.com/jetty-java-programmatic) -- [Testing Netty with EmbeddedChannel](http://www.baeldung.com/testing-netty-embedded-channel) +- [Embedded Jetty Server in Java](https://www.baeldung.com/jetty-embedded) +- [Introduction to Netty](https://www.baeldung.com/netty) +- [Exceptions in Netty](https://www.baeldung.com/netty-exception-handling) +- [Programmatically Create, Configure and Run a Tomcat Server](https://www.baeldung.com/tomcat-programmatic-setup) +- [Creating and Configuring Jetty 9 Server in Java](https://www.baeldung.com/jetty-java-programmatic) +- [Testing Netty with EmbeddedChannel](https://www.baeldung.com/testing-netty-embedded-channel) - [MQTT Client in Java](https://www.baeldung.com/java-mqtt-client) - [Guide to XMPP Smack Client](https://www.baeldung.com/xmpp-smack-chat-client) - [A Guide to NanoHTTPD](https://www.baeldung.com/nanohttpd) diff --git a/libraries-testing/README.md b/libraries-testing/README.md index fb2c7123a3..3f1904dc50 100644 --- a/libraries-testing/README.md +++ b/libraries-testing/README.md @@ -1,9 +1,9 @@ ### Relevant articles -- [Introduction to Serenity BDD](http://www.baeldung.com/serenity-bdd) -- [Introduction to JSONassert](http://www.baeldung.com/jsonassert) -- [Serenity BDD and Screenplay](http://www.baeldung.com/serenity-screenplay) -- [Serenity BDD with Spring and JBehave](http://www.baeldung.com/serenity-spring-jbehave) -- [Introduction to Awaitlity](http://www.baeldung.com/awaitlity-testing) -- [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) -- [Testing with Hamcrest](http://www.baeldung.com/java-junit-hamcrest-guide) \ No newline at end of file +- [Introduction to Serenity BDD](https://www.baeldung.com/serenity-bdd) +- [Introduction to JSONassert](https://www.baeldung.com/jsonassert) +- [Serenity BDD and Screenplay](https://www.baeldung.com/serenity-screenplay) +- [Serenity BDD with Spring and JBehave](https://www.baeldung.com/serenity-spring-jbehave) +- [Introduction to Awaitlity](https://www.baeldung.com/awaitlity-testing) +- [Introduction to Hoverfly in Java](https://www.baeldung.com/hoverfly) +- [Testing with Hamcrest](https://www.baeldung.com/java-junit-hamcrest-guide) diff --git a/libraries/README.md b/libraries/README.md index ebf087ccd8..c15e0d8fb8 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -1,40 +1,40 @@ ### Relevant articles -- [Introduction to Javatuples](http://www.baeldung.com/java-tuples) -- [Introduction to Javassist](http://www.baeldung.com/javassist) -- [Introduction to Apache Flink with Java](http://www.baeldung.com/apache-flink) -- [Intro to JaVers](http://www.baeldung.com/javers) -- [Merging Streams in Java](http://www.baeldung.com/java-merge-streams) -- [Introduction to Quartz](http://www.baeldung.com/quartz) -- [How to Warm Up the JVM](http://www.baeldung.com/java-jvm-warmup) -- [Software Transactional Memory in Java Using Multiverse](http://www.baeldung.com/java-multiverse-stm) -- [Locality-Sensitive Hashing in Java Using Java-LSH](http://www.baeldung.com/locality-sensitive-hashing) -- [Introduction to Neuroph](http://www.baeldung.com/neuroph) -- [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss) -- [Introduction to PCollections](http://www.baeldung.com/java-pcollections) -- [Introduction to Eclipse Collections](http://www.baeldung.com/eclipse-collections) -- [DistinctBy in the Java Stream API](http://www.baeldung.com/java-streams-distinct-by) -- [Introduction to NoException](http://www.baeldung.com/no-exception) -- [Spring Yarg Integration](http://www.baeldung.com/spring-yarg) -- [Delete a Directory Recursively in Java](http://www.baeldung.com/java-delete-directory) -- [Guide to JDeferred](http://www.baeldung.com/jdeferred) -- [Introduction to MBassador](http://www.baeldung.com/mbassador) -- [Using Pairs in Java](http://www.baeldung.com/java-pairs) -- [Introduction to Caffeine](http://www.baeldung.com/java-caching-caffeine) -- [Introduction to StreamEx](http://www.baeldung.com/streamex) -- [A Docker Guide for Java](http://www.baeldung.com/docker-java-api) -- [Introduction to Akka Actors in Java](http://www.baeldung.com/akka-actors-java) -- [A Guide to Byte Buddy](http://www.baeldung.com/byte-buddy) -- [Introduction to jOOL](http://www.baeldung.com/jool) -- [Consumer Driven Contracts with Pact](http://www.baeldung.com/pact-junit-consumer-driven-contracts) -- [Introduction to Atlassian Fugue](http://www.baeldung.com/java-fugue) -- [Publish and Receive Messages with Nats Java Client](http://www.baeldung.com/nats-java-client) -- [Java Concurrency Utility with JCTools](http://www.baeldung.com/java-concurrency-jc-tools) -- [Introduction to JavaPoet](http://www.baeldung.com/java-poet) -- [Convert String to Date in Java](http://www.baeldung.com/java-string-to-date) -- [Guide to Resilience4j](http://www.baeldung.com/resilience4j) +- [Introduction to Javatuples](https://www.baeldung.com/java-tuples) +- [Introduction to Javassist](https://www.baeldung.com/javassist) +- [Introduction to Apache Flink with Java](https://www.baeldung.com/apache-flink) +- [Intro to JaVers](https://www.baeldung.com/javers) +- [Merging Streams in Java](https://www.baeldung.com/java-merge-streams) +- [Introduction to Quartz](https://www.baeldung.com/quartz) +- [How to Warm Up the JVM](https://www.baeldung.com/java-jvm-warmup) +- [Software Transactional Memory in Java Using Multiverse](https://www.baeldung.com/java-multiverse-stm) +- [Locality-Sensitive Hashing in Java Using Java-LSH](https://www.baeldung.com/locality-sensitive-hashing) +- [Introduction to Neuroph](https://www.baeldung.com/neuroph) +- [Quick Guide to RSS with Rome](https://www.baeldung.com/rome-rss) +- [Introduction to PCollections](https://www.baeldung.com/java-pcollections) +- [Introduction to Eclipse Collections](https://www.baeldung.com/eclipse-collections) +- [DistinctBy in the Java Stream API](https://www.baeldung.com/java-streams-distinct-by) +- [Introduction to NoException](https://www.baeldung.com/no-exception) +- [Spring Yarg Integration](https://www.baeldung.com/spring-yarg) +- [Delete a Directory Recursively in Java](https://www.baeldung.com/java-delete-directory) +- [Guide to JDeferred](https://www.baeldung.com/jdeferred) +- [Introduction to MBassador](https://www.baeldung.com/mbassador) +- [Using Pairs in Java](https://www.baeldung.com/java-pairs) +- [Introduction to Caffeine](https://www.baeldung.com/java-caching-caffeine) +- [Introduction to StreamEx](https://www.baeldung.com/streamex) +- [A Docker Guide for Java](https://www.baeldung.com/docker-java-api) +- [Introduction to Akka Actors in Java](https://www.baeldung.com/akka-actors-java) +- [A Guide to Byte Buddy](https://www.baeldung.com/byte-buddy) +- [Introduction to jOOL](https://www.baeldung.com/jool) +- [Consumer Driven Contracts with Pact](https://www.baeldung.com/pact-junit-consumer-driven-contracts) +- [Introduction to Atlassian Fugue](https://www.baeldung.com/java-fugue) +- [Publish and Receive Messages with Nats Java Client](https://www.baeldung.com/nats-java-client) +- [Java Concurrency Utility with JCTools](https://www.baeldung.com/java-concurrency-jc-tools) +- [Introduction to JavaPoet](https://www.baeldung.com/java-poet) +- [Convert String to Date in Java](https://www.baeldung.com/java-string-to-date) +- [Guide to Resilience4j](https://www.baeldung.com/resilience4j) - [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once) -- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) +- [Implementing a FTP-Client in Java](https://www.baeldung.com/java-ftp-client) - [Introduction to Functional Java](https://www.baeldung.com/java-functional-library) - [A Guide to the Reflections Library](https://www.baeldung.com/reflections-library) diff --git a/linkrest/README.md b/linkrest/README.md index 33cf930b18..8297b14bb5 100644 --- a/linkrest/README.md +++ b/linkrest/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [Guide to LinkRest](http://www.baeldung.com/linkrest) +- [Guide to LinkRest](https://www.baeldung.com/linkrest) diff --git a/logging-modules/README.md b/logging-modules/README.md index 17405847b1..f5a1acaac1 100644 --- a/logging-modules/README.md +++ b/logging-modules/README.md @@ -3,5 +3,5 @@ ### Relevant Articles: -- [Creating a Custom Logback Appender](http://www.baeldung.com/custom-logback-appender) -- [A Guide To Logback](http://www.baeldung.com/logback) +- [Creating a Custom Logback Appender](https://www.baeldung.com/custom-logback-appender) +- [A Guide To Logback](https://www.baeldung.com/logback) diff --git a/lombok/README.md b/lombok/README.md index 4ff7ca7921..54a0984159 100644 --- a/lombok/README.md +++ b/lombok/README.md @@ -1,6 +1,6 @@ ## Relevant Articles: -- [Introduction to Project Lombok](http://www.baeldung.com/intro-to-project-lombok) -- [Using Lombok’s @Builder Annotation](http://www.baeldung.com/lombok-builder) +- [Introduction to Project Lombok](https://www.baeldung.com/intro-to-project-lombok) +- [Using Lombok’s @Builder Annotation](https://www.baeldung.com/lombok-builder) - [Using Lombok’s @Getter for Boolean Fields](https://www.baeldung.com/lombok-getter-boolean) - [Lombok @Builder with Inheritance](https://www.baeldung.com/lombok-builder-inheritance) - [Lombok Builder with Default Value](https://www.baeldung.com/lombok-builder-default-value) diff --git a/lucene/README.md b/lucene/README.md index ea7f715480..2bfd8bf4e1 100644 --- a/lucene/README.md +++ b/lucene/README.md @@ -1,5 +1,5 @@ ### Relevant Articles: -- [Introduction to Apache Lucene](http://www.baeldung.com/lucene) -- [A Simple File Search with Lucene](http://www.baeldung.com/lucene-file-search) +- [Introduction to Apache Lucene](https://www.baeldung.com/lucene) +- [A Simple File Search with Lucene](https://www.baeldung.com/lucene-file-search) - [Guide to Lucene Analyzers](https://www.baeldung.com/lucene-analyzers) diff --git a/mapstruct/README.md b/mapstruct/README.md index e279a48f7a..92c55a131d 100644 --- a/mapstruct/README.md +++ b/mapstruct/README.md @@ -1,2 +1,2 @@ ###Relevant Articles: -- [Quick Guide to MapStruct](http://www.baeldung.com/mapstruct) +- [Quick Guide to MapStruct](https://www.baeldung.com/mapstruct) diff --git a/maven-all/maven/README.md b/maven-all/maven/README.md index abe7fc4a80..acf7dfc47b 100644 --- a/maven-all/maven/README.md +++ b/maven-all/maven/README.md @@ -1,13 +1,13 @@ ### Relevant Articles -- [Guide to the Core Maven Plugins](http://www.baeldung.com/core-maven-plugins) -- [Maven Resources Plugin](http://www.baeldung.com/maven-resources-plugin) -- [Maven Compiler Plugin](http://www.baeldung.com/maven-compiler-plugin) -- [Quick Guide to the Maven Surefire Plugin](http://www.baeldung.com/maven-surefire-plugin) -- [The Maven Failsafe Plugin](http://www.baeldung.com/maven-failsafe-plugin) -- [The Maven Verifier Plugin](http://www.baeldung.com/maven-verifier-plugin) -- [The Maven Clean Plugin](http://www.baeldung.com/maven-clean-plugin) -- [Build a Jar with Maven and Ignore the Test Results](http://www.baeldung.com/maven-ignore-test-results) +- [Guide to the Core Maven Plugins](https://www.baeldung.com/core-maven-plugins) +- [Maven Resources Plugin](https://www.baeldung.com/maven-resources-plugin) +- [Maven Compiler Plugin](https://www.baeldung.com/maven-compiler-plugin) +- [Quick Guide to the Maven Surefire Plugin](https://www.baeldung.com/maven-surefire-plugin) +- [The Maven Failsafe Plugin](https://www.baeldung.com/maven-failsafe-plugin) +- [The Maven Verifier Plugin](https://www.baeldung.com/maven-verifier-plugin) +- [The Maven Clean Plugin](https://www.baeldung.com/maven-clean-plugin) +- [Build a Jar with Maven and Ignore the Test Results](https://www.baeldung.com/maven-ignore-test-results) - [Maven Project with Multiple Source Directories](https://www.baeldung.com/maven-project-multiple-src-directories) - [Integration Testing with Maven](https://www.baeldung.com/maven-integration-test) - [Apache Maven Standard Directory Layout](https://www.baeldung.com/maven-directory-structure) diff --git a/maven-archetype/README.md b/maven-archetype/README.md index 71821e3348..b707150854 100644 --- a/maven-archetype/README.md +++ b/maven-archetype/README.md @@ -1,4 +1,4 @@ ### Relevant Articles: ================================ -- [Guide to Maven Archetype](http://www.baeldung.com/maven-archetype) +- [Guide to Maven Archetype](https://www.baeldung.com/maven-archetype) diff --git a/mesos-marathon/README.md b/mesos-marathon/README.md index 1d4d4995a8..09467ebfcb 100644 --- a/mesos-marathon/README.md +++ b/mesos-marathon/README.md @@ -1,5 +1,5 @@ ### Relevant articles -- [Simple Jenkins Pipeline with Marathon and Mesos](http://www.baeldung.com/jenkins-pipeline-with-marathon-mesos) +- [Simple Jenkins Pipeline with Marathon and Mesos](https://www.baeldung.com/jenkins-pipeline-with-marathon-mesos) To run the pipeline, please modify the dockerise.sh file with your own useranema and password for docker login. diff --git a/metrics/README.md b/metrics/README.md index c7772bffa0..d344a2707f 100644 --- a/metrics/README.md +++ b/metrics/README.md @@ -1,5 +1,5 @@ ## Relevant articles: -- [Intro to Dropwizard Metrics](http://www.baeldung.com/dropwizard-metrics) -- [Introduction to Netflix Servo](http://www.baeldung.com/netflix-servo) -- [Quick Guide to Micrometer](http://www.baeldung.com/micrometer) +- [Intro to Dropwizard Metrics](https://www.baeldung.com/dropwizard-metrics) +- [Introduction to Netflix Servo](https://www.baeldung.com/netflix-servo) +- [Quick Guide to Micrometer](https://www.baeldung.com/micrometer) diff --git a/micronaut/README.md b/micronaut/README.md index 10a68ff2f8..0a39cf9e33 100644 --- a/micronaut/README.md +++ b/micronaut/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Introduction to Micronaut Framework](http://www.baeldung.com/micronaut) +- [Introduction to Micronaut Framework](https://www.baeldung.com/micronaut) diff --git a/microprofile/README.md b/microprofile/README.md index 1a28487e89..7525ee5bff 100644 --- a/microprofile/README.md +++ b/microprofile/README.md @@ -1,3 +1,3 @@ ### Relevant articles: -- [Building Microservices with Eclipse MicroProfile](http://www.baeldung.com/eclipse-microprofile) +- [Building Microservices with Eclipse MicroProfile](https://www.baeldung.com/eclipse-microprofile) diff --git a/ml/README.md b/ml/README.md index f4712a94da..1362f2840c 100644 --- a/ml/README.md +++ b/ml/README.md @@ -2,4 +2,4 @@ This is a soft introduction to ML using [deeplearning4j](https://deeplearning4j.org) library ### Relevant Articles: -- [Logistic Regression in Java](http://www.baeldung.com/) +- [Logistic Regression in Java](https://www.baeldung.com/) diff --git a/msf4j/README.md b/msf4j/README.md index 7c66b8dc5f..b7f2c5a546 100644 --- a/msf4j/README.md +++ b/msf4j/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Introduction to Java Microservices with MSF4J](http://www.baeldung.com/msf4j) +- [Introduction to Java Microservices with MSF4J](https://www.baeldung.com/msf4j) diff --git a/muleesb/README.md b/muleesb/README.md index 8da4e595e3..555a10b5cc 100644 --- a/muleesb/README.md +++ b/muleesb/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Getting Started With Mule ESB](http://www.baeldung.com/mule-esb) +- [Getting Started With Mule ESB](https://www.baeldung.com/mule-esb) diff --git a/mustache/README.md b/mustache/README.md index fa41eb4f4d..c36080b56f 100644 --- a/mustache/README.md +++ b/mustache/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [Introduction to Mustache](http://www.baeldung.com/mustache) -- [Guide to Mustache with Spring Boot](http://www.baeldung.com/spring-boot-mustache) +- [Introduction to Mustache](https://www.baeldung.com/mustache) +- [Guide to Mustache with Spring Boot](https://www.baeldung.com/spring-boot-mustache) diff --git a/mybatis/README.md b/mybatis/README.md index 7c366aeab6..57687d3da1 100644 --- a/mybatis/README.md +++ b/mybatis/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Quick Guide to MyBatis](http://www.baeldung.com/mybatis) +- [Quick Guide to MyBatis](https://www.baeldung.com/mybatis) diff --git a/orika/README.md b/orika/README.md index 4ed033c170..0096793507 100644 --- a/orika/README.md +++ b/orika/README.md @@ -1,2 +1,2 @@ ### Relevant Articles: -- [Mapping with Orika](http://www.baeldung.com/orika-mapping) +- [Mapping with Orika](https://www.baeldung.com/orika-mapping) diff --git a/osgi/readme.md b/osgi/readme.md index e380ae06c3..ee5d7d66c4 100644 --- a/osgi/readme.md +++ b/osgi/readme.md @@ -87,7 +87,7 @@ org.eclipse.osgi_3.12.1.v20170821-1548.jar = = NOT GOOD = = ## Relevant articles: - - [Introduction to OSGi](http://www.baeldung.com/osgi) + - [Introduction to OSGi](https://www.baeldung.com/osgi) diff --git a/pdf/README.md b/pdf/README.md index 5454d2b2de..8525dc4f69 100644 --- a/pdf/README.md +++ b/pdf/README.md @@ -1,3 +1,3 @@ ### Relevant Articles: -- [PDF Conversions in Java](http://www.baeldung.com/pdf-conversions-java) -- [Creating PDF Files in Java](http://www.baeldung.com/java-pdf-creation) +- [PDF Conversions in Java](https://www.baeldung.com/pdf-conversions-java) +- [Creating PDF Files in Java](https://www.baeldung.com/java-pdf-creation) diff --git a/performance-tests/README.md b/performance-tests/README.md index 0064157966..918c81bb69 100644 --- a/performance-tests/README.md +++ b/performance-tests/README.md @@ -1,10 +1,10 @@ ### Relevant Articles: -- [Performance of Java Mapping Frameworks](http://www.baeldung.com/java-performance-mapping-frameworks) +- [Performance of Java Mapping Frameworks](https://www.baeldung.com/java-performance-mapping-frameworks) ### Running To run the performance benchmarks: 1: `mvn clean install` -2: `java -jar target/benchmarks.jar` \ No newline at end of file +2: `java -jar target/benchmarks.jar` diff --git a/play-framework/README.md b/play-framework/README.md index 0fd13fba27..2309b67422 100644 --- a/play-framework/README.md +++ b/play-framework/README.md @@ -1,4 +1,4 @@ ###Relevant Articles: -- [REST API with Play Framework in Java](http://www.baeldung.com/rest-api-with-play) -- [Routing In Play Applications in Java](http://www.baeldung.com/routing-in-play) -- [Introduction To Play In Java](http://www.baeldung.com/java-intro-to-the-play-framework) +- [REST API with Play Framework in Java](https://www.baeldung.com/rest-api-with-play) +- [Routing In Play Applications in Java](https://www.baeldung.com/routing-in-play) +- [Introduction To Play In Java](https://www.baeldung.com/java-intro-to-the-play-framework) diff --git a/protobuffer/README.md b/protobuffer/README.md index 4dcdb3cf52..4302418a8b 100644 --- a/protobuffer/README.md +++ b/protobuffer/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [Introduction to Google Protocol Buffer](http://www.baeldung.com/google-protocol-buffer) +- [Introduction to Google Protocol Buffer](https://www.baeldung.com/google-protocol-buffer) diff --git a/rabbitmq/README.md b/rabbitmq/README.md index 11300b047f..01e51bd784 100644 --- a/rabbitmq/README.md +++ b/rabbitmq/README.md @@ -1,3 +1,3 @@ ### Relevant articles -- [Introduction to RabbitMQ](http://www.baeldung.com/rabbitmq) +- [Introduction to RabbitMQ](https://www.baeldung.com/rabbitmq) diff --git a/raml/README.MD b/raml/README.MD index 2a87b46021..fcf0b41a18 100644 --- a/raml/README.MD +++ b/raml/README.MD @@ -1,2 +1,2 @@ ###The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring +The "REST With Spring" Classes: https://bit.ly/restwithspring diff --git a/ratpack/README.md b/ratpack/README.md index 78e2f8ccfc..706fd0c8c3 100644 --- a/ratpack/README.md +++ b/ratpack/README.md @@ -1,9 +1,9 @@ ### Relevant articles -- [Introduction to Ratpack](http://www.baeldung.com/ratpack) -- [Ratpack Google Guice Integration](http://www.baeldung.com/ratpack-google-guice) +- [Introduction to Ratpack](https://www.baeldung.com/ratpack) +- [Ratpack Google Guice Integration](https://www.baeldung.com/ratpack-google-guice) - [Ratpack Integration with Spring Boot](http://www.baeldung.com/ratpack-spring-boot) -- [Ratpack with Hystrix](http://www.baeldung.com/ratpack-hystrix) +- [Ratpack with Hystrix](https://www.baeldung.com/ratpack-hystrix) - [Ratpack HTTP Client](https://www.baeldung.com/ratpack-http-client) - [Ratpack with RxJava](https://www.baeldung.com/ratpack-rxjava) - [Ratpack with Groovy](https://www.baeldung.com/ratpack-groovy) diff --git a/reactor-core/README.md b/reactor-core/README.md index 5f9d2d1bc2..ba5b355d02 100644 --- a/reactor-core/README.md +++ b/reactor-core/README.md @@ -1,5 +1,5 @@ ### Relevant articles -- [Intro To Reactor Core](http://www.baeldung.com/reactor-core) -- [Combining Publishers in Project Reactor](http://www.baeldung.com/reactor-combine-streams) +- [Intro To Reactor Core](https://www.baeldung.com/reactor-core) +- [Combining Publishers in Project Reactor](https://www.baeldung.com/reactor-combine-streams) - [Programmatically Creating Sequences with Project Reactor](https://www.baeldung.com/flux-sequences-reactor) diff --git a/resteasy/README.md b/resteasy/README.md index 83051037d2..3f3c833256 100644 --- a/resteasy/README.md +++ b/resteasy/README.md @@ -4,6 +4,6 @@ ### Relevant Articles: -- [A Guide to RESTEasy](http://www.baeldung.com/resteasy-tutorial) -- [RESTEasy Client API](http://www.baeldung.com/resteasy-client-tutorial) -- [CORS in JAX-RS](http://www.baeldung.com/cors-in-jax-rs) +- [A Guide to RESTEasy](https://www.baeldung.com/resteasy-tutorial) +- [RESTEasy Client API](https://www.baeldung.com/resteasy-client-tutorial) +- [CORS in JAX-RS](https://www.baeldung.com/cors-in-jax-rs) diff --git a/rule-engines/README.md b/rule-engines/README.md index 6d3c0e93b4..37d419daf5 100644 --- a/rule-engines/README.md +++ b/rule-engines/README.md @@ -1,3 +1,3 @@ ## Relevant articles: -- [List of Rules Engines in Java](http://www.baeldung.com/java-rule-engines) +- [List of Rules Engines in Java](https://www.baeldung.com/java-rule-engines) diff --git a/rxjava-2/README.md b/rxjava-2/README.md index 4182f3fa00..43c1a9942b 100644 --- a/rxjava-2/README.md +++ b/rxjava-2/README.md @@ -1,9 +1,9 @@ ## Relevant articles: -- [RxJava and Error Handling](http://www.baeldung.com/rxjava-error-handling) -- [RxJava 2 – Flowable](http://www.baeldung.com/rxjava-2-flowable) -- [RxJava Maybe](http://www.baeldung.com/rxjava-maybe) -- [Introduction to RxRelay for RxJava](http://www.baeldung.com/rx-relay) +- [RxJava and Error Handling](https://www.baeldung.com/rxjava-error-handling) +- [RxJava 2 – Flowable](https://www.baeldung.com/rxjava-2-flowable) +- [RxJava Maybe](https://www.baeldung.com/rxjava-maybe) +- [Introduction to RxRelay for RxJava](https://www.baeldung.com/rx-relay) - [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable) - [Converting Synchronous and Asynchronous APIs to Observables using RxJava2](https://www.baeldung.com/rxjava-apis-to-observables) - [RxJava Hooks](https://www.baeldung.com/rxjava-hooks) diff --git a/rxjava/README.md b/rxjava/README.md index f8a4ca1dbe..f9b7e2ba0d 100644 --- a/rxjava/README.md +++ b/rxjava/README.md @@ -1,15 +1,15 @@ ## Relevant articles: -- [Dealing with Backpressure with RxJava](http://www.baeldung.com/rxjava-backpressure) -- [How to Test RxJava?](http://www.baeldung.com/rxjava-testing) -- [Implementing Custom Operators in RxJava](http://www.baeldung.com/rxjava-custom-operators) -- [Introduction to RxJava](http://www.baeldung.com/rx-java) -- [Observable Utility Operators in RxJava](http://www.baeldung.com/rxjava-observable-operators) -- [Introduction to rxjava-jdbc](http://www.baeldung.com/rxjava-jdbc) -- [Schedulers in RxJava](http://www.baeldung.com/rxjava-schedulers) -- [Mathematical and Aggregate Operators in RxJava](http://www.baeldung.com/rxjava-math) -- [Combining Observables in RxJava](http://www.baeldung.com/rxjava-combine-observables) -- [RxJava StringObservable](http://www.baeldung.com/rxjava-string) -- [Filtering Observables in RxJava](http://www.baeldung.com/rxjava-filtering) -- [RxJava One Observable, Multiple Subscribers](http://www.baeldung.com/rxjava-multiple-subscribers-observable) +- [Dealing with Backpressure with RxJava](https://www.baeldung.com/rxjava-backpressure) +- [How to Test RxJava?](https://www.baeldung.com/rxjava-testing) +- [Implementing Custom Operators in RxJava](https://www.baeldung.com/rxjava-custom-operators) +- [Introduction to RxJava](https://www.baeldung.com/rx-java) +- [Observable Utility Operators in RxJava](https://www.baeldung.com/rxjava-observable-operators) +- [Introduction to rxjava-jdbc](https://www.baeldung.com/rxjava-jdbc) +- [Schedulers in RxJava](https://www.baeldung.com/rxjava-schedulers) +- [Mathematical and Aggregate Operators in RxJava](https://www.baeldung.com/rxjava-math) +- [Combining Observables in RxJava](https://www.baeldung.com/rxjava-combine-observables) +- [RxJava StringObservable](https://www.baeldung.com/rxjava-string) +- [Filtering Observables in RxJava](https://www.baeldung.com/rxjava-filtering) +- [RxJava One Observable, Multiple Subscribers](https://www.baeldung.com/rxjava-multiple-subscribers-observable) - [Difference Between Flatmap and Switchmap in RxJava](https://www.baeldung.com/rxjava-flatmap-switchmap) diff --git a/saas/README.md b/saas/README.md index f537c7ff95..4effb2afa9 100644 --- a/saas/README.md +++ b/saas/README.md @@ -4,4 +4,4 @@ This module contains articles about software as a service (SAAS) ## Relevant articles: -- [JIRA REST API Integration](http://www.baeldung.com/jira-rest-api) +- [JIRA REST API Integration](https://www.baeldung.com/jira-rest-api) diff --git a/spark-java/README.md b/spark-java/README.md index 3f16b29b9f..b3ef62e631 100644 --- a/spark-java/README.md +++ b/spark-java/README.md @@ -3,4 +3,4 @@ This module contains articles about Spark ### Relevant Articles -- [Building an API With the Spark Java Framework](http://www.baeldung.com/spark-framework-rest-api) +- [Building an API With the Spark Java Framework](https://www.baeldung.com/spark-framework-rest-api) diff --git a/spring-4/README.md b/spring-4/README.md index 5bc38d4a9d..d44eed915e 100644 --- a/spring-4/README.md +++ b/spring-4/README.md @@ -3,6 +3,6 @@ This module contains articles about Spring 4 ### Relevant Articles: -- [A Guide to Flips for Spring](http://www.baeldung.com/flips-spring) +- [A Guide to Flips for Spring](https://www.baeldung.com/flips-spring) - [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari) -- [Spring JSON-P with Jackson](http://www.baeldung.com/spring-jackson-jsonp) +- [Spring JSON-P with Jackson](https://www.baeldung.com/spring-jackson-jsonp) diff --git a/spring-5-data-reactive/README.md b/spring-5-data-reactive/README.md index 982704e11c..683b493317 100644 --- a/spring-5-data-reactive/README.md +++ b/spring-5-data-reactive/README.md @@ -6,7 +6,7 @@ This module contains articles about reactive Spring 5 Data The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [Reactive Flow with MongoDB, Kotlin, and Spring WebFlux](http://www.baeldung.com/kotlin-mongodb-spring-webflux) -- [Spring Data Reactive Repositories with MongoDB](http://www.baeldung.com/spring-data-mongodb-reactive) +- [Reactive Flow with MongoDB, Kotlin, and Spring WebFlux](https://www.baeldung.com/kotlin-mongodb-spring-webflux) +- [Spring Data Reactive Repositories with MongoDB](https://www.baeldung.com/spring-data-mongodb-reactive) - [Spring Data MongoDB Tailable Cursors](https://www.baeldung.com/spring-data-mongodb-tailable-cursors) - [A Quick Look at R2DBC with Spring Data](https://www.baeldung.com/spring-data-r2dbc) diff --git a/spring-5-mvc/README.md b/spring-5-mvc/README.md index d3216187f9..e98012c047 100644 --- a/spring-5-mvc/README.md +++ b/spring-5-mvc/README.md @@ -3,6 +3,6 @@ This module contains articles about Spring 5 model-view-controller (MVC) pattern ### Relevant Articles: -- [Spring Boot and Kotlin](http://www.baeldung.com/spring-boot-kotlin) +- [Spring Boot and Kotlin](https://www.baeldung.com/spring-boot-kotlin) - [Spring MVC Streaming and SSE Request Processing](https://www.baeldung.com/spring-mvc-sse-streams) - [Interface Driven Controllers in Spring](https://www.baeldung.com/spring-interface-driven-controllers) diff --git a/spring-5-reactive-security/README.md b/spring-5-reactive-security/README.md index ebb107645b..4ea6fb644f 100644 --- a/spring-5-reactive-security/README.md +++ b/spring-5-reactive-security/README.md @@ -7,7 +7,7 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [Spring Boot Actuator](http://www.baeldung.com/spring-boot-actuators) -- [Spring Security 5 for Reactive Applications](http://www.baeldung.com/spring-security-5-reactive) -- [Guide to Spring 5 WebFlux](http://www.baeldung.com/spring-webflux) +- [Spring Boot Actuator](https://www.baeldung.com/spring-boot-actuators) +- [Spring Security 5 for Reactive Applications](https://www.baeldung.com/spring-security-5-reactive) +- [Guide to Spring 5 WebFlux](https://www.baeldung.com/spring-webflux) - [Introduction to the Functional Web Framework in Spring 5](https://www.baeldung.com/spring-5-functional-web) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index 89ff4fea9f..2bef8ee6d4 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -7,14 +7,14 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [Introduction to the Functional Web Framework in Spring 5](http://www.baeldung.com/spring-5-functional-web) -- [Spring 5 WebClient](http://www.baeldung.com/spring-5-webclient) -- [Exploring the Spring 5 WebFlux URL Matching](http://www.baeldung.com/spring-5-mvc-url-matching) -- [Reactive WebSockets with Spring 5](http://www.baeldung.com/spring-5-reactive-websockets) -- [Spring Webflux Filters](http://www.baeldung.com/spring-webflux-filters) -- [How to Set a Header on a Response with Spring 5](http://www.baeldung.com/spring-response-header) -- [Spring Webflux and CORS](http://www.baeldung.com/spring-webflux-cors) -- [Handling Errors in Spring WebFlux](http://www.baeldung.com/spring-webflux-errors) +- [Introduction to the Functional Web Framework in Spring 5](https://www.baeldung.com/spring-5-functional-web) +- [Spring 5 WebClient](https://www.baeldung.com/spring-5-webclient) +- [Exploring the Spring 5 WebFlux URL Matching](https://www.baeldung.com/spring-5-mvc-url-matching) +- [Reactive WebSockets with Spring 5](https://www.baeldung.com/spring-5-reactive-websockets) +- [Spring Webflux Filters](httpss://www.baeldung.com/spring-webflux-filters) +- [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) +- [Spring Webflux and CORS](https://www.baeldung.com/spring-webflux-cors) +- [Handling Errors in Spring WebFlux](https://www.baeldung.com/spring-webflux-errors) - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) - [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) @@ -22,4 +22,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) - [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) - [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) -- More articles: [[next -->]](/spring-5-reactive-2) \ No newline at end of file +- More articles: [[next -->]](/spring-5-reactive-2) diff --git a/spring-5-security-oauth/README.md b/spring-5-security-oauth/README.md index 4e080fc517..43cab33598 100644 --- a/spring-5-security-oauth/README.md +++ b/spring-5-security-oauth/README.md @@ -4,6 +4,6 @@ This module contains articles about Spring 5 OAuth Security ## Relevant articles: -- [Spring Security 5 – OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login) +- [Spring Security 5 – OAuth2 Login](https://www.baeldung.com/spring-security-5-oauth2-login) - [Extracting Principal and Authorities using Spring Security OAuth](https://www.baeldung.com/spring-security-oauth-principal-authorities-extractor) - [Customizing Authorization and Token Requests with Spring Security 5.1 Client](https://www.baeldung.com/spring-security-custom-oauth-requests) diff --git a/spring-5-security/README.md b/spring-5-security/README.md index 23b46f4dc9..4cace0db8d 100644 --- a/spring-5-security/README.md +++ b/spring-5-security/README.md @@ -4,8 +4,8 @@ This module contains articles about Spring Security 5 ## Relevant articles: -- [Extra Login Fields with Spring Security](http://www.baeldung.com/spring-security-extra-login-fields) -- [A Custom Spring SecurityConfigurer](http://www.baeldung.com/spring-security-custom-configurer) -- [New Password Storage In Spring Security 5](http://www.baeldung.com/spring-security-5-password-storage) +- [Extra Login Fields with Spring Security](https://www.baeldung.com/spring-security-extra-login-fields) +- [A Custom Spring SecurityConfigurer](https://www.baeldung.com/spring-security-custom-configurer) +- [New Password Storage In Spring Security 5](https://www.baeldung.com/spring-security-5-password-storage) - [Default Password Encoder in Spring Security 5](https://www.baeldung.com/spring-security-5-default-password-encoder) diff --git a/spring-5/README.md b/spring-5/README.md index 7f4c643b7a..7588d23304 100644 --- a/spring-5/README.md +++ b/spring-5/README.md @@ -7,12 +7,12 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles -- [Concurrent Test Execution in Spring 5](http://www.baeldung.com/spring-5-concurrent-tests) -- [Spring 5 Functional Bean Registration](http://www.baeldung.com/spring-5-functional-beans) -- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](http://www.baeldung.com/spring-5-junit-config) -- [Spring 5 Testing with @EnabledIf Annotation](http://www.baeldung.com/spring-5-enabledIf) -- [Introduction to Spring REST Docs](http://www.baeldung.com/spring-rest-docs) -- [Spring ResponseStatusException](http://www.baeldung.com/spring-response-status-exception) -- [Spring Assert Statements](http://www.baeldung.com/spring-assert) +- [Concurrent Test Execution in Spring 5](https://www.baeldung.com/spring-5-concurrent-tests) +- [Spring 5 Functional Bean Registration](https://www.baeldung.com/spring-5-functional-beans) +- [The SpringJUnitConfig and SpringJUnitWebConfig Annotations in Spring 5](https://www.baeldung.com/spring-5-junit-config) +- [Spring 5 Testing with @EnabledIf Annotation](https://www.baeldung.com/spring-5-enabledIf) +- [Introduction to Spring REST Docs](https://www.baeldung.com/spring-rest-docs) +- [Spring ResponseStatusException](https://www.baeldung.com/spring-response-status-exception) +- [Spring Assert Statements](https://www.baeldung.com/spring-assert) - [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari) diff --git a/spring-activiti/README.md b/spring-activiti/README.md index 75f3ea51e5..f4e788492b 100644 --- a/spring-activiti/README.md +++ b/spring-activiti/README.md @@ -4,7 +4,7 @@ This module contains articles about Spring with Activiti ### Relevant articles -- [A Guide to Activiti with Java](http://www.baeldung.com/java-activiti) -- [Introduction to Activiti with Spring](http://www.baeldung.com/spring-activiti) -- [Activiti with Spring Security](http://www.baeldung.com/activiti-spring-security) -- [ProcessEngine Configuration in Activiti](http://www.baeldung.com/activiti-process-engine) +- [A Guide to Activiti with Java](https://www.baeldung.com/java-activiti) +- [Introduction to Activiti with Spring](https://www.baeldung.com/spring-activiti) +- [Activiti with Spring Security](https://www.baeldung.com/activiti-spring-security) +- [ProcessEngine Configuration in Activiti](https://www.baeldung.com/activiti-process-engine) diff --git a/spring-akka/README.md b/spring-akka/README.md index 035551d459..c7db5d5c01 100644 --- a/spring-akka/README.md +++ b/spring-akka/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring with Akka ### Relevant Articles: -- [Introduction to Spring with Akka](http://www.baeldung.com/akka-with-spring) +- [Introduction to Spring with Akka](https://www.baeldung.com/akka-with-spring) diff --git a/spring-all/README.md b/spring-all/README.md index 8a4e8fa18f..1d6cb0bfad 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -8,26 +8,26 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant articles: -- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) -- [Spring Profiles](http://www.baeldung.com/spring-profiles) -- [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor) -- [What’s New in Spring 4.3?](http://www.baeldung.com/whats-new-in-spring-4-3) -- [Running Setup Data on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring) -- [Quick Guide to Spring Controllers](http://www.baeldung.com/spring-controllers) -- [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) -- [Introduction To Ehcache](http://www.baeldung.com/ehcache) -- [A Guide to the Spring Task Scheduler](http://www.baeldung.com/spring-task-scheduler) -- [Guide to Spring Retry](http://www.baeldung.com/spring-retry) -- [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) -- [A CLI with Spring Shell](http://www.baeldung.com/spring-shell-cli) -- [JasperReports with Spring](http://www.baeldung.com/spring-jasper) -- [Model, ModelMap, and ModelView in Spring MVC](http://www.baeldung.com/spring-mvc-model-model-map-model-view) -- [A Guide To Caching in Spring](http://www.baeldung.com/spring-cache-tutorial) -- [How To Do @Async in Spring](http://www.baeldung.com/spring-async) -- [@Order in Spring](http://www.baeldung.com/spring-order) -- [Spring Web Contexts](http://www.baeldung.com/spring-web-contexts) -- [Spring Cache – Creating a Custom KeyGenerator](http://www.baeldung.com/spring-cache-custom-keygenerator) -- [Spring @Primary Annotation](http://www.baeldung.com/spring-primary) +- [Guide to Spring @Autowired](https://www.baeldung.com/spring-autowire) +- [Spring Profiles](https://www.baeldung.com/spring-profiles) +- [A Spring Custom Annotation for a Better DAO](https://www.baeldung.com/spring-annotation-bean-pre-processor) +- [What’s New in Spring 4.3?](https://www.baeldung.com/whats-new-in-spring-4-3) +- [Running Setup Data on Startup in Spring](https://www.baeldung.com/running-setup-logic-on-startup-in-spring) +- [Quick Guide to Spring Controllers](https://www.baeldung.com/spring-controllers) +- [Quick Guide to Spring Bean Scopes](https://www.baeldung.com/spring-bean-scopes) +- [Introduction To Ehcache](https://www.baeldung.com/ehcache) +- [A Guide to the Spring Task Scheduler](https://www.baeldung.com/spring-task-scheduler) +- [Guide to Spring Retry](https://www.baeldung.com/spring-retry) +- [Custom Scope in Spring](https://www.baeldung.com/spring-custom-scope) +- [A CLI with Spring Shell](https://www.baeldung.com/spring-shell-cli) +- [JasperReports with Spring](https://www.baeldung.com/spring-jasper) +- [Model, ModelMap, and ModelView in Spring MVC](https://www.baeldung.com/spring-mvc-model-model-map-model-view) +- [A Guide To Caching in Spring](https://www.baeldung.com/spring-cache-tutorial) +- [How To Do @Async in Spring](https://www.baeldung.com/spring-async) +- [@Order in Spring](https://www.baeldung.com/spring-order) +- [Spring Web Contexts](https://www.baeldung.com/spring-web-contexts) +- [Spring Cache – Creating a Custom KeyGenerator](https://www.baeldung.com/spring-cache-custom-keygenerator) +- [Spring @Primary Annotation](https://www.baeldung.com/spring-primary) - [Spring Events](https://www.baeldung.com/spring-events) - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) - [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) diff --git a/spring-aop/README.md b/spring-aop/README.md index 915299a073..061e736d31 100644 --- a/spring-aop/README.md +++ b/spring-aop/README.md @@ -4,7 +4,7 @@ This module contains articles about Spring aspect oriented programming (AOP) ### Relevant articles -- [Implementing a Custom Spring AOP Annotation](http://www.baeldung.com/spring-aop-annotation) -- [Intro to AspectJ](http://www.baeldung.com/aspectj) -- [Spring Performance Logging](http://www.baeldung.com/spring-performance-logging) -- [Introduction to Spring AOP](http://www.baeldung.com/spring-aop) +- [Implementing a Custom Spring AOP Annotation](https://www.baeldung.com/spring-aop-annotation) +- [Intro to AspectJ](https://www.baeldung.com/aspectj) +- [Spring Performance Logging](https://www.baeldung.com/spring-performance-logging) +- [Introduction to Spring AOP](https://www.baeldung.com/spring-aop) diff --git a/spring-batch/README.md b/spring-batch/README.md index c100835948..95abbaf931 100644 --- a/spring-batch/README.md +++ b/spring-batch/README.md @@ -3,7 +3,7 @@ This module contains articles about Spring Batch ### Relevant Articles: -- [Introduction to Spring Batch](http://www.baeldung.com/introduction-to-spring-batch) -- [Spring Batch using Partitioner](http://www.baeldung.com/spring-batch-partitioner) -- [Spring Batch – Tasklets vs Chunks](http://www.baeldung.com/spring-batch-tasklet-chunk) -- [How to Trigger and Stop a Scheduled Spring Batch Job](http://www.baeldung.com/spring-batch-start-stop-job) +- [Introduction to Spring Batch](https://www.baeldung.com/introduction-to-spring-batch) +- [Spring Batch using Partitioner](https://www.baeldung.com/spring-batch-partitioner) +- [Spring Batch – Tasklets vs Chunks](https://www.baeldung.com/spring-batch-tasklet-chunk) +- [How to Trigger and Stop a Scheduled Spring Batch Job](https://www.baeldung.com/spring-batch-start-stop-job) diff --git a/spring-bom/README.md b/spring-bom/README.md index 60e7d75340..0866582fb2 100644 --- a/spring-bom/README.md +++ b/spring-bom/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring with Maven BOM (Bill Of Materials) ### Relevant Articles: -- [Spring with Maven BOM](http://www.baeldung.com/spring-maven-bom) +- [Spring with Maven BOM](https://www.baeldung.com/spring-maven-bom) diff --git a/spring-boot-admin/README.md b/spring-boot-admin/README.md index 61010819fd..ac4d781d0e 100644 --- a/spring-boot-admin/README.md +++ b/spring-boot-admin/README.md @@ -23,4 +23,4 @@ and the mail configuration from application.properties ### Relevant Articles: -- [A Guide to Spring Boot Admin](http://www.baeldung.com/spring-boot-admin) +- [A Guide to Spring Boot Admin](https://www.baeldung.com/spring-boot-admin) diff --git a/spring-boot-autoconfiguration/README.md b/spring-boot-autoconfiguration/README.md index 920c378139..67311eed50 100644 --- a/spring-boot-autoconfiguration/README.md +++ b/spring-boot-autoconfiguration/README.md @@ -7,5 +7,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Create a Custom Auto-Configuration with Spring Boot](http://www.baeldung.com/spring-boot-custom-auto-configuration) +- [Create a Custom Auto-Configuration with Spring Boot](https://www.baeldung.com/spring-boot-custom-auto-configuration) - [Guide to ApplicationContextRunner in Spring Boot](https://www.baeldung.com/spring-boot-context-runner) diff --git a/spring-boot-bootstrap/README.md b/spring-boot-bootstrap/README.md index 6dd1582a20..5fb8fd4a84 100644 --- a/spring-boot-bootstrap/README.md +++ b/spring-boot-bootstrap/README.md @@ -3,8 +3,8 @@ This module contains articles about bootstrapping Spring Boot applications. ### Relevant Articles: -- [Spring Boot Tutorial – Bootstrap a Simple Application](http://www.baeldung.com/spring-boot-start) -- [Thin JARs with Spring Boot](http://www.baeldung.com/spring-boot-thin-jar) +- [Spring Boot Tutorial – Bootstrap a Simple Application](https://www.baeldung.com/spring-boot-start) +- [Thin JARs with Spring Boot](https://www.baeldung.com/spring-boot-thin-jar) - [Deploying a Spring Boot Application to Cloud Foundry](https://www.baeldung.com/spring-boot-app-deploy-to-cloud-foundry) - [Deploy a Spring Boot Application to Google App Engine](https://www.baeldung.com/spring-boot-google-app-engine) - [Deploy a Spring Boot Application to OpenShift](https://www.baeldung.com/spring-boot-deploy-openshift) diff --git a/spring-boot-camel/README.md b/spring-boot-camel/README.md index 194b7ea9c7..f9594a95a6 100644 --- a/spring-boot-camel/README.md +++ b/spring-boot-camel/README.md @@ -24,4 +24,4 @@ or return code of 201 and the response: `{"id": 10,"name": "Hello, World"}` - if ## Relevant articles: -- [Apache Camel with Spring Boot](http://www.baeldung.com/apache-camel-spring-boot) +- [Apache Camel with Spring Boot](https://www.baeldung.com/apache-camel-spring-boot) diff --git a/spring-boot-cli/README.md b/spring-boot-cli/README.md index 8c8a0c99c1..79e259c855 100644 --- a/spring-boot-cli/README.md +++ b/spring-boot-cli/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring Boot CLI ### Relevant Articles: -- [Introduction to Spring Boot CLI](http://www.baeldung.com/spring-boot-cli) +- [Introduction to Spring Boot CLI](https://www.baeldung.com/spring-boot-cli) diff --git a/spring-boot-client/README.MD b/spring-boot-client/README.MD index c8b9e1cd6e..b5a4c78446 100644 --- a/spring-boot-client/README.MD +++ b/spring-boot-client/README.MD @@ -7,5 +7,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Quick Guide to @RestClientTest in Spring Boot](http://www.baeldung.com/restclienttest-in-spring-boot) -- [A Java Client for a WebSockets API](http://www.baeldung.com/websockets-api-java-spring-client) \ No newline at end of file +- [Quick Guide to @RestClientTest in Spring Boot](https://www.baeldung.com/restclienttest-in-spring-boot) +- [A Java Client for a WebSockets API](https://www.baeldung.com/websockets-api-java-spring-client) diff --git a/spring-boot-ctx-fluent/README.md b/spring-boot-ctx-fluent/README.md index 646ad0f7d1..2d7ba7f2c0 100644 --- a/spring-boot-ctx-fluent/README.md +++ b/spring-boot-ctx-fluent/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring Boot Fluent Builder ### Relevant Articles: -- [Context Hierarchy with the Spring Boot Fluent Builder API](http://www.baeldung.com/spring-boot-context-hierarchy) +- [Context Hierarchy with the Spring Boot Fluent Builder API](https://www.baeldung.com/spring-boot-context-hierarchy) diff --git a/spring-boot-custom-starter/README.md b/spring-boot-custom-starter/README.md index 9a62884ecb..c22aab7a2b 100644 --- a/spring-boot-custom-starter/README.md +++ b/spring-boot-custom-starter/README.md @@ -3,7 +3,7 @@ This module contains articles about writing Spring Boot [starters](https://www.baeldung.com/spring-boot-starters). ### Relevant Articles: -- [Creating a Custom Starter with Spring Boot](http://www.baeldung.com/spring-boot-custom-starter) +- [Creating a Custom Starter with Spring Boot](https://www.baeldung.com/spring-boot-custom-starter) - **greeter-library**: The sample library that we're creating the starter for. @@ -13,4 +13,4 @@ This module contains articles about writing Spring Boot [starters](https://www.b - **greeter-spring-boot-sample-app**: The sample project that uses the custom starter. -- [Multi-Module Project With Spring Boot](http://www.baeldung.com/spring-boot-multiple-modules) +- [Multi-Module Project With Spring Boot](https://www.baeldung.com/spring-boot-multiple-modules) diff --git a/spring-boot-flowable/README.md b/spring-boot-flowable/README.md index 884ddb7ec6..1a8fb28a5e 100644 --- a/spring-boot-flowable/README.md +++ b/spring-boot-flowable/README.md @@ -4,4 +4,4 @@ This module contains articles about Flowable in Boot applications ### Relevant articles -- [Introduction to Flowable](http://www.baeldung.com/flowable) +- [Introduction to Flowable](https://www.baeldung.com/flowable) diff --git a/spring-boot-gradle/README.md b/spring-boot-gradle/README.md index 3a64cca553..859c5d8199 100644 --- a/spring-boot-gradle/README.md +++ b/spring-boot-gradle/README.md @@ -4,5 +4,5 @@ This module contains articles about Gradle in Spring Boot projects. ### Relevant Articles: -- [Spring Boot: Configuring a Main Class](http://www.baeldung.com/spring-boot-main-class) -- [Thin JARs with Spring Boot](http://www.baeldung.com/spring-boot-thin-jar) +- [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) +- [Thin JARs with Spring Boot](https://www.baeldung.com/spring-boot-thin-jar) diff --git a/spring-boot-jasypt/README.md b/spring-boot-jasypt/README.md index a07ca19790..c76339119a 100644 --- a/spring-boot-jasypt/README.md +++ b/spring-boot-jasypt/README.md @@ -4,4 +4,4 @@ This module contains articles about Jasypt in Spring Boot projects. ### Relevant Articles: -- [Spring Boot Configuration with Jasypt](http://www.baeldung.com/spring-boot-jasypt) +- [Spring Boot Configuration with Jasypt](https://www.baeldung.com/spring-boot-jasypt) diff --git a/spring-boot-keycloak/README.md b/spring-boot-keycloak/README.md index 15f0f1459c..2dfe3fc331 100644 --- a/spring-boot-keycloak/README.md +++ b/spring-boot-keycloak/README.md @@ -3,4 +3,4 @@ This module contains articles about Keycloak in Spring Boot projects. ## Relevant articles: -- [A Quick Guide to Using Keycloak with Spring Boot](http://www.baeldung.com/spring-boot-keycloak) +- [A Quick Guide to Using Keycloak with Spring Boot](https://www.baeldung.com/spring-boot-keycloak) diff --git a/spring-boot-kotlin/README.md b/spring-boot-kotlin/README.md index 73c312040d..d393805ed1 100644 --- a/spring-boot-kotlin/README.md +++ b/spring-boot-kotlin/README.md @@ -3,4 +3,4 @@ This module contains articles about Kotlin in Spring Boot projects. ### Relevant Articles: -- [Non-blocking Spring Boot with Kotlin Coroutines](http://www.baeldung.com/non-blocking-spring-boot-with-kotlin-coroutines) +- [Non-blocking Spring Boot with Kotlin Coroutines](https://www.baeldung.com/non-blocking-spring-boot-with-kotlin-coroutines) diff --git a/spring-boot-logging-log4j2/README.md b/spring-boot-logging-log4j2/README.md index 2d72ab6f97..76029caef8 100644 --- a/spring-boot-logging-log4j2/README.md +++ b/spring-boot-logging-log4j2/README.md @@ -3,6 +3,6 @@ This module contains articles about logging in Spring Boot projects with Log4j 2. ### Relevant Articles: -- [Logging in Spring Boot](http://www.baeldung.com/spring-boot-logging) +- [Logging in Spring Boot](https://www.baeldung.com/spring-boot-logging) - [Logging to Graylog with Spring Boot](https://www.baeldung.com/graylog-with-spring-boot) diff --git a/spring-boot-mvc/README.md b/spring-boot-mvc/README.md index 444d91b0e7..a83ea3ee25 100644 --- a/spring-boot-mvc/README.md +++ b/spring-boot-mvc/README.md @@ -4,18 +4,18 @@ This module contains articles about Spring Web MVC in Spring Boot projects. ### Relevant Articles: -- [Guide to the Favicon in Spring Boot](http://www.baeldung.com/spring-boot-favicon) +- [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) - [Custom Validation MessageSource in Spring Boot](https://www.baeldung.com/spring-custom-validation-message-source) -- [Spring Boot Annotations](http://www.baeldung.com/spring-boot-annotations) -- [Spring Scheduling Annotations](http://www.baeldung.com/spring-scheduling-annotations) -- [Spring Web Annotations](http://www.baeldung.com/spring-mvc-annotations) -- [Spring Core Annotations](http://www.baeldung.com/spring-core-annotations) -- [Display RSS Feed with Spring MVC](http://www.baeldung.com/spring-mvc-rss-feed) +- [Spring Boot Annotations](https://www.baeldung.com/spring-boot-annotations) +- [Spring Scheduling Annotations](https://www.baeldung.com/spring-scheduling-annotations) +- [Spring Web Annotations](https://www.baeldung.com/spring-mvc-annotations) +- [Spring Core Annotations](https://www.baeldung.com/spring-core-annotations) +- [Display RSS Feed with Spring MVC](https://www.baeldung.com/spring-mvc-rss-feed) - [A Controller, Service and DAO Example with Spring Boot and JSF](https://www.baeldung.com/jsf-spring-boot-controller-service-dao) - [Cache Eviction in Spring Boot](https://www.baeldung.com/spring-boot-evict-cache) -- [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) +- [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) - [Conditionally Enable Scheduled Jobs in Spring](https://www.baeldung.com/spring-scheduled-enabled-conditionally) - [Accessing Spring MVC Model Objects in JavaScript](https://www.baeldung.com/spring-mvc-model-objects-js) -- [Using Spring ResponseEntity to Manipulate the HTTP Response](http://www.baeldung.com/spring-response-entity) -- [Spring Bean Annotations](http://www.baeldung.com/spring-bean-annotations) +- [Using Spring ResponseEntity to Manipulate the HTTP Response](https://www.baeldung.com/spring-response-entity) +- [Spring Bean Annotations](https://www.baeldung.com/spring-bean-annotations) - More articles: [[next -->]](/spring-boot-mvc-2) diff --git a/spring-boot-ops/README.md b/spring-boot-ops/README.md index 71b00b63b0..2720bc5ae2 100644 --- a/spring-boot-ops/README.md +++ b/spring-boot-ops/README.md @@ -3,16 +3,16 @@ This module contains articles about Spring Boot Operations ### Relevant Articles: - - [Deploy a Spring Boot WAR into a Tomcat Server](http://www.baeldung.com/spring-boot-war-tomcat-deploy) - - [Spring Boot Dependency Management with a Custom Parent](http://www.baeldung.com/spring-boot-dependency-management-custom-parent) - - [A Custom Data Binder in Spring MVC](http://www.baeldung.com/spring-mvc-custom-data-binder) - - [Create a Fat Jar App with Spring Boot](http://www.baeldung.com/deployable-fat-jar-spring-boot) - - [Introduction to WebJars](http://www.baeldung.com/maven-webjars) - - [Intro to Spring Boot Starters](http://www.baeldung.com/spring-boot-starters) - - [A Quick Guide to Maven Wrapper](http://www.baeldung.com/maven-wrapper) - - [Shutdown a Spring Boot Application](http://www.baeldung.com/spring-boot-shutdown) - - [Spring Boot Console Application](http://www.baeldung.com/spring-boot-console-app) - - [Comparing Embedded Servlet Containers in Spring Boot](http://www.baeldung.com/spring-boot-servlet-containers) + - [Deploy a Spring Boot WAR into a Tomcat Server](https://www.baeldung.com/spring-boot-war-tomcat-deploy) + - [Spring Boot Dependency Management with a Custom Parent](https://www.baeldung.com/spring-boot-dependency-management-custom-parent) + - [A Custom Data Binder in Spring MVC](https://www.baeldung.com/spring-mvc-custom-data-binder) + - [Create a Fat Jar App with Spring Boot](https://www.baeldung.com/deployable-fat-jar-spring-boot) + - [Introduction to WebJars](https://www.baeldung.com/maven-webjars) + - [Intro to Spring Boot Starters](https://www.baeldung.com/spring-boot-starters) + - [A Quick Guide to Maven Wrapper](https://www.baeldung.com/maven-wrapper) + - [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown) + - [Spring Boot Console Application](https://www.baeldung.com/spring-boot-console-app) + - [Comparing Embedded Servlet Containers in Spring Boot](https://www.baeldung.com/spring-boot-servlet-containers) - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar) - [EnvironmentPostProcessor in Spring Boot](https://www.baeldung.com/spring-boot-environmentpostprocessor) diff --git a/spring-boot-properties/README.md b/spring-boot-properties/README.md index 9aea5b4871..48ff79537c 100644 --- a/spring-boot-properties/README.md +++ b/spring-boot-properties/README.md @@ -1,10 +1,10 @@ ### Relevant Articles: - [Reloading Properties Files in Spring](https://www.baeldung.com/spring-reloading-properties) -- [Guide to @ConfigurationProperties in Spring Boot](http://www.baeldung.com/configuration-properties-in-spring-boot) +- [Guide to @ConfigurationProperties in Spring Boot](https://www.baeldung.com/configuration-properties-in-spring-boot) - [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties) - [Guide to @EnableConfigurationProperties](https://www.baeldung.com/spring-enable-config-properties) -- [Properties with Spring and Spring Boot](http://www.baeldung.com/properties-with-spring) - checkout the `com.baeldung.properties` package for all scenarios of properties injection and usage -- [A Quick Guide to Spring @Value](http://www.baeldung.com/spring-value-annotation) -- [Spring YAML Configuration](http://www.baeldung.com/spring-yaml) -- [Using Spring @Value with Defaults](http://www.baeldung.com/spring-value-defaults) -- [How to Inject a Property Value Into a Class Not Managed by Spring?](http://www.baeldung.com/inject-properties-value-non-spring-class) +- [Properties with Spring and Spring Boot](https://www.baeldung.com/properties-with-spring) - checkout the `com.baeldung.properties` package for all scenarios of properties injection and usage +- [A Quick Guide to Spring @Value](https://www.baeldung.com/spring-value-annotation) +- [Spring YAML Configuration](https://www.baeldung.com/spring-yaml) +- [Using Spring @Value with Defaults](https://www.baeldung.com/spring-value-defaults) +- [How to Inject a Property Value Into a Class Not Managed by Spring?](https://www.baeldung.com/inject-properties-value-non-spring-class) diff --git a/spring-boot-property-exp/README.md b/spring-boot-property-exp/README.md index e880837dc0..23af5995e2 100644 --- a/spring-boot-property-exp/README.md +++ b/spring-boot-property-exp/README.md @@ -1,10 +1,10 @@ ## Spring Boot Property Expansion -This Module contains articles about Spring Boot Property Expansion +This module contains articles about Spring Boot Property Expansion ### Relevant Articles - - [Automatic Property Expansion with Spring Boot](http://www.baeldung.com/spring-boot-auto-property-expansion) + - [Automatic Property Expansion with Spring Boot](https://www.baeldung.com/spring-boot-auto-property-expansion) ## SubModules diff --git a/spring-boot-rest/README.md b/spring-boot-rest/README.md index b3365d932e..ffac9335fd 100644 --- a/spring-boot-rest/README.md +++ b/spring-boot-rest/README.md @@ -4,10 +4,10 @@ This module contains articles about Spring Boot RESTful APIs. ### Relevant Articles -- [HATEOAS for a Spring REST Service](http://www.baeldung.com/rest-api-discoverability-with-spring) -- [Versioning a REST API](http://www.baeldung.com/rest-versioning) -- [ETags for REST with Spring](http://www.baeldung.com/etags-for-rest-with-spring) -- [Testing REST with multiple MIME types](http://www.baeldung.com/testing-rest-api-with-multiple-media-types) +- [HATEOAS for a Spring REST Service](https://www.baeldung.com/rest-api-discoverability-with-spring) +- [Versioning a REST API](https://www.baeldung.com/rest-versioning) +- [ETags for REST with Spring](https://www.baeldung.com/etags-for-rest-with-spring) +- [Testing REST with multiple MIME types](https://www.baeldung.com/testing-rest-api-with-multiple-media-types) - [Testing Web APIs with Postman Collections](https://www.baeldung.com/postman-testing-collections) - [Spring Boot Consuming and Producing JSON](https://www.baeldung.com/spring-boot-json) @@ -16,14 +16,12 @@ This module contains articles about Spring Boot RESTful APIs. These articles are part of the Spring REST E-book: 1. [Bootstrap a Web Application with Spring 5](https://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration) -2. [Build a REST API with Spring and Java Config](http://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration) -3. [Http Message Converters with the Spring Framework](http://www.baeldung.com/spring-httpmessageconverter-rest) +2. [Build a REST API with Spring and Java Config](https://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration) +3. [Http Message Converters with the Spring Framework](https://www.baeldung.com/spring-httpmessageconverter-rest) 4. [Spring’s RequestBody and ResponseBody Annotations](https://www.baeldung.com/spring-request-response-body) 5. [Entity To DTO Conversion for a Spring REST API](https://www.baeldung.com/entity-to-and-from-dto-for-a-java-spring-application) -6. [Error Handling for REST with Spring](http://www.baeldung.com/exception-handling-for-rest-with-spring) -7. [REST API Discoverability and HATEOAS](http://www.baeldung.com/restful-web-service-discoverability) -8. [An Intro to Spring HATEOAS](http://www.baeldung.com/spring-hateoas-tutorial) -9. [REST Pagination in Spring](http://www.baeldung.com/rest-api-pagination-in-spring) -10. [Test a REST API with Java](http://www.baeldung.com/integration-testing-a-rest-api) - - +6. [Error Handling for REST with Spring](https://www.baeldung.com/exception-handling-for-rest-with-spring) +7. [REST API Discoverability and HATEOAS](https://www.baeldung.com/restful-web-service-discoverability) +8. [An Intro to Spring HATEOAS](https://www.baeldung.com/spring-hateoas-tutorial) +9. [REST Pagination in Spring](https://www.baeldung.com/rest-api-pagination-in-spring) +10. [Test a REST API with Java](https://www.baeldung.com/integration-testing-a-rest-api) diff --git a/spring-boot-security/README.md b/spring-boot-security/README.md index be40010091..be4690f321 100644 --- a/spring-boot-security/README.md +++ b/spring-boot-security/README.md @@ -4,7 +4,7 @@ This module contains articles about Spring Boot Security ### Relevant Articles: -- [Spring Boot Security Auto-Configuration](http://www.baeldung.com/spring-boot-security-autoconfiguration) +- [Spring Boot Security Auto-Configuration](https://www.baeldung.com/spring-boot-security-autoconfiguration) - [Spring Security for Spring Boot Integration Tests](https://www.baeldung.com/spring-security-integration-tests) - [Introduction to Spring Security Taglibs](https://www.baeldung.com/spring-security-taglibs) @@ -17,5 +17,3 @@ This module contains articles about Spring Boot Security ### CURL commands - curl -X POST -u baeldung-admin:baeldung -d grant_type=client_credentials -d username=baeldung-admin -d password=baeldung http://localhost:8080/oauth/token - - diff --git a/spring-boot-vue/README.md b/spring-boot-vue/README.md index 5de138826c..de473c0d36 100644 --- a/spring-boot-vue/README.md +++ b/spring-boot-vue/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring Boot with Vue.js ### Relevant Articles: -- [Vue.js Frontend with a Spring Boot Backend](http://www.baeldung.com/spring-boot-vue-js) +- [Vue.js Frontend with a Spring Boot Backend](https://www.baeldung.com/spring-boot-vue-js) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 522a1f7120..2423d6d331 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -7,30 +7,30 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [A Guide to Spring in Eclipse STS](http://www.baeldung.com/eclipse-sts-spring) -- [The @ServletComponentScan Annotation in Spring Boot](http://www.baeldung.com/spring-servletcomponentscan) -- [How to Register a Servlet in Java](http://www.baeldung.com/register-servlet) -- [Guide to Spring WebUtils and ServletRequestUtils](http://www.baeldung.com/spring-webutils-servletrequestutils) -- [Using Custom Banners in Spring Boot](http://www.baeldung.com/spring-boot-custom-banners) -- [Guide to Internationalization in Spring Boot](http://www.baeldung.com/spring-boot-internationalization) -- [Create a Custom FailureAnalyzer with Spring Boot](http://www.baeldung.com/spring-boot-failure-analyzer) -- [Dynamic DTO Validation Config Retrieved from the Database](http://www.baeldung.com/spring-dynamic-dto-validation) -- [Custom Information in Spring Boot Info Endpoint](http://www.baeldung.com/spring-boot-info-actuator-custom) -- [Using @JsonComponent in Spring Boot](http://www.baeldung.com/spring-boot-jsoncomponent) -- [Testing in Spring Boot](http://www.baeldung.com/spring-boot-testing) -- [How to Get All Spring-Managed Beans?](http://www.baeldung.com/spring-show-all-beans) -- [Spring Boot and Togglz Aspect](http://www.baeldung.com/spring-togglz) -- [Getting Started with GraphQL and Spring Boot](http://www.baeldung.com/spring-graphql) -- [Guide to Spring Type Conversions](http://www.baeldung.com/spring-type-conversions) -- [An Introduction to Kong](http://www.baeldung.com/kong) -- [Spring Boot: Customize Whitelabel Error Page](http://www.baeldung.com/spring-boot-custom-error-page) -- [Spring Boot: Configuring a Main Class](http://www.baeldung.com/spring-boot-main-class) -- [A Quick Intro to the SpringBootServletInitializer](http://www.baeldung.com/spring-boot-servlet-initializer) -- [How to Define a Spring Boot Filter?](http://www.baeldung.com/spring-boot-add-filter) -- [Spring Boot Exit Codes](http://www.baeldung.com/spring-boot-exit-codes) -- [Guide to the Favicon in Spring Boot](http://www.baeldung.com/spring-boot-favicon) -- [Spring Shutdown Callbacks](http://www.baeldung.com/spring-shutdown-callbacks) -- [Container Configuration in Spring Boot 2](http://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) +- [A Guide to Spring in Eclipse STS](https://www.baeldung.com/eclipse-sts-spring) +- [The @ServletComponentScan Annotation in Spring Boot](https://www.baeldung.com/spring-servletcomponentscan) +- [How to Register a Servlet in Java](https://www.baeldung.com/register-servlet) +- [Guide to Spring WebUtils and ServletRequestUtils](https://www.baeldung.com/spring-webutils-servletrequestutils) +- [Using Custom Banners in Spring Boot](https://www.baeldung.com/spring-boot-custom-banners) +- [Guide to Internationalization in Spring Boot](https://www.baeldung.com/spring-boot-internationalization) +- [Create a Custom FailureAnalyzer with Spring Boot](https://www.baeldung.com/spring-boot-failure-analyzer) +- [Dynamic DTO Validation Config Retrieved from the Database](https://www.baeldung.com/spring-dynamic-dto-validation) +- [Custom Information in Spring Boot Info Endpoint](https://www.baeldung.com/spring-boot-info-actuator-custom) +- [Using @JsonComponent in Spring Boot](https://www.baeldung.com/spring-boot-jsoncomponent) +- [Testing in Spring Boot](https://www.baeldung.com/spring-boot-testing) +- [How to Get All Spring-Managed Beans?](https://www.baeldung.com/spring-show-all-beans) +- [Spring Boot and Togglz Aspect](https://www.baeldung.com/spring-togglz) +- [Getting Started with GraphQL and Spring Boot](https://www.baeldung.com/spring-graphql) +- [Guide to Spring Type Conversions](https://www.baeldung.com/spring-type-conversions) +- [An Introduction to Kong](https://www.baeldung.com/kong) +- [Spring Boot: Customize Whitelabel Error Page](https://www.baeldung.com/spring-boot-custom-error-page) +- [Spring Boot: Configuring a Main Class](https://www.baeldung.com/spring-boot-main-class) +- [A Quick Intro to the SpringBootServletInitializer](https://www.baeldung.com/spring-boot-servlet-initializer) +- [How to Define a Spring Boot Filter?](https://www.baeldung.com/spring-boot-add-filter) +- [Spring Boot Exit Codes](https://www.baeldung.com/spring-boot-exit-codes) +- [Guide to the Favicon in Spring Boot](https://www.baeldung.com/spring-boot-favicon) +- [Spring Shutdown Callbacks](https://www.baeldung.com/spring-shutdown-callbacks) +- [Container Configuration in Spring Boot 2](https://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) - [Introduction to Chaos Monkey](https://www.baeldung.com/spring-boot-chaos-monkey) - [Display Auto-Configuration Report in Spring Boot](https://www.baeldung.com/spring-boot-auto-configuration-report) - [Injecting Git Information Into Spring](https://www.baeldung.com/spring-git-information) diff --git a/spring-cloud-bus/README.md b/spring-cloud-bus/README.md index 9c33353a24..dbbb8d7156 100644 --- a/spring-cloud-bus/README.md +++ b/spring-cloud-bus/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring Cloud Bus ### Relevant articles -- [Spring Cloud Bus](http://www.baeldung.com/spring-cloud-bus) +- [Spring Cloud Bus](https://www.baeldung.com/spring-cloud-bus) diff --git a/spring-cloud-cli/README.md b/spring-cloud-cli/README.md index 99df3ddbad..46b47e0e08 100644 --- a/spring-cloud-cli/README.md +++ b/spring-cloud-cli/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring Cloud CLI ### Relevant Articles: -- [Introduction to Spring Cloud CLI](http://www.baeldung.com/spring-cloud-cli) +- [Introduction to Spring Cloud CLI](https://www.baeldung.com/spring-cloud-cli) diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 936c93b460..910d27583f 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -5,7 +5,7 @@ This module contains articles about core Spring functionality ## Relevant Articles: - [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean) -- [Exploring the Spring BeanFactory API](http://www.baeldung.com/spring-beanfactory) -- [How to use the Spring FactoryBean?](http://www.baeldung.com/spring-factorybean) -- [Spring – Injecting Collections](http://www.baeldung.com/spring-injecting-collections) +- [Exploring the Spring BeanFactory API](https://www.baeldung.com/spring-beanfactory) +- [How to use the Spring FactoryBean?](https://www.baeldung.com/spring-factorybean) +- [Spring – Injecting Collections](https://www.baeldung.com/spring-injecting-collections) - More articles: [[<-- prev]](/spring-core) diff --git a/spring-core/README.md b/spring-core/README.md index f90e84121d..6d274e89f0 100644 --- a/spring-core/README.md +++ b/spring-core/README.md @@ -3,13 +3,13 @@ This module contains articles about core Spring functionality ### Relevant Articles: -- [Wiring in Spring: @Autowired, @Resource and @Inject](http://www.baeldung.com/spring-annotations-resource-inject-autowire) -- [Constructor Injection in Spring with Lombok](http://www.baeldung.com/spring-injection-lombok) -- [Introduction to Spring’s StreamUtils](http://www.baeldung.com/spring-stream-utils) -- [XML-Based Injection in Spring](http://www.baeldung.com/spring-xml-injection) -- [A Quick Guide to the Spring @Lazy Annotation](http://www.baeldung.com/spring-lazy-annotation) -- [BeanNameAware and BeanFactoryAware Interfaces in Spring](http://www.baeldung.com/spring-bean-name-factory-aware) -- [Access a File from the Classpath in a Spring Application](http://www.baeldung.com/spring-classpath-file-access) +- [Wiring in Spring: @Autowired, @Resource and @Inject](https://www.baeldung.com/spring-annotations-resource-inject-autowire) +- [Constructor Injection in Spring with Lombok](httsp://www.baeldung.com/spring-injection-lombok) +- [Introduction to Spring’s StreamUtils](https://www.baeldung.com/spring-stream-utils) +- [XML-Based Injection in Spring](httsp://www.baeldung.com/spring-xml-injection) +- [A Quick Guide to the Spring @Lazy Annotation](https://www.baeldung.com/spring-lazy-annotation) +- [BeanNameAware and BeanFactoryAware Interfaces in Spring](https://www.baeldung.com/spring-bean-name-factory-aware) +- [Access a File from the Classpath in a Spring Application](https://www.baeldung.com/spring-classpath-file-access) - [Spring Application Context Events](https://www.baeldung.com/spring-context-events) - [What is a Spring Bean?](https://www.baeldung.com/spring-bean) - [Spring PostConstruct and PreDestroy Annotations](https://www.baeldung.com/spring-postconstruct-predestroy) diff --git a/spring-cucumber/README.md b/spring-cucumber/README.md index 0638ff777a..85bc1f65d5 100644 --- a/spring-cucumber/README.md +++ b/spring-cucumber/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring testing with Cucumber ### Relevant Articles: -- [Cucumber Spring Integration](http://www.baeldung.com/cucumber-spring-integration) +- [Cucumber Spring Integration](https://www.baeldung.com/cucumber-spring-integration) diff --git a/spring-data-rest-querydsl/README.md b/spring-data-rest-querydsl/README.md index be47d05f8d..05ae03ab87 100644 --- a/spring-data-rest-querydsl/README.md +++ b/spring-data-rest-querydsl/README.md @@ -3,4 +3,4 @@ This module contains articles about Querydsl with Spring Data REST ### Relevant Articles: -- [REST Query Language Over Multiple Tables with Querydsl Web Support](http://www.baeldung.com/rest-querydsl-multiple-tables) +- [REST Query Language Over Multiple Tables with Querydsl Web Support](https://www.baeldung.com/rest-querydsl-multiple-tables) diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md index b12590e5e5..bae2fe8eaf 100644 --- a/spring-data-rest/README.md +++ b/spring-data-rest/README.md @@ -3,12 +3,12 @@ This module contains articles about Spring Data REST ### Relevant Articles: -- [Introduction to Spring Data REST](http://www.baeldung.com/spring-data-rest-intro) -- [Guide to Spring Data REST Validators](http://www.baeldung.com/spring-data-rest-validators) -- [Working with Relationships in Spring Data REST](http://www.baeldung.com/spring-data-rest-relationships) -- [AngularJS CRUD Application with Spring Data REST](http://www.baeldung.com/angularjs-crud-with-spring-data-rest) -- [Projections and Excerpts in Spring Data REST](http://www.baeldung.com/spring-data-rest-projections-excerpts) -- [Spring Data REST Events with @RepositoryEventHandler](http://www.baeldung.com/spring-data-rest-events) +- [Introduction to Spring Data REST](https://www.baeldung.com/spring-data-rest-intro) +- [Guide to Spring Data REST Validators](https://www.baeldung.com/spring-data-rest-validators) +- [Working with Relationships in Spring Data REST](https://www.baeldung.com/spring-data-rest-relationships) +- [AngularJS CRUD Application with Spring Data REST](https://www.baeldung.com/angularjs-crud-with-spring-data-rest) +- [Projections and Excerpts in Spring Data REST](https://www.baeldung.com/spring-data-rest-projections-excerpts) +- [Spring Data REST Events with @RepositoryEventHandler](https://www.baeldung.com/spring-data-rest-events) - [Customizing HTTP Endpoints in Spring Data REST](https://www.baeldung.com/spring-data-rest-customize-http-endpoints) - [Spring Boot with SQLite](https://www.baeldung.com/spring-boot-sqlite) - [Spring Data Web Support](https://www.baeldung.com/spring-data-web-support) @@ -24,5 +24,3 @@ The application uses [Spring Boot](http://projects.spring.io/spring-boot/), so i # Viewing the running application To view the running application, visit [http://localhost:8080](http://localhost:8080) in your browser - - diff --git a/spring-di/README.md b/spring-di/README.md index 17f50ba410..7571b12916 100644 --- a/spring-di/README.md +++ b/spring-di/README.md @@ -5,11 +5,11 @@ This module contains articles about dependency injection with Spring ### Relevant Articles - [The Spring @Qualifier Annotation](https://www.baeldung.com/spring-qualifier-annotation) -- [Constructor Dependency Injection in Spring](http://www.baeldung.com/constructor-injection-in-spring) +- [Constructor Dependency Injection in Spring](https://www.baeldung.com/constructor-injection-in-spring) - [Spring Autowiring of Generic Types](https://www.baeldung.com/spring-autowire-generics) - [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection) -- [Injecting Prototype Beans into a Singleton Instance in Spring](http://www.baeldung.com/spring-inject-prototype-bean-into-singleton) -- [@Lookup Annotation in Spring](http://www.baeldung.com/spring-lookup) -- [Controlling Bean Creation Order with @DependsOn Annotation](http://www.baeldung.com/spring-depends-on) +- [Injecting Prototype Beans into a Singleton Instance in Spring](https://www.baeldung.com/spring-inject-prototype-bean-into-singleton) +- [@Lookup Annotation in Spring](https://www.baeldung.com/spring-lookup) +- [Controlling Bean Creation Order with @DependsOn Annotation](https://www.baeldung.com/spring-depends-on) - [Unsatisfied Dependency in Spring](https://www.baeldung.com/spring-unsatisfied-dependency) -- [Circular Dependencies in Spring](http://www.baeldung.com/circular-dependencies-in-spring) +- [Circular Dependencies in Spring](https://www.baeldung.com/circular-dependencies-in-spring) diff --git a/spring-dispatcher-servlet/README.md b/spring-dispatcher-servlet/README.md index 3954d4df5a..3027546152 100644 --- a/spring-dispatcher-servlet/README.md +++ b/spring-dispatcher-servlet/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring DispatcherServlet ## Relevant articles: -- [An Intro to the Spring DispatcherServlet](http://www.baeldung.com/spring-dispatcherservlet) +- [An Intro to the Spring DispatcherServlet](https://www.baeldung.com/spring-dispatcherservlet) diff --git a/spring-drools/README.md b/spring-drools/README.md index 3685a399bc..08ab4de465 100644 --- a/spring-drools/README.md +++ b/spring-drools/README.md @@ -4,4 +4,4 @@ This modules contains articles about Spring with Drools ## Relevant articles: -- [Drools Spring Integration](http://www.baeldung.com/drools-spring-integration) +- [Drools Spring Integration](https://www.baeldung.com/drools-spring-integration) diff --git a/spring-ejb/README.md b/spring-ejb/README.md index f475aafc7f..6c63c2709f 100644 --- a/spring-ejb/README.md +++ b/spring-ejb/README.md @@ -4,10 +4,10 @@ This module contains articles about Spring with EJB ### Relevant Articles -- [Guide to EJB Set-up](http://www.baeldung.com/ejb-intro) -- [Java EE Session Beans](http://www.baeldung.com/ejb-session-beans) -- [Introduction to EJB JNDI Lookup on WildFly Application Server](http://www.baeldung.com/wildfly-ejb-jndi) -- [A Guide to Message Driven Beans in EJB](http://www.baeldung.com/ejb-message-driven-beans) -- [Integration Guide for Spring and EJB](http://www.baeldung.com/spring-ejb) -- [Singleton Session Bean in Java EE](http://www.baeldung.com/java-ee-singleton-session-bean) +- [Guide to EJB Set-up](https://www.baeldung.com/ejb-intro) +- [Java EE Session Beans](https://www.baeldung.com/ejb-session-beans) +- [Introduction to EJB JNDI Lookup on WildFly Application Server](httpss://www.baeldung.com/wildfly-ejb-jndi) +- [A Guide to Message Driven Beans in EJB](https://www.baeldung.com/ejb-message-driven-beans) +- [Integration Guide for Spring and EJB](https://www.baeldung.com/spring-ejb) +- [Singleton Session Bean in Java EE](https://www.baeldung.com/java-ee-singleton-session-bean) diff --git a/spring-exceptions/README.md b/spring-exceptions/README.md index 026e8485c8..f8c7553f05 100644 --- a/spring-exceptions/README.md +++ b/spring-exceptions/README.md @@ -3,9 +3,9 @@ This module contains articles about Spring `Exception`s ### Relevant articles: -- [Spring BeanCreationException](http://www.baeldung.com/spring-beancreationexception) -- [Spring DataIntegrityViolationException](http://www.baeldung.com/spring-dataIntegrityviolationexception) -- [Spring BeanDefinitionStoreException](http://www.baeldung.com/spring-beandefinitionstoreexception) -- [Spring NoSuchBeanDefinitionException](http://www.baeldung.com/spring-nosuchbeandefinitionexception) -- [Guide to Spring NonTransientDataAccessException](http://www.baeldung.com/nontransientdataaccessexception) -- [Hibernate Mapping Exception – Unknown Entity](http://www.baeldung.com/hibernate-mappingexception-unknown-entity) +- [Spring BeanCreationException](https://www.baeldung.com/spring-beancreationexception) +- [Spring DataIntegrityViolationException](https://www.baeldung.com/spring-dataIntegrityviolationexception) +- [Spring BeanDefinitionStoreException](https://www.baeldung.com/spring-beandefinitionstoreexception) +- [Spring NoSuchBeanDefinitionException](https://www.baeldung.com/spring-nosuchbeandefinitionexception) +- [Guide to Spring NonTransientDataAccessException](https://www.baeldung.com/nontransientdataaccessexception) +- [Hibernate Mapping Exception – Unknown Entity](https://www.baeldung.com/hibernate-mappingexception-unknown-entity) diff --git a/spring-freemarker/README.md b/spring-freemarker/README.md index ce8fb78f4d..410781f2ca 100644 --- a/spring-freemarker/README.md +++ b/spring-freemarker/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring with FreeMarker ### Relevant Articles: -- [Introduction to Using FreeMarker in Spring MVC](http://www.baeldung.com/freemarker-in-spring-mvc-tutorial) +- [Introduction to Using FreeMarker in Spring MVC](https://www.baeldung.com/freemarker-in-spring-mvc-tutorial) diff --git a/spring-integration/README.md b/spring-integration/README.md index f2fbfe48b5..2e719a8674 100644 --- a/spring-integration/README.md +++ b/spring-integration/README.md @@ -3,8 +3,8 @@ This module contains articles about Spring Integration ### Relevant Articles: -- [Introduction to Spring Integration](http://www.baeldung.com/spring-integration) -- [Security In Spring Integration](http://www.baeldung.com/spring-integration-security) +- [Introduction to Spring Integration](https://www.baeldung.com/spring-integration) +- [Security In Spring Integration](https://www.baeldung.com/spring-integration-security) - [Spring Integration Java DSL](https://www.baeldung.com/spring-integration-java-dsl) - [Using Subflows in Spring Integration](https://www.baeldung.com/spring-integration-subflows) diff --git a/spring-jenkins-pipeline/README.md b/spring-jenkins-pipeline/README.md index 0086ae256d..9182823f52 100644 --- a/spring-jenkins-pipeline/README.md +++ b/spring-jenkins-pipeline/README.md @@ -4,7 +4,7 @@ This module contains articles about Spring with Jenkins ### Relevant articles -- [Intro to Jenkins 2 and the Power of Pipelines](http://www.baeldung.com/jenkins-pipelines) +- [Intro to Jenkins 2 and the Power of Pipelines](https://www.baeldung.com/jenkins-pipelines) ## Basic CRUD API with Spring Boot @@ -27,5 +27,3 @@ $ mvn spring-boot:run -Dserver.port=8989 Now with default configurations it will be available at: [http://localhost:8080](http://localhost:8080) Enjoy it :) - - diff --git a/spring-jersey/README.md b/spring-jersey/README.md index 6adc5f1375..3c6b0577c0 100644 --- a/spring-jersey/README.md +++ b/spring-jersey/README.md @@ -3,6 +3,6 @@ This module contains articles about Spring with Jersey ## REST API with Jersey & Spring Example Project -- [REST API with Jersey and Spring](http://www.baeldung.com/jersey-rest-api-with-spring) -- [JAX-RS Client with Jersey](http://www.baeldung.com/jersey-jax-rs-client) +- [REST API with Jersey and Spring](https://www.baeldung.com/jersey-rest-api-with-spring) +- [JAX-RS Client with Jersey](https://www.baeldung.com/jersey-jax-rs-client) - [Reactive JAX-RS Client API](https://www.baeldung.com/jax-rs-reactive-client) diff --git a/spring-jinq/README.md b/spring-jinq/README.md index b2fea32123..e049dc2ba8 100644 --- a/spring-jinq/README.md +++ b/spring-jinq/README.md @@ -4,5 +4,5 @@ This module contains articles about Spring with Jinq ## Relevant articles: -- [Introduction to Jinq with Spring](http://www.baeldung.com/spring-jinq) +- [Introduction to Jinq with Spring](https://www.baeldung.com/spring-jinq) diff --git a/spring-jms/README.md b/spring-jms/README.md index ef768d086f..fdeb64953a 100644 --- a/spring-jms/README.md +++ b/spring-jms/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring with JMS ### Relevant Articles: -- [Getting Started with Spring JMS](http://www.baeldung.com/spring-jms) +- [Getting Started with Spring JMS](https://www.baeldung.com/spring-jms) diff --git a/spring-jooq/README.md b/spring-jooq/README.md index 36397fa7ed..515ab8be3c 100644 --- a/spring-jooq/README.md +++ b/spring-jooq/README.md @@ -3,8 +3,8 @@ This module contains articles about Spring with jOOQ ### Relevant Articles: -- [Spring Boot Support for jOOQ](http://www.baeldung.com/spring-boot-support-for-jooq) -- [Introduction to jOOQ with Spring](http://www.baeldung.com/jooq-with-spring) +- [Spring Boot Support for jOOQ](https://www.baeldung.com/spring-boot-support-for-jooq) +- [Introduction to jOOQ with Spring](https://www.baeldung.com/jooq-with-spring) In order to fix the error "Plugin execution not covered by lifecycle configuration: org.jooq:jooq-codegen-maven:3.7.3:generate (execution: default, phase: generate-sources)", right-click on the error message and choose "Mark goal generated as ignore in pom.xml". Until version 1.4.x, the maven-plugin-plugin was covered by the default lifecycle mapping that ships with m2e. diff --git a/spring-kafka/README.md b/spring-kafka/README.md index c04dda0a2f..f2fecde894 100644 --- a/spring-kafka/README.md +++ b/spring-kafka/README.md @@ -4,7 +4,7 @@ This module contains articles about Spring with Kafka ### Relevant articles -- [Intro to Apache Kafka with Spring](http://www.baeldung.com/spring-kafka) +- [Intro to Apache Kafka with Spring](https://www.baeldung.com/spring-kafka) ### Intro diff --git a/spring-katharsis/README.md b/spring-katharsis/README.md index c9391f7e22..d7454e6841 100644 --- a/spring-katharsis/README.md +++ b/spring-katharsis/README.md @@ -4,10 +4,8 @@ This module contains articles about Spring with Katharsis ### Relevant Articles: -- [JSON API in a Spring Application](http://www.baeldung.com/json-api-java-spring-web-app) +- [JSON API in a Spring Application](https://www.baeldung.com/json-api-java-spring-web-app) ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring - - diff --git a/spring-ldap/README.md b/spring-ldap/README.md index 3f592ab365..4872f897e1 100644 --- a/spring-ldap/README.md +++ b/spring-ldap/README.md @@ -4,5 +4,5 @@ This module contains articles about Spring LDAP ### Relevant articles -- [Spring LDAP Overview](http://www.baeldung.com/spring-ldap) -- [Guide to Spring Data LDAP](http://www.baeldung.com/spring-data-ldap) +- [Spring LDAP Overview](https://www.baeldung.com/spring-ldap) +- [Guide to Spring Data LDAP](https://www.baeldung.com/spring-data-ldap) diff --git a/spring-mobile/README.md b/spring-mobile/README.md index d4473c8c54..badd79d162 100644 --- a/spring-mobile/README.md +++ b/spring-mobile/README.md @@ -4,5 +4,5 @@ This module contains articles about Spring Mobile ## Relevant articles: -- [A Guide to Spring Mobile](http://www.baeldung.com/spring-mobile) +- [A Guide to Spring Mobile](https://www.baeldung.com/spring-mobile) diff --git a/spring-mockito/README.md b/spring-mockito/README.md index 7d7945a2fe..0ad8e05ce3 100644 --- a/spring-mockito/README.md +++ b/spring-mockito/README.md @@ -3,5 +3,5 @@ This module contains articles about Spring with Mockito ### Relevant Articles: -- [Injecting Mockito Mocks into Spring Beans](http://www.baeldung.com/injecting-mocks-in-spring) -- [Mockito ArgumentMatchers](http://www.baeldung.com/mockito-argument-matchers) +- [Injecting Mockito Mocks into Spring Beans](https://www.baeldung.com/injecting-mocks-in-spring) +- [Mockito ArgumentMatchers](https://www.baeldung.com/mockito-argument-matchers) diff --git a/spring-mvc-basics/README.md b/spring-mvc-basics/README.md index b257b3587b..a04c6e7ae7 100644 --- a/spring-mvc-basics/README.md +++ b/spring-mvc-basics/README.md @@ -7,12 +7,12 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: - [Spring MVC Tutorial](https://www.baeldung.com/spring-mvc-tutorial) -- [The Spring @Controller and @RestController Annotations](http://www.baeldung.com/spring-controller-vs-restcontroller) -- [A Guide to the ViewResolver in Spring MVC](http://www.baeldung.com/spring-mvc-view-resolver-tutorial) -- [Guide to Spring Handler Mappings](http://www.baeldung.com/spring-handler-mappings) -- [Spring MVC Content Negotiation](http://www.baeldung.com/spring-mvc-content-negotiation-json-xml) -- [Spring @RequestMapping New Shortcut Annotations](http://www.baeldung.com/spring-new-requestmapping-shortcuts) -- [Spring MVC Custom Validation](http://www.baeldung.com/spring-mvc-custom-validator) -- [Using Spring @ResponseStatus to Set HTTP Status Code](http://www.baeldung.com/spring-response-status) -- [Spring MVC and the @ModelAttribute Annotation](http://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation) -- [The HttpMediaTypeNotAcceptableException in Spring MVC](http://www.baeldung.com/spring-httpmediatypenotacceptable) \ No newline at end of file +- [The Spring @Controller and @RestController Annotations](https://www.baeldung.com/spring-controller-vs-restcontroller) +- [A Guide to the ViewResolver in Spring MVC](https://www.baeldung.com/spring-mvc-view-resolver-tutorial) +- [Guide to Spring Handler Mappings](https://www.baeldung.com/spring-handler-mappings) +- [Spring MVC Content Negotiation](https://www.baeldung.com/spring-mvc-content-negotiation-json-xml) +- [Spring @RequestMapping New Shortcut Annotations](https://www.baeldung.com/spring-new-requestmapping-shortcuts) +- [Spring MVC Custom Validation](https://www.baeldung.com/spring-mvc-custom-validator) +- [Using Spring @ResponseStatus to Set HTTP Status Code](https://www.baeldung.com/spring-response-status) +- [Spring MVC and the @ModelAttribute Annotation](https://www.baeldung.com/spring-mvc-and-the-modelattribute-annotation) +- [The HttpMediaTypeNotAcceptableException in Spring MVC](https://www.baeldung.com/spring-httpmediatypenotacceptable) diff --git a/spring-mvc-forms-jsp/README.md b/spring-mvc-forms-jsp/README.md index 941191858d..2c077f5171 100644 --- a/spring-mvc-forms-jsp/README.md +++ b/spring-mvc-forms-jsp/README.md @@ -3,7 +3,7 @@ This module contains articles about Spring MVC Forms using JSP ### Relevant Articles -- [MaxUploadSizeExceededException in Spring](http://www.baeldung.com/spring-maxuploadsizeexceeded) -- [Getting Started with Forms in Spring MVC](http://www.baeldung.com/spring-mvc-form-tutorial) -- [Form Validation with AngularJS and Spring MVC](http://www.baeldung.com/validation-angularjs-spring-mvc) -- [A Guide to the JSTL Library](http://www.baeldung.com/jstl) +- [MaxUploadSizeExceededException in Spring](https://www.baeldung.com/spring-maxuploadsizeexceeded) +- [Getting Started with Forms in Spring MVC](https://www.baeldung.com/spring-mvc-form-tutorial) +- [Form Validation with AngularJS and Spring MVC](https://www.baeldung.com/validation-angularjs-spring-mvc) +- [A Guide to the JSTL Library](https://www.baeldung.com/jstl) diff --git a/spring-mvc-forms-thymeleaf/README.md b/spring-mvc-forms-thymeleaf/README.md index 7e011bdc60..57fa32901c 100644 --- a/spring-mvc-forms-thymeleaf/README.md +++ b/spring-mvc-forms-thymeleaf/README.md @@ -4,6 +4,6 @@ This module contains articles about Spring MVC Forms using Thymeleaf ### Relevant articles -- [Session Attributes in Spring MVC](http://www.baeldung.com/spring-mvc-session-attributes) -- [Binding a List in Thymeleaf](http://www.baeldung.com/thymeleaf-list) +- [Session Attributes in Spring MVC](https://www.baeldung.com/spring-mvc-session-attributes) +- [Binding a List in Thymeleaf](https://www.baeldung.com/thymeleaf-list) diff --git a/spring-mvc-java/README.md b/spring-mvc-java/README.md index ed9ee20f66..7088162496 100644 --- a/spring-mvc-java/README.md +++ b/spring-mvc-java/README.md @@ -7,17 +7,17 @@ This module contains articles about Spring MVC with Java configuration The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Introduction to Pointcut Expressions in Spring](http://www.baeldung.com/spring-aop-pointcut-tutorial) -- [Introduction to Advice Types in Spring](http://www.baeldung.com/spring-aop-advice-tutorial) -- [Integration Testing in Spring](http://www.baeldung.com/integration-testing-in-spring) -- [A Quick Guide to Spring MVC Matrix Variables](http://www.baeldung.com/spring-mvc-matrix-variables) -- [Intro to WebSockets with Spring](http://www.baeldung.com/websockets-spring) -- [File Upload with Spring MVC](http://www.baeldung.com/spring-file-upload) -- [Introduction to HtmlUnit](http://www.baeldung.com/htmlunit) -- [Upload and Display Excel Files with Spring MVC](http://www.baeldung.com/spring-mvc-excel-files) -- [web.xml vs Initializer with Spring](http://www.baeldung.com/spring-xml-vs-java-config) -- [Spring MVC @PathVariable with a dot (.) gets truncated](http://www.baeldung.com/spring-mvc-pathvariable-dot) -- [A Quick Example of Spring Websockets’ @SendToUser Annotation](http://www.baeldung.com/spring-websockets-sendtouser) +- [Introduction to Pointcut Expressions in Spring](https://www.baeldung.com/spring-aop-pointcut-tutorial) +- [Introduction to Advice Types in Spring](https://www.baeldung.com/spring-aop-advice-tutorial) +- [Integration Testing in Spring](https://www.baeldung.com/integration-testing-in-spring) +- [A Quick Guide to Spring MVC Matrix Variables](https://www.baeldung.com/spring-mvc-matrix-variables) +- [Intro to WebSockets with Spring](https://www.baeldung.com/websockets-spring) +- [File Upload with Spring MVC](https://www.baeldung.com/spring-file-upload) +- [Introduction to HtmlUnit](https://www.baeldung.com/htmlunit) +- [Upload and Display Excel Files with Spring MVC](https://www.baeldung.com/spring-mvc-excel-files) +- [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config) +- [Spring MVC @PathVariable with a dot (.) gets truncated](https://www.baeldung.com/spring-mvc-pathvariable-dot) +- [A Quick Example of Spring Websockets’ @SendToUser Annotation](https://www.baeldung.com/spring-websockets-sendtouser) - [Working with Date Parameters in Spring](https://www.baeldung.com/spring-date-parameters) - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) - [The HttpMediaTypeNotAcceptableException in Spring MVC](https://www.baeldung.com/spring-httpmediatypenotacceptable) diff --git a/spring-mvc-kotlin/README.md b/spring-mvc-kotlin/README.md index bd0593731f..590c627cb6 100644 --- a/spring-mvc-kotlin/README.md +++ b/spring-mvc-kotlin/README.md @@ -3,7 +3,7 @@ This module contains articles about Spring MVC with Kotlin ### Relevant articles -- [Spring MVC Setup with Kotlin](http://www.baeldung.com/spring-mvc-kotlin) -- [Working with Kotlin and JPA](http://www.baeldung.com/kotlin-jpa) -- [Kotlin-allopen and Spring](http://www.baeldung.com/kotlin-allopen-spring) +- [Spring MVC Setup with Kotlin](https://www.baeldung.com/spring-mvc-kotlin) +- [Working with Kotlin and JPA](https://www.baeldung.com/kotlin-jpa) +- [Kotlin-allopen and Spring](https://www.baeldung.com/kotlin-allopen-spring) - [MockMvc Kotlin DSL](https://www.baeldung.com/mockmvc-kotlin-dsl) diff --git a/spring-mvc-simple/README.md b/spring-mvc-simple/README.md index e2068dcae0..ae03fedf3c 100644 --- a/spring-mvc-simple/README.md +++ b/spring-mvc-simple/README.md @@ -4,12 +4,12 @@ This module contains articles about Spring MVC ## Relevant articles: -- [HandlerAdapters in Spring MVC](http://www.baeldung.com/spring-mvc-handler-adapters) -- [Template Engines for Spring](http://www.baeldung.com/spring-template-engines) -- [Spring 5 and Servlet 4 – The PushBuilder](http://www.baeldung.com/spring-5-push) -- [Servlet Redirect vs Forward](http://www.baeldung.com/servlet-redirect-forward) -- [Apache Tiles Integration with Spring MVC](http://www.baeldung.com/spring-mvc-apache-tiles) -- [Guide to Spring Email](http://www.baeldung.com/spring-email) +- [HandlerAdapters in Spring MVC](https://www.baeldung.com/spring-mvc-handler-adapters) +- [Template Engines for Spring](https://www.baeldung.com/spring-template-engines) +- [Spring 5 and Servlet 4 – The PushBuilder](https://www.baeldung.com/spring-5-push) +- [Servlet Redirect vs Forward](https://www.baeldung.com/servlet-redirect-forward) +- [Apache Tiles Integration with Spring MVC](https://www.baeldung.com/spring-mvc-apache-tiles) +- [Guide to Spring Email](https://www.baeldung.com/spring-email) - [Request Method Not Supported (405) in Spring](https://www.baeldung.com/spring-request-method-not-supported-405) - [Spring @RequestParam Annotation](https://www.baeldung.com/spring-request-param) - More articles: [[more -->]](/spring-mvc-simple-2) \ No newline at end of file diff --git a/spring-mvc-velocity/README.md b/spring-mvc-velocity/README.md index fed4ce260e..99c4c032de 100644 --- a/spring-mvc-velocity/README.md +++ b/spring-mvc-velocity/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring MVC with Velocity ### Relevant Articles: -- [Quick Guide to Spring MVC with Velocity](http://www.baeldung.com/spring-mvc-with-velocity) +- [Quick Guide to Spring MVC with Velocity](https://www.baeldung.com/spring-mvc-with-velocity) diff --git a/spring-mvc-webflow/README.md b/spring-mvc-webflow/README.md index dff99ff490..f89b97963e 100644 --- a/spring-mvc-webflow/README.md +++ b/spring-mvc-webflow/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring MVC Web Flow ### Relevant Articles: -- [Guide to Spring Web Flow](http://www.baeldung.com/spring-web-flow) +- [Guide to Spring Web Flow](https://www.baeldung.com/spring-web-flow) diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index c08cfb1430..b6a34475ea 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -6,15 +6,14 @@ This module contains articles about Spring MVC with XML configuration The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Java Session Timeout](http://www.baeldung.com/servlet-session-timeout) -- [Returning Image/Media Data with Spring MVC](http://www.baeldung.com/spring-mvc-image-media-data) -- [Geolocation by IP in Java](http://www.baeldung.com/geolocation-by-ip-with-maxmind) -- [Guide to JavaServer Pages (JSP)](http://www.baeldung.com/jsp) -- [Exploring SpringMVC’s Form Tag Library](http://www.baeldung.com/spring-mvc-form-tags) -- [web.xml vs Initializer with Spring](http://www.baeldung.com/spring-xml-vs-java-config) +- [Java Session Timeout](https://www.baeldung.com/servlet-session-timeout) +- [Returning Image/Media Data with Spring MVC](https://www.baeldung.com/spring-mvc-image-media-data) +- [Geolocation by IP in Java](https://www.baeldung.com/geolocation-by-ip-with-maxmind) +- [Guide to JavaServer Pages (JSP)](https://www.baeldung.com/jsp) +- [Exploring SpringMVC’s Form Tag Library](https://www.baeldung.com/spring-mvc-form-tags) +- [web.xml vs Initializer with Spring](https://www.baeldung.com/spring-xml-vs-java-config) - [A Java Web Application Without a web.xml](https://www.baeldung.com/java-web-app-without-web-xml) - [Validating RequestParams and PathVariables in Spring](https://www.baeldung.com/spring-validate-requestparam-pathvariable) ## Spring MVC with XML Configuration Example Project - access a sample jsp page at: `http://localhost:8080/spring-mvc-xml/sample.html` - diff --git a/spring-protobuf/README.md b/spring-protobuf/README.md index d8737014a7..37f35808e1 100644 --- a/spring-protobuf/README.md +++ b/spring-protobuf/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring with Protocol Buffers ### Relevant Articles: -- [Spring REST API with Protocol Buffers](http://www.baeldung.com/spring-rest-api-with-protocol-buffers) +- [Spring REST API with Protocol Buffers](https://www.baeldung.com/spring-rest-api-with-protocol-buffers) diff --git a/spring-quartz/README.md b/spring-quartz/README.md index 45e20f6076..d9257066d4 100644 --- a/spring-quartz/README.md +++ b/spring-quartz/README.md @@ -3,7 +3,7 @@ This module contains articles about Spring with Quartz ### Relevant Articles: -- [Scheduling in Spring with Quartz](http://www.baeldung.com/spring-quartz-schedule) +- [Scheduling in Spring with Quartz](https://www.baeldung.com/spring-quartz-schedule) ## #Scheduling in Spring with Quartz Example Project @@ -23,5 +23,3 @@ This is the first example where we configure a basic scheduler. - To configure scheduler using Quartz API: `using.spring.schedulerFactory=false` - - diff --git a/spring-reactive-kotlin/README.md b/spring-reactive-kotlin/README.md index 46f4b580fd..629f7e7f58 100644 --- a/spring-reactive-kotlin/README.md +++ b/spring-reactive-kotlin/README.md @@ -3,4 +3,4 @@ This module contains articles about reactive Kotlin ### Relevant Articles: -- [Spring Webflux with Kotlin](http://www.baeldung.com/spring-webflux-kotlin) +- [Spring Webflux with Kotlin](https://www.baeldung.com/spring-webflux-kotlin) diff --git a/spring-reactor/README.md b/spring-reactor/README.md index e7d7eb927d..b92478f6fb 100644 --- a/spring-reactor/README.md +++ b/spring-reactor/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring Reactor ## Relevant articles: -- [Introduction to Spring Reactor](http://www.baeldung.com/spring-reactor) +- [Introduction to Spring Reactor](https://www.baeldung.com/spring-reactor) diff --git a/spring-remoting/README.md b/spring-remoting/README.md index 247aa52db2..a98893ebcb 100644 --- a/spring-remoting/README.md +++ b/spring-remoting/README.md @@ -3,11 +3,11 @@ This module contains articles about Spring Remoting ### Relevant Articles -- [Intro to Spring Remoting with HTTP Invokers](http://www.baeldung.com/spring-remoting-http-invoker) -- [Spring Remoting with Hessian and Burlap](http://www.baeldung.com/spring-remoting-hessian-burlap) -- [Spring Remoting with AMQP](http://www.baeldung.com/spring-remoting-amqp) -- [Spring Remoting with JMS and ActiveMQ](http://www.baeldung.com/spring-remoting-jms) -- [Spring Remoting with RMI](http://www.baeldung.com/spring-remoting-rmi) +- [Intro to Spring Remoting with HTTP Invokers](https://www.baeldung.com/spring-remoting-http-invoker) +- [Spring Remoting with Hessian and Burlap](https://www.baeldung.com/spring-remoting-hessian-burlap) +- [Spring Remoting with AMQP](https://www.baeldung.com/spring-remoting-amqp) +- [Spring Remoting with JMS and ActiveMQ](https://www.baeldung.com/spring-remoting-jms) +- [Spring Remoting with RMI](https://www.baeldung.com/spring-remoting-rmi) ### Overview This Maven project contains the Java source code for various modules used in the Spring Remoting series of articles. diff --git a/spring-rest-angular/README.md b/spring-rest-angular/README.md index 5cd2570152..038160db9d 100644 --- a/spring-rest-angular/README.md +++ b/spring-rest-angular/README.md @@ -4,4 +4,4 @@ This module contains articles about REST APIs with Spring and Angular ### Relevant Articles: -- [Pagination with Spring REST and AngularJS table](http://www.baeldung.com/pagination-with-a-spring-rest-api-and-an-angularjs-table) +- [Pagination with Spring REST and AngularJS table](https://www.baeldung.com/pagination-with-a-spring-rest-api-and-an-angularjs-table) diff --git a/spring-rest-full/README.md b/spring-rest-full/README.md index a0e6e74179..a0ba8df27d 100644 --- a/spring-rest-full/README.md +++ b/spring-rest-full/README.md @@ -9,9 +9,9 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Integration Testing with the Maven Cargo plugin](http://www.baeldung.com/integration-testing-with-the-maven-cargo-plugin) -- [Project Configuration with Spring](http://www.baeldung.com/project-configuration-with-spring) -- [Metrics for your Spring REST API](http://www.baeldung.com/spring-rest-api-metrics) +- [Integration Testing with the Maven Cargo plugin](https://www.baeldung.com/integration-testing-with-the-maven-cargo-plugin) +- [Project Configuration with Spring](https://www.baeldung.com/project-configuration-with-spring) +- [Metrics for your Spring REST API](https://www.baeldung.com/spring-rest-api-metrics) - [Spring Security Expressions - hasRole Example](https://www.baeldung.com/spring-security-expressions-basic) diff --git a/spring-rest-hal-browser/README.md b/spring-rest-hal-browser/README.md index 027937f116..90337aad1a 100644 --- a/spring-rest-hal-browser/README.md +++ b/spring-rest-hal-browser/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring REST with the HAL browser ### Relevant Articles: -- [Spring REST and HAL Browser](http://www.baeldung.com/spring-rest-hal) +- [Spring REST and HAL Browser](https://www.baeldung.com/spring-rest-hal) diff --git a/spring-rest-query-language/README.md b/spring-rest-query-language/README.md index 383cecec36..4458fc93fb 100644 --- a/spring-rest-query-language/README.md +++ b/spring-rest-query-language/README.md @@ -10,12 +10,12 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [REST Query Language with Spring and JPA Criteria](http://www.baeldung.com/rest-search-language-spring-jpa-criteria) -- [REST Query Language with Spring Data JPA Specifications](http://www.baeldung.com/rest-api-search-language-spring-data-specifications) -- [REST Query Language with Spring Data JPA and QueryDSL](http://www.baeldung.com/rest-api-search-language-spring-data-querydsl) -- [REST Query Language – Advanced Search Operations](http://www.baeldung.com/rest-api-query-search-language-more-operations) -- [REST Query Language with RSQL](http://www.baeldung.com/rest-api-search-language-rsql-fiql) -- [REST Query Language – Implementing OR Operation](http://www.baeldung.com/rest-api-query-search-or-operation) +- [REST Query Language with Spring and JPA Criteria](https://www.baeldung.com/rest-search-language-spring-jpa-criteria) +- [REST Query Language with Spring Data JPA Specifications](https://www.baeldung.com/rest-api-search-language-spring-data-specifications) +- [REST Query Language with Spring Data JPA and QueryDSL](https://www.baeldung.com/rest-api-search-language-spring-data-querydsl) +- [REST Query Language – Advanced Search Operations](https://www.baeldung.com/rest-api-query-search-language-more-operations) +- [REST Query Language with RSQL](https://www.baeldung.com/rest-api-search-language-rsql-fiql) +- [REST Query Language – Implementing OR Operation](https://www.baeldung.com/rest-api-query-search-or-operation) ### Build the Project ``` diff --git a/spring-rest-shell/README.md b/spring-rest-shell/README.md index 0b126e6b1c..3c04bb457e 100644 --- a/spring-rest-shell/README.md +++ b/spring-rest-shell/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring REST Shell ### Relevant Articles -- [Introduction to Spring REST Shell](http://www.baeldung.com/spring-rest-shell) +- [Introduction to Spring REST Shell](https://www.baeldung.com/spring-rest-shell) diff --git a/spring-rest-simple/README.md b/spring-rest-simple/README.md index d60f57b227..1ad32bf120 100644 --- a/spring-rest-simple/README.md +++ b/spring-rest-simple/README.md @@ -4,9 +4,9 @@ This module contains articles about REST APIs in Spring ## Relevant articles: -- [Guide to UriComponentsBuilder in Spring](http://www.baeldung.com/spring-uricomponentsbuilder) -- [Returning Custom Status Codes from Spring Controllers](http://www.baeldung.com/spring-mvc-controller-custom-http-status-code) -- [Spring RequestMapping](http://www.baeldung.com/spring-requestmapping) -- [Spring and Apache FileUpload](http://www.baeldung.com/spring-apache-file-upload) -- [Test a REST API with curl](http://www.baeldung.com/curl-rest) +- [Guide to UriComponentsBuilder in Spring](https://www.baeldung.com/spring-uricomponentsbuilder) +- [Returning Custom Status Codes from Spring Controllers](https://www.baeldung.com/spring-mvc-controller-custom-http-status-code) +- [Spring RequestMapping](https://www.baeldung.com/spring-requestmapping) +- [Spring and Apache FileUpload](https://www.baeldung.com/spring-apache-file-upload) +- [Test a REST API with curl](https://www.baeldung.com/curl-rest) - [CORS with Spring](https://www.baeldung.com/spring-cors) diff --git a/spring-rest/README.md b/spring-rest/README.md index 1d713c05c0..ac12066e8f 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -6,20 +6,20 @@ This module contains articles about REST APIs with Spring The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Spring @RequestMapping](http://www.baeldung.com/spring-requestmapping) -- [Returning Custom Status Codes from Spring Controllers](http://www.baeldung.com/spring-mvc-controller-custom-http-status-code) -- [Binary Data Formats in a Spring REST API](http://www.baeldung.com/spring-rest-api-with-binary-data-formats) -- [Guide to UriComponentsBuilder in Spring](http://www.baeldung.com/spring-uricomponentsbuilder) -- [Introduction to FindBugs](http://www.baeldung.com/intro-to-findbugs) -- [A Custom Media Type for a Spring REST API](http://www.baeldung.com/spring-rest-custom-media-type) -- [HTTP PUT vs HTTP PATCH in a REST API](http://www.baeldung.com/http-put-patch-difference-spring) -- [Spring – Log Incoming Requests](http://www.baeldung.com/spring-http-logging) -- [Introduction to CheckStyle](http://www.baeldung.com/checkstyle-java) -- [How to Change the Default Port in Spring Boot](http://www.baeldung.com/spring-boot-change-port) -- [Guide to DeferredResult in Spring](http://www.baeldung.com/spring-deferred-result) -- [Spring Custom Property Editor](http://www.baeldung.com/spring-mvc-custom-property-editor) -- [Using the Spring RestTemplate Interceptor](http://www.baeldung.com/spring-rest-template-interceptor) -- [Get and Post Lists of Objects with RestTemplate](http://www.baeldung.com/spring-rest-template-list) -- [How to Set a Header on a Response with Spring 5](http://www.baeldung.com/spring-response-header) -- [Uploading MultipartFile with Spring RestTemplate](http://www.baeldung.com/spring-rest-template-multipart-upload) -- [Download an Image or a File with Spring MVC](http://www.baeldung.com/spring-controller-return-image-file) +- [Spring @RequestMapping](https://www.baeldung.com/spring-requestmapping) +- [Returning Custom Status Codes from Spring Controllers](https://www.baeldung.com/spring-mvc-controller-custom-http-status-code) +- [Binary Data Formats in a Spring REST API](https://www.baeldung.com/spring-rest-api-with-binary-data-formats) +- [Guide to UriComponentsBuilder in Spring](https://www.baeldung.com/spring-uricomponentsbuilder) +- [Introduction to FindBugs](https://www.baeldung.com/intro-to-findbugs) +- [A Custom Media Type for a Spring REST API](https://www.baeldung.com/spring-rest-custom-media-type) +- [HTTP PUT vs HTTP PATCH in a REST API](https://www.baeldung.com/http-put-patch-difference-spring) +- [Spring – Log Incoming Requests](https://www.baeldung.com/spring-http-logging) +- [Introduction to CheckStyle](https://www.baeldung.com/checkstyle-java) +- [How to Change the Default Port in Spring Boot](https://www.baeldung.com/spring-boot-change-port) +- [Guide to DeferredResult in Spring](https://www.baeldung.com/spring-deferred-result) +- [Spring Custom Property Editor](https://www.baeldung.com/spring-mvc-custom-property-editor) +- [Using the Spring RestTemplate Interceptor](https://www.baeldung.com/spring-rest-template-interceptor) +- [Get and Post Lists of Objects with RestTemplate](https://www.baeldung.com/spring-rest-template-list) +- [How to Set a Header on a Response with Spring 5](https://www.baeldung.com/spring-response-header) +- [Uploading MultipartFile with Spring RestTemplate](https://www.baeldung.com/spring-rest-template-multipart-upload) +- [Download an Image or a File with Spring MVC](https://www.baeldung.com/spring-controller-return-image-file) diff --git a/spring-resttemplate/README.md b/spring-resttemplate/README.md index 9b75e1aa81..e98af0e787 100644 --- a/spring-resttemplate/README.md +++ b/spring-resttemplate/README.md @@ -6,10 +6,10 @@ This module contains articles about Spring RestTemplate The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [The Guide to RestTemplate](http://www.baeldung.com/rest-template) -- [Exploring the Spring Boot TestRestTemplate](http://www.baeldung.com/spring-boot-testresttemplate) -- [Spring RestTemplate Error Handling](http://www.baeldung.com/spring-rest-template-error-handling) -- [Configure a RestTemplate with RestTemplateBuilder](http://www.baeldung.com/spring-rest-template-builder) +- [The Guide to RestTemplate](https://www.baeldung.com/rest-template) +- [Exploring the Spring Boot TestRestTemplate](https://www.baeldung.com/spring-boot-testresttemplate) +- [Spring RestTemplate Error Handling](https://www.baeldung.com/spring-rest-template-error-handling) +- [Configure a RestTemplate with RestTemplateBuilder](https://www.baeldung.com/spring-rest-template-builder) - [Mocking a RestTemplate in Spring](https://www.baeldung.com/spring-mock-rest-template) - [RestTemplate Post Request with JSON](https://www.baeldung.com/spring-resttemplate-post-json) - [Download a Large File Through a Spring RestTemplate](https://www.baeldung.com/spring-resttemplate-download-large-file) diff --git a/spring-roo/README.md b/spring-roo/README.md index 5a8ce6e30f..abbc4249d4 100644 --- a/spring-roo/README.md +++ b/spring-roo/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring Roo ### Relevant Articles: -[Quick Guide to Spring Roo](http://www.baeldung.com/spring-roo) +[Quick Guide to Spring Roo](https://www.baeldung.com/spring-roo) diff --git a/spring-security-acl/README.md b/spring-security-acl/README.md index 2f95793f8d..b2f42d5c29 100644 --- a/spring-security-acl/README.md +++ b/spring-security-acl/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring Security ACL ### Relevant Articles -- [Introduction to Spring Security ACL](http://www.baeldung.com/spring-security-acl) +- [Introduction to Spring Security ACL](https://www.baeldung.com/spring-security-acl) diff --git a/spring-security-cache-control/README.md b/spring-security-cache-control/README.md index fc5bdda1f6..1c7cbfd096 100644 --- a/spring-security-cache-control/README.md +++ b/spring-security-cache-control/README.md @@ -3,4 +3,4 @@ This module contains articles about cache control with Spring Security ### Relevant Articles: -- [Spring Security – Cache Control Headers](http://www.baeldung.com/spring-security-cache-control-headers) +- [Spring Security – Cache Control Headers](https://www.baeldung.com/spring-security-cache-control-headers) diff --git a/spring-security-core/README.md b/spring-security-core/README.md index 3dfcb276d7..3579e5e759 100644 --- a/spring-security-core/README.md +++ b/spring-security-core/README.md @@ -3,9 +3,9 @@ This module contains articles about core Spring Security ### Relevant Articles: -- [Spring Security – @PreFilter and @PostFilter](http://www.baeldung.com/spring-security-prefilter-postfilter) -- [Spring Boot Authentication Auditing Support](http://www.baeldung.com/spring-boot-authentication-audit) -- [Introduction to Spring Method Security](http://www.baeldung.com/spring-security-method-security) +- [Spring Security – @PreFilter and @PostFilter](https://www.baeldung.com/spring-security-prefilter-postfilter) +- [Spring Boot Authentication Auditing Support](https://www.baeldung.com/spring-boot-authentication-audit) +- [Introduction to Spring Method Security](https://www.baeldung.com/spring-security-method-security) - [Overview and Need for DelegatingFilterProxy in Spring](https://www.baeldung.com/spring-delegating-filter-proxy) ### @PreFilter and @PostFilter annotations @@ -13,5 +13,3 @@ This module contains articles about core Spring Security #### Build the Project `mvn clean install` - - diff --git a/spring-security-mvc-boot/README.md b/spring-security-mvc-boot/README.md index 150ea3eee9..7dcfe4d70f 100644 --- a/spring-security-mvc-boot/README.md +++ b/spring-security-mvc-boot/README.md @@ -6,13 +6,13 @@ This module contains articles about Spring Security with Spring MVC in Boot appl The "REST With Spring" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [A Custom Security Expression with Spring Security](http://www.baeldung.com/spring-security-create-new-custom-security-expression) -- [Custom AccessDecisionVoters in Spring Security](http://www.baeldung.com/spring-security-custom-voter) -- [Spring Security: Authentication with a Database-backed UserDetailsService](http://www.baeldung.com/spring-security-authentication-with-a-database) -- [Two Login Pages with Spring Security](http://www.baeldung.com/spring-security-two-login-pages) -- [Multiple Entry Points in Spring Security](http://www.baeldung.com/spring-security-multiple-entry-points) -- [Multiple Authentication Providers in Spring Security](http://www.baeldung.com/spring-security-multiple-auth-providers) -- [Granted Authority Versus Role in Spring Security](http://www.baeldung.com/spring-security-granted-authority-vs-role) +- [A Custom Security Expression with Spring Security](https://www.baeldung.com/spring-security-create-new-custom-security-expression) +- [Custom AccessDecisionVoters in Spring Security](https://www.baeldung.com/spring-security-custom-voter) +- [Spring Security: Authentication with a Database-backed UserDetailsService](https://www.baeldung.com/spring-security-authentication-with-a-database) +- [Two Login Pages with Spring Security](https://www.baeldung.com/spring-security-two-login-pages) +- [Multiple Entry Points in Spring Security](https://www.baeldung.com/spring-security-multiple-entry-points) +- [Multiple Authentication Providers in Spring Security](https://www.baeldung.com/spring-security-multiple-auth-providers) +- [Granted Authority Versus Role in Spring Security](https://www.baeldung.com/spring-security-granted-authority-vs-role) - [Spring Data with Spring Security](https://www.baeldung.com/spring-data-security) - [Spring Security – Whitelist IP Range](https://www.baeldung.com/spring-security-whitelist-ip-range) - [Find the Registered Spring Security Filters](https://www.baeldung.com/spring-security-registered-filters) diff --git a/spring-security-mvc-custom/README.md b/spring-security-mvc-custom/README.md index 84bdec3c10..1a131f4c23 100644 --- a/spring-security-mvc-custom/README.md +++ b/spring-security-mvc-custom/README.md @@ -6,13 +6,13 @@ This module contains articles about Spring Security with custom MVC applications The "REST With Spring" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring Security Remember Me](http://www.baeldung.com/spring-security-remember-me) -- [Redirect to different pages after Login with Spring Security](http://www.baeldung.com/spring_redirect_after_login) -- [Changing Spring Model Parameters with Handler Interceptor](http://www.baeldung.com/spring-model-parameters-with-handler-interceptor) -- [Introduction to Spring MVC HandlerInterceptor](http://www.baeldung.com/spring-mvc-handlerinterceptor) -- [Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions](http://www.baeldung.com/spring-mvc-custom-handler-interceptor) -- [A Guide to CSRF Protection in Spring Security](http://www.baeldung.com/spring-security-csrf) -- [How to Manually Authenticate User with Spring Security](http://www.baeldung.com/manually-set-user-authentication-spring-security) +- [Spring Security Remember Me](https://www.baeldung.com/spring-security-remember-me) +- [Redirect to different pages after Login with Spring Security](https://www.baeldung.com/spring_redirect_after_login) +- [Changing Spring Model Parameters with Handler Interceptor](https://www.baeldung.com/spring-model-parameters-with-handler-interceptor) +- [Introduction to Spring MVC HandlerInterceptor](https://www.baeldung.com/spring-mvc-handlerinterceptor) +- [Using a Custom Spring MVC’s Handler Interceptor to Manage Sessions](https://www.baeldung.com/spring-mvc-custom-handler-interceptor) +- [A Guide to CSRF Protection in Spring Security](https://www.baeldung.com/spring-security-csrf) +- [How to Manually Authenticate User with Spring Security](https://www.baeldung.com/manually-set-user-authentication-spring-security) ### Build the Project ``` diff --git a/spring-security-mvc-digest-auth/README.md b/spring-security-mvc-digest-auth/README.md index da612e273b..0d36dbfd63 100644 --- a/spring-security-mvc-digest-auth/README.md +++ b/spring-security-mvc-digest-auth/README.md @@ -6,6 +6,6 @@ This module contains articles about digest authentication with Spring Security The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Article: -- [Spring Security Digest Authentication](http://www.baeldung.com/spring-security-digest-authentication) -- [RestTemplate with Digest Authentication](http://www.baeldung.com/resttemplate-digest-authentication) +- [Spring Security Digest Authentication](https://www.baeldung.com/spring-security-digest-authentication) +- [RestTemplate with Digest Authentication](https://www.baeldung.com/resttemplate-digest-authentication) diff --git a/spring-security-mvc-ldap/README.md b/spring-security-mvc-ldap/README.md index fe04cd23fa..3230c0398a 100644 --- a/spring-security-mvc-ldap/README.md +++ b/spring-security-mvc-ldap/README.md @@ -6,8 +6,8 @@ This module contains articles about Spring Security LDAP The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Article: -- [Spring Security – security none, filters none, access permitAll](http://www.baeldung.com/security-none-filters-none-access-permitAll) -- [Intro to Spring Security LDAP](http://www.baeldung.com/spring-security-ldap) +- [Spring Security – security none, filters none, access permitAll](https://www.baeldung.com/security-none-filters-none-access-permitAll) +- [Intro to Spring Security LDAP](https://www.baeldung.com/spring-security-ldap) ### Notes - the project uses Spring Boot - simply run 'SampleLDAPApplication.java' to start up Spring Boot with a Tomcat container and embedded LDAP server. diff --git a/spring-security-mvc-login/README.md b/spring-security-mvc-login/README.md index a20a04edec..5d92a8e1b4 100644 --- a/spring-security-mvc-login/README.md +++ b/spring-security-mvc-login/README.md @@ -6,13 +6,13 @@ This module contains articles about login mechanisms with Spring Security The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring Security Form Login](http://www.baeldung.com/spring-security-login) -- [Spring Security Logout](http://www.baeldung.com/spring-security-logout) -- [Spring Security Expressions – hasRole Example](http://www.baeldung.com/spring-security-expressions-basic) -- [Spring HTTP/HTTPS Channel Security](http://www.baeldung.com/spring-channel-security-https) -- [Spring Security – Customize the 403 Forbidden/Access Denied Page](http://www.baeldung.com/spring-security-custom-access-denied-page) -- [Spring Security – Redirect to the Previous URL After Login](http://www.baeldung.com/spring-security-redirect-login) -- [Spring Security Custom AuthenticationFailureHandler](http://www.baeldung.com/spring-security-custom-authentication-failure-handler) +- [Spring Security Form Login](https://www.baeldung.com/spring-security-login) +- [Spring Security Logout](https://www.baeldung.com/spring-security-logout) +- [Spring Security Expressions – hasRole Example](https://www.baeldung.com/spring-security-expressions-basic) +- [Spring HTTP/HTTPS Channel Security](https://www.baeldung.com/spring-channel-security-https) +- [Spring Security – Customize the 403 Forbidden/Access Denied Page](https://www.baeldung.com/spring-security-custom-access-denied-page) +- [Spring Security – Redirect to the Previous URL After Login](https://www.baeldung.com/spring-security-redirect-login) +- [Spring Security Custom AuthenticationFailureHandler](https://www.baeldung.com/spring-security-custom-authentication-failure-handler) ### Build the Project ``` diff --git a/spring-security-mvc-persisted-remember-me/README.md b/spring-security-mvc-persisted-remember-me/README.md index 260e55198a..e3003e89e2 100644 --- a/spring-security-mvc-persisted-remember-me/README.md +++ b/spring-security-mvc-persisted-remember-me/README.md @@ -6,7 +6,7 @@ This module contains articles about 'remember me' with Spring Security The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring Security – Persistent Remember Me](http://www.baeldung.com/spring-security-persistent-remember-me) +- [Spring Security – Persistent Remember Me](https://www.baeldung.com/spring-security-persistent-remember-me) ### Build the Project ``` diff --git a/spring-security-mvc-socket/README.md b/spring-security-mvc-socket/README.md index 187bbe82b0..d134d19c84 100644 --- a/spring-security-mvc-socket/README.md +++ b/spring-security-mvc-socket/README.md @@ -4,7 +4,7 @@ This module contains articles about WebSockets with Spring Security ### Relevant Articles: -- [Intro to Security and WebSockets](http://www.baeldung.com/spring-security-websockets) +- [Intro to Security and WebSockets](https://www.baeldung.com/spring-security-websockets) - [Spring WebSockets: Build an User Chat](https://www.baeldung.com/spring-websockets-send-message-to-user) - [REST vs WebSockets](https://www.baeldung.com/rest-vs-websockets) @@ -15,5 +15,3 @@ To build the project, run the command: mvn clean install. This will build a war Alternatively, run the project from an IDE. To login, use credentials from the data.sql file in src/main/resource, eg: user/password. - - diff --git a/spring-security-mvc/README.md b/spring-security-mvc/README.md index ad55e903c5..a458127c61 100644 --- a/spring-security-mvc/README.md +++ b/spring-security-mvc/README.md @@ -6,8 +6,8 @@ This module contains articles about Spring Security in MVC applications The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [HttpSessionListener Example – Monitoring](http://www.baeldung.com/httpsessionlistener_with_metrics) -- [Control the Session with Spring Security](http://www.baeldung.com/spring-security-session) +- [HttpSessionListener Example – Monitoring](https://www.baeldung.com/httpsessionlistener_with_metrics) +- [Control the Session with Spring Security](https://www.baeldung.com/spring-security-session) ### Build the Project diff --git a/spring-security-openid/README.md b/spring-security-openid/README.md index 1512ffbde5..1f856fe191 100644 --- a/spring-security-openid/README.md +++ b/spring-security-openid/README.md @@ -4,7 +4,7 @@ This module contains articles about OpenID with Spring Security ### Relevant articles -- [Spring Security and OpenID Connect](http://www.baeldung.com/spring-security-openid-connect) +- [Spring Security and OpenID Connect](https://www.baeldung.com/spring-security-openid-connect) ### OpenID Connect with Spring Security diff --git a/spring-security-react/README.md b/spring-security-react/README.md index 4eb402c699..6c9e1dad7a 100644 --- a/spring-security-react/README.md +++ b/spring-security-react/README.md @@ -8,7 +8,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -* [Spring Security Login Page with React](http://www.baeldung.com/spring-security-login-react) +* [Spring Security Login Page with React](https://www.baeldung.com/spring-security-login-react) ### Build the Project diff --git a/spring-security-rest-basic-auth/README.md b/spring-security-rest-basic-auth/README.md index 41d463f1e2..d12427a106 100644 --- a/spring-security-rest-basic-auth/README.md +++ b/spring-security-rest-basic-auth/README.md @@ -7,6 +7,6 @@ This module contains articles about basic authentication in RESTful APIs with Sp The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Basic Authentication with the RestTemplate](http://www.baeldung.com/how-to-use-resttemplate-with-basic-authentication-in-spring) -- [A Custom Filter in the Spring Security Filter Chain](http://www.baeldung.com/spring-security-custom-filter) -- [Spring Security Basic Authentication](http://www.baeldung.com/spring-security-basic-authentication) +- [Basic Authentication with the RestTemplate](https://www.baeldung.com/how-to-use-resttemplate-with-basic-authentication-in-spring) +- [A Custom Filter in the Spring Security Filter Chain](https://www.baeldung.com/spring-security-custom-filter) +- [Spring Security Basic Authentication](https://www.baeldung.com/spring-security-basic-authentication) diff --git a/spring-security-rest-custom/README.md b/spring-security-rest-custom/README.md index 846093b554..15cbc22b5f 100644 --- a/spring-security-rest-custom/README.md +++ b/spring-security-rest-custom/README.md @@ -6,6 +6,6 @@ This module contains articles about REST APIs with Spring Security The "REST With Spring" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring Security Authentication Provider](http://www.baeldung.com/spring-security-authentication-provider) -- [Retrieve User Information in Spring Security](http://www.baeldung.com/get-user-in-spring-security) +- [Spring Security Authentication Provider](https://www.baeldung.com/spring-security-authentication-provider) +- [Retrieve User Information in Spring Security](https://www.baeldung.com/get-user-in-spring-security) - [Spring Security – Run-As Authentication](https://www.baeldung.com/spring-security-run-as-auth) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index c7ac45e38f..d61a52070c 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -8,10 +8,10 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: -- [Spring REST Service Security](http://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/) -- [Setting Up Swagger 2 with a Spring REST API](http://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) -- [Custom Error Message Handling for REST API](http://www.baeldung.com/global-error-handler-in-a-spring-rest-api) -- [Spring Security Context Propagation with @Async](http://www.baeldung.com/spring-security-async-principal-propagation) -- [Servlet 3 Async Support with Spring MVC and Spring Security](http://www.baeldung.com/spring-mvc-async-security) -- [Intro to Spring Security Expressions](http://www.baeldung.com/spring-security-expressions) -- [Spring Security for a REST API](http://www.baeldung.com/securing-a-restful-web-service-with-spring-security) +- [Spring REST Service Security](https://www.baeldung.com/2011/10/31/securing-a-restful-web-service-with-spring-security-3-1-part-3/) +- [Setting Up Swagger 2 with a Spring REST API](https://www.baeldung.com/swagger-2-documentation-for-spring-rest-api) +- [Custom Error Message Handling for REST API](https://www.baeldung.com/global-error-handler-in-a-spring-rest-api) +- [Spring Security Context Propagation with @Async](https://www.baeldung.com/spring-security-async-principal-propagation) +- [Servlet 3 Async Support with Spring MVC and Spring Security](https://www.baeldung.com/spring-mvc-async-security) +- [Intro to Spring Security Expressions](https://www.baeldung.com/spring-security-expressions) +- [Spring Security for a REST API](https://www.baeldung.com/securing-a-restful-web-service-with-spring-security) diff --git a/spring-security-sso/README.md b/spring-security-sso/README.md index 31694bee45..23b53521be 100644 --- a/spring-security-sso/README.md +++ b/spring-security-sso/README.md @@ -3,5 +3,5 @@ This module contains modules about single-sign-on with Spring Security ### Relevant Articles: -- [Simple Single Sign-On with Spring Security OAuth2](http://www.baeldung.com/sso-spring-security-oauth2) +- [Simple Single Sign-On with Spring Security OAuth2](https://www.baeldung.com/sso-spring-security-oauth2) - [Spring Security Kerberos Integration](https://www.baeldung.com/spring-security-kerberos-integration) diff --git a/spring-security-stormpath/README.md b/spring-security-stormpath/README.md index abd65294a3..971d4cc858 100644 --- a/spring-security-stormpath/README.md +++ b/spring-security-stormpath/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring Security with Stormpath ### Relevant articles -- [Spring Security with Stormpath](http://www.baeldung.com/spring-security-stormpath) +- [Spring Security with Stormpath](https://www.baeldung.com/spring-security-stormpath) diff --git a/spring-security-thymeleaf/README.MD b/spring-security-thymeleaf/README.MD index 67b811fac8..2ad7b9d2bd 100644 --- a/spring-security-thymeleaf/README.MD +++ b/spring-security-thymeleaf/README.MD @@ -4,4 +4,4 @@ This module contains articles about Spring Security with Thymeleaf ### Relevant Articles: -- [Spring Security with Thymeleaf](http://www.baeldung.com/spring-security-thymeleaf) +- [Spring Security with Thymeleaf](https://www.baeldung.com/spring-security-thymeleaf) diff --git a/spring-security-x509/README.md b/spring-security-x509/README.md index 2c0e25a229..b1eb0debf5 100644 --- a/spring-security-x509/README.md +++ b/spring-security-x509/README.md @@ -3,4 +3,4 @@ This module contains articles about X.509 authentication with Spring Security ### Relevant Articles: -- [X.509 Authentication in Spring Security](http://www.baeldung.com/x-509-authentication-in-spring-security) +- [X.509 Authentication in Spring Security](https://www.baeldung.com/x-509-authentication-in-spring-security) diff --git a/spring-sleuth/README.md b/spring-sleuth/README.md index 692fbaa8b7..ebaebde6c9 100644 --- a/spring-sleuth/README.md +++ b/spring-sleuth/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring Cloud Sleuth ### Relevant articles: -- [Spring Cloud Sleuth in a Monolith Application](http://www.baeldung.com/spring-cloud-sleuth-single-application) +- [Spring Cloud Sleuth in a Monolith Application](https://www.baeldung.com/spring-cloud-sleuth-single-application) diff --git a/spring-social-login/README.md b/spring-social-login/README.md index c3ca867a95..2d97584e62 100644 --- a/spring-social-login/README.md +++ b/spring-social-login/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring Social ### Relevant Articles: -- [A Secondary Facebook Login with Spring Social](http://www.baeldung.com/facebook-authentication-with-spring-security-and-social) +- [A Secondary Facebook Login with Spring Social](https://www.baeldung.com/facebook-authentication-with-spring-security-and-social) diff --git a/spring-spel/README.md b/spring-spel/README.md index f81d304e1a..2a1d900e38 100644 --- a/spring-spel/README.md +++ b/spring-spel/README.md @@ -3,4 +3,4 @@ This module contains articles about the Spring Expression Language (SpEL) ### Relevant Articles: -- [Spring Expression Language Guide](http://www.baeldung.com/spring-expression-language) +- [Spring Expression Language Guide](https://www.baeldung.com/spring-expression-language) diff --git a/spring-state-machine/README.md b/spring-state-machine/README.md index f80ef34ef8..dadb628572 100644 --- a/spring-state-machine/README.md +++ b/spring-state-machine/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring State Machine ### Relevant articles -- [A Guide to the Spring State Machine Project](http://www.baeldung.com/spring-state-machine) +- [A Guide to the Spring State Machine Project](https://www.baeldung.com/spring-state-machine) diff --git a/spring-static-resources/README.md b/spring-static-resources/README.md index 8d77e6fe94..206421ed0e 100644 --- a/spring-static-resources/README.md +++ b/spring-static-resources/README.md @@ -3,7 +3,7 @@ This module contains articles about static resources with Spring ### Relevant Articles: -- [Cachable Static Assets with Spring MVC](http://www.baeldung.com/cachable-static-assets-with-spring-mvc) -- [Minification of JS and CSS Assets with Maven](http://www.baeldung.com/maven-minification-of-js-and-css-assets) -- [Serve Static Resources with Spring](http://www.baeldung.com/spring-mvc-static-resources) +- [Cachable Static Assets with Spring MVC](https://www.baeldung.com/cachable-static-assets-with-spring-mvc) +- [Minification of JS and CSS Assets with Maven](https://www.baeldung.com/maven-minification-of-js-and-css-assets) +- [Serve Static Resources with Spring](https://www.baeldung.com/spring-mvc-static-resources) - [Load a Resource as a String in Spring](https://www.baeldung.com/spring-load-resource-as-string) diff --git a/spring-swagger-codegen/README.md b/spring-swagger-codegen/README.md index dbcf2b3e8d..e375ae7594 100644 --- a/spring-swagger-codegen/README.md +++ b/spring-swagger-codegen/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring with Swagger CodeGen ### Relevant articles -- [Generate Spring Boot REST Client with Swagger](http://www.baeldung.com/spring-boot-rest-client-swagger-codegen) +- [Generate Spring Boot REST Client with Swagger](https://www.baeldung.com/spring-boot-rest-client-swagger-codegen) diff --git a/spring-thymeleaf/README.md b/spring-thymeleaf/README.md index 88f3e35f8c..329ef8580c 100644 --- a/spring-thymeleaf/README.md +++ b/spring-thymeleaf/README.md @@ -3,20 +3,20 @@ This module contains articles about Spring with Thymeleaf ### Relevant Articles: -- [Introduction to Using Thymeleaf in Spring](http://www.baeldung.com/thymeleaf-in-spring-mvc) -- [CSRF Protection with Spring MVC and Thymeleaf](http://www.baeldung.com/csrf-thymeleaf-with-spring-security) -- [Thymeleaf: Custom Layout Dialect](http://www.baeldung.com/thymeleaf-spring-layouts) -- [Spring and Thymeleaf 3: Expressions](http://www.baeldung.com/spring-thymeleaf-3-expressions) -- [Spring MVC + Thymeleaf 3.0: New Features](http://www.baeldung.com/spring-thymeleaf-3) -- [How to Work with Dates in Thymeleaf](http://www.baeldung.com/dates-in-thymeleaf) -- [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) -- [Working with Boolean in Thymeleaf](http://www.baeldung.com/thymeleaf-boolean) -- [Working with Fragments in Thymeleaf](http://www.baeldung.com/spring-thymeleaf-fragments) -- [Conditionals in Thymeleaf](http://www.baeldung.com/spring-thymeleaf-conditionals) -- [Iteration in Thymeleaf](http://www.baeldung.com/thymeleaf-iteration) -- [Working With Arrays in Thymeleaf](http://www.baeldung.com/thymeleaf-arrays) -- [Spring with Thymeleaf Pagination for a List](http://www.baeldung.com/spring-thymeleaf-pagination) -- [Working with Select and Option in Thymeleaf](http://www.baeldung.com/thymeleaf-select-option) +- [Introduction to Using Thymeleaf in Spring](https://www.baeldung.com/thymeleaf-in-spring-mvc) +- [CSRF Protection with Spring MVC and Thymeleaf](https://www.baeldung.com/csrf-thymeleaf-with-spring-security) +- [Thymeleaf: Custom Layout Dialect](https://www.baeldung.com/thymeleaf-spring-layouts) +- [Spring and Thymeleaf 3: Expressions](https://www.baeldung.com/spring-thymeleaf-3-expressions) +- [Spring MVC + Thymeleaf 3.0: New Features](https://www.baeldung.com/spring-thymeleaf-3) +- [How to Work with Dates in Thymeleaf](https://www.baeldung.com/dates-in-thymeleaf) +- [How to Create an Executable JAR with Maven](https://www.baeldung.com/executable-jar-with-maven) +- [Working with Boolean in Thymeleaf](https://www.baeldung.com/thymeleaf-boolean) +- [Working with Fragments in Thymeleaf](https://www.baeldung.com/spring-thymeleaf-fragments) +- [Conditionals in Thymeleaf](https://www.baeldung.com/spring-thymeleaf-conditionals) +- [Iteration in Thymeleaf](https://www.baeldung.com/thymeleaf-iteration) +- [Working With Arrays in Thymeleaf](https://www.baeldung.com/thymeleaf-arrays) +- [Spring with Thymeleaf Pagination for a List](https://www.baeldung.com/spring-thymeleaf-pagination) +- [Working with Select and Option in Thymeleaf](https://www.baeldung.com/thymeleaf-select-option) - [Working With Custom HTML Attributes in Thymeleaf](https://www.baeldung.com/thymeleaf-custom-html-attributes) - [Spring Request Parameters with Thymeleaf](https://www.baeldung.com/spring-thymeleaf-request-parameters) - [[next -->]](/spring-thymeleaf-2) diff --git a/spring-vertx/README.md b/spring-vertx/README.md index e9557f330b..e310079ff4 100644 --- a/spring-vertx/README.md +++ b/spring-vertx/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring with Vert.x ### Relevant Articles: -- [Vert.x Spring Integration](http://www.baeldung.com/spring-vertx) +- [Vert.x Spring Integration](https://www.baeldung.com/spring-vertx) diff --git a/spring-webflux-amqp/README.md b/spring-webflux-amqp/README.md index b7ac73b53d..20ddbe469a 100644 --- a/spring-webflux-amqp/README.md +++ b/spring-webflux-amqp/README.md @@ -4,4 +4,4 @@ This module contains articles about Spring WebFlux with AMQP ### Relevant Articles: -- [Spring AMQP in Reactive Applications](http://www.baeldung.com/spring-amqp-reactive) +- [Spring AMQP in Reactive Applications](https://www.baeldung.com/spring-amqp-reactive) diff --git a/spring-zuul/README.md b/spring-zuul/README.md index a2ea211195..e1067ebb9f 100644 --- a/spring-zuul/README.md +++ b/spring-zuul/README.md @@ -3,4 +3,4 @@ This module contains articles about Spring with Netflix Zuul ### Relevant Articles: -- [Spring REST with a Zuul Proxy](http://www.baeldung.com/spring-rest-with-zuul-proxy) +- [Spring REST with a Zuul Proxy](https://www.baeldung.com/spring-rest-with-zuul-proxy) diff --git a/static-analysis/README.md b/static-analysis/README.md index e3710831cf..235b79853b 100644 --- a/static-analysis/README.md +++ b/static-analysis/README.md @@ -4,5 +4,5 @@ This module contains articles about static program analysis ## Relevant articles: -- [Introduction to PMD](http://www.baeldung.com/pmd) -- [Java Static Analysis Tools in Eclipse and IntelliJ IDEA](http://www.baeldung.com/java-static-analysis-tools) +- [Introduction to PMD](https://www.baeldung.com/pmd) +- [Java Static Analysis Tools in Eclipse and IntelliJ IDEA](https://www.baeldung.com/java-static-analysis-tools) diff --git a/stripe/README.md b/stripe/README.md index a7134b9633..9e41dcf945 100644 --- a/stripe/README.md +++ b/stripe/README.md @@ -4,5 +4,5 @@ This module contains articles about Stripe ### Relevant articles -- [Introduction to the Stripe API for Java](http://www.baeldung.com/java-stripe-api) +- [Introduction to the Stripe API for Java](https://www.baeldung.com/java-stripe-api) diff --git a/structurizr/README.md b/structurizr/README.md index 90ce49b482..15331228bd 100644 --- a/structurizr/README.md +++ b/structurizr/README.md @@ -3,4 +3,4 @@ This module contains articles about Structurizr ### Relevant Articles: -- [Intro to Structurizr](http://www.baeldung.com/structurizr) +- [Intro to Structurizr](https://www.baeldung.com/structurizr) diff --git a/struts-2/README.md b/struts-2/README.md index 6121ab3166..d15b94f662 100644 --- a/struts-2/README.md +++ b/struts-2/README.md @@ -4,4 +4,4 @@ This module contains articles about Struts 2 ### Relevant articles -- [A Quick Struts 2 Intro](http://www.baeldung.com/struts-2-intro) +- [A Quick Struts 2 Intro](https://www.baeldung.com/struts-2-intro) diff --git a/twilio/README.md b/twilio/README.md index b098473fa9..f298a8b75d 100644 --- a/twilio/README.md +++ b/twilio/README.md @@ -4,4 +4,4 @@ This module contains articles about Twilio ### Relevant Articles: -- [Sending SMS in Java with Twilio](http://www.baeldung.com/java-sms-twilio) +- [Sending SMS in Java with Twilio](https://www.baeldung.com/java-sms-twilio) diff --git a/twitter4j/README.md b/twitter4j/README.md index 0f58240538..8c9ee92348 100644 --- a/twitter4j/README.md +++ b/twitter4j/README.md @@ -4,4 +4,4 @@ This module contains articles about Twitter4J ### Relevant articles -- [Introduction to Twitter4J](http://www.baeldung.com/twitter4j) +- [Introduction to Twitter4J](https://www.baeldung.com/twitter4j) diff --git a/undertow/README.md b/undertow/README.md index ceec806bd4..f08c6cdb4d 100644 --- a/undertow/README.md +++ b/undertow/README.md @@ -3,4 +3,4 @@ This module contains articles about JBoss Undertow ### Relevant Articles: -- [Introduction to JBoss Undertow](http://www.baeldung.com/jboss-undertow) +- [Introduction to JBoss Undertow](https://www.baeldung.com/jboss-undertow) diff --git a/vaadin/README.md b/vaadin/README.md index 43d2cc8961..1d570d1f58 100644 --- a/vaadin/README.md +++ b/vaadin/README.md @@ -1,4 +1,4 @@ ## Relevant articles: -- [Introduction to Vaadin](http://www.baeldung.com/vaadin) +- [Introduction to Vaadin](https://www.baeldung.com/vaadin) - [Sample Application with Spring Boot and Vaadin](https://www.baeldung.com/spring-boot-vaadin) diff --git a/vavr/README.md b/vavr/README.md index 266cae91bb..6832f78a62 100644 --- a/vavr/README.md +++ b/vavr/README.md @@ -1,13 +1,13 @@ ### Relevant Articles: -- [Introduction to Vavr](http://www.baeldung.com/vavr) -- [Guide to Try in Vavr](http://www.baeldung.com/vavr-try) -- [Guide to Pattern Matching in Vavr](http://www.baeldung.com/vavr-pattern-matching) -- [Property Testing Example With Vavr](http://www.baeldung.com/vavr-property-testing) -- [Exceptions in Lambda Expression Using Vavr](http://www.baeldung.com/exceptions-using-vavr) -- [Vavr Support in Spring Data](http://www.baeldung.com/spring-vavr) -- [Introduction to Vavr’s Validation API](http://www.baeldung.com/vavr-validation-api) -- [Guide to Collections API in Vavr](http://www.baeldung.com/vavr-collections) -- [Collection Factory Methods for Vavr](http://www.baeldung.com/vavr-collection-factory-methods) -- [Introduction to Future in Vavr](http://www.baeldung.com/vavr-future) -- [Introduction to Vavr’s Either](http://www.baeldung.com/vavr-either) -- [Interoperability Between Java and Vavr](http://www.baeldung.com/java-vavr) +- [Introduction to Vavr](https://www.baeldung.com/vavr) +- [Guide to Try in Vavr](https://www.baeldung.com/vavr-try) +- [Guide to Pattern Matching in Vavr](https://www.baeldung.com/vavr-pattern-matching) +- [Property Testing Example With Vavr](https://www.baeldung.com/vavr-property-testing) +- [Exceptions in Lambda Expression Using Vavr](https://www.baeldung.com/exceptions-using-vavr) +- [Vavr Support in Spring Data](https://www.baeldung.com/spring-vavr) +- [Introduction to Vavr’s Validation API](https://www.baeldung.com/vavr-validation-api) +- [Guide to Collections API in Vavr](https://www.baeldung.com/vavr-collections) +- [Collection Factory Methods for Vavr](https://www.baeldung.com/vavr-collection-factory-methods) +- [Introduction to Future in Vavr](https://www.baeldung.com/vavr-future) +- [Introduction to Vavr’s Either](https://www.baeldung.com/vavr-either) +- [Interoperability Between Java and Vavr](https://www.baeldung.com/java-vavr) diff --git a/vertx-and-rxjava/README.md b/vertx-and-rxjava/README.md index 6d217426e0..622b80feca 100644 --- a/vertx-and-rxjava/README.md +++ b/vertx-and-rxjava/README.md @@ -3,4 +3,4 @@ This module contains articles about RxJava with Vert.x ### Relevant articles -- [Example of Vertx and RxJava Integration](http://www.baeldung.com/vertx-rx-java) +- [Example of Vertx and RxJava Integration](https://www.baeldung.com/vertx-rx-java) diff --git a/vertx/README.md b/vertx/README.md index fffc0afd62..9a62c7b5dc 100644 --- a/vertx/README.md +++ b/vertx/README.md @@ -4,4 +4,4 @@ This module contains articles about Vert.x ### Relevant articles -- [Introduction to Vert.x](http://www.baeldung.com/vertx) +- [Introduction to Vert.x](https://www.baeldung.com/vertx) diff --git a/vraptor/README.md b/vraptor/README.md index c5a7128922..037865d934 100644 --- a/vraptor/README.md +++ b/vraptor/README.md @@ -4,7 +4,7 @@ This module contains articles about VRaptor ### Relevant Article: -- [Introduction to VRaptor in Java](http://www.baeldung.com/vraptor) +- [Introduction to VRaptor in Java](https://www.baeldung.com/vraptor) # VRaptor blank project @@ -27,6 +27,3 @@ Após criar seu projeto você pode rodá-lo com um tomcat7 ou +: `mvn tomcat7:run` Cuidado para *jamais* executar `mvn tomcat:run` pois ele usará um tomcat6 (incompatível). - - - diff --git a/wicket/README.md b/wicket/README.md index 91fab2a364..65f0db2661 100644 --- a/wicket/README.md +++ b/wicket/README.md @@ -4,10 +4,10 @@ This module contains articles about Wicket ### Relevant Articles -- [Introduction to the Wicket Framework](http://www.baeldung.com/intro-to-the-wicket-framework) +- [Introduction to the Wicket Framework](https://www.baeldung.com/intro-to-the-wicket-framework) ### Execution From the same directory where pom.xml is, execute the following command to run the project: -mvn jetty:run \ No newline at end of file +`mvn jetty:run` diff --git a/xml/README.md b/xml/README.md index 1872568574..d1aa3a798b 100644 --- a/xml/README.md +++ b/xml/README.md @@ -3,10 +3,10 @@ This module contains articles about eXtensible Markup Language (XML) ### Relevant Articles: -- [Intro to XPath with Java](http://www.baeldung.com/java-xpath) -- [Introduction to JiBX](http://www.baeldung.com/jibx) -- [XML Libraries Support in Java](http://www.baeldung.com/java-xml-libraries) -- [DOM parsing with Xerces](http://www.baeldung.com/java-xerces-dom-parsing) +- [Intro to XPath with Java](https://www.baeldung.com/java-xpath) +- [Introduction to JiBX](https://www.baeldung.com/jibx) +- [XML Libraries Support in Java](https://www.baeldung.com/java-xml-libraries) +- [DOM parsing with Xerces](https://www.baeldung.com/java-xerces-dom-parsing) - [Write an org.w3.dom.Document to a File](https://www.baeldung.com/java-write-xml-document-file) - [Modifying an XML Attribute in Java](https://www.baeldung.com/java-modify-xml-attribute) - [Convert XML to HTML in Java](https://www.baeldung.com/java-convert-xml-to-html) diff --git a/xstream/README.md b/xstream/README.md index 62996132c8..505ce1e2d9 100644 --- a/xstream/README.md +++ b/xstream/README.md @@ -4,7 +4,7 @@ This module contains articles about XStream ## Relevant Articles: -- [XStream User Guide: JSON](http://www.baeldung.com/xstream-json-processing) -- [XStream User Guide: Converting XML to Objects](http://www.baeldung.com/xstream-deserialize-xml-to-object) -- [XStream User Guide: Converting Objects to XML](http://www.baeldung.com/xstream-serialize-object-to-xml) +- [XStream User Guide: JSON](https://www.baeldung.com/xstream-json-processing) +- [XStream User Guide: Converting XML to Objects](https://www.baeldung.com/xstream-deserialize-xml-to-object) +- [XStream User Guide: Converting Objects to XML](https://www.baeldung.com/xstream-serialize-object-to-xml) - [Remote Code Execution with XStream](https://www.baeldung.com/java-xstream-remote-code-execution) From 160fd28fddaa07e7f2a09596484a380f48dd5ba3 Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Thu, 3 Oct 2019 06:33:18 +0300 Subject: [PATCH 334/396] Split or move testing-modules/junit-5 module (#7879) --- testing-modules/junit-5/README.md | 16 ++---- testing-modules/junit-5/pom.xml | 5 -- .../DynamicTestsUnitTest.java} | 6 +- .../com/baeldung/dynamictests/Employee.java | 38 +++++++++++++ .../baeldung/dynamictests/EmployeeDao.java | 16 ++++++ testing-modules/junit5-annotations/README.md | 9 +++ testing-modules/junit5-annotations/pom.xml | 57 +++++++++++++++++++ .../registerextension/LoggingExtension.java | 18 ++++++ .../RegisterExtensionSampleExtension.java | 2 +- .../RepeatedTestAnnotationUnitTest.java} | 4 +- .../ConditionalAnnotationsUnitTest.java | 2 +- .../BlankStringsArgumentsProvider.java | 2 +- .../junit5}/parameterized/EnumsUnitTest.java | 2 +- .../parameterized/LocalDateUnitTest.java | 2 +- .../junit5}/parameterized/Numbers.java | 2 +- .../parameterized/NumbersUnitTest.java | 2 +- .../junit5}/parameterized/Person.java | 2 +- .../parameterized/PersonAggregator.java | 2 +- .../junit5}/parameterized/PersonUnitTest.java | 2 +- .../parameterized/SlashyDateConverter.java | 2 +- .../junit5}/parameterized/StringParams.java | 2 +- .../junit5}/parameterized/Strings.java | 2 +- .../parameterized/StringsUnitTest.java | 4 +- .../VariableArgumentsProvider.java | 2 +- .../junit5}/parameterized/VariableSource.java | 2 +- .../RegisterExtensionUnitTest.java | 4 +- .../src/test/resources/data.csv | 0 testing-modules/junit5-migration/README.md | 6 +- .../baeldung/junit5vstestng/Calculator.java | 0 .../junit5vstestng/DivideByZeroException.java | 0 .../junit4vstestng/SortedUnitTest.java | 0 .../SummationServiceIntegrationTest.java | 0 .../Junit4AssertionsUnitTest.java} | 4 +- .../Junit5AssertionsUnitTest.java} | 4 +- .../junit5vstestng/CalculatorUnitTest.java | 0 .../junit5vstestng/Class1UnitTest.java | 0 .../junit5vstestng/Class2UnitTest.java | 0 .../junit5vstestng/CustomNameUnitTest.java | 0 .../junit5vstestng/ParameterizedUnitTest.java | 0 .../junit5vstestng/PizzaDeliveryStrategy.java | 0 .../SelectClassesSuiteUnitTest.java | 0 .../SelectPackagesSuiteUnitTest.java | 0 .../SummationServiceUnitTest.java | 0 testing-modules/pom.xml | 1 + 44 files changed, 176 insertions(+), 46 deletions(-) rename testing-modules/junit-5/src/test/java/com/baeldung/{DynamicTestsExample.java => dynamictests/DynamicTestsUnitTest.java} (97%) create mode 100644 testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/Employee.java create mode 100644 testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/EmployeeDao.java create mode 100644 testing-modules/junit5-annotations/README.md create mode 100644 testing-modules/junit5-annotations/pom.xml create mode 100644 testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/LoggingExtension.java rename testing-modules/{junit-5/src/test/java/com/baeldung/extensions => junit5-annotations/src/main/java/com/baeldung/junit5/registerextension}/RegisterExtensionSampleExtension.java (95%) rename testing-modules/{junit-5/src/test/java/com/baeldung/RepeatedTestExample.java => junit5-annotations/src/test/java/com/baeldung/junit5/RepeatedTestAnnotationUnitTest.java} (95%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/conditional/ConditionalAnnotationsUnitTest.java (98%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/BlankStringsArgumentsProvider.java (92%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/EnumsUnitTest.java (97%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/LocalDateUnitTest.java (92%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/Numbers.java (72%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/NumbersUnitTest.java (89%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/Person.java (92%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/PersonAggregator.java (93%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/PersonUnitTest.java (96%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/SlashyDateConverter.java (95%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/StringParams.java (78%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/Strings.java (74%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/StringsUnitTest.java (97%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/VariableArgumentsProvider.java (96%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5}/parameterized/VariableSource.java (90%) rename testing-modules/{junit-5/src/test/java/com/baeldung => junit5-annotations/src/test/java/com/baeldung/junit5/registerextension}/RegisterExtensionUnitTest.java (86%) rename testing-modules/{junit-5 => junit5-annotations}/src/test/resources/data.csv (100%) rename testing-modules/{junit-5 => junit5-migration}/src/main/java/com/baeldung/junit5vstestng/Calculator.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java (100%) rename testing-modules/{junit-4/src/test/java/com/baeldung/junit/AssertionsUnitTest.java => junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit4AssertionsUnitTest.java} (96%) rename testing-modules/{junit-5/src/test/java/com/baeldung/AssertionUnitTest.java => junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit5AssertionsUnitTest.java} (98%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java (100%) rename testing-modules/{junit-5 => junit5-migration}/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java (100%) diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md index 14e018a5f9..676d2f2f03 100644 --- a/testing-modules/junit-5/README.md +++ b/testing-modules/junit-5/README.md @@ -1,14 +1,8 @@ ### Relevant Articles: -- [A Guide to @RepeatedTest in Junit 5](http://www.baeldung.com/junit-5-repeated-test) -- [Guide to Dynamic Tests in Junit 5](http://www.baeldung.com/junit5-dynamic-tests) -- [A Guide to JUnit 5 Extensions](http://www.baeldung.com/junit-5-extensions) -- [Inject Parameters into JUnit Jupiter Unit Tests](http://www.baeldung.com/junit-5-parameters) -- [Mockito and JUnit 5 – Using ExtendWith](http://www.baeldung.com/mockito-junit-5-extension) -- [JUnit5 Programmatic Extension Registration with @RegisterExtension](http://www.baeldung.com/junit-5-registerextension-annotation) -- [The Order of Tests in JUnit](http://www.baeldung.com/junit-5-test-order) +- [A Guide to JUnit 5 Extensions](https://www.baeldung.com/junit-5-extensions) +- [Inject Parameters into JUnit Jupiter Unit Tests](https://www.baeldung.com/junit-5-parameters) +- [Mockito and JUnit 5 – Using ExtendWith](https://www.baeldung.com/mockito-junit-5-extension) +- [The Order of Tests in JUnit](https://www.baeldung.com/junit-5-test-order) - [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) - [Testing an Abstract Class With JUnit](https://www.baeldung.com/junit-test-abstract-class) -- [A Quick JUnit vs TestNG Comparison](http://www.baeldung.com/junit-vs-testng) -- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5) -- [JUnit 5 Conditional Test Execution with Annotations](https://www.baeldung.com/junit-5-conditional-test-execution) -- [Assertions in JUnit 4 and JUnit 5](http://www.baeldung.com/junit-assertions) +- [Guide to Dynamic Tests in Junit 5](https://www.baeldung.com/junit5-dynamic-tests) diff --git a/testing-modules/junit-5/pom.xml b/testing-modules/junit-5/pom.xml index b3074635a7..96944b4dc6 100644 --- a/testing-modules/junit-5/pom.xml +++ b/testing-modules/junit-5/pom.xml @@ -26,11 +26,6 @@ junit-jupiter-engine ${junit.jupiter.version} - - org.junit.jupiter - junit-jupiter-params - ${junit.jupiter.version} - org.junit.jupiter junit-jupiter-api diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/DynamicTestsUnitTest.java similarity index 97% rename from testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java rename to testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/DynamicTestsUnitTest.java index b684f3603f..8b3087497b 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/DynamicTestsExample.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/DynamicTestsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.dynamictests; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; @@ -17,10 +17,8 @@ import org.junit.jupiter.api.DynamicTest; import org.junit.jupiter.api.TestFactory; import org.junit.jupiter.api.function.ThrowingConsumer; -import com.baeldung.helpers.Employee; -import com.baeldung.helpers.EmployeeDao; -public class DynamicTestsExample { +public class DynamicTestsUnitTest { @TestFactory Collection dynamicTestsWithCollection() { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/Employee.java b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/Employee.java new file mode 100644 index 0000000000..4b58a71135 --- /dev/null +++ b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/Employee.java @@ -0,0 +1,38 @@ +package com.baeldung.dynamictests; + +public class Employee { + + private long id; + private String firstName; + + public Employee(long id) { + this.id = id; + this.firstName = ""; + } + + public Employee(long id, String firstName) { + this.id = id; + this.firstName = firstName; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + @Override + public String toString() { + return "Employee [id=" + id + ", firstName=" + firstName + "]"; + } +} diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/EmployeeDao.java b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/EmployeeDao.java new file mode 100644 index 0000000000..4e2d9a5140 --- /dev/null +++ b/testing-modules/junit-5/src/test/java/com/baeldung/dynamictests/EmployeeDao.java @@ -0,0 +1,16 @@ +package com.baeldung.dynamictests; + +public class EmployeeDao { + + public Employee save(long id) { + return new Employee(id); + } + + public Employee save(long id, String firstName) { + return new Employee(id, firstName); + } + + public Employee update(Employee employee) { + return employee; + } +} diff --git a/testing-modules/junit5-annotations/README.md b/testing-modules/junit5-annotations/README.md new file mode 100644 index 0000000000..53819dbec5 --- /dev/null +++ b/testing-modules/junit5-annotations/README.md @@ -0,0 +1,9 @@ +## Junit 5 Annotations + +This module contains articles about Junit 5 Annotations + +### Relevant Articles: +- [A Guide to @RepeatedTest in Junit 5](https://www.baeldung.com/junit-5-repeated-test) +- [JUnit 5 Conditional Test Execution with Annotations](https://www.baeldung.com/junit-5-conditional-test-execution) +- [JUnit5 Programmatic Extension Registration with @RegisterExtension](https://www.baeldung.com/junit-5-registerextension-annotation) +- [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5) diff --git a/testing-modules/junit5-annotations/pom.xml b/testing-modules/junit5-annotations/pom.xml new file mode 100644 index 0000000000..c8abfe909d --- /dev/null +++ b/testing-modules/junit5-annotations/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + junit5-annotations + 1.0-SNAPSHOT + junit5-annotations + Intro to JUnit 5 + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + org.junit.platform + junit-platform-engine + ${junit.platform.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit.jupiter.version} + + + org.junit.jupiter + junit-jupiter-params + ${junit.jupiter.version} + + + org.junit.jupiter + junit-jupiter-api + ${junit.jupiter.version} + + + org.apache.logging.log4j + log4j-core + ${log4j2.version} + + + org.junit.platform + junit-platform-runner + ${junit.platform.version} + test + + + + + 5.4.2 + 1.4.2 + 2.8.2 + + + diff --git a/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/LoggingExtension.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/LoggingExtension.java new file mode 100644 index 0000000000..5de49e028b --- /dev/null +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/LoggingExtension.java @@ -0,0 +1,18 @@ +package com.baeldung.junit5.registerextension; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.junit.jupiter.api.extension.ExtensionContext; +import org.junit.jupiter.api.extension.TestInstancePostProcessor; + +public class LoggingExtension implements TestInstancePostProcessor { + + @Override + public void postProcessTestInstance(Object testInstance, ExtensionContext context) throws Exception { + Logger logger = LogManager.getLogger(testInstance.getClass()); + testInstance.getClass() + .getMethod("setLogger", Logger.class) + .invoke(testInstance, logger); + } + +} diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/RegisterExtensionSampleExtension.java similarity index 95% rename from testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java rename to testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/RegisterExtensionSampleExtension.java index 64f4d8fd3e..5339f98875 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/extensions/RegisterExtensionSampleExtension.java +++ b/testing-modules/junit5-annotations/src/main/java/com/baeldung/junit5/registerextension/RegisterExtensionSampleExtension.java @@ -1,4 +1,4 @@ -package com.baeldung.extensions; +package com.baeldung.junit5.registerextension; import org.junit.jupiter.api.extension.BeforeAllCallback; import org.junit.jupiter.api.extension.BeforeEachCallback; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/RepeatedTestAnnotationUnitTest.java similarity index 95% rename from testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/RepeatedTestAnnotationUnitTest.java index 749d7064bc..f9121d8790 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/RepeatedTestExample.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/RepeatedTestAnnotationUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.junit5; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -8,7 +8,7 @@ import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.RepetitionInfo; import org.junit.jupiter.api.TestInfo; -public class RepeatedTestExample { +public class RepeatedTestAnnotationUnitTest { @BeforeEach void beforeEachTest() { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java similarity index 98% rename from testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java index ec76bd1488..ddceb78cac 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/conditional/ConditionalAnnotationsUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/conditional/ConditionalAnnotationsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.conditional; +package com.baeldung.junit5.conditional; import org.junit.jupiter.api.RepeatedTest; import org.junit.jupiter.api.Test; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/BlankStringsArgumentsProvider.java similarity index 92% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/BlankStringsArgumentsProvider.java index 1d2c76d37b..6c626efa40 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/BlankStringsArgumentsProvider.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/BlankStringsArgumentsProvider.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.provider.Arguments; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/EnumsUnitTest.java similarity index 97% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/EnumsUnitTest.java index 0b2068dbf1..1e3bbcc772 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/EnumsUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/EnumsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.CsvSource; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/LocalDateUnitTest.java similarity index 92% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/LocalDateUnitTest.java index 95487705f5..d411fcb7e2 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/LocalDateUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/LocalDateUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.converter.ConvertWith; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Numbers.java similarity index 72% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Numbers.java index 8a9b229aac..094da6de05 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Numbers.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Numbers.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; public class Numbers { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/NumbersUnitTest.java similarity index 89% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/NumbersUnitTest.java index b3a3371bb2..76ebf93f93 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/NumbersUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/NumbersUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Person.java similarity index 92% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Person.java index 225f11ba29..c635b2e4da 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Person.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Person.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; class Person { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonAggregator.java similarity index 93% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonAggregator.java index df2ddc9e66..c899115df8 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonAggregator.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonAggregator.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.params.aggregator.ArgumentsAccessor; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonUnitTest.java similarity index 96% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonUnitTest.java index b30ecc748e..62a2f32a63 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/PersonUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/PersonUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.aggregator.AggregateWith; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/SlashyDateConverter.java similarity index 95% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/SlashyDateConverter.java index 40773d29a9..d96fbce121 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/SlashyDateConverter.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/SlashyDateConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.api.extension.ParameterContext; import org.junit.jupiter.params.converter.ArgumentConversionException; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringParams.java similarity index 78% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringParams.java index bc9f881bd4..022fb797a4 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringParams.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringParams.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import java.util.stream.Stream; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Strings.java similarity index 74% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Strings.java index f8e29f6b7f..5ee29339d7 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/Strings.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/Strings.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; class Strings { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringsUnitTest.java similarity index 97% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringsUnitTest.java index 6aea7668f1..064f305295 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/StringsUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/StringsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.*; @@ -44,7 +44,7 @@ class StringsUnitTest { } @ParameterizedTest - @MethodSource("com.baeldung.parameterized.StringParams#blankStrings") + @MethodSource("com.baeldung.junit5.parameterized.StringParams#blankStrings") void isBlank_ShouldReturnTrueForNullOrBlankStringsExternalSource(String input) { assertTrue(Strings.isBlank(input)); } diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableArgumentsProvider.java similarity index 96% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableArgumentsProvider.java index a96d01e854..af10860f6a 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableArgumentsProvider.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableArgumentsProvider.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.api.extension.ExtensionContext; import org.junit.jupiter.params.provider.Arguments; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableSource.java similarity index 90% rename from testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableSource.java index 9c1d07c1be..11187a4865 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/parameterized/VariableSource.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/parameterized/VariableSource.java @@ -1,4 +1,4 @@ -package com.baeldung.parameterized; +package com.baeldung.junit5.parameterized; import org.junit.jupiter.params.provider.ArgumentsSource; diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/registerextension/RegisterExtensionUnitTest.java similarity index 86% rename from testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java rename to testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/registerextension/RegisterExtensionUnitTest.java index 721cfdb013..7b787f96d0 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/RegisterExtensionUnitTest.java +++ b/testing-modules/junit5-annotations/src/test/java/com/baeldung/junit5/registerextension/RegisterExtensionUnitTest.java @@ -1,6 +1,6 @@ -package com.baeldung; +package com.baeldung.junit5.registerextension; -import com.baeldung.extensions.RegisterExtensionSampleExtension; +import com.baeldung.junit5.registerextension.RegisterExtensionSampleExtension; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; diff --git a/testing-modules/junit-5/src/test/resources/data.csv b/testing-modules/junit5-annotations/src/test/resources/data.csv similarity index 100% rename from testing-modules/junit-5/src/test/resources/data.csv rename to testing-modules/junit5-annotations/src/test/resources/data.csv diff --git a/testing-modules/junit5-migration/README.md b/testing-modules/junit5-migration/README.md index b97ff8255c..e6ad4f376c 100644 --- a/testing-modules/junit5-migration/README.md +++ b/testing-modules/junit5-migration/README.md @@ -1,2 +1,6 @@ - This is the code for the Junit 4 - Junit 5 Migration E-book. + +### Relevant Articles: +- [Junit 5 Migration](https://www.baeldung.com/junit-5-migration) +- [A Quick JUnit vs TestNG Comparison](https://www.baeldung.com/junit-vs-testng) +- [Assertions in JUnit 4 and JUnit 5](https://www.baeldung.com/junit-assertions) diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java b/testing-modules/junit5-migration/src/main/java/com/baeldung/junit5vstestng/Calculator.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/Calculator.java rename to testing-modules/junit5-migration/src/main/java/com/baeldung/junit5vstestng/Calculator.java diff --git a/testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java b/testing-modules/junit5-migration/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java similarity index 100% rename from testing-modules/junit-5/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java rename to testing-modules/junit5-migration/src/main/java/com/baeldung/junit5vstestng/DivideByZeroException.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4vstestng/SortedUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit4vstestng/SummationServiceIntegrationTest.java diff --git a/testing-modules/junit-4/src/test/java/com/baeldung/junit/AssertionsUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit4AssertionsUnitTest.java similarity index 96% rename from testing-modules/junit-4/src/test/java/com/baeldung/junit/AssertionsUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit4AssertionsUnitTest.java index b0209b01aa..7e74c2dace 100644 --- a/testing-modules/junit-4/src/test/java/com/baeldung/junit/AssertionsUnitTest.java +++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit4AssertionsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.junit; +package com.baeldung.junit5vsjunit4assertions; import org.junit.Test; @@ -10,7 +10,7 @@ import static org.junit.Assert.*; /** * Unit test that demonstrate the different assertions available within JUnit 4 */ -public class AssertionsUnitTest { +public class Junit4AssertionsUnitTest { @Test public void whenAssertingEquality_thenEqual() { diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit5AssertionsUnitTest.java similarity index 98% rename from testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit5AssertionsUnitTest.java index f1f7c531f2..40b9143a71 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/AssertionUnitTest.java +++ b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vsjunit4assertions/Junit5AssertionsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package com.baeldung.junit5vsjunit4assertions; import static java.time.Duration.ofSeconds; import static java.util.Arrays.asList; @@ -32,7 +32,7 @@ import org.junit.jupiter.api.Test; * Unit test that demonstrate the different assertions available within JUnit 4 */ @DisplayName("Test case for assertions") -public class AssertionUnitTest { +public class Junit5AssertionsUnitTest { @Test @DisplayName("Arrays should be equals") diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/CalculatorUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/Class1UnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/Class2UnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/CustomNameUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/ParameterizedUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/PizzaDeliveryStrategy.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectClassesSuiteUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SelectPackagesSuiteUnitTest.java diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java b/testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java similarity index 100% rename from testing-modules/junit-5/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java rename to testing-modules/junit5-migration/src/test/java/com/baeldung/junit5vstestng/SummationServiceUnitTest.java diff --git a/testing-modules/pom.xml b/testing-modules/pom.xml index 5934db00ff..aad709cfe9 100644 --- a/testing-modules/pom.xml +++ b/testing-modules/pom.xml @@ -19,6 +19,7 @@ gatling groovy-spock junit-5 + junit5-annotations junit5-migration load-testing-comparison mockito From aa88f134d31c8c3198590dcbb4f1ee3fe13d7231 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Thu, 3 Oct 2019 04:43:24 +0100 Subject: [PATCH 335/396] [BAEL-17476] - Added README descriptions (#7904) --- spring-cloud/spring-cloud-archaius/README.md | 6 ++++-- .../spring-cloud-bootstrap/{README.MD => README.md} | 6 ++++++ spring-cloud/spring-cloud-contract/README.md | 4 ++++ spring-cloud/spring-cloud-gateway/{README.MD => README.md} | 4 ++++ spring-cloud/spring-cloud-kubernetes/README.md | 4 ++++ spring-cloud/spring-cloud-rest/README.md | 3 +++ spring-cloud/spring-cloud-ribbon-client/README.md | 4 ++++ 7 files changed, 29 insertions(+), 2 deletions(-) rename spring-cloud/spring-cloud-bootstrap/{README.MD => README.md} (87%) rename spring-cloud/spring-cloud-gateway/{README.MD => README.md} (57%) diff --git a/spring-cloud/spring-cloud-archaius/README.md b/spring-cloud/spring-cloud-archaius/README.md index ae853c6ef0..3b5ed16373 100644 --- a/spring-cloud/spring-cloud-archaius/README.md +++ b/spring-cloud/spring-cloud-archaius/README.md @@ -1,10 +1,12 @@ +# Spring Cloud Archaius + +This module contains articles about Spring Cloud with Netflix Archaius + # Relevant Articles - [Introduction to Netflix Archaius with Spring Cloud](https://www.baeldung.com/netflix-archaius-spring-cloud-integration) - [Netflix Archaius with Various Database Configurations](https://www.baeldung.com/netflix-archaius-database-configurations) -# Spring Cloud Archaius - #### Basic Config This service has the basic, out-of-the-box Spring Cloud Netflix Archaius configuration. diff --git a/spring-cloud/spring-cloud-bootstrap/README.MD b/spring-cloud/spring-cloud-bootstrap/README.md similarity index 87% rename from spring-cloud/spring-cloud-bootstrap/README.MD rename to spring-cloud/spring-cloud-bootstrap/README.md index 7a3a94c8e3..01998ccf51 100644 --- a/spring-cloud/spring-cloud-bootstrap/README.MD +++ b/spring-cloud/spring-cloud-bootstrap/README.md @@ -1,3 +1,7 @@ +## Spring Cloud Bootstrap + +This module contains articles about bootstrapping Spring Cloud applications + ### Relevant Articles: - [Spring Cloud – Bootstrapping](http://www.baeldung.com/spring-cloud-bootstrapping) - [Spring Cloud – Securing Services](http://www.baeldung.com/spring-cloud-securing-services) @@ -5,6 +9,8 @@ - [Spring Cloud Series – The Gateway Pattern](http://www.baeldung.com/spring-cloud-gateway-pattern) - [Spring Cloud – Adding Angular 4](http://www.baeldung.com/spring-cloud-angular) +### Running the Project + - To run the project: - copy the appliction-config folder to c:\Users\{username}\ on Windows or /home/{username}/ on *nix. Then open a git bash terminal in application-config and run: - git init diff --git a/spring-cloud/spring-cloud-contract/README.md b/spring-cloud/spring-cloud-contract/README.md index 70e056757b..72a3627e30 100644 --- a/spring-cloud/spring-cloud-contract/README.md +++ b/spring-cloud/spring-cloud-contract/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Contract + +This module contains articles about Spring Cloud Contract + ### Relevant Articles: - [An Intro to Spring Cloud Contract](http://www.baeldung.com/spring-cloud-contract) diff --git a/spring-cloud/spring-cloud-gateway/README.MD b/spring-cloud/spring-cloud-gateway/README.md similarity index 57% rename from spring-cloud/spring-cloud-gateway/README.MD rename to spring-cloud/spring-cloud-gateway/README.md index d945ae949c..e87bc547e1 100644 --- a/spring-cloud/spring-cloud-gateway/README.MD +++ b/spring-cloud/spring-cloud-gateway/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Gateway + +This module contains articles about Spring Cloud Gateway + ### Relevant Articles: - [Exploring the new Spring Cloud Gateway](http://www.baeldung.com/spring-cloud-gateway) diff --git a/spring-cloud/spring-cloud-kubernetes/README.md b/spring-cloud/spring-cloud-kubernetes/README.md index 32bcbc59b8..b64ad65ef9 100644 --- a/spring-cloud/spring-cloud-kubernetes/README.md +++ b/spring-cloud/spring-cloud-kubernetes/README.md @@ -1,3 +1,7 @@ +## Spring Cloud Kubernetes + +This moudle contains articles about Spring Cloud Kubernetes + ### Relevant Articles: - [Running Spring Boot Applications With Minikube](https://www.baeldung.com/spring-boot-minikube) diff --git a/spring-cloud/spring-cloud-rest/README.md b/spring-cloud/spring-cloud-rest/README.md index a650004708..25d62007b6 100644 --- a/spring-cloud/spring-cloud-rest/README.md +++ b/spring-cloud/spring-cloud-rest/README.md @@ -1,2 +1,5 @@ +## Spring Cloud REST + +This module contains articles about RESTful APIs with Spring Cloud Code for an ebook - "A REST API with Spring Boot and Spring Cloud" diff --git a/spring-cloud/spring-cloud-ribbon-client/README.md b/spring-cloud/spring-cloud-ribbon-client/README.md index 596b3226c8..d22b8ec8f8 100644 --- a/spring-cloud/spring-cloud-ribbon-client/README.md +++ b/spring-cloud/spring-cloud-ribbon-client/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Ribbon Client + +This module contains articles about Spring Cloud with Netflix Ribbon + ### Relevant Articles: - [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) From 6cb034c1d80ce0f53d4ff31a5041f5aea5e567d0 Mon Sep 17 00:00:00 2001 From: Catalin Burcea Date: Thu, 3 Oct 2019 07:02:53 +0300 Subject: [PATCH 336/396] Move articles out of core-java-lang part 1 (#7908) --- .../core-java-exceptions/README.md | 19 ++- .../core-java-exceptions/pom.xml | 91 +++++------ .../com/baeldung/exceptions/Arithmetic.java | 20 --- .../exceptions/ArrayIndexOutOfBounds.java | 24 --- .../CheckedUncheckedExceptions.java | 43 ----- .../com/baeldung/exceptions/ClassCast.java | 36 ---- .../com/baeldung/exceptions/FileNotFound.java | 25 --- .../exceptions/GlobalExceptionHandler.java | 28 ---- .../baeldung/exceptions/IllegalArgument.java | 18 -- .../com/baeldung/exceptions/IllegalState.java | 32 ---- .../IncorrectFileNameException.java | 13 -- .../InterruptedExceptionExample.java | 28 ---- .../com/baeldung/exceptions/MalformedURL.java | 25 --- .../exceptions/NullOrEmptyException.java | 14 -- .../com/baeldung/exceptions/NullPointer.java | 36 ---- .../com/baeldung/exceptions/NumberFormat.java | 23 --- .../exceptions/ParseExceptionExample.java | 25 --- .../baeldung/exceptions/RootCauseFinder.java | 98 ----------- .../exceptions/StackTraceToString.java | 30 ---- .../exceptions/StringIndexOutOfBounds.java | 23 --- .../chainedexception/LogWithChain.java | 10 +- .../chainedexception/LogWithoutChain.java | 10 +- .../GirlFriendOfManagerUpsetException.java | 2 +- .../exceptions/ManagerUpsetException.java | 2 +- .../exceptions/NoLeaveGrantedException.java | 2 +- .../exceptions/TeamLeadUpsetException.java | 2 +- .../customexception/FileManager.java | 2 +- .../IncorrectFileExtensionException.java | 2 +- .../IncorrectFileNameException.java | 2 +- .../exceptionhandling/Exceptions.java | 2 +- .../exceptionhandling/MyException.java | 5 + .../exceptions}/exceptionhandling/Player.java | 2 +- .../PlayerLoadException.java | 2 +- .../PlayerScoreException.java | 2 +- .../exceptionhandling/TimeoutException.java | 2 +- .../keywords/finalize/FinalizeObject.java | 2 +- .../keywords/finalkeyword/Child.java | 2 +- .../keywords/finalkeyword/GrandChild.java | 2 +- .../keywords/finalkeyword/Parent.java | 2 +- .../finallykeyword/FinallyExample.java | 2 +- .../ClassWithInitErrors.java | 2 +- .../NoClassDefFoundErrorExample.java | 2 +- .../sneakythrows/SneakyRunnable.java | 2 +- .../sneakythrows/SneakyThrows.java | 2 +- .../stackoverflowerror/AccountHolder.java | 2 +- .../stackoverflowerror/ClassOne.java | 2 +- .../stackoverflowerror/ClassTwo.java | 2 +- ...niteRecursionWithTerminationCondition.java | 2 +- ...ursionWithCorrectTerminationCondition.java | 2 +- .../UnintendedInfiniteRecursion.java | 2 +- .../throwvsthrows}/DataAccessException.java | 2 +- .../exceptions/throwvsthrows}/Main.java | 2 +- .../throwvsthrows}/PersonRepository.java | 2 +- .../throwvsthrows}/SimpleService.java | 2 +- .../exceptions/throwvsthrows}/TryCatch.java | 2 +- .../baeldung/optional/PersonRepository.java | 9 - .../error/ErrorGeneratorUnitTest.java | 25 --- .../NumberFormatExceptionUnitTest.java | 154 ------------------ .../CheckedUncheckedExceptionsUnitTest.java | 55 ------- .../GlobalExceptionHandlerUnitTest.java | 64 -------- .../exceptions/RootCauseFinderUnitTest.java | 114 ------------- .../ClassNotFoundExceptionUnitTest.java | 2 +- ...correctFileExtensionExceptionUnitTest.java | 2 +- .../IncorrectFileNameExceptionUnitTest.java | 2 +- .../exceptionhandling/ExceptionsUnitTest.java | 2 +- .../NoClassDefFoundErrorUnitTest.java | 2 +- .../sneakythrows/SneakyRunnableUnitTest.java | 2 +- .../sneakythrows/SneakyThrowsUnitTest.java | 2 +- .../AccountHolderManualTest.java | 2 +- .../CyclicDependancyManualTest.java | 2 +- ...ionWithTerminationConditionManualTest.java | 2 +- ...CorrectTerminationConditionManualTest.java | 2 +- ...UnintendedInfiniteRecursionManualTest.java | 2 +- .../throwvsthrows}/SimpleServiceUnitTest.java | 2 +- ...vaTryWithResourcesLongRunningUnitTest.java | 92 ----------- .../optional/PersonRepositoryUnitTest.java | 43 ----- .../correctFileNameWithoutProperExtension | 0 core-java-modules/core-java-lang/README.md | 34 ++-- core-java-modules/core-java-lang/pom.xml | 14 -- .../exceptionhandling/MyException.java | 5 - core-java-modules/pom.xml | 1 - pom.xml | 2 + 82 files changed, 128 insertions(+), 1250 deletions(-) delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/Arithmetic.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ClassCast.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/FileNotFound.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalArgument.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalState.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/MalformedURL.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullPointer.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NumberFormat.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StackTraceToString.java delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/chainedexception/LogWithChain.java (73%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/chainedexception/LogWithoutChain.java (75%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java (82%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/chainedexception/exceptions/ManagerUpsetException.java (80%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/chainedexception/exceptions/NoLeaveGrantedException.java (80%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/chainedexception/exceptions/TeamLeadUpsetException.java (80%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/customexception/FileManager.java (96%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/customexception/IncorrectFileExtensionException.java (83%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/customexception/IncorrectFileNameException.java (82%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/exceptionhandling/Exceptions.java (99%) create mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/exceptionhandling/Player.java (72%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/exceptionhandling/PlayerLoadException.java (75%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/exceptionhandling/PlayerScoreException.java (71%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/exceptionhandling/TimeoutException.java (71%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/keywords/finalize/FinalizeObject.java (88%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/keywords/finalkeyword/Child.java (78%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/keywords/finalkeyword/GrandChild.java (56%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/keywords/finalkeyword/Parent.java (87%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/keywords/finallykeyword/FinallyExample.java (92%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/noclassdeffounderror/ClassWithInitErrors.java (55%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/noclassdeffounderror/NoClassDefFoundErrorExample.java (86%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/sneakythrows/SneakyRunnable.java (90%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/sneakythrows/SneakyThrows.java (90%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/stackoverflowerror/AccountHolder.java (74%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/stackoverflowerror/ClassOne.java (86%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/stackoverflowerror/ClassTwo.java (86%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java (78%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/stackoverflowerror/RecursionWithCorrectTerminationCondition.java (78%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-exceptions/src/main/java/com/baeldung/exceptions}/stackoverflowerror/UnintendedInfiniteRecursion.java (75%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung/throwsexception => core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows}/DataAccessException.java (78%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung/throwsexception => core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows}/Main.java (95%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung/throwsexception => core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows}/PersonRepository.java (79%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung/throwsexception => core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows}/SimpleService.java (90%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung/throwsexception => core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows}/TryCatch.java (85%) delete mode 100644 core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/PersonRepository.java delete mode 100644 core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java delete mode 100644 core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java delete mode 100644 core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java delete mode 100644 core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java delete mode 100644 core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/classnotfoundexception/ClassNotFoundExceptionUnitTest.java (84%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/customexception/IncorrectFileExtensionExceptionUnitTest.java (95%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/customexception/IncorrectFileNameExceptionUnitTest.java (92%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/exceptionhandling/ExceptionsUnitTest.java (97%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java (85%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/sneakythrows/SneakyRunnableUnitTest.java (89%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/sneakythrows/SneakyThrowsUnitTest.java (89%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/stackoverflowerror/AccountHolderManualTest.java (82%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/stackoverflowerror/CyclicDependancyManualTest.java (81%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java (95%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java (89%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-exceptions/src/test/java/com/baeldung/exceptions}/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java (94%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung/throwsexception => core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows}/SimpleServiceUnitTest.java (92%) delete mode 100644 core-java-modules/core-java-exceptions/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java delete mode 100644 core-java-modules/core-java-exceptions/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java rename core-java-modules/{core-java-lang => core-java-exceptions}/src/test/resources/correctFileNameWithoutProperExtension (100%) delete mode 100644 core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java diff --git a/core-java-modules/core-java-exceptions/README.md b/core-java-modules/core-java-exceptions/README.md index 78599c6b7b..0120b970c3 100644 --- a/core-java-modules/core-java-exceptions/README.md +++ b/core-java-modules/core-java-exceptions/README.md @@ -1,8 +1,13 @@ -## Relevant Articles: +## Core Java Exceptions -- [Will an Error Be Caught by Catch Block in Java?](https://www.baeldung.com/java-error-catch) -- [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler) -- [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions) -- [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception) -- [How to Find an Exception’s Root Cause in Java](https://www.baeldung.com/java-exception-root-cause) -- [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) +This module contains articles about core java exceptions + +### Relevant articles: +- [Chained Exceptions in Java](https://www.baeldung.com/java-chained-exceptions) +- [ClassNotFoundException vs NoClassDefFoundError](https://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror) +- [Create a Custom Exception in Java](https://www.baeldung.com/java-new-custom-exception) +- [Exception Handling in Java](https://www.baeldung.com/java-exceptions) +- [Differences Between Final, Finally and Finalize in Java](https://www.baeldung.com/java-final-finally-finalize) +- [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws) +- [“Sneaky Throws” in Java](https://www.baeldung.com/java-sneaky-throws) +- [The StackOverflowError in Java](https://www.baeldung.com/java-stack-overflow-error) diff --git a/core-java-modules/core-java-exceptions/pom.xml b/core-java-modules/core-java-exceptions/pom.xml index 43c4e31033..da5ec76622 100644 --- a/core-java-modules/core-java-exceptions/pom.xml +++ b/core-java-modules/core-java-exceptions/pom.xml @@ -1,55 +1,46 @@ + - 4.0.0 - com.baeldung.exception.numberformat - core-java-exceptions - 0.0.1-SNAPSHOT - core-java-exceptions + 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"> + com.baeldung.exceptions + 4.0.0 + core-java-exceptions + 0.1.0-SNAPSHOT + core-java-exceptions + jar - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../../parent-java - + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../../parent-java + - - - junit - junit - ${junit.version} - test - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - org.openjdk.jmh - jmh-core - ${jmh-core.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh-generator-annprocess.version} - - - - org.assertj - assertj-core - ${assertj-core.version} - test - - + + + javax.mail + mail + ${javax.mail.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + - - 3.9 - 1.19 - 3.10.0 - 1.19 - + + 1.5.0-b01 + + 3.10.0 + - + \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/Arithmetic.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/Arithmetic.java deleted file mode 100644 index 138916ec60..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/Arithmetic.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.baeldung.exceptions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class Arithmetic { - - private static Logger LOGGER = LoggerFactory.getLogger(Arithmetic.class); - - public static void main(String[] args) { - - try { - int result = 30 / 0; // Trying to divide by zero - } catch (ArithmeticException e) { - LOGGER.error("ArithmeticException caught!"); - } - - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java deleted file mode 100644 index 93b53f284c..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ArrayIndexOutOfBounds.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.baeldung.exceptions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ArrayIndexOutOfBounds { - - private static Logger LOGGER = LoggerFactory.getLogger(ArrayIndexOutOfBounds.class); - - public static void main(String[] args) { - - int[] nums = new int[] { 1, 2, 3 }; - - try { - int numFromNegativeIndex = nums[-1]; // Trying to access at negative index - int numFromGreaterIndex = nums[4]; // Trying to access at greater index - int numFromLengthIndex = nums[3]; // Trying to access at index equal to size of the array - } catch (ArrayIndexOutOfBoundsException e) { - LOGGER.error("ArrayIndexOutOfBoundsException caught"); - } - - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java deleted file mode 100644 index 780189b654..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/CheckedUncheckedExceptions.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.exceptions; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; - -public class CheckedUncheckedExceptions { - public static void checkedExceptionWithThrows() throws FileNotFoundException { - File file = new File("not_existing_file.txt"); - FileInputStream stream = new FileInputStream(file); - } - - public static void checkedExceptionWithTryCatch() { - File file = new File("not_existing_file.txt"); - try { - FileInputStream stream = new FileInputStream(file); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - - public static int divideByZero() { - int numerator = 1; - int denominator = 0; - return numerator / denominator; - } - - public static void checkFile(String fileName) throws IncorrectFileNameException { - if (fileName == null || fileName.isEmpty()) { - throw new NullOrEmptyException("The filename is null."); - } - if (!isCorrectFileName(fileName)) { - throw new IncorrectFileNameException("Incorrect filename : " + fileName); - } - } - - private static boolean isCorrectFileName(String fileName) { - if (fileName.equals("wrongFileName.txt")) - return false; - else - return true; - } -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ClassCast.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ClassCast.java deleted file mode 100644 index 183f8f54a3..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ClassCast.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.exceptions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -class Animal { - -} - -class Dog extends Animal { - -} - -class Lion extends Animal { - -} - -public class ClassCast { - - private static Logger LOGGER = LoggerFactory.getLogger(ClassCast.class); - - public static void main(String[] args) { - - try { - Animal animalOne = new Dog(); // At runtime the instance is dog - Dog bruno = (Dog) animalOne; // Downcasting - - Animal animalTwo = new Lion(); // At runtime the instance is animal - Dog tommy = (Dog) animalTwo; // Downcasting - } catch (ClassCastException e) { - LOGGER.error("ClassCastException caught!"); - } - - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/FileNotFound.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/FileNotFound.java deleted file mode 100644 index bb9e0bf4ac..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/FileNotFound.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.exceptions; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class FileNotFound { - - private static Logger LOGGER = LoggerFactory.getLogger(FileNotFound.class); - - public static void main(String[] args) { - - BufferedReader reader = null; - try { - reader = new BufferedReader(new FileReader(new File("/invalid/file/location"))); - } catch (FileNotFoundException e) { - LOGGER.error("FileNotFoundException caught!"); - } - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java deleted file mode 100644 index ab46c83da4..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/GlobalExceptionHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.exceptions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class GlobalExceptionHandler { - - public static void main(String[] args) { - - Handler globalExceptionHandler = new Handler(); - Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); - new GlobalExceptionHandler().performArithmeticOperation(10, 0); - } - - public int performArithmeticOperation(int num1, int num2) { - return num1/num2; - } - -} - -class Handler implements Thread.UncaughtExceptionHandler { - - private static Logger LOGGER = LoggerFactory.getLogger(Handler.class); - - public void uncaughtException(Thread t, Throwable e) { - LOGGER.info("Unhandled exception caught!"); - } -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalArgument.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalArgument.java deleted file mode 100644 index 801536cb2d..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalArgument.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.exceptions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class IllegalArgument { - - private static Logger LOGGER = LoggerFactory.getLogger(IllegalArgument.class); - - public static void main(String[] args) { - try { - Thread.sleep(-1000); - } catch (InterruptedException e) { - LOGGER.error("IllegalArgumentException caught!"); - } - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalState.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalState.java deleted file mode 100644 index e8ddcea3c2..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IllegalState.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.exceptions; - -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class IllegalState { - - private static Logger LOGGER = LoggerFactory.getLogger(IllegalState.class); - - public static void main(String[] args) { - - List intList = new ArrayList<>(); - - for (int i = 0; i < 10; i++) { - intList.add(i); - } - - Iterator intListIterator = intList.iterator(); // Initialized with index at -1 - - try { - intListIterator.remove(); // IllegalStateException - } catch (IllegalStateException e) { - LOGGER.error("IllegalStateException caught!"); - } - - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java deleted file mode 100644 index 9877fe25ca..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/IncorrectFileNameException.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.exceptions; - -public class IncorrectFileNameException extends Exception { - private static final long serialVersionUID = 1L; - - public IncorrectFileNameException(String errorMessage) { - super(errorMessage); - } - - public IncorrectFileNameException(String errorMessage, Throwable thr) { - super(errorMessage, thr); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java deleted file mode 100644 index 319fd33591..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/InterruptedExceptionExample.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.exceptions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -class ChildThread extends Thread { - - private static Logger LOGGER = LoggerFactory.getLogger(ChildThread.class); - - public void run() { - try { - Thread.sleep(1000); - } catch (InterruptedException e) { - LOGGER.error("InterruptedException caught!"); - } - } - -} - -public class InterruptedExceptionExample { - - public static void main(String[] args) throws InterruptedException { - ChildThread childThread = new ChildThread(); - childThread.start(); - childThread.interrupt(); - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/MalformedURL.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/MalformedURL.java deleted file mode 100644 index 57fcddf76b..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/MalformedURL.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.exceptions; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class MalformedURL { - - private static Logger LOGGER = LoggerFactory.getLogger(MalformedURL.class); - - public static void main(String[] args) { - - URL baeldungURL = null; - - try { - baeldungURL = new URL("malformedurl"); - } catch (MalformedURLException e) { - LOGGER.error("MalformedURLException caught!"); - } - - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java deleted file mode 100644 index d4ee9c0d6f..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullOrEmptyException.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.exceptions; - -public class NullOrEmptyException extends RuntimeException { - - private static final long serialVersionUID = 1L; - - public NullOrEmptyException(String errorMessage) { - super(errorMessage); - } - - public NullOrEmptyException(String errorMessage, Throwable thr) { - super(errorMessage, thr); - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullPointer.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullPointer.java deleted file mode 100644 index 2402a786a9..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NullPointer.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.baeldung.exceptions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class NullPointer { - - private static Logger LOGGER = LoggerFactory.getLogger(NullPointer.class); - - public static void main(String[] args) { - - Person personObj = null; - - try { - String name = personObj.personName; // Accessing the field of a null object - personObj.personName = "Jon Doe"; // Modifying the field of a null object - } catch (NullPointerException e) { - LOGGER.error("NullPointerException caught!"); - } - - } -} - -class Person { - - public String personName; - - public String getPersonName() { - return personName; - } - - public void setPersonName(String personName) { - this.personName = personName; - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NumberFormat.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NumberFormat.java deleted file mode 100644 index 7050e70aee..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/NumberFormat.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.exceptions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class NumberFormat { - - private static Logger LOGGER = LoggerFactory.getLogger(NumberFormat.class); - - public static void main(String[] args) { - - String str1 = "100ABCD"; - - try { - int x = Integer.parseInt(str1); // Converting string with inappropriate format - int y = Integer.valueOf(str1); - } catch (NumberFormatException e) { - LOGGER.error("NumberFormatException caught!"); - } - - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java deleted file mode 100644 index f7fb4c91e4..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/ParseExceptionExample.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.exceptions; - -import java.text.DateFormat; -import java.text.ParseException; -import java.text.SimpleDateFormat; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class ParseExceptionExample { - - private static Logger LOGGER = LoggerFactory.getLogger(ParseExceptionExample.class); - - public static void main(String[] args) { - - DateFormat format = new SimpleDateFormat("MM, dd, yyyy"); - - try { - format.parse("01, , 2010"); - } catch (ParseException e) { - LOGGER.error("ParseException caught!"); - } - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java deleted file mode 100644 index cf449110e6..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/RootCauseFinder.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.baeldung.exceptions; - -import java.time.LocalDate; -import java.time.Period; -import java.time.format.DateTimeParseException; -import java.util.Objects; - -/** - * Utility class to find root cause exceptions. - */ -public class RootCauseFinder { - - private RootCauseFinder() { - } - - public static Throwable findCauseUsingPlainJava(Throwable throwable) { - Objects.requireNonNull(throwable); - Throwable rootCause = throwable; - while (rootCause.getCause() != null && rootCause.getCause() != rootCause) { - rootCause = rootCause.getCause(); - } - return rootCause; - } - - /** - * Calculates the age of a person from a given date. - */ - static class AgeCalculator { - - private AgeCalculator() { - } - - public static int calculateAge(String birthDate) { - if (birthDate == null || birthDate.isEmpty()) { - throw new IllegalArgumentException(); - } - - try { - return Period - .between(parseDate(birthDate), LocalDate.now()) - .getYears(); - } catch (DateParseException ex) { - throw new CalculationException(ex); - } - } - - private static LocalDate parseDate(String birthDateAsString) { - - LocalDate birthDate; - try { - birthDate = LocalDate.parse(birthDateAsString); - } catch (DateTimeParseException ex) { - throw new InvalidFormatException(birthDateAsString, ex); - } - - if (birthDate.isAfter(LocalDate.now())) { - throw new DateOutOfRangeException(birthDateAsString); - } - - return birthDate; - } - - } - - static class CalculationException extends RuntimeException { - - CalculationException(DateParseException ex) { - super(ex); - } - } - - static class DateParseException extends RuntimeException { - - DateParseException(String input) { - super(input); - } - - DateParseException(String input, Throwable thr) { - super(input, thr); - } - } - - static class InvalidFormatException extends DateParseException { - - InvalidFormatException(String input, Throwable thr) { - super("Invalid date format: " + input, thr); - } - } - - static class DateOutOfRangeException extends DateParseException { - - DateOutOfRangeException(String date) { - super("Date out of range: " + date); - } - - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StackTraceToString.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StackTraceToString.java deleted file mode 100644 index c6bf915996..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StackTraceToString.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.exceptions; - -import org.apache.commons.lang3.exception.ExceptionUtils; - -import java.io.PrintWriter; -import java.io.StringWriter; - -public class StackTraceToString { - - public static void main(String[] args) { - // Convert a StackTrace to String using core java - try { - throw new NullPointerException(); - } catch (Exception e) { - StringWriter sw = new StringWriter(); - PrintWriter pw = new PrintWriter(sw); - e.printStackTrace(pw); - - System.out.println(sw.toString()); - } - - // Convert a StackTrace to String using Apache Commons - try { - throw new IndexOutOfBoundsException(); - } catch (Exception e) { - System.out.println(ExceptionUtils.getStackTrace(e)); - } - } - -} diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java deleted file mode 100644 index bc297be498..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/StringIndexOutOfBounds.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.exceptions; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class StringIndexOutOfBounds { - - private static Logger LOGGER = LoggerFactory.getLogger(StringIndexOutOfBounds.class); - - public static void main(String[] args) { - - String str = "Hello World"; - - try { - char charAtNegativeIndex = str.charAt(-1); // Trying to access at negative index - char charAtLengthIndex = str.charAt(11); // Trying to access at index equal to size of the string - } catch (StringIndexOutOfBoundsException e) { - LOGGER.error("StringIndexOutOfBoundsException caught"); - } - - } - -} diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithChain.java similarity index 73% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithChain.java index 3d66c2b535..a2eae50108 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithChain.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithChain.java @@ -1,9 +1,9 @@ -package com.baeldung.chainedexception; +package com.baeldung.exceptions.chainedexception; -import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException; -import com.baeldung.chainedexception.exceptions.ManagerUpsetException; -import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException; -import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.GirlFriendOfManagerUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.ManagerUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.NoLeaveGrantedException; +import com.baeldung.exceptions.chainedexception.exceptions.TeamLeadUpsetException; public class LogWithChain { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithoutChain.java similarity index 75% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithoutChain.java index 7556e30663..8c37db0307 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/LogWithoutChain.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/LogWithoutChain.java @@ -1,9 +1,9 @@ -package com.baeldung.chainedexception; +package com.baeldung.exceptions.chainedexception; -import com.baeldung.chainedexception.exceptions.GirlFriendOfManagerUpsetException; -import com.baeldung.chainedexception.exceptions.ManagerUpsetException; -import com.baeldung.chainedexception.exceptions.NoLeaveGrantedException; -import com.baeldung.chainedexception.exceptions.TeamLeadUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.GirlFriendOfManagerUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.ManagerUpsetException; +import com.baeldung.exceptions.chainedexception.exceptions.NoLeaveGrantedException; +import com.baeldung.exceptions.chainedexception.exceptions.TeamLeadUpsetException; public class LogWithoutChain { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java similarity index 82% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java index e20c58ea5b..91537b58d4 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/GirlFriendOfManagerUpsetException.java @@ -1,4 +1,4 @@ -package com.baeldung.chainedexception.exceptions; +package com.baeldung.exceptions.chainedexception.exceptions; public class GirlFriendOfManagerUpsetException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/ManagerUpsetException.java similarity index 80% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/ManagerUpsetException.java index e95a3921a4..351521a522 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/ManagerUpsetException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/ManagerUpsetException.java @@ -1,4 +1,4 @@ -package com.baeldung.chainedexception.exceptions; +package com.baeldung.exceptions.chainedexception.exceptions; public class ManagerUpsetException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/NoLeaveGrantedException.java similarity index 80% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/NoLeaveGrantedException.java index b9521858b3..dd84baae74 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/NoLeaveGrantedException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/NoLeaveGrantedException.java @@ -1,4 +1,4 @@ -package com.baeldung.chainedexception.exceptions; +package com.baeldung.exceptions.chainedexception.exceptions; public class NoLeaveGrantedException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/TeamLeadUpsetException.java similarity index 80% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/TeamLeadUpsetException.java index f874620f00..4ea8c3db7a 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/chainedexception/exceptions/TeamLeadUpsetException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/chainedexception/exceptions/TeamLeadUpsetException.java @@ -1,4 +1,4 @@ -package com.baeldung.chainedexception.exceptions; +package com.baeldung.exceptions.chainedexception.exceptions; public class TeamLeadUpsetException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/FileManager.java similarity index 96% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/FileManager.java index b6f4d960aa..adc1b1613c 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/FileManager.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/FileManager.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; import java.io.File; import java.io.FileNotFoundException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionException.java similarity index 83% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionException.java index c6dc6d6964..4e8fece145 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileExtensionException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionException.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; public class IncorrectFileExtensionException extends RuntimeException{ private static final long serialVersionUID = 1L; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileNameException.java similarity index 82% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileNameException.java index a804cadb84..f7f6a9dd8c 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/customexception/IncorrectFileNameException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/customexception/IncorrectFileNameException.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; public class IncorrectFileNameException extends Exception { private static final long serialVersionUID = 1L; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Exceptions.java similarity index 99% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Exceptions.java index 32d88cfd12..14483b3489 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Exceptions.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Exceptions.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; import java.io.File; import java.io.FileNotFoundException; diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java new file mode 100644 index 0000000000..bc2c6baffb --- /dev/null +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/MyException.java @@ -0,0 +1,5 @@ +package com.baeldung.exceptions.exceptionhandling; + +public class MyException extends Throwable { + +} diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Player.java similarity index 72% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Player.java index e866802fe3..1251cd58e6 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/Player.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/Player.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; public class Player { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerLoadException.java similarity index 75% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerLoadException.java index d92edeebbd..432232c23e 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerLoadException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerLoadException.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; import java.io.IOException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerScoreException.java similarity index 71% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerScoreException.java index 299370ee86..ba2a6d74e4 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/PlayerScoreException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/PlayerScoreException.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; public class PlayerScoreException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/TimeoutException.java similarity index 71% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/TimeoutException.java index 0211284e5d..0f926ccf58 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/TimeoutException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/exceptionhandling/TimeoutException.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; public class TimeoutException extends Exception { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalize/FinalizeObject.java similarity index 88% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalize/FinalizeObject.java index af0449c0da..9e5e7461ea 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalize/FinalizeObject.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalize/FinalizeObject.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finalize; +package com.baeldung.exceptions.keywords.finalize; public class FinalizeObject { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Child.java similarity index 78% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Child.java index 8615c78652..b006850199 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Child.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Child.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finalkeyword; +package com.baeldung.exceptions.keywords.finalkeyword; public final class Child extends Parent { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/GrandChild.java similarity index 56% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/GrandChild.java index 1530c5037f..f8adf27914 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/GrandChild.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/GrandChild.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finalkeyword; +package com.baeldung.exceptions.keywords.finalkeyword; /*public class GrandChild extends Child { // Compilation error diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Parent.java similarity index 87% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Parent.java index 5cd2996e7a..2a5d19a32f 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finalkeyword/Parent.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finalkeyword/Parent.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finalkeyword; +package com.baeldung.exceptions.keywords.finalkeyword; public class Parent { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finallykeyword/FinallyExample.java similarity index 92% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finallykeyword/FinallyExample.java index 3c0aee3196..8f9d9a29d2 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/keywords/finallykeyword/FinallyExample.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/keywords/finallykeyword/FinallyExample.java @@ -1,4 +1,4 @@ -package com.baeldung.keywords.finallykeyword; +package com.baeldung.exceptions.keywords.finallykeyword; public class FinallyExample { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/ClassWithInitErrors.java similarity index 55% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/ClassWithInitErrors.java index b5b357a322..a82f430959 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/ClassWithInitErrors.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/ClassWithInitErrors.java @@ -1,4 +1,4 @@ -package com.baeldung.noclassdeffounderror; +package com.baeldung.exceptions.noclassdeffounderror; public class ClassWithInitErrors { static int data = 1 / 0; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorExample.java similarity index 86% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorExample.java index 7bcefbdbd3..0dc74a9d01 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorExample.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorExample.java @@ -1,4 +1,4 @@ -package com.baeldung.noclassdeffounderror; +package com.baeldung.exceptions.noclassdeffounderror; public class NoClassDefFoundErrorExample { public ClassWithInitErrors getClassWithInitErrors() { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyRunnable.java similarity index 90% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyRunnable.java index 88a8696053..06b587d0e0 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyRunnable.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyRunnable.java @@ -1,4 +1,4 @@ -package com.baeldung.sneakythrows; +package com.baeldung.exceptions.sneakythrows; import lombok.SneakyThrows; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyThrows.java similarity index 90% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyThrows.java index 847aaa7249..e86ef53733 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/sneakythrows/SneakyThrows.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/sneakythrows/SneakyThrows.java @@ -1,4 +1,4 @@ -package com.baeldung.sneakythrows; +package com.baeldung.exceptions.sneakythrows; import java.io.IOException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/AccountHolder.java similarity index 74% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/AccountHolder.java index 91b8a3bbb0..5beac1cd04 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/AccountHolder.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/AccountHolder.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class AccountHolder { private String firstName; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassOne.java similarity index 86% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassOne.java index 3b95fd1368..e290a1fe38 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassOne.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassOne.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class ClassOne { private int oneValue; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassTwo.java similarity index 86% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassTwo.java index 0adf075b43..fc6a89e1fb 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/ClassTwo.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/ClassTwo.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class ClassTwo { private int twoValue; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java similarity index 78% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java index c67eeb30d1..858871cb9d 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationCondition.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class InfiniteRecursionWithTerminationCondition { public int calculateFactorial(final int number) { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationCondition.java similarity index 78% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationCondition.java index 8d10c65dcc..69b1c0b5ab 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationCondition.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationCondition.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class RecursionWithCorrectTerminationCondition { public int calculateFactorial(final int number) { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursion.java similarity index 75% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursion.java index 0b7fb3cf94..c07fdcb01b 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursion.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursion.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; public class UnintendedInfiniteRecursion { public int calculateFactorial(int number) { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/DataAccessException.java similarity index 78% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/DataAccessException.java index 0b371dcedb..448c8e2213 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/DataAccessException.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/DataAccessException.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; public class DataAccessException extends RuntimeException { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java similarity index 95% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java index 17fbf5a582..dfe8fcbd5a 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/Main.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/Main.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import com.sun.mail.iap.ConnectionException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/PersonRepository.java similarity index 79% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/PersonRepository.java index 7d8345c3c1..73453f4fc0 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/PersonRepository.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/PersonRepository.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import java.sql.SQLException; import java.util.List; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/SimpleService.java similarity index 90% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/SimpleService.java index 6bb8b90bf1..605d900633 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/SimpleService.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/SimpleService.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import java.sql.SQLException; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/TryCatch.java similarity index 85% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java rename to core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/TryCatch.java index 2fd87f124d..f8a603f013 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/throwsexception/TryCatch.java +++ b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/exceptions/throwvsthrows/TryCatch.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import com.sun.mail.iap.ConnectionException; diff --git a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/PersonRepository.java b/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/PersonRepository.java deleted file mode 100644 index 46018faf80..0000000000 --- a/core-java-modules/core-java-exceptions/src/main/java/com/baeldung/optional/PersonRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.optional; - -public class PersonRepository { - - public String findNameById(String id) { - return id == null ? null : "Name"; - } - -} diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java deleted file mode 100644 index 6dcd0d72e0..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/error/ErrorGeneratorUnitTest.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.exception.error; - -import org.junit.Assert; -import org.junit.Test; - -public class ErrorGeneratorUnitTest { - - @Test(expected = AssertionError.class) - public void whenError_thenIsNotCaughtByCatchException() { - try { - throw new AssertionError(); - } catch (Exception e) { - Assert.fail(); // errors are not caught by catch exception - } - } - - @Test - public void whenError_thenIsCaughtByCatchError() { - try { - throw new AssertionError(); - } catch (Error e) { - // caught! -> test pass - } - } -} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java deleted file mode 100644 index cb26bf451a..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exception/numberformat/NumberFormatExceptionUnitTest.java +++ /dev/null @@ -1,154 +0,0 @@ -package com.baeldung.exception.numberformat; - -import static org.junit.Assert.assertEquals; - -import java.math.BigDecimal; -import java.math.BigInteger; -import java.text.NumberFormat; -import java.text.ParseException; -import java.util.Locale; -import java.util.logging.Logger; - -import org.junit.Test; - -/** - * A set of examples tested to show cases where NumberFormatException is thrown and not thrown. - */ -public class NumberFormatExceptionUnitTest { - - Logger LOG = Logger.getLogger(NumberFormatExceptionUnitTest.class.getName()); - - /* ---INTEGER FAIL CASES--- */ - @Test(expected = NumberFormatException.class) - public void givenByteConstructor_whenAlphabetAsInput_thenFail() { - Byte byteInt = new Byte("one"); - } - - @Test(expected = NumberFormatException.class) - public void givenShortConstructor_whenSpaceInInput_thenFail() { - Short shortInt = new Short("2 "); - } - - @Test(expected = NumberFormatException.class) - public void givenParseIntMethod_whenSpaceInInput_thenFail() { - Integer aIntPrim = Integer.parseInt("6000 "); - } - - @Test(expected = NumberFormatException.class) - public void givenParseIntMethod_whenUnderscoreInInput_thenFail() { - int bIntPrim = Integer.parseInt("_6000"); - } - - @Test(expected = NumberFormatException.class) - public void givenIntegerValueOfMethod_whenCommaInInput_thenFail() { - Integer cIntPrim = Integer.valueOf("6,000"); - } - - @Test(expected = NumberFormatException.class) - public void givenBigIntegerConstructor_whenDecimalInInput_thenFail() { - BigInteger bigInteger = new BigInteger("4.0"); - } - - @Test(expected = NumberFormatException.class) - public void givenDecodeMethod_whenAlphabetInInput_thenFail() { - Long decodedLong = Long.decode("64403L"); - } - - /* ---INTEGER PASS CASES--- */ - @Test - public void givenInvalidNumberInputs_whenOptimized_thenPass() { - Byte byteInt = new Byte("1"); - assertEquals(1, byteInt.intValue()); - - Short shortInt = new Short("2 ".trim()); - assertEquals(2, shortInt.intValue()); - - Integer aIntObj = Integer.valueOf("6"); - assertEquals(6, aIntObj.intValue()); - - BigInteger bigInteger = new BigInteger("4"); - assertEquals(4, bigInteger.intValue()); - - int aIntPrim = Integer.parseInt("6000 ".trim()); - assertEquals(6000, aIntPrim); - - int bIntPrim = Integer.parseInt("_6000".replaceAll("_", "")); - assertEquals(6000, bIntPrim); - - int cIntPrim = Integer.parseInt("-6000"); - assertEquals(-6000, cIntPrim); - - Long decodeInteger = Long.decode("644032334"); - assertEquals(644032334L, decodeInteger.longValue()); - } - - /* ---DOUBLE FAIL CASES--- */ - @Test(expected = NumberFormatException.class) - public void givenFloatConstructor_whenAlphabetInInput_thenFail() { - Float floatDecimalObj = new Float("one.1"); - } - - @Test(expected = NumberFormatException.class) - public void givenDoubleConstructor_whenAlphabetInInput_thenFail() { - Double doubleDecimalObj = new Double("two.2"); - } - - @Test(expected = NumberFormatException.class) - public void givenBigDecimalConstructor_whenSpecialCharsInInput_thenFail() { - BigDecimal bigDecimalObj = new BigDecimal("3_0.3"); - } - - @Test(expected = NumberFormatException.class) - public void givenParseDoubleMethod_whenCommaInInput_thenFail() { - double aDoublePrim = Double.parseDouble("4000,1"); - } - - /* ---DOUBLE PASS CASES--- */ - @Test - public void givenDoubleConstructor_whenDecimalInInput_thenPass() { - Double doubleDecimalObj = new Double("2.2"); - assertEquals(2.2, doubleDecimalObj.doubleValue(), 0); - } - - @Test - public void givenDoubleValueOfMethod_whenMinusInInput_thenPass() { - Double aDoubleObj = Double.valueOf("-6000"); - assertEquals(-6000, aDoubleObj.doubleValue(), 0); - } - - @Test - public void givenUsDecimalNumber_whenParsedWithNumberFormat_thenPass() throws ParseException { - Number parsedNumber = parseNumberWithLocale("4000.1", Locale.US); - assertEquals(4000.1, parsedNumber); - assertEquals(4000.1, parsedNumber.doubleValue(), 0); - assertEquals(4000, parsedNumber.intValue()); - } - - /** - * In most European countries (for example, France), comma is used as decimal in place of period. - * @throws ParseException if the input string contains special characters other than comma or decimal. - * In this test case, anything after decimal (period) is dropped when a European locale is set. - */ - @Test - public void givenEuDecimalNumberHasComma_whenParsedWithNumberFormat_thenPass() throws ParseException { - Number parsedNumber = parseNumberWithLocale("4000,1", Locale.FRANCE); - LOG.info("Number parsed is: " + parsedNumber); - assertEquals(4000.1, parsedNumber); - assertEquals(4000.1, parsedNumber.doubleValue(), 0); - assertEquals(4000, parsedNumber.intValue()); - } - - /** - * Converts a string into a number retaining all decimals, and symbols valid in a locale. - * @param number the input string for a number. - * @param locale the locale to consider while parsing a number. - * @return the generic number object which can represent multiple number types. - * @throws ParseException when input contains invalid characters. - */ - private Number parseNumberWithLocale(String number, Locale locale) throws ParseException { - locale = locale == null ? Locale.getDefault() : locale; - NumberFormat numberFormat = NumberFormat.getInstance(locale); - return numberFormat.parse(number); - } - -} diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java deleted file mode 100644 index d82b1349d8..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/CheckedUncheckedExceptionsUnitTest.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.baeldung.exceptions; - -import static org.junit.jupiter.api.Assertions.assertThrows; - -import java.io.FileNotFoundException; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -/** - * Tests the {@link CheckedUncheckedExceptions}. - */ -public class CheckedUncheckedExceptionsUnitTest { - - @Test - public void whenFileNotExist_thenThrowException() { - assertThrows(FileNotFoundException.class, () -> { - CheckedUncheckedExceptions.checkedExceptionWithThrows(); - }); - } - - @Test - public void whenTryCatchExcetpion_thenSuccess() { - try { - CheckedUncheckedExceptions.checkedExceptionWithTryCatch(); - } catch (Exception e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void whenDivideByZero_thenThrowException() { - assertThrows(ArithmeticException.class, () -> { - CheckedUncheckedExceptions.divideByZero(); - }); - } - - @Test - public void whenInvalidFile_thenThrowException() { - - assertThrows(IncorrectFileNameException.class, () -> { - CheckedUncheckedExceptions.checkFile("wrongFileName.txt"); - }); - } - - @Test - public void whenNullOrEmptyFile_thenThrowException() { - assertThrows(NullOrEmptyException.class, () -> { - CheckedUncheckedExceptions.checkFile(null); - }); - assertThrows(NullOrEmptyException.class, () -> { - CheckedUncheckedExceptions.checkFile(""); - }); - } -} diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java deleted file mode 100644 index 394de9c576..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/GlobalExceptionHandlerUnitTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.baeldung.exceptions; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.Mock; -import org.mockito.junit.MockitoJUnitRunner; -import org.slf4j.LoggerFactory; -import ch.qos.logback.classic.Level; -import ch.qos.logback.classic.Logger; -import ch.qos.logback.classic.spi.ILoggingEvent; -import ch.qos.logback.classic.spi.LoggingEvent; -import ch.qos.logback.core.Appender; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.verify; - -@RunWith(MockitoJUnitRunner.class) -public class GlobalExceptionHandlerUnitTest { - - @Mock - private Appender mockAppender; - - @Captor - private ArgumentCaptor captorLoggingEvent; - - @Before - public void setup() { - final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - logger.addAppender(mockAppender); - - Handler globalExceptionHandler = new Handler(); - Thread.setDefaultUncaughtExceptionHandler(globalExceptionHandler); - } - - @After - public void teardown() { - final Logger logger = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); - logger.detachAppender(mockAppender); - } - - @Test - public void whenArithmeticException_thenUseUncaughtExceptionHandler() throws InterruptedException { - - Thread globalExceptionHandlerThread = new Thread() { - public void run() { - GlobalExceptionHandler globalExceptionHandlerObj = new GlobalExceptionHandler(); - globalExceptionHandlerObj.performArithmeticOperation(99, 0); - } - }; - - globalExceptionHandlerThread.start(); - globalExceptionHandlerThread.join(); - - verify(mockAppender).doAppend(captorLoggingEvent.capture()); - LoggingEvent loggingEvent = captorLoggingEvent.getValue(); - - assertThat(loggingEvent.getLevel()).isEqualTo(Level.INFO); - assertThat(loggingEvent.getFormattedMessage()).isEqualTo("Unhandled exception caught!"); - } - -} diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java deleted file mode 100644 index 5d0f3b9c3e..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/RootCauseFinderUnitTest.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.baeldung.exceptions; - -import com.google.common.base.Throwables; -import org.apache.commons.lang3.exception.ExceptionUtils; -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -import java.time.LocalDate; -import java.time.format.DateTimeParseException; -import java.time.temporal.ChronoUnit; - -import static com.baeldung.exceptions.RootCauseFinder.*; -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Tests the {@link RootCauseFinder}. - */ -public class RootCauseFinderUnitTest { - - @Test - public void givenBirthDate_whenCalculatingAge_thenAgeReturned() { - try { - int age = AgeCalculator.calculateAge("1990-01-01"); - Assertions.assertEquals(1990, LocalDate - .now() - .minus(age, ChronoUnit.YEARS) - .getYear()); - } catch (CalculationException e) { - Assertions.fail(e.getMessage()); - } - } - - @Test - public void givenWrongFormatDate_whenFindingRootCauseUsingJava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("010102"); - } catch (CalculationException ex) { - assertTrue(findCauseUsingPlainJava(ex) instanceof DateTimeParseException); - } - } - - @Test - public void givenOutOfRangeDate_whenFindingRootCauseUsingJava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("2020-04-04"); - } catch (CalculationException ex) { - assertTrue(findCauseUsingPlainJava(ex) instanceof DateOutOfRangeException); - } - } - - @Test - public void givenNullDate_whenFindingRootCauseUsingJava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge(null); - } catch (Exception ex) { - assertTrue(findCauseUsingPlainJava(ex) instanceof IllegalArgumentException); - } - } - - @Test - public void givenWrongFormatDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("010102"); - } catch (CalculationException ex) { - assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateTimeParseException); - } - } - - @Test - public void givenOutOfRangeDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("2020-04-04"); - } catch (CalculationException ex) { - assertTrue(ExceptionUtils.getRootCause(ex) instanceof DateOutOfRangeException); - } - } - - @Test - public void givenNullDate_whenFindingRootCauseUsingApacheCommons_thenRootCauseNotFound() { - try { - AgeCalculator.calculateAge(null); - } catch (Exception ex) { - assertTrue(ExceptionUtils.getRootCause(ex) instanceof IllegalArgumentException); - } - } - - @Test - public void givenWrongFormatDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("010102"); - } catch (CalculationException ex) { - assertTrue(Throwables.getRootCause(ex) instanceof DateTimeParseException); - } - } - - @Test - public void givenOutOfRangeDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge("2020-04-04"); - } catch (CalculationException ex) { - assertTrue(Throwables.getRootCause(ex) instanceof DateOutOfRangeException); - } - } - - @Test - public void givenNullDate_whenFindingRootCauseUsingGuava_thenRootCauseFound() { - try { - AgeCalculator.calculateAge(null); - } catch (Exception ex) { - assertTrue(Throwables.getRootCause(ex) instanceof IllegalArgumentException); - } - } - -} diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/classnotfoundexception/ClassNotFoundExceptionUnitTest.java similarity index 84% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/classnotfoundexception/ClassNotFoundExceptionUnitTest.java index 59605fb1c9..9311a9d886 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/classnotfoundexception/ClassNotFoundExceptionUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/classnotfoundexception/ClassNotFoundExceptionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.classnotfoundexception; +package com.baeldung.exceptions.classnotfoundexception; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionExceptionUnitTest.java similarity index 95% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionExceptionUnitTest.java index 230698f719..80787daaaa 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileExtensionExceptionUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileExtensionExceptionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; import static org.assertj.core.api.Assertions.assertThat; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileNameExceptionUnitTest.java similarity index 92% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileNameExceptionUnitTest.java index acb05eb763..8e135c1cec 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/customexception/IncorrectFileNameExceptionUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/customexception/IncorrectFileNameExceptionUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.customexception; +package com.baeldung.exceptions.customexception; import static org.assertj.core.api.Assertions.assertThat; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/exceptionhandling/ExceptionsUnitTest.java similarity index 97% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/exceptionhandling/ExceptionsUnitTest.java index 29c690133d..3551de3631 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/exceptionhandling/ExceptionsUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/exceptionhandling/ExceptionsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptionhandling; +package com.baeldung.exceptions.exceptionhandling; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java similarity index 85% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java index 521c50098a..135a51f9dd 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/noclassdeffounderror/NoClassDefFoundErrorUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.noclassdeffounderror; +package com.baeldung.exceptions.noclassdeffounderror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyRunnableUnitTest.java similarity index 89% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyRunnableUnitTest.java index 8d8e4f14fe..086c4eaef0 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyRunnableUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyRunnableUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.sneakythrows; +package com.baeldung.exceptions.sneakythrows; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyThrowsUnitTest.java similarity index 89% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyThrowsUnitTest.java index da1b2e617b..3b70128a9b 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/sneakythrows/SneakyThrowsUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/sneakythrows/SneakyThrowsUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.sneakythrows; +package com.baeldung.exceptions.sneakythrows; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/AccountHolderManualTest.java similarity index 82% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/AccountHolderManualTest.java index 180b7723ac..dac8698bf8 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/AccountHolderManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/AccountHolderManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/CyclicDependancyManualTest.java similarity index 81% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/CyclicDependancyManualTest.java index 95164ac935..db6b1d45f8 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/CyclicDependancyManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/CyclicDependancyManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java similarity index 95% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java index ccf8c25271..2c7289cd5c 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/InfiniteRecursionWithTerminationConditionManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java similarity index 89% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java index 40c2c4799e..e7fb0874ea 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/RecursionWithCorrectTerminationConditionManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java similarity index 94% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java index f4e2e5221a..0f1d71034d 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/stackoverflowerror/UnintendedInfiniteRecursionManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.stackoverflowerror; +package com.baeldung.exceptions.stackoverflowerror; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows/SimpleServiceUnitTest.java similarity index 92% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java rename to core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows/SimpleServiceUnitTest.java index b9a658a960..87f6224217 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/throwsexception/SimpleServiceUnitTest.java +++ b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/exceptions/throwvsthrows/SimpleServiceUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.throwsexception; +package com.baeldung.exceptions.throwvsthrows; import org.junit.jupiter.api.Test; diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java deleted file mode 100644 index 32879aed0c..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/java8/JavaTryWithResourcesLongRunningUnitTest.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.baeldung.java8; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Date; -import java.util.Scanner; - -import org.junit.Assert; -import org.junit.Test; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class JavaTryWithResourcesLongRunningUnitTest { - - private static final Logger LOG = LoggerFactory.getLogger(JavaTryWithResourcesLongRunningUnitTest.class); - - private static final String TEST_STRING_HELLO_WORLD = "Hello World"; - private Date resource1Date, resource2Date; - - // tests - - /* Example for using Try_with_resources */ - @Test - public void whenWritingToStringWriter_thenCorrectlyWritten() { - final StringWriter sw = new StringWriter(); - try (PrintWriter pw = new PrintWriter(sw, true)) { - pw.print(TEST_STRING_HELLO_WORLD); - } - - Assert.assertEquals(sw.getBuffer() - .toString(), TEST_STRING_HELLO_WORLD); - } - - /* Example for using multiple resources */ - @Test - public void givenStringToScanner_whenWritingToStringWriter_thenCorrectlyWritten() { - - final StringWriter sw = new StringWriter(); - try (Scanner sc = new Scanner(TEST_STRING_HELLO_WORLD); PrintWriter pw = new PrintWriter(sw, true)) { - while (sc.hasNext()) { - pw.print(sc.nextLine()); - } - } - - Assert.assertEquals(sw.getBuffer() - .toString(), TEST_STRING_HELLO_WORLD); - } - - /* Example to show order in which the resources are closed */ - @Test - public void whenFirstAutoClosableResourceIsinitializedFirst_thenFirstAutoClosableResourceIsReleasedFirst() throws Exception { - try (AutoCloseableResourcesFirst af = new AutoCloseableResourcesFirst(); AutoCloseableResourcesSecond as = new AutoCloseableResourcesSecond()) { - af.doSomething(); - as.doSomething(); - } - Assert.assertTrue(resource1Date.after(resource2Date)); - } - - class AutoCloseableResourcesFirst implements AutoCloseable { - public AutoCloseableResourcesFirst() { - LOG.debug("Constructor -> AutoCloseableResources_First"); - } - - public void doSomething() { - LOG.debug("Something -> AutoCloseableResources_First"); - } - - @Override - public void close() throws Exception { - LOG.debug("Closed AutoCloseableResources_First"); - resource1Date = new Date(); - } - } - - class AutoCloseableResourcesSecond implements AutoCloseable { - public AutoCloseableResourcesSecond() { - LOG.debug("Constructor -> AutoCloseableResources_Second"); - } - - public void doSomething() { - LOG.debug("Something -> AutoCloseableResources_Second"); - } - - @Override - public void close() throws Exception { - LOG.debug("Closed AutoCloseableResources_Second"); - resource2Date = new Date(); - Thread.sleep(10000); - } - } - -} \ No newline at end of file diff --git a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java b/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java deleted file mode 100644 index 4efa625ccd..0000000000 --- a/core-java-modules/core-java-exceptions/src/test/java/com/baeldung/optional/PersonRepositoryUnitTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.optional; - -import org.junit.Test; - -import java.util.Optional; - -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class PersonRepositoryUnitTest { - - PersonRepository personRepository = new PersonRepository(); - - @Test - public void whenIdIsNull_thenExceptionIsThrown() { - assertThrows(IllegalArgumentException.class, - () -> - Optional - .ofNullable(personRepository.findNameById(null)) - .orElseThrow(IllegalArgumentException::new)); - } - - @Test - public void whenIdIsNonNull_thenNoExceptionIsThrown() { - assertAll( - () -> - Optional - .ofNullable(personRepository.findNameById("id")) - .orElseThrow(RuntimeException::new)); - } - - @Test - public void whenIdNonNull_thenReturnsNameUpperCase() { - String name = Optional - .ofNullable(personRepository.findNameById("id")) - .map(String::toUpperCase) - .orElseThrow(RuntimeException::new); - - assertEquals("NAME", name); - } - -} \ No newline at end of file diff --git a/core-java-modules/core-java-lang/src/test/resources/correctFileNameWithoutProperExtension b/core-java-modules/core-java-exceptions/src/test/resources/correctFileNameWithoutProperExtension similarity index 100% rename from core-java-modules/core-java-lang/src/test/resources/correctFileNameWithoutProperExtension rename to core-java-modules/core-java-exceptions/src/test/resources/correctFileNameWithoutProperExtension diff --git a/core-java-modules/core-java-lang/README.md b/core-java-modules/core-java-lang/README.md index ac91751600..6e619c1c4e 100644 --- a/core-java-modules/core-java-lang/README.md +++ b/core-java-modules/core-java-lang/README.md @@ -4,30 +4,22 @@ ### Relevant Articles: -- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) -- [Chained Exceptions in Java](http://www.baeldung.com/java-chained-exceptions) -- [Iterating Over Enum Values in Java](http://www.baeldung.com/java-enum-iteration) -- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization) -- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator) -- [Comparator and Comparable in Java](http://www.baeldung.com/java-comparator-comparable) -- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break) -- [Nested Classes in Java](http://www.baeldung.com/java-nested-classes) -- [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces) -- [Recursion In Java](http://www.baeldung.com/java-recursion) -- [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize) -- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java) -- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system) -- [Using Java Assertions](http://www.baeldung.com/java-assert) -- [ClassNotFoundException vs NoClassDefFoundError](http://www.baeldung.com/java-classnotfoundexception-and-noclassdeffounderror) -- [The StackOverflowError in Java](http://www.baeldung.com/java-stack-overflow-error) -- [Create a Custom Exception in Java](http://www.baeldung.com/java-new-custom-exception) -- [Exception Handling in Java](http://www.baeldung.com/java-exceptions) -- [Differences Between Final, Finally and Finalize in Java](https://www.baeldung.com/java-final-finally-finalize) +- [Generate equals() and hashCode() with Eclipse](https://www.baeldung.com/java-eclipse-equals-and-hashcode) +- [Iterating Over Enum Values in Java](https://www.baeldung.com/java-enum-iteration) +- [Java Double Brace Initialization](https://www.baeldung.com/java-double-brace-initialization) +- [Guide to the Diamond Operator in Java](https://www.baeldung.com/java-diamond-operator) +- [Comparator and Comparable in Java](https://www.baeldung.com/java-comparator-comparable) +- [The Java continue and break Keywords](https://www.baeldung.com/java-continue-and-break) +- [Nested Classes in Java](https://www.baeldung.com/java-nested-classes) +- [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces) +- [Recursion In Java](https://www.baeldung.com/java-recursion) +- [A Guide to the finalize Method in Java](https://www.baeldung.com/java-finalize) +- [Infinite Loops in Java](https://www.baeldung.com/infinite-loops-java) +- [Quick Guide to java.lang.System](https://www.baeldung.com/java-lang-system) +- [Using Java Assertions](https://www.baeldung.com/java-assert) - [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding) -- [Difference Between Throw and Throws in Java](https://www.baeldung.com/java-throw-throws) - [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic) - [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts) -- [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) - [Java Compound Operators](https://www.baeldung.com/java-compound-operators) - [Guide to Java Packages](https://www.baeldung.com/java-packages) diff --git a/core-java-modules/core-java-lang/pom.xml b/core-java-modules/core-java-lang/pom.xml index 8311636873..1a2b86f872 100644 --- a/core-java-modules/core-java-lang/pom.xml +++ b/core-java-modules/core-java-lang/pom.xml @@ -43,12 +43,6 @@ log4j-over-slf4j ${org.slf4j.version} - - org.projectlombok - lombok - ${lombok.version} - provided - org.assertj @@ -56,11 +50,6 @@ ${assertj-core.version} test - - javax.mail - mail - ${javax.mail.version} - @@ -75,9 +64,6 @@ 2.8.2 - - 1.5.0-b01 - 3.10.0 diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java deleted file mode 100644 index c2908b7278..0000000000 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/exceptionhandling/MyException.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.exceptionhandling; - -public class MyException extends Throwable { - -} diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml index 082ffbef53..68ece1c473 100644 --- a/core-java-modules/pom.xml +++ b/core-java-modules/pom.xml @@ -15,7 +15,6 @@ pre-jpms - core-java-exceptions core-java-optional core-java-lang-operators core-java-networking-2 diff --git a/pom.xml b/pom.xml index 4f40f8261f..733aaad056 100644 --- a/pom.xml +++ b/pom.xml @@ -415,6 +415,7 @@ core-java-modules/core-java-io-files core-java-modules/core-java-nio core-java-modules/core-java-security + core-java-modules/core-java-exceptions core-java-modules/core-java-lang-syntax core-java-modules/core-java-lang-syntax-2 core-java-modules/core-java-lang @@ -1162,6 +1163,7 @@ core-java-modules/core-java-io-files core-java-modules/core-java-nio core-java-modules/core-java-security + core-java-modules/core-java-exceptions core-java-modules/core-java-lang-syntax core-java-modules/core-java-lang-syntax-2 core-java-modules/core-java-lang From e4ef23d7b971c8e77cfe71ed6a1f828c42d193ff Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Thu, 3 Oct 2019 05:19:05 +0100 Subject: [PATCH 337/396] Add README descriptions 28! (#7917) --- core-groovy-collections/README.md | 4 +++- core-java-modules/core-java-10/README.md | 3 +++ core-java-modules/core-java-11/README.md | 4 ++++ core-java-modules/core-java-8-2/README.md | 5 +++-- core-java-modules/core-java-8/README.md | 5 +++-- core-java-modules/core-java-9/README.md | 6 ++---- .../core-java-arrays-2/{README.MD => README.md} | 5 +++++ core-java-modules/core-java-arrays/README.md | 5 +++-- core-java-modules/core-java-collections/README.md | 5 +++-- core-java-modules/core-java-os/README.md | 7 ++++--- 10 files changed, 33 insertions(+), 16 deletions(-) rename core-java-modules/core-java-arrays-2/{README.MD => README.md} (85%) diff --git a/core-groovy-collections/README.md b/core-groovy-collections/README.md index aeba8933be..4afd214e7d 100644 --- a/core-groovy-collections/README.md +++ b/core-groovy-collections/README.md @@ -1,4 +1,6 @@ -# Groovy +## Core Groovy Collections + +This module contains articles about Groovy core collections ## Relevant articles: diff --git a/core-java-modules/core-java-10/README.md b/core-java-modules/core-java-10/README.md index 8fb4f8a7dd..2b57ec9064 100644 --- a/core-java-modules/core-java-10/README.md +++ b/core-java-modules/core-java-10/README.md @@ -1,3 +1,6 @@ +## Core Java 10 + +This module contains articles about Java 10 core features ### Relevant Articles: diff --git a/core-java-modules/core-java-11/README.md b/core-java-modules/core-java-11/README.md index 11c7d9d388..514f24a4ae 100644 --- a/core-java-modules/core-java-11/README.md +++ b/core-java-modules/core-java-11/README.md @@ -1,3 +1,7 @@ +## Core Java 11 + +This module contains articles about Java 11 core features + ### Relevant articles - [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-code) diff --git a/core-java-modules/core-java-8-2/README.md b/core-java-modules/core-java-8-2/README.md index 4952cf4eb7..9201add1d7 100644 --- a/core-java-modules/core-java-8-2/README.md +++ b/core-java-modules/core-java-8-2/README.md @@ -1,6 +1,6 @@ -========= +## Core Java 8 (part 2) -## Core Java 8 Cookbooks and Examples (part 2) +This module contains articles about Java 8 core features ### Relevant Articles: - [Anonymous Classes in Java](http://www.baeldung.com/) @@ -8,3 +8,4 @@ - [Run a Java Application from the Command Line](https://www.baeldung.com/java-run-jar-with-arguments) - [Java 8 Stream skip() vs limit()](https://www.baeldung.com/java-stream-skip-vs-limit) - [Guide to Java BiFunction Interface](https://www.baeldung.com/java-bifunction-interface) +- [[<-- Prev]](/core-java-modules/core-java-8) \ No newline at end of file diff --git a/core-java-modules/core-java-8/README.md b/core-java-modules/core-java-8/README.md index 6d69d30d00..72bdafe5fa 100644 --- a/core-java-modules/core-java-8/README.md +++ b/core-java-modules/core-java-8/README.md @@ -1,6 +1,6 @@ -========= +## Core Java 8 -## Core Java 8 Cookbooks and Examples +This module contains articles about Java 8 core features ### Relevant Articles: - [New Features in Java 8](https://www.baeldung.com/java-8-new-features) @@ -12,3 +12,4 @@ - [Finding Min/Max in an Array with Java](https://www.baeldung.com/java-array-min-max) - [Internationalization and Localization in Java 8](https://www.baeldung.com/java-8-localization) - [Generalized Target-Type Inference in Java](https://www.baeldung.com/java-generalized-target-type-inference) +- [[More -->]](/core-java-modules/core-java-8-2) diff --git a/core-java-modules/core-java-9/README.md b/core-java-modules/core-java-9/README.md index 8b52ce79b4..f4939ae1e1 100644 --- a/core-java-modules/core-java-9/README.md +++ b/core-java-modules/core-java-9/README.md @@ -1,8 +1,6 @@ -========= +## Core Java 9 -## Core Java 9 Examples - -[Java 9 New Features](http://www.baeldung.com/new-java-9) +This module contains articles about Java 9 core features ### Relevant Articles: diff --git a/core-java-modules/core-java-arrays-2/README.MD b/core-java-modules/core-java-arrays-2/README.md similarity index 85% rename from core-java-modules/core-java-arrays-2/README.MD rename to core-java-modules/core-java-arrays-2/README.md index 952770a2da..5fa2f2bf4c 100644 --- a/core-java-modules/core-java-arrays-2/README.MD +++ b/core-java-modules/core-java-arrays-2/README.md @@ -1,3 +1,7 @@ +## Core Java Arrays (Part 2) + +This module contains articles about Java arrays + ## Relevant Articles - [Extending an Array’s Length](https://www.baeldung.com/java-array-add-element-at-the-end) @@ -8,3 +12,4 @@ - [Intersection Between two Integer Arrays](https://www.baeldung.com/java-array-intersection) - [Removing an Element from an Array in Java](https://www.baeldung.com/java-array-remove-element) - [Removing the First Element of an Array](https://www.baeldung.com/java-array-remove-first-element) +- [[<-- Prev]](/core-java-modules/core-java-arrays) diff --git a/core-java-modules/core-java-arrays/README.md b/core-java-modules/core-java-arrays/README.md index 36d2d4c4ad..42fe3f83a1 100644 --- a/core-java-modules/core-java-arrays/README.md +++ b/core-java-modules/core-java-arrays/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Arrays -## Core Java Arrays Cookbooks and Examples +This module contains articles about Java arrays ### Relevant Articles: - [How to Copy an Array in Java](https://www.baeldung.com/java-array-copy) @@ -14,3 +14,4 @@ - [How to Reverse an Array in Java](http://www.baeldung.com/java-invert-array) - [Sorting Arrays in Java](https://www.baeldung.com/java-sorting-arrays) - [Checking If an Array Is Sorted in Java](https://www.baeldung.com/java-check-sorted-array) +- [[More -->]](/core-java-modules/core-java-arrays-2) diff --git a/core-java-modules/core-java-collections/README.md b/core-java-modules/core-java-collections/README.md index 7be7d02b3f..340c2b286e 100644 --- a/core-java-modules/core-java-collections/README.md +++ b/core-java-modules/core-java-collections/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Collections -## Core Java Collections Cookbooks and Examples +This module contains articles about Java collections ### Relevant Articles: - [Collect a Java Stream to an Immutable Collection](https://www.baeldung.com/java-stream-immutable-collection) @@ -13,3 +13,4 @@ - [Defining a Char Stack in Java](https://www.baeldung.com/java-char-stack) - [Guide to the Java Queue Interface](https://www.baeldung.com/java-queue) - [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections) +- [[More -->]](/core-java-modules/core-java-collections-2) \ No newline at end of file diff --git a/core-java-modules/core-java-os/README.md b/core-java-modules/core-java-os/README.md index 697af5e4d6..9205628a87 100644 --- a/core-java-modules/core-java-os/README.md +++ b/core-java-modules/core-java-os/README.md @@ -1,10 +1,11 @@ -========= +## Core Java OS -This module uses Java 9, so make sure to have the JDK 9 installed to run it. +This module contains articles about working with the operating system (OS) in Java -## ### Relevant Articles: - [Java 9 Process API Improvements](http://www.baeldung.com/java-9-process-api) - [Guide to java.lang.Process API](https://www.baeldung.com/java-process-api) - [Guide to java.lang.ProcessBuilder API](https://www.baeldung.com/java-lang-processbuilder-api) - [Get the Current Working Directory in Java](https://www.baeldung.com/java-current-directory) + +This module uses Java 9, so make sure to have the JDK 9 installed to run it. \ No newline at end of file From 4a04af8ebfdbc083bbf3e5246800cbdca448d505 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 3 Oct 2019 09:53:05 +0530 Subject: [PATCH 338/396] BAEL-17956 Fix the integrations tests in vertx (#7889) * BAEL-17956 Fix the integrations tests in vertx * BAEL-17956 Fix the integrations tests in vertx -Added random port logic --- vertx/pom.xml | 5 +- .../RestServiceVerticleIntegrationTest.java | 46 ------------- .../baeldung/RestServiceVerticleUnitTest.java | 66 +++++++++++++++++++ .../SimpleServerVerticleIntegrationTest.java | 44 ------------- .../SimpleServerVerticleUnitTest.java | 55 ++++++++++++++++ 5 files changed, 123 insertions(+), 93 deletions(-) delete mode 100644 vertx/src/test/java/com/baeldung/RestServiceVerticleIntegrationTest.java create mode 100644 vertx/src/test/java/com/baeldung/RestServiceVerticleUnitTest.java delete mode 100644 vertx/src/test/java/com/baeldung/SimpleServerVerticleIntegrationTest.java create mode 100644 vertx/src/test/java/com/baeldung/SimpleServerVerticleUnitTest.java diff --git a/vertx/pom.xml b/vertx/pom.xml index befd4c45bb..c566681073 100644 --- a/vertx/pom.xml +++ b/vertx/pom.xml @@ -64,9 +64,8 @@ - 3.0.0 - 6.10 - 2.3 + 3.8.1 + 3.2.1 diff --git a/vertx/src/test/java/com/baeldung/RestServiceVerticleIntegrationTest.java b/vertx/src/test/java/com/baeldung/RestServiceVerticleIntegrationTest.java deleted file mode 100644 index 40fa6c7220..0000000000 --- a/vertx/src/test/java/com/baeldung/RestServiceVerticleIntegrationTest.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.baeldung; - -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -import com.baeldung.rest.RestServiceVerticle; - -import io.vertx.core.Vertx; -import io.vertx.ext.unit.Async; -import io.vertx.ext.unit.TestContext; -import io.vertx.ext.unit.junit.VertxUnitRunner; - -@RunWith(VertxUnitRunner.class) -public class RestServiceVerticleIntegrationTest { - - private Vertx vertx; - - @Before - public void setup(TestContext testContext) { - vertx = Vertx.vertx(); - - vertx.deployVerticle(RestServiceVerticle.class.getName(), testContext.asyncAssertSuccess()); - } - - @After - public void tearDown(TestContext testContext) { - vertx.close(testContext.asyncAssertSuccess()); - } - - @Test - public void givenId_whenReceivedArticle_thenSuccess(TestContext testContext) { - final Async async = testContext.async(); - - vertx.createHttpClient() - .getNow(8080, "localhost", "/api/baeldung/articles/article/12345", response -> { - response.handler(responseBody -> { - testContext.assertTrue(responseBody.toString() - .contains("\"id\" : \"12345\"")); - async.complete(); - }); - }); - } - -} diff --git a/vertx/src/test/java/com/baeldung/RestServiceVerticleUnitTest.java b/vertx/src/test/java/com/baeldung/RestServiceVerticleUnitTest.java new file mode 100644 index 0000000000..aab841f5bb --- /dev/null +++ b/vertx/src/test/java/com/baeldung/RestServiceVerticleUnitTest.java @@ -0,0 +1,66 @@ +package com.baeldung; + +import java.io.IOException; +import java.net.ServerSocket; + +import org.junit.After; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; + +import com.baeldung.rest.RestServiceVerticle; + +import io.vertx.core.DeploymentOptions; +import io.vertx.core.Vertx; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.unit.Async; +import io.vertx.ext.unit.TestContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; + +@RunWith(VertxUnitRunner.class) +public class RestServiceVerticleUnitTest { + + private Vertx vertx; + + private int port = 8081; + + @BeforeClass + public static void beforeClass() { + + } + + @Before + public void setup(TestContext testContext) throws IOException { + vertx = Vertx.vertx(); + + // Pick an available and random + ServerSocket socket = new ServerSocket(0); + port = socket.getLocalPort(); + socket.close(); + + DeploymentOptions options = new DeploymentOptions().setConfig(new JsonObject().put("http.port", port)); + + vertx.deployVerticle(RestServiceVerticle.class.getName(), options, testContext.asyncAssertSuccess()); + } + + @After + public void tearDown(TestContext testContext) { + vertx.close(testContext.asyncAssertSuccess()); + } + + @Test + public void givenId_whenReceivedArticle_thenSuccess(TestContext testContext) { + final Async async = testContext.async(); + + vertx.createHttpClient() + .getNow(port, "localhost", "/api/baeldung/articles/article/12345", response -> { + response.handler(responseBody -> { + testContext.assertTrue(responseBody.toString() + .contains("\"id\" : \"12345\"")); + async.complete(); + }); + }); + } + +} diff --git a/vertx/src/test/java/com/baeldung/SimpleServerVerticleIntegrationTest.java b/vertx/src/test/java/com/baeldung/SimpleServerVerticleIntegrationTest.java deleted file mode 100644 index 194f403e25..0000000000 --- a/vertx/src/test/java/com/baeldung/SimpleServerVerticleIntegrationTest.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung; - -import io.vertx.core.Vertx; -import io.vertx.ext.unit.Async; -import io.vertx.ext.unit.TestContext; -import io.vertx.ext.unit.junit.VertxUnitRunner; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(VertxUnitRunner.class) -public class SimpleServerVerticleIntegrationTest { - private Vertx vertx; - - @Before - public void setup(TestContext testContext) { - vertx = Vertx.vertx(); - - vertx.deployVerticle(SimpleServerVerticle.class.getName(), testContext.asyncAssertSuccess()); - } - - @After - public void tearDown(TestContext testContext) { - vertx.close(testContext.asyncAssertSuccess()); - } - - @Test - public void whenReceivedResponse_thenSuccess(TestContext testContext) { - final Async async = testContext.async(); - - vertx - .createHttpClient() - .getNow(8080, "localhost", "/", - response -> response.handler(responseBody -> { - testContext.assertTrue(responseBody - .toString() - .contains("Welcome")); - async.complete(); - })); - } - -} - diff --git a/vertx/src/test/java/com/baeldung/SimpleServerVerticleUnitTest.java b/vertx/src/test/java/com/baeldung/SimpleServerVerticleUnitTest.java new file mode 100644 index 0000000000..761577d5f3 --- /dev/null +++ b/vertx/src/test/java/com/baeldung/SimpleServerVerticleUnitTest.java @@ -0,0 +1,55 @@ +package com.baeldung; + +import io.vertx.core.DeploymentOptions; +import io.vertx.core.Vertx; +import io.vertx.core.json.JsonObject; +import io.vertx.ext.unit.Async; +import io.vertx.ext.unit.TestContext; +import io.vertx.ext.unit.junit.VertxUnitRunner; + +import java.io.IOException; +import java.net.ServerSocket; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +@RunWith(VertxUnitRunner.class) +public class SimpleServerVerticleUnitTest { + private Vertx vertx; + + private int port = 8081; + + @Before + public void setup(TestContext testContext) throws IOException { + vertx = Vertx.vertx(); + + // Pick an available and random + ServerSocket socket = new ServerSocket(0); + port = socket.getLocalPort(); + socket.close(); + + DeploymentOptions options = new DeploymentOptions().setConfig(new JsonObject().put("http.port", port)); + + vertx.deployVerticle(SimpleServerVerticle.class.getName(), options, testContext.asyncAssertSuccess()); + } + + @After + public void tearDown(TestContext testContext) { + vertx.close(testContext.asyncAssertSuccess()); + } + + @Test + public void whenReceivedResponse_thenSuccess(TestContext testContext) { + final Async async = testContext.async(); + + vertx.createHttpClient() + .getNow(port, "localhost", "/", response -> response.handler(responseBody -> { + testContext.assertTrue(responseBody.toString() + .contains("Welcome")); + async.complete(); + })); + } + +} From 68b080e1c540091d6b3a3b003398f05170966ab7 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Thu, 3 Oct 2019 05:48:02 +0100 Subject: [PATCH 339/396] [BAEL-17476] Add readme descriptions 19 (#7905) --- persistence-modules/spring-data-keyvalue/README.md | 4 ++++ persistence-modules/spring-hibernate-3/README.md | 9 ++++----- spring-cloud-data-flow/README.md | 5 ++--- spring-cloud/spring-cloud-security/README.md | 4 ++++ spring-cloud/spring-cloud-stream/README.md | 4 ++++ spring-cloud/spring-cloud-task/README.md | 4 ++++ spring-cloud/spring-cloud-zookeeper/README.md | 4 ++++ 7 files changed, 26 insertions(+), 8 deletions(-) diff --git a/persistence-modules/spring-data-keyvalue/README.md b/persistence-modules/spring-data-keyvalue/README.md index f76cf4d5ac..9f53a11b2c 100644 --- a/persistence-modules/spring-data-keyvalue/README.md +++ b/persistence-modules/spring-data-keyvalue/README.md @@ -1,2 +1,6 @@ +## Spring Data Key-Value + +This module contains articles about Spring Data Key-Value + ### Relevant Articles: - [A Guide to Spring Data Key Value](http://www.baeldung.com/spring-data-key-value) diff --git a/persistence-modules/spring-hibernate-3/README.md b/persistence-modules/spring-hibernate-3/README.md index ac840b6f66..898c6522a9 100644 --- a/persistence-modules/spring-hibernate-3/README.md +++ b/persistence-modules/spring-hibernate-3/README.md @@ -1,13 +1,12 @@ -========= +## Spring with Hibernate 3 -## Spring with Hibernate 3 Example Project +This module contains articles about Spring with Hibernate 3 + +### Relevant Articles: - -### Relevant ArticleS: - [Hibernate 3 with Spring](http://www.baeldung.com/hibernate3-spring) - [HibernateException: No Hibernate Session Bound to Thread in Hibernate 3](http://www.baeldung.com/no-hibernate-session-bound-to-thread-exception) - ### Quick Start ``` diff --git a/spring-cloud-data-flow/README.md b/spring-cloud-data-flow/README.md index 40e1db6840..c9b6891b54 100644 --- a/spring-cloud-data-flow/README.md +++ b/spring-cloud-data-flow/README.md @@ -1,4 +1,3 @@ -## Spring Cloud Data Flow - -This module contains modules about Spring Cloud Data Flow +## Spring Cloud Data Flow +This is an aggregator module for Spring Cloud Data Flow modules. diff --git a/spring-cloud/spring-cloud-security/README.md b/spring-cloud/spring-cloud-security/README.md index 7099406614..0f3b39c98b 100644 --- a/spring-cloud/spring-cloud-security/README.md +++ b/spring-cloud/spring-cloud-security/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Security + +This module contains articles about Spring Cloud Security + ### Relevant Articles: - [An Intro to Spring Cloud Security](http://www.baeldung.com/spring-cloud-security) diff --git a/spring-cloud/spring-cloud-stream/README.md b/spring-cloud/spring-cloud-stream/README.md index 5ecb852df5..fd1eeccfda 100644 --- a/spring-cloud/spring-cloud-stream/README.md +++ b/spring-cloud/spring-cloud-stream/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Stream + +This module contains articles about Spring Cloud Stream + ## Relevant Articles - [Introduction to Spring Cloud Stream](http://www.baeldung.com/spring-cloud-stream) diff --git a/spring-cloud/spring-cloud-task/README.md b/spring-cloud/spring-cloud-task/README.md index cabc1ac854..8f6ee26099 100644 --- a/spring-cloud/spring-cloud-task/README.md +++ b/spring-cloud/spring-cloud-task/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Task + +This module contains articles about Spring Cloud Task + ### Relevant Articles: - [An Intro to Spring Cloud Task](http://www.baeldung.com/spring-cloud-task) diff --git a/spring-cloud/spring-cloud-zookeeper/README.md b/spring-cloud/spring-cloud-zookeeper/README.md index a49a448833..2bef63ef9f 100644 --- a/spring-cloud/spring-cloud-zookeeper/README.md +++ b/spring-cloud/spring-cloud-zookeeper/README.md @@ -1,2 +1,6 @@ +## Spring Cloud Zookeeper + +This module contains articles about Spring Cloud Zookeeper + ### Relevant Articles: - [An Intro to Spring Cloud Zookeeper](http://www.baeldung.com/spring-cloud-zookeeper) From 476dbbc01aaeec8e09613b0a204b34edc4c8b972 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Thu, 3 Oct 2019 08:36:36 +0200 Subject: [PATCH 340/396] #BAEL-17518 add README descriptions --- httpclient-simple/README.md | 7 +++++-- hystrix/README.md | 4 ++++ image-processing/README.md | 4 ++++ immutables/README.md | 4 ++++ jackson-2/README.md | 5 +++-- jackson-simple/README.md | 3 ++- jackson/README.md | 5 +++-- java-collections-conversions/README.md | 4 ++-- java-collections-maps-2/README.md | 7 ++++++- java-collections-maps/README.md | 5 +++-- 10 files changed, 36 insertions(+), 12 deletions(-) diff --git a/httpclient-simple/README.md b/httpclient-simple/README.md index 13a539d794..098d5f278e 100644 --- a/httpclient-simple/README.md +++ b/httpclient-simple/README.md @@ -1,5 +1,8 @@ -========= -## This module contains articles that are part of the HTTPClient Ebook +## HTTPClient Ebook + +This module contains articles about HTTPClient that are part of the HTTPClient Ebook. + +### Relevant Articles - [HttpClient 4 – Get the Status Code](https://www.baeldung.com/httpclient-status-code) - [HttpClient with SSL](https://www.baeldung.com/httpclient-ssl) diff --git a/hystrix/README.md b/hystrix/README.md index f35518bce3..d53baee957 100644 --- a/hystrix/README.md +++ b/hystrix/README.md @@ -1,3 +1,7 @@ +## Hystrix + +This module contains articles about Hystrix. + ### Relevant Articles: - [Hystrix Integration with Existing Spring Application](https://www.baeldung.com/hystrix-integration-with-spring-aop) - [Introduction to Hystrix](https://www.baeldung.com/introduction-to-hystrix) diff --git a/image-processing/README.md b/image-processing/README.md index 2dd74d7c47..adb35c2318 100644 --- a/image-processing/README.md +++ b/image-processing/README.md @@ -1,2 +1,6 @@ +## Image Processing + +This module contains articles about image processing. + ### Relevant Articles: - [Working with Images in Java](https://www.baeldung.com/java-images) diff --git a/immutables/README.md b/immutables/README.md index 2ea4f4fe50..a93a342f9c 100644 --- a/immutables/README.md +++ b/immutables/README.md @@ -1,2 +1,6 @@ +## Immutables + +This module contains articles about the Immutables library. + ### Relevant Articles: - [Introduction to Immutables](https://www.baeldung.com/immutables) diff --git a/jackson-2/README.md b/jackson-2/README.md index 920eaa91e8..5e0cb4ec37 100644 --- a/jackson-2/README.md +++ b/jackson-2/README.md @@ -1,7 +1,7 @@ -========= - ## Jackson Cookbooks and Examples +This module contains articles about Jackson. + ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring @@ -12,3 +12,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Converting JSON to CSV in Java](https://www.baeldung.com/java-converting-json-to-csv) - [Compare Two JSON Objects with Jackson](https://www.baeldung.com/jackson-compare-two-json-objects) - [Calling Default Serializer from Custom Serializer in Jackson](https://www.baeldung.com/jackson-call-default-serializer-from-custom-serializer) +- More articles: [[<-- prev]](/../jackson) diff --git a/jackson-simple/README.md b/jackson-simple/README.md index 79538c6929..302fcb5b05 100644 --- a/jackson-simple/README.md +++ b/jackson-simple/README.md @@ -1,6 +1,7 @@ -========= ### Jackson Articles that are also part of the e-book +This module contains articles about Jackson that are also part of the Jackson Ebook. + ###The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/jackson/README.md b/jackson/README.md index fb7f6c4127..f96a569617 100644 --- a/jackson/README.md +++ b/jackson/README.md @@ -1,7 +1,7 @@ -========= - ## Jackson Cookbooks and Examples +This module contains articles about Jackson. + ###The Course The "REST With Spring" Classes: http://bit.ly/restwithspring @@ -32,4 +32,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Convert XML to JSON Using Jackson](https://www.baeldung.com/jackson-convert-xml-json) - [Deserialize Immutable Objects with Jackson](https://www.baeldung.com/jackson-deserialize-immutable-objects) - [Mapping a Dynamic JSON Object with Jackson](https://www.baeldung.com/jackson-mapping-dynamic-object) +- More articles: [[next -->]](/../jackson-2) diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md index e80f29f519..6d4f6ddb3a 100644 --- a/java-collections-conversions/README.md +++ b/java-collections-conversions/README.md @@ -1,7 +1,7 @@ -========= - ## Java Collections Cookbooks and Examples +This module contains articles about conversions among Collection types and arrays in Java. + ### Relevant Articles: - [Converting between an Array and a List in Java](https://www.baeldung.com/convert-array-to-list-and-list-to-array) - [Converting between an Array and a Set in Java](https://www.baeldung.com/convert-array-to-set-and-set-to-array) diff --git a/java-collections-maps-2/README.md b/java-collections-maps-2/README.md index 09c4b4fbb3..0db83fbae7 100644 --- a/java-collections-maps-2/README.md +++ b/java-collections-maps-2/README.md @@ -1,4 +1,8 @@ -## Relevant Articles: +## Java Collections Cookbooks and Examples + +This module contains articles about Map data structures in Java. + +### Relevant Articles: - [Map of Primitives in Java](https://www.baeldung.com/java-map-primitives) - [Copying a HashMap in Java](https://www.baeldung.com/java-copy-hashmap) - [Guide to Java HashMap]() @@ -10,3 +14,4 @@ - [Finding the Highest Value in a Java Map](https://www.baeldung.com/java-find-map-max) - [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) - [Java TreeMap vs HashMap](https://www.baeldung.com/java-treemap-vs-hashmap) +- More articles: [[<-- prev>]](/../java-collections-maps) diff --git a/java-collections-maps/README.md b/java-collections-maps/README.md index 3a6ad1d10c..87fefe1b9d 100644 --- a/java-collections-maps/README.md +++ b/java-collections-maps/README.md @@ -1,7 +1,7 @@ -========= - ## Java Collections Cookbooks and Examples +This module contains articles about Map data structures in Java. + ### Relevant Articles: - [Guide to the Guava BiMap](https://www.baeldung.com/guava-bimap) - [The Java HashMap Under the Hood](https://www.baeldung.com/java-hashmap) @@ -13,3 +13,4 @@ - [Comparing Two HashMaps in Java](https://www.baeldung.com/java-compare-hashmaps) - [Immutable Map Implementations in Java](https://www.baeldung.com/java-immutable-maps) - [Guide to Apache Commons MultiValuedMap](https://www.baeldung.com/apache-commons-multi-valued-map) +- More articles: [[next -->]](/../java-collections-maps-2) From 4a9cae5e851b602b205508b58f4156ae9044538a Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Thu, 3 Oct 2019 08:58:43 +0200 Subject: [PATCH 341/396] #BAEL-17520 add README descriptions --- java-strings-2/README.md | 7 ++++++- java-strings-3/README.md | 7 ++++++- java-strings-ops/README.md | 4 ++-- java-strings/README.md | 5 +++-- java-vavr-stream/README.md | 3 +++ java-websocket/README.md | 4 ++++ javafx/README.md | 4 ++++ javax-servlets/README.md | 4 ++++ javaxval/README.md | 4 ++-- jaxb/README.md | 4 ++++ 10 files changed, 38 insertions(+), 8 deletions(-) diff --git a/java-strings-2/README.md b/java-strings-2/README.md index 166a8a2b1f..82f33997c5 100644 --- a/java-strings-2/README.md +++ b/java-strings-2/README.md @@ -1,4 +1,8 @@ -## Relevant Articles: +## Java Strings Cookbooks and Examples + +This module contains articles about strings in Java. + +### Relevant Articles: - [Java Localization – Formatting Messages](https://www.baeldung.com/java-localization-messages-formatting) - [Check If a String Contains a Substring](https://www.baeldung.com/java-string-contains-substring) @@ -25,3 +29,4 @@ - [How to Reverse a String in Java](https://www.baeldung.com/java-reverse-string) - [String toLowerCase and toUpperCase Methods in Java](https://www.baeldung.com/java-string-convert-case) - [Guide to StreamTokenizer](https://www.baeldung.com/java-streamtokenizer) +- More articles: [[<-- prev>]](/java-strings) [[next -->]](/java-strings-3) diff --git a/java-strings-3/README.md b/java-strings-3/README.md index 6c2339028f..f0aaddefcb 100644 --- a/java-strings-3/README.md +++ b/java-strings-3/README.md @@ -1,3 +1,8 @@ -## Relevant Articles: +## Java Strings Cookbooks and Examples + +This module contains articles about strings in Java. + +### Relevant Articles: - [Converting Java String to Double](https://www.baeldung.com/java-string-to-double) +- More articles: [[<-- prev>]](/java-strings-2) diff --git a/java-strings-ops/README.md b/java-strings-ops/README.md index d9c28dab0d..31c5f48022 100644 --- a/java-strings-ops/README.md +++ b/java-strings-ops/README.md @@ -1,7 +1,7 @@ -========= - ## Java Strings Cookbooks and Examples +This module contains articles about operations on strings in Java. + ### Relevant Articles: - [Convert char to String in Java](https://www.baeldung.com/java-convert-char-to-string) - [Convert String to int or Integer in Java](https://www.baeldung.com/java-convert-string-to-int-or-integer) diff --git a/java-strings/README.md b/java-strings/README.md index 5b2a327877..1faa11f606 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -1,7 +1,7 @@ -========= - ## Java Strings Cookbooks and Examples +This module contains articles about strings in Java. + ### Relevant Articles: - [String Operations with Java Streams](https://www.baeldung.com/java-stream-operations-on-strings) - [Converting String to Stream of chars](https://www.baeldung.com/java-string-to-stream) @@ -21,3 +21,4 @@ - [Adding a Newline Character to a String in Java](https://www.baeldung.com/java-string-newline) - [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) - [Replace a Character at a Specific Index in a String in Java](https://www.baeldung.com/java-replace-character-at-index) +- More articles: [[next -->]](/java-strings-2) diff --git a/java-vavr-stream/README.md b/java-vavr-stream/README.md index 901978a1d8..4e8b5ccd66 100644 --- a/java-vavr-stream/README.md +++ b/java-vavr-stream/README.md @@ -1,3 +1,6 @@ +## Vavr Streams + +This module contains articles about streams in Vavr. ### Relevant Articles: diff --git a/java-websocket/README.md b/java-websocket/README.md index 87cbb3fa5c..f48b8c6804 100644 --- a/java-websocket/README.md +++ b/java-websocket/README.md @@ -1,3 +1,7 @@ +## Java WebSocket + +This module contains articles about WebSocket in Java. + ### Relevant articles - [A Guide to the Java API for WebSocket](https://www.baeldung.com/java-websockets) diff --git a/javafx/README.md b/javafx/README.md index 7214321141..80c4f49026 100644 --- a/javafx/README.md +++ b/javafx/README.md @@ -1,3 +1,7 @@ +## JavaFX + +This module contains articles about JavaFX. + ### Relevant Articles: -[Introduction to JavaFX](https://www.baeldung.com/javafx) diff --git a/javax-servlets/README.md b/javax-servlets/README.md index 8254a78c4c..085cc04f87 100644 --- a/javax-servlets/README.md +++ b/javax-servlets/README.md @@ -1,3 +1,7 @@ +## Servlets + +This module contains articles about Servlets. + ### Relevant Articles: - [Introduction to Java Servlets](https://www.baeldung.com/intro-to-servlets) - [An MVC Example with Servlets and JSP](https://www.baeldung.com/mvc-servlet-jsp) diff --git a/javaxval/README.md b/javaxval/README.md index b141bc7859..46b7deab2a 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -1,7 +1,7 @@ -========= - ## Java Bean Validation Examples +This module contains articles about Bean Validation. + ### Relevant Articles: - [Java Bean Validation Basics](https://www.baeldung.com/javax-validation) - [Validating Container Elements with Bean Validation 2.0](https://www.baeldung.com/bean-validation-container-elements) diff --git a/jaxb/README.md b/jaxb/README.md index bdaef90279..aca078af15 100644 --- a/jaxb/README.md +++ b/jaxb/README.md @@ -1,2 +1,6 @@ +## JAXB + +This module contains articles about JAXB. + ### Relevant Articles: - [Guide to JAXB](https://www.baeldung.com/jaxb) From c138b81fa46dbe31cae864850d8da63e78c48546 Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Thu, 3 Oct 2019 10:57:18 +0300 Subject: [PATCH 342/396] Split or move testing-modules/junit-5 module - update readmes --- testing-modules/junit-5/README.md | 2 +- testing-modules/junit5-annotations/README.md | 6 +++--- testing-modules/junit5-migration/README.md | 8 ++++++-- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/testing-modules/junit-5/README.md b/testing-modules/junit-5/README.md index 676d2f2f03..ede60c45a9 100644 --- a/testing-modules/junit-5/README.md +++ b/testing-modules/junit-5/README.md @@ -5,4 +5,4 @@ - [The Order of Tests in JUnit](https://www.baeldung.com/junit-5-test-order) - [Running JUnit Tests Programmatically, from a Java Application](https://www.baeldung.com/junit-tests-run-programmatically-from-java) - [Testing an Abstract Class With JUnit](https://www.baeldung.com/junit-test-abstract-class) -- [Guide to Dynamic Tests in Junit 5](https://www.baeldung.com/junit5-dynamic-tests) +- [Guide to Dynamic Tests in JUnit 5](https://www.baeldung.com/junit5-dynamic-tests) diff --git a/testing-modules/junit5-annotations/README.md b/testing-modules/junit5-annotations/README.md index 53819dbec5..02d4cd652a 100644 --- a/testing-modules/junit5-annotations/README.md +++ b/testing-modules/junit5-annotations/README.md @@ -1,9 +1,9 @@ -## Junit 5 Annotations +## JUnit 5 Annotations -This module contains articles about Junit 5 Annotations +This module contains articles about JUnit 5 Annotations ### Relevant Articles: -- [A Guide to @RepeatedTest in Junit 5](https://www.baeldung.com/junit-5-repeated-test) +- [A Guide to @RepeatedTest in JUnit 5](https://www.baeldung.com/junit-5-repeated-test) - [JUnit 5 Conditional Test Execution with Annotations](https://www.baeldung.com/junit-5-conditional-test-execution) - [JUnit5 Programmatic Extension Registration with @RegisterExtension](https://www.baeldung.com/junit-5-registerextension-annotation) - [Guide to JUnit 5 Parameterized Tests](https://www.baeldung.com/parameterized-tests-junit-5) diff --git a/testing-modules/junit5-migration/README.md b/testing-modules/junit5-migration/README.md index e6ad4f376c..84e540b466 100644 --- a/testing-modules/junit5-migration/README.md +++ b/testing-modules/junit5-migration/README.md @@ -1,6 +1,10 @@ -This is the code for the Junit 4 - Junit 5 Migration E-book. +## JUnit 5 migration + +This module contains articles about migrating to JUnit 5. + +The code for the JUnit 4 - JUnit 5 E-book is in `com.baeldung.junit4` and `com.baeldung.junit5`. ### Relevant Articles: -- [Junit 5 Migration](https://www.baeldung.com/junit-5-migration) +- [JUnit 5 Migration](https://www.baeldung.com/junit-5-migration) - [A Quick JUnit vs TestNG Comparison](https://www.baeldung.com/junit-vs-testng) - [Assertions in JUnit 4 and JUnit 5](https://www.baeldung.com/junit-assertions) From b53d41f9779c4591be79d3ee030523ded514cb12 Mon Sep 17 00:00:00 2001 From: Tapan Avasthi Date: Sun, 15 Sep 2019 11:59:29 +0530 Subject: [PATCH 343/396] BAEL-3223: Excluding URLs for a Filter in a Spring Web Application --- .../exclude_urls_filter/Application.java | 17 ++++++++++ .../controller/FAQController.java | 32 +++++++++++++++++++ .../exclude_urls_filter/controller/Ping.java | 22 +++++++++++++ .../filter/FilterRegistrationConfig.java | 26 +++++++++++++++ .../filter/HeaderValidatorFilter.java | 30 +++++++++++++++++ .../exclude_urls_filter/filter/LogFilter.java | 25 +++++++++++++++ .../service/FAQService.java | 5 +++ .../service/FAQServiceImpl.java | 15 +++++++++ 8 files changed, 172 insertions(+) create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/Application.java create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/FAQController.java create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/Ping.java create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/FilterRegistrationConfig.java create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/HeaderValidatorFilter.java create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/LogFilter.java create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQService.java create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQServiceImpl.java diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/Application.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/Application.java new file mode 100644 index 0000000000..4fb6938694 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/Application.java @@ -0,0 +1,17 @@ +package com.baeldung.exclude_urls_filter; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@ComponentScan(basePackages = "com.baeldung.exclude_urls_filter") +@Configuration +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/FAQController.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/FAQController.java new file mode 100644 index 0000000000..1463af6bfd --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/FAQController.java @@ -0,0 +1,32 @@ +package com.baeldung.exclude_urls_filter.controller; + +import com.baeldung.exclude_urls_filter.service.FAQService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class FAQController { + + private final FAQService faqService; + + @Autowired + public FAQController(FAQService faqService) { + this.faqService = faqService; + } + + @RequestMapping(value = "/faq/helpline", method = RequestMethod.GET) + public ResponseEntity getHelpLineNumber() { + String helplineNumber = faqService.getHelpLineNumber(); + if (helplineNumber != null) { + return new ResponseEntity(helplineNumber, HttpStatus.OK); + } else { + return new ResponseEntity("Unavailable", HttpStatus.NOT_FOUND); + } + } + + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/Ping.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/Ping.java new file mode 100644 index 0000000000..c8a0723ba6 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/controller/Ping.java @@ -0,0 +1,22 @@ +package com.baeldung.exclude_urls_filter.controller; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class Ping { + + @RequestMapping(value = "/health", method = RequestMethod.GET) + public ResponseEntity pingGet() { + return new ResponseEntity("pong", HttpStatus.OK); + } + + @RequestMapping(value = "/health", method = RequestMethod.POST) + public ResponseEntity pingPost() { + return new ResponseEntity("pong", HttpStatus.OK); + } + +} diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/FilterRegistrationConfig.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/FilterRegistrationConfig.java new file mode 100644 index 0000000000..ff99b4cc25 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/FilterRegistrationConfig.java @@ -0,0 +1,26 @@ +package com.baeldung.exclude_urls_filter.filter; + +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class FilterRegistrationConfig { + + @Bean + public FilterRegistrationBean logFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new LogFilter()); + registrationBean.addUrlPatterns("/health", "/faq/*"); + return registrationBean; + } + + + @Bean + public FilterRegistrationBean headerValidatorFilter() { + FilterRegistrationBean registrationBean = new FilterRegistrationBean<>(); + registrationBean.setFilter(new HeaderValidatorFilter()); + registrationBean.addUrlPatterns("*"); + return registrationBean; + } +} \ No newline at end of file diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/HeaderValidatorFilter.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/HeaderValidatorFilter.java new file mode 100644 index 0000000000..2af90badae --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/HeaderValidatorFilter.java @@ -0,0 +1,30 @@ +package com.baeldung.exclude_urls_filter.filter; + +import org.springframework.core.annotation.Order; +import org.springframework.http.HttpStatus; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Order(1) +public class HeaderValidatorFilter extends OncePerRequestFilter { + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String path = request.getRequestURI(); + if ("/health".equals(path)) { + filterChain.doFilter(request, response); + return; + } + String countryCode = request.getHeader("X-Country-Code"); + if (!"US".equals(countryCode)) { + response.sendError(HttpStatus.BAD_REQUEST.value(), "Invalid Locale"); + return; + } + + filterChain.doFilter(request, response); + } +} \ No newline at end of file diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/LogFilter.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/LogFilter.java new file mode 100644 index 0000000000..fcde4f7f8f --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/filter/LogFilter.java @@ -0,0 +1,25 @@ +package com.baeldung.exclude_urls_filter.filter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.annotation.Order; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.*; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +@Order(1) +public class LogFilter extends OncePerRequestFilter { + private final Logger logger = LoggerFactory.getLogger(LogFilter.class); + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, + FilterChain filterChain) throws ServletException, IOException { + String path = request.getRequestURI(); + String contentType = request.getContentType(); + logger.info("Request URL path : {}, Request content type: {}", path, contentType); + filterChain.doFilter(request, response); + } +} \ No newline at end of file diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQService.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQService.java new file mode 100644 index 0000000000..a2949ea0a2 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQService.java @@ -0,0 +1,5 @@ +package com.baeldung.exclude_urls_filter.service; + +public interface FAQService { + String getHelpLineNumber(); +} \ No newline at end of file diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQServiceImpl.java b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQServiceImpl.java new file mode 100644 index 0000000000..6f841e4ec1 --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/exclude_urls_filter/service/FAQServiceImpl.java @@ -0,0 +1,15 @@ +package com.baeldung.exclude_urls_filter.service; + +import org.springframework.stereotype.Service; + +@Service +public class FAQServiceImpl implements FAQService { + + private static final String HELPLINE_NUMBER = "+1 888-777-66"; + + @Override + public String getHelpLineNumber() { + return HELPLINE_NUMBER; + } + +} From 06fd2119b5604076c90bb173da87608affeb262a Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Thu, 3 Oct 2019 13:37:26 +0200 Subject: [PATCH 344/396] #BAEL-17522 add README descriptions --- jmh/README.md | 6 +++++- jni/README.md | 3 +++ jooby/README.md | 6 +++++- jsf/README.md | 4 ++++ json-path/README.md | 6 +++++- json/README.md | 4 ++-- jsoup/README.md | 4 ++-- jta/README.md | 4 ++++ kotlin-js/README.md | 4 ++++ kotlin-libraries-2/README.md | 7 ++++++- kotlin-libraries/README.md | 7 ++++++- 11 files changed, 46 insertions(+), 9 deletions(-) diff --git a/jmh/README.md b/jmh/README.md index 6876615328..257bb7bf85 100644 --- a/jmh/README.md +++ b/jmh/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Java Microbenchmark Harness + +This module contains articles about JMH (the Java Microbenchmark Harness). + +### Relevant articles: - [Microbenchmarking with Java](https://www.baeldung.com/java-microbenchmark-harness) diff --git a/jni/README.md b/jni/README.md index daaeb7819f..e65b89ca8a 100644 --- a/jni/README.md +++ b/jni/README.md @@ -1,3 +1,6 @@ +## JNI + +This module contains articles about JNI (the Java Native Interface). ### Relevant Articles: diff --git a/jooby/README.md b/jooby/README.md index bf8c580633..a2fe1985ba 100644 --- a/jooby/README.md +++ b/jooby/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Jooby + +This module contains articles about Jooby. + +### Relevant articles: - [Introduction to Jooby](https://www.baeldung.com/jooby) diff --git a/jsf/README.md b/jsf/README.md index 65735cc406..c82268c14b 100644 --- a/jsf/README.md +++ b/jsf/README.md @@ -1,3 +1,7 @@ +## JSF + +This module contains articles about JSF (JavaServer Faces). + ### Relevant Articles: - [Guide to JSF Expression Language 3.0](https://www.baeldung.com/jsf-expression-language-el-3) - [Introduction to JSF EL 2](https://www.baeldung.com/intro-to-jsf-expression-language) diff --git a/json-path/README.md b/json-path/README.md index 41cc72a842..e3f81e827b 100644 --- a/json-path/README.md +++ b/json-path/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## JsonPath + +This module contains articles about JsonPath. + +### Relevant articles: - [Introduction to JsonPath](https://www.baeldung.com/guide-to-jayway-jsonpath) - [Count with JsonPath](https://www.baeldung.com/jsonpath-count) diff --git a/json/README.md b/json/README.md index 96acedd0b1..0e50dcfddb 100644 --- a/json/README.md +++ b/json/README.md @@ -1,6 +1,6 @@ -========= +## JSON -## Fast-Json +This module contains articles about JSON. ### Relevant Articles: - [Introduction to JSON Schema in Java](https://www.baeldung.com/introduction-to-json-schema-in-java) diff --git a/jsoup/README.md b/jsoup/README.md index 7624ce77bf..271d04194d 100644 --- a/jsoup/README.md +++ b/jsoup/README.md @@ -1,6 +1,6 @@ -========= +## jsoup -## jsoup Example Project +This module contains articles about jsoup. ### Relevant Articles: - [Parsing HTML in Java with Jsoup](https://www.baeldung.com/java-with-jsoup) diff --git a/jta/README.md b/jta/README.md index 445a291c8f..862c9e620a 100644 --- a/jta/README.md +++ b/jta/README.md @@ -1,2 +1,6 @@ +## JTA + +This module contains articles about JTA. + ### Relevant Articles: - [Guide to Java EE JTA](https://www.baeldung.com/jee-jta) diff --git a/kotlin-js/README.md b/kotlin-js/README.md index 84d0c70427..2ec50bad78 100644 --- a/kotlin-js/README.md +++ b/kotlin-js/README.md @@ -1,3 +1,7 @@ +## JavaScript in Kotlin + +This module contains articles about JavaScript in Kotlin. + ### Relevant Articles: - [Kotlin and Javascript](https://www.baeldung.com/kotlin-javascript) diff --git a/kotlin-libraries-2/README.md b/kotlin-libraries-2/README.md index 0b9f238d51..188f99dc16 100644 --- a/kotlin-libraries-2/README.md +++ b/kotlin-libraries-2/README.md @@ -1,4 +1,9 @@ -## Relevant articles: +## Kotlin Libraries + +This module contains articles about Kotlin Libraries. + +### Relevant articles: - [Jackson Support for Kotlin](https://www.baeldung.com/jackson-kotlin) - [Introduction to RxKotlin](https://www.baeldung.com/rxkotlin) +- More articles: [[<-- prev]](/kotlin-libraries) diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md index 6ad90c1cd2..e4b0a35d28 100644 --- a/kotlin-libraries/README.md +++ b/kotlin-libraries/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Kotlin Libraries + +This module contains articles about Kotlin Libraries. + +### Relevant articles: - [Kotlin with Mockito](https://www.baeldung.com/kotlin-mockito) - [HTTP Requests with Kotlin and khttp](https://www.baeldung.com/kotlin-khttp) @@ -12,3 +16,4 @@ - [REST API With Kotlin and Kovert](https://www.baeldung.com/kotlin-kovert) - [MockK: A Mocking Library for Kotlin](https://www.baeldung.com/kotlin-mockk) - [Kotlin Immutable Collections](https://www.baeldung.com/kotlin-immutable-collections) +- More articles: [[next -->]](/kotlin-libraries-2) From e6b5f14c49f44434767a357bbb0f7c445959edd3 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Thu, 3 Oct 2019 16:21:23 +0100 Subject: [PATCH 345/396] Add readme descriptions 24 --- algorithms-miscellaneous-3/README.md | 6 ++++++ algorithms-sorting/README.md | 6 +++++- animal-sniffer-mvn-plugin/README.md | 6 +++++- annotations/{readme.md => README.md} | 5 +++++ antlr/README.md | 4 ++++ apache-avro/README.md | 4 ++++ apache-bval/README.md | 5 +++++ apache-curator/README.md | 4 ++++ apache-cxf/README.md | 4 ++++ apache-fop/README.md | 4 ++-- 10 files changed, 44 insertions(+), 4 deletions(-) rename annotations/{readme.md => README.md} (66%) diff --git a/algorithms-miscellaneous-3/README.md b/algorithms-miscellaneous-3/README.md index d2d73ec8a1..9748595a34 100644 --- a/algorithms-miscellaneous-3/README.md +++ b/algorithms-miscellaneous-3/README.md @@ -1,3 +1,8 @@ +## Algorithms - Miscellaneous + +This module contains articles about algorithms. Some classes of algorithms, e.g., [sorting](/algorithms-sorting) and +[genetic algorithms](/algorithms-genetic), have their own dedicated modules. + ## Relevant Articles: - [Java Two Pointer Technique](https://www.baeldung.com/java-two-pointer-technique) @@ -9,3 +14,4 @@ - [A Guide to the Folding Technique in Java](https://www.baeldung.com/folding-hashing-technique) - [Creating a Triangle with for Loops in Java](https://www.baeldung.com/java-print-triangle) - [Efficient Word Frequency Calculator in Java](https://www.baeldung.com/java-word-frequency) +- More articles: [[<-- prev]](/algorithms-miscellaneous-2) [[next -->]](/algorithms-miscellaneous-4) \ No newline at end of file diff --git a/algorithms-sorting/README.md b/algorithms-sorting/README.md index 903865046a..f19705f113 100644 --- a/algorithms-sorting/README.md +++ b/algorithms-sorting/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Algorithms - Sorting + +This module contains articles about sorting algorithms. + +### Relevant articles: - [Bubble Sort in Java](https://www.baeldung.com/java-bubble-sort) - [Merge Sort in Java](https://www.baeldung.com/java-merge-sort) diff --git a/animal-sniffer-mvn-plugin/README.md b/animal-sniffer-mvn-plugin/README.md index e292fe29ca..52e319b399 100644 --- a/animal-sniffer-mvn-plugin/README.md +++ b/animal-sniffer-mvn-plugin/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Animal Sniffer Maven Plugin + +This module contains articles about the Animal Sniffer Maven Plugin + +### Relevant articles: [Introduction to Animal Sniffer Maven Plugin](https://www.baeldung.com/maven-animal-sniffer) diff --git a/annotations/readme.md b/annotations/README.md similarity index 66% rename from annotations/readme.md rename to annotations/README.md index dc40a7e116..ec4005fc5e 100644 --- a/annotations/readme.md +++ b/annotations/README.md @@ -1,2 +1,7 @@ +## Annotations + +This module contains articles about Java annotations + ### Relevant Articles: + - [Java Annotation Processing and Creating a Builder](https://www.baeldung.com/java-annotation-processing-builder) diff --git a/antlr/README.md b/antlr/README.md index b6dac4aa4b..1f394125c6 100644 --- a/antlr/README.md +++ b/antlr/README.md @@ -1,3 +1,7 @@ +## ANTLR + +This module contains articles about ANTLR + ### Relevant Articles: - [Java with ANTLR](https://www.baeldung.com/java-antlr) diff --git a/apache-avro/README.md b/apache-avro/README.md index 45ae6e2b9b..b338e8e565 100644 --- a/apache-avro/README.md +++ b/apache-avro/README.md @@ -1,2 +1,6 @@ +## Apache Avro + +This module contains articles about Apache Avro + ### Relevant Articles: - [Guide to Apache Avro](https://www.baeldung.com/java-apache-avro) diff --git a/apache-bval/README.md b/apache-bval/README.md index a9b3979828..e856810378 100644 --- a/apache-bval/README.md +++ b/apache-bval/README.md @@ -1,2 +1,7 @@ +## Apache BVal + +This module contains articles about Apache BVal + ### Relevant Articles: + - [Intro to Apache BVal](https://www.baeldung.com/apache-bval) diff --git a/apache-curator/README.md b/apache-curator/README.md index 30336d7cdc..4fef6a138e 100644 --- a/apache-curator/README.md +++ b/apache-curator/README.md @@ -1,3 +1,7 @@ +## Apache Curator + +This module contains articles about Apache Curator + ### Relevant Articles: - [Introduction to Apache Curator](https://www.baeldung.com/apache-curator) diff --git a/apache-cxf/README.md b/apache-cxf/README.md index 87413df8c9..f825b85bb3 100644 --- a/apache-cxf/README.md +++ b/apache-cxf/README.md @@ -1,3 +1,7 @@ +## Apache CXF + +This module contains articles about Apache CXF + ## Relevant Articles: - [Introduction to Apache CXF Aegis Data Binding](https://www.baeldung.com/aegis-data-binding-in-apache-cxf) - [Apache CXF Support for RESTful Web Services](https://www.baeldung.com/apache-cxf-rest-api) diff --git a/apache-fop/README.md b/apache-fop/README.md index 1e734a5f36..2adc593026 100644 --- a/apache-fop/README.md +++ b/apache-fop/README.md @@ -1,5 +1,5 @@ -========= +## Apache FOP -## Core Java Cookbooks and Examples +This module contains articles about Apache FOP ### Relevant Articles: From 6be36874d9b3c0016b2be3c1c8b92a68c5c68d33 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Thu, 3 Oct 2019 17:54:31 +0200 Subject: [PATCH 346/396] #BAEL-17523 add README descriptions --- lagom/README.md | 19 ++++++++++--------- libraries-apache-commons/README.md | 4 ++++ libraries-data-2/README.md | 5 +++++ libraries-data/README.md | 5 +++++ libraries-http/README.md | 3 +++ libraries-security/README.md | 4 ++++ libraries-server/README.md | 6 +++++- libraries-testing/README.md | 4 ++++ linkrest/README.md | 6 +++++- logging-modules/README.md | 3 ++- 10 files changed, 47 insertions(+), 12 deletions(-) diff --git a/lagom/README.md b/lagom/README.md index a8070c047c..1453b511e8 100644 --- a/lagom/README.md +++ b/lagom/README.md @@ -1,11 +1,12 @@ +## Lagom + +This module contains articles about the Lagom framework. + ### Relevant articles - [Guide to Reactive Microservices Using Lagom Framework](https://www.baeldung.com/lagom-reactive-microservices) - - - -Steps to setup from scratch +### Steps to setup from scratch 1) Create sbt build file "build.sbt" 2) Create plugins file project/plugins.sbt @@ -35,13 +36,13 @@ Steps to setup from scratch 10) Run project: sbt lagom:runAll -Sample Run: -curl http://localhost:9000/api/greeting/Nikhil; +### Sample Run: +``` +$ curl http://localhost:9000/api/greeting/Nikhil; Hello Nikhil! Today's weather stats: Going to be very humid, Take Water -curl http://localhost:9000/api/greeting/Nikhil; +$ curl http://localhost:9000/api/greeting/Nikhil; Hello Again Nikhil! Today's weather stats: Going to Rain, Take Umbrella - - +``` diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md index 7d1f5b8333..439587266b 100644 --- a/libraries-apache-commons/README.md +++ b/libraries-apache-commons/README.md @@ -1,3 +1,7 @@ +## Apache Commons + +This module contains articles about Apache Commons libraries. + ### Relevant articles - [Array Processing with Apache Commons Lang 3](https://www.baeldung.com/array-processing-commons-lang) diff --git a/libraries-data-2/README.md b/libraries-data-2/README.md index ae113e7f70..25d9fe177e 100644 --- a/libraries-data-2/README.md +++ b/libraries-data-2/README.md @@ -1,3 +1,7 @@ +## Data Libraries + +This module contains articles about libraries for data processing in Java. + ### Relevant articles - [Introduction to Apache Flink with Java](https://www.baeldung.com/apache-flink) - [Guide to the HyperLogLog Algorithm](https://www.baeldung.com/java-hyperloglog) @@ -8,4 +12,5 @@ - [Introduction To OpenCSV](https://www.baeldung.com/opencsv) - [Introduction to Smooks](https://www.baeldung.com/smooks) - [A Guide to Infinispan in Java](https://www.baeldung.com/infinispan) +- More articles: [[<-- prev>]](/libraries-data) diff --git a/libraries-data/README.md b/libraries-data/README.md index e1d3c40222..be8f2b2525 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -1,3 +1,7 @@ +## Data Libraries + +This module contains articles about libraries for data processing in Java. + ### Relevant articles - [Introduction to Reladomo](https://www.baeldung.com/reladomo) - [Introduction to ORMLite](https://www.baeldung.com/ormlite) @@ -15,3 +19,4 @@ - [Introduction to Kafka Connectors](https://www.baeldung.com/kafka-connectors-guide) - [Kafka Connect Example with MQTT and MongoDB](https://www.baeldung.com/kafka-connect-mqtt-mongodb) - [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline) +- More articles: [[next -->]](/libraries-data-2) diff --git a/libraries-http/README.md b/libraries-http/README.md index 436268e707..f5afb2d277 100644 --- a/libraries-http/README.md +++ b/libraries-http/README.md @@ -1,3 +1,6 @@ +## HTTP + +This module contains articles about HTTP libraries. ### Relevant Articles: diff --git a/libraries-security/README.md b/libraries-security/README.md index 96f3fcdac6..68badcf12d 100644 --- a/libraries-security/README.md +++ b/libraries-security/README.md @@ -1,3 +1,7 @@ +## Security + +This module contains articles about security libraries. + ### Relevant Articles: - [Guide to ScribeJava](https://www.baeldung.com/scribejava) diff --git a/libraries-server/README.md b/libraries-server/README.md index 5245b98139..d9e6b8b206 100644 --- a/libraries-server/README.md +++ b/libraries-server/README.md @@ -1,4 +1,8 @@ -## Relevant Articles: +## Server + +This module contains articles about server libraries. + +### Relevant Articles: - [Embedded Jetty Server in Java](https://www.baeldung.com/jetty-embedded) - [Introduction to Netty](https://www.baeldung.com/netty) diff --git a/libraries-testing/README.md b/libraries-testing/README.md index 3f1904dc50..332debfe18 100644 --- a/libraries-testing/README.md +++ b/libraries-testing/README.md @@ -1,3 +1,7 @@ +## Testing + +This module contains articles about test libraries. + ### Relevant articles - [Introduction to Serenity BDD](https://www.baeldung.com/serenity-bdd) diff --git a/linkrest/README.md b/linkrest/README.md index 8297b14bb5..5402d9db96 100644 --- a/linkrest/README.md +++ b/linkrest/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## LinkRest + +This module contains articles about LinkRest. + +### Relevant articles: - [Guide to LinkRest](https://www.baeldung.com/linkrest) diff --git a/logging-modules/README.md b/logging-modules/README.md index f5a1acaac1..b763f6baaf 100644 --- a/logging-modules/README.md +++ b/logging-modules/README.md @@ -1,6 +1,7 @@ - ## Logging Modules +This module contains articles about logging libraries. + ### Relevant Articles: - [Creating a Custom Logback Appender](https://www.baeldung.com/custom-logback-appender) From b36f5ef72f64c7fc36970cfbaf7d2a80f545a429 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 4 Oct 2019 06:34:10 +0100 Subject: [PATCH 347/396] [BAEL-17476] Add README descriptions 25 (#7911) --- apache-geode/README.md | 4 ++++ apache-meecrowave/README.md | 8 ++++++-- apache-olingo/README.md | 6 +++++- apache-opennlp/README.md | 4 ++++ apache-poi/README.md | 4 ++++ apache-pulsar/README.md | 4 ++++ apache-shiro/README.md | 9 +++++++-- apache-solrj/README.md | 9 ++++++--- apache-spark/README.md | 6 +++++- apache-thrift/README.md | 6 +++++- 10 files changed, 50 insertions(+), 10 deletions(-) diff --git a/apache-geode/README.md b/apache-geode/README.md index 2f04418825..86629f7a82 100644 --- a/apache-geode/README.md +++ b/apache-geode/README.md @@ -1,3 +1,7 @@ +## Apache Geode + +This module contains articles about Apache Geode + ### Relevant Articles: - [A Quick Guide to Apache Geode](https://www.baeldung.com/apache-geode) diff --git a/apache-meecrowave/README.md b/apache-meecrowave/README.md index 0dea60816b..d360af13af 100644 --- a/apache-meecrowave/README.md +++ b/apache-meecrowave/README.md @@ -1,3 +1,7 @@ +## Apache Meecrowave + +This module contains articles about Apache Meecrowave + ### Relevant Articles: -================================ -- [Building a Microservice with Apache Meecrowave](https://www.baeldung.com/apache-meecrowave) + +- [Building a Microservice with Apache Meecrowave](https://www.baeldung.com/apache-meecrowave) \ No newline at end of file diff --git a/apache-olingo/README.md b/apache-olingo/README.md index 22fa6b3b51..2f4e86d5a2 100644 --- a/apache-olingo/README.md +++ b/apache-olingo/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Apache Olingo + +This module contains articles about Apache Olingo + +### Relevant articles: - [OData Protocol Guide](https://www.baeldung.com/odata) - [Intro to OData with Olingo](https://www.baeldung.com/olingo) diff --git a/apache-opennlp/README.md b/apache-opennlp/README.md index 006ca588f2..4b1fa36540 100644 --- a/apache-opennlp/README.md +++ b/apache-opennlp/README.md @@ -1,3 +1,7 @@ +## Apache OpenNLP + +This module contains articles about Apache OpenNLP + ### Relevant Articles - [Intro to Apache OpenNLP](https://www.baeldung.com/apache-open-nlp) diff --git a/apache-poi/README.md b/apache-poi/README.md index 8ffd8ef517..b7b8bf5f6a 100644 --- a/apache-poi/README.md +++ b/apache-poi/README.md @@ -1,3 +1,7 @@ +## Apache POI + +This module contains articles about Apache POI + ### Relevant Articles: - [Microsoft Word Processing in Java with Apache POI](https://www.baeldung.com/java-microsoft-word-with-apache-poi) - [Working with Microsoft Excel in Java](https://www.baeldung.com/java-microsoft-excel) diff --git a/apache-pulsar/README.md b/apache-pulsar/README.md index 2970bc3d88..c44849a490 100644 --- a/apache-pulsar/README.md +++ b/apache-pulsar/README.md @@ -1,3 +1,7 @@ +## Apache Pulsar + +This module contains articles about Apache Pulsar + ### Relevant Articles: - [Introduction to Apache Pulsar](https://www.baeldung.com/apache-pulsar) diff --git a/apache-shiro/README.md b/apache-shiro/README.md index 85f2a99a59..553eeecc69 100644 --- a/apache-shiro/README.md +++ b/apache-shiro/README.md @@ -1,2 +1,7 @@ -### Relevant articles -- [Introduction to Apache Shiro](https://www.baeldung.com/apache-shiro) +## Apache Shiro + +This module contains articles about Apache Shiro + +### Relevant articles: + +- [Introduction to Apache Shiro](https://www.baeldung.com/apache-shiro) \ No newline at end of file diff --git a/apache-solrj/README.md b/apache-solrj/README.md index 55f35b90a7..803db393e9 100644 --- a/apache-solrj/README.md +++ b/apache-solrj/README.md @@ -1,4 +1,7 @@ -## Apache Solrj Tutorials Project +## Apache Solrj -### Relevant Articles -- [Guide to Solr in Java with Apache Solrj](https://www.baeldung.com/apache-solrj) +This module contains articles about Apache Solrj + +### Relevant Articles: + +- [Guide to Solr in Java with Apache Solrj](https://www.baeldung.com/apache-solrj) \ No newline at end of file diff --git a/apache-spark/README.md b/apache-spark/README.md index a867fd57ff..360a18f095 100644 --- a/apache-spark/README.md +++ b/apache-spark/README.md @@ -1,4 +1,8 @@ -### Relevant articles +## Apache Spark + +This module contains articles about Apache Spark + +### Relevant articles: - [Introduction to Apache Spark](https://www.baeldung.com/apache-spark) - [Building a Data Pipeline with Kafka, Spark Streaming and Cassandra](https://www.baeldung.com/kafka-spark-data-pipeline) diff --git a/apache-thrift/README.md b/apache-thrift/README.md index b90192f342..4508939de6 100644 --- a/apache-thrift/README.md +++ b/apache-thrift/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Apache Thrift + +This module contains articles about Apache Thrift + +### Relevant articles: - [Working with Apache Thrift](https://www.baeldung.com/apache-thrift) From f7e63a836b9d748e2adf7a1d3b31600f91ae691f Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 4 Oct 2019 06:49:29 +0100 Subject: [PATCH 348/396] Add README descriptions 29 (#7923) * Add README descriptions 29 * Fixed collections-list links --- .../core-java-collections-array-list/README.md | 4 ++-- core-java-modules/core-java-collections-list-2/README.md | 7 ++++--- core-java-modules/core-java-collections-list-3/README.md | 5 +++-- core-java-modules/core-java-collections-list/README.md | 5 +++-- core-java-modules/core-java-collections-set/README.md | 4 ++-- core-java-modules/core-java-concurrency-basic/README.md | 5 +++-- .../core-java-concurrency-collections/README.md | 4 ++-- core-java-modules/core-java-io/README.md | 5 +++-- core-java-modules/core-java-nio/README.md | 4 ++++ core-java-modules/core-java-security/README.md | 2 ++ 10 files changed, 28 insertions(+), 17 deletions(-) diff --git a/core-java-modules/core-java-collections-array-list/README.md b/core-java-modules/core-java-collections-array-list/README.md index 3d1cdd5085..4423a77c78 100644 --- a/core-java-modules/core-java-collections-array-list/README.md +++ b/core-java-modules/core-java-collections-array-list/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Collections ArrayList -## Core Java Collections Array List Cookbooks and Examples +This module contains articles about the Java ArrayList collection ### Relevant Articles: - [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list) diff --git a/core-java-modules/core-java-collections-list-2/README.md b/core-java-modules/core-java-collections-list-2/README.md index 6192442edd..fada9d96ac 100644 --- a/core-java-modules/core-java-collections-list-2/README.md +++ b/core-java-modules/core-java-collections-list-2/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Collections List (Part 2) -## Core Java Collections List Cookbooks and Examples +This module contains articles about the Java List collection ### Relevant Articles: - [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) @@ -10,4 +10,5 @@ - [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) - [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list) - [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) -- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection) \ No newline at end of file +- [Intersection of Two Lists in Java](https://www.baeldung.com/java-lists-intersection) +- [[<-- Prev]](/core-java-modules/core-java-collections-list)[[Next -->]](/core-java-modules/core-java-collections-list-3) \ No newline at end of file diff --git a/core-java-modules/core-java-collections-list-3/README.md b/core-java-modules/core-java-collections-list-3/README.md index 267996044c..3d4004de6f 100644 --- a/core-java-modules/core-java-collections-list-3/README.md +++ b/core-java-modules/core-java-collections-list-3/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Collections List (Part 3) -## Core Java Collections List Cookbooks and Examples +This module contains articles about the Java List collection ### Relevant Articles: - [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list) @@ -9,3 +9,4 @@ - [List of Primitive Integer Values in Java](https://www.baeldung.com/java-list-primitive-int) - [Performance Comparison of Primitive Lists in Java](https://www.baeldung.com/java-list-primitive-performance) - [Filtering a Java Collection by a List](https://www.baeldung.com/java-filter-collection-by-list) +- [[<-- Prev]](/core-java-modules/core-java-collections-list-2) diff --git a/core-java-modules/core-java-collections-list/README.md b/core-java-modules/core-java-collections-list/README.md index 367f62780d..ff7a9876a2 100644 --- a/core-java-modules/core-java-collections-list/README.md +++ b/core-java-modules/core-java-collections-list/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Collections List -## Core Java Collections List Cookbooks and Examples +This module contains articles about the Java List collection ### Relevant Articles: - [Java – Get Random Item/Element From a List](http://www.baeldung.com/java-random-list-element) @@ -12,3 +12,4 @@ - [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java) - [Finding Max/Min of a List or Collection](http://www.baeldung.com/java-collection-min-max) - [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list) +- [[Next -->]](/core-java-modules/core-java-collections-list-2) diff --git a/core-java-modules/core-java-collections-set/README.md b/core-java-modules/core-java-collections-set/README.md index 618b4e932c..2b34ef3449 100644 --- a/core-java-modules/core-java-collections-set/README.md +++ b/core-java-modules/core-java-collections-set/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Collections Set -## Core Java Sets Cookbooks and Examples +This module contains articles about the Java Set collection ### Relevant Articles: - [Set Operations in Java](http://www.baeldung.com/set-operations-in-java) diff --git a/core-java-modules/core-java-concurrency-basic/README.md b/core-java-modules/core-java-concurrency-basic/README.md index 2f9d014103..846687b8dd 100644 --- a/core-java-modules/core-java-concurrency-basic/README.md +++ b/core-java-modules/core-java-concurrency-basic/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Concurrency Basic -## Core Java Concurrency Basic Examples +This module contains articles about basic Java concurrency ### Relevant Articles: - [Guide To CompletableFuture](https://www.baeldung.com/java-completablefuture) @@ -13,3 +13,4 @@ - [Runnable vs. Callable in Java](https://www.baeldung.com/java-runnable-callable) - [What is Thread-Safety and How to Achieve it?](https://www.baeldung.com/java-thread-safety) - [How to Start a Thread in Java](https://www.baeldung.com/java-start-thread) +- [[Next -->]](/core-java-modules/core-java-concurrency-basic-2) diff --git a/core-java-modules/core-java-concurrency-collections/README.md b/core-java-modules/core-java-concurrency-collections/README.md index b982a91861..80a21ee533 100644 --- a/core-java-modules/core-java-concurrency-collections/README.md +++ b/core-java-modules/core-java-concurrency-collections/README.md @@ -1,6 +1,6 @@ -========= +## Core Java Concurrency Collections -## Core Java Concurrency Collections Examples +This module contains articles about concurrent Java collections ### Relevant Articles: - [Guide to java.util.concurrent.BlockingQueue](http://www.baeldung.com/java-blocking-queue) diff --git a/core-java-modules/core-java-io/README.md b/core-java-modules/core-java-io/README.md index 6737ad6eb9..023d7d64b5 100644 --- a/core-java-modules/core-java-io/README.md +++ b/core-java-modules/core-java-io/README.md @@ -1,6 +1,6 @@ -========= +## Core Java IO -## Core Java IO Cookbooks and Examples +This module contains articles about core Java input and output (IO) ### Relevant Articles: - [How to Read a Large File Efficiently with Java](http://www.baeldung.com/java-read-lines-large-file) @@ -41,3 +41,4 @@ - [List Files in a Directory in Java](https://www.baeldung.com/java-list-directory-files) - [Java InputStream to Byte Array and ByteBuffer](https://www.baeldung.com/convert-input-stream-to-array-of-bytes) - [Introduction to the Java NIO Selector](https://www.baeldung.com/java-nio-selector) +- [[More -->]](/core-java-modules/core-java-io-2) diff --git a/core-java-modules/core-java-nio/README.md b/core-java-modules/core-java-nio/README.md index 1ac3b6c089..efa58671b5 100644 --- a/core-java-modules/core-java-nio/README.md +++ b/core-java-modules/core-java-nio/README.md @@ -1,3 +1,7 @@ +## Core Java NIO + +This module contains articles about core Java non-blocking input and output (IO) + ## Relevant Articles: - [Determine File Creation Date in Java](https://www.baeldung.com/java-file-creation-date) diff --git a/core-java-modules/core-java-security/README.md b/core-java-modules/core-java-security/README.md index 00449575b0..48fd071396 100644 --- a/core-java-modules/core-java-security/README.md +++ b/core-java-modules/core-java-security/README.md @@ -1,5 +1,7 @@ ## Core Java Security +This module contains articles about core Java Security + ### Relevant Articles: - [MD5 Hashing in Java](http://www.baeldung.com/java-md5) - [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) From 416b6c7e1ebc729af417390ec6b0855dabe85e79 Mon Sep 17 00:00:00 2001 From: Josh Cummings Date: Fri, 4 Oct 2019 00:18:16 -0600 Subject: [PATCH 349/396] Update README.md --- spring-5-reactive/README.md | 5 ----- 1 file changed, 5 deletions(-) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index 2190258981..41d831632a 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -17,9 +17,4 @@ The "REST With Spring" Classes: https://bit.ly/restwithspring - [Handling Errors in Spring WebFlux](https://www.baeldung.com/spring-webflux-errors) - [Server-Sent Events in Spring](https://www.baeldung.com/spring-server-sent-events) - [A Guide to Spring Session Reactive Support: WebSession](https://www.baeldung.com/spring-session-reactive) -- [Validation for Functional Endpoints in Spring 5](https://www.baeldung.com/spring-functional-endpoints-validation) -- [Logging a Reactive Sequence](https://www.baeldung.com/spring-reactive-sequence-logging) -- [Testing Reactive Streams Using StepVerifier and TestPublisher](https://www.baeldung.com/reactive-streams-step-verifier-test-publisher) -- [Debugging Reactive Streams in Spring 5](https://www.baeldung.com/spring-debugging-reactive-streams) -- [Static Content in Spring WebFlux](https://www.baeldung.com/spring-webflux-static-content) - More articles: [[next -->]](/spring-5-reactive-2) From 7490fb6aed5d64a94194b031568ca9b042049f74 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Fri, 4 Oct 2019 07:52:16 +0100 Subject: [PATCH 350/396] Add README descriptions 27 (#7913) --- azure/README.md | 4 ++++ bazel/README.md | 6 +++++- bootique/README.md | 4 ++++ cas/README.md | 7 +++++++ cdi/README.md | 4 ++++ checker-plugin/README.md | 4 ++++ cloud-foundry-uaa/README.md | 6 +++++- core-groovy-2/README.md | 5 ++++- core-groovy/README.md | 5 ++++- 9 files changed, 41 insertions(+), 4 deletions(-) create mode 100644 cas/README.md diff --git a/azure/README.md b/azure/README.md index 3c70622b85..4da8481502 100644 --- a/azure/README.md +++ b/azure/README.md @@ -1,3 +1,7 @@ +## Azure + +This module contains articles about Azure + ### Relevant Articles: - [Deploy a Spring Boot App to Azure](https://www.baeldung.com/spring-boot-azure) diff --git a/bazel/README.md b/bazel/README.md index d1f8f1af5b..af4f901f49 100644 --- a/bazel/README.md +++ b/bazel/README.md @@ -1,3 +1,7 @@ -## Relevant Articles: +## Bazel + +This module contains articles about Bazel + +### Relevant Articles: - [Building Java Applications with Bazel](https://www.baeldung.com/bazel-build-tool) diff --git a/bootique/README.md b/bootique/README.md index beb61c2a78..0d4076201e 100644 --- a/bootique/README.md +++ b/bootique/README.md @@ -1,2 +1,6 @@ +## Bootique + +This module contains articles about Bootique + ### Relevant Articles: - [Introduction to Bootique](https://www.baeldung.com/bootique) diff --git a/cas/README.md b/cas/README.md new file mode 100644 index 0000000000..16775a8a02 --- /dev/null +++ b/cas/README.md @@ -0,0 +1,7 @@ +## CAS + +This module contains articles about the Central Authentication Service (CAS) + +### Relevant Articles: + +- [CAS SSO With Spring Security](baeldung.com/spring-security-cas-sso) \ No newline at end of file diff --git a/cdi/README.md b/cdi/README.md index 69ce285d7b..13169698a2 100644 --- a/cdi/README.md +++ b/cdi/README.md @@ -1,3 +1,7 @@ +## CDI + +This module contains articles about Contexts and Dependency Injection (CDI) + ### Relevant Articles: - [CDI Interceptor vs Spring AspectJ](https://www.baeldung.com/cdi-interceptor-vs-spring-aspectj) - [An Introduction to CDI (Contexts and Dependency Injection) in Java](https://www.baeldung.com/java-ee-cdi) diff --git a/checker-plugin/README.md b/checker-plugin/README.md index 5c73b86f91..59dc2878a2 100644 --- a/checker-plugin/README.md +++ b/checker-plugin/README.md @@ -1,3 +1,7 @@ +## Checker Plugin + +This module contains articles about the Checker Plugin + ### Relevant articles - [The Checker Framework – Pluggable Type Systems for Java](https://www.baeldung.com/checker-framework) diff --git a/cloud-foundry-uaa/README.md b/cloud-foundry-uaa/README.md index b2f382cad1..f7707a04e2 100644 --- a/cloud-foundry-uaa/README.md +++ b/cloud-foundry-uaa/README.md @@ -1,3 +1,7 @@ -### Revelant Articles +## Cloud Foundry UAA + +This module contains articles about Cloud Foundry UAA + +### Relevant Articles: - [A Quick Guide To Using Cloud Foundry UAA](https://www.baeldung.com/cloud-foundry-uaa) diff --git a/core-groovy-2/README.md b/core-groovy-2/README.md index 1dbfbd07a5..6359592da6 100644 --- a/core-groovy-2/README.md +++ b/core-groovy-2/README.md @@ -1,4 +1,6 @@ -# Groovy +# Core Groovy 2 + +This module contains articles about core Groovy concepts ## Relevant articles: @@ -9,3 +11,4 @@ - [Integrating Groovy into Java Applications](https://www.baeldung.com/groovy-java-applications) - [Concatenate Strings with Groovy](https://www.baeldung.com/groovy-concatenate-strings) - [Metaprogramming in Groovy](https://www.baeldung.com/groovy-metaprogramming) +- [[<-- Prev]](/core-groovy) \ No newline at end of file diff --git a/core-groovy/README.md b/core-groovy/README.md index 2e62884b1f..0f45eed879 100644 --- a/core-groovy/README.md +++ b/core-groovy/README.md @@ -1,4 +1,6 @@ -# Groovy +# Core Groovy + +This module contains articles about core Groovy concepts ## Relevant articles: @@ -13,3 +15,4 @@ - [Lists in Groovy](https://www.baeldung.com/groovy-lists) - [Converting a String to a Date in Groovy](https://www.baeldung.com/groovy-string-to-date) - [Guide to I/O in Groovy](https://www.baeldung.com/groovy-io) +- [[More -->]](/core-groovy-2) \ No newline at end of file From 0f64304c34e324c70fb6c853de01ac8508eb4fe5 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Fri, 4 Oct 2019 08:52:25 +0200 Subject: [PATCH 351/396] #BAEL-17519 add README descriptions (#7935) --- java-ee-8-security-api/README.md | 4 ++++ java-jdi/README.md | 7 +++++++ java-lite/README.md | 4 ++++ java-math/README.md | 6 +++++- java-numbers-2/README.md | 7 ++++++- java-numbers/README.md | 5 +++-- java-rmi/README.md | 4 ++++ java-spi/README.md | 3 +++ java-streams-2/README.md | 5 +++++ java-streams/README.md | 5 +++-- 10 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 java-jdi/README.md diff --git a/java-ee-8-security-api/README.md b/java-ee-8-security-api/README.md index 5ecce2b4cc..b01a073e35 100644 --- a/java-ee-8-security-api/README.md +++ b/java-ee-8-security-api/README.md @@ -1,3 +1,7 @@ +## Java EE 8 Security API + +This module contains articles about the Security API in Java EE 8. + ### Relevant articles - [Java EE 8 Security API](https://www.baeldung.com/java-ee-8-security) diff --git a/java-jdi/README.md b/java-jdi/README.md new file mode 100644 index 0000000000..c8c2d3e9ab --- /dev/null +++ b/java-jdi/README.md @@ -0,0 +1,7 @@ +## Java JDI + +This module contains articles about JDI, the Java Debug Interface. + +###Relevant articles + +- [An Intro to the Java Debug Interface (JDI)](https://www.baeldung.com/java-debug-interface) diff --git a/java-lite/README.md b/java-lite/README.md index 5221b832f9..96fb6f1a93 100644 --- a/java-lite/README.md +++ b/java-lite/README.md @@ -1,3 +1,7 @@ +## JavaLite + +This module contains articles about JavaLite. + ### Relevant Articles: - [A Guide to JavaLite – Building a RESTful CRUD application](https://www.baeldung.com/javalite-rest) diff --git a/java-math/README.md b/java-math/README.md index b0921e55ae..49ff5afde1 100644 --- a/java-math/README.md +++ b/java-math/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Java Math + +This module contains articles about math in Java. + +### Relevant articles: - [Calculate Factorial in Java](https://www.baeldung.com/java-calculate-factorial) - [Generate Combinations in Java](https://www.baeldung.com/java-combinations-algorithm) diff --git a/java-numbers-2/README.md b/java-numbers-2/README.md index 5c6f46b05b..48f9acd32d 100644 --- a/java-numbers-2/README.md +++ b/java-numbers-2/README.md @@ -1,4 +1,8 @@ -## Relevant Articles +## Java Number Cookbooks and Examples + +This module contains articles about numbers in Java. + +### Relevant Articles - [Lossy Conversion in Java](https://www.baeldung.com/java-lossy-conversion) - [A Guide to the Java Math Class](https://www.baeldung.com/java-lang-math) - [Calculate the Area of a Circle in Java](https://www.baeldung.com/java-calculate-circle-area) @@ -9,3 +13,4 @@ - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) - [Finding the Least Common Multiple in Java](https://www.baeldung.com/java-least-common-multiple) - [Binary Numbers in Java](https://www.baeldung.com/java-binary-numbers) +- More articles: [[<-- prev]](/../java-numbers) diff --git a/java-numbers/README.md b/java-numbers/README.md index 7885232c46..eee6fceab1 100644 --- a/java-numbers/README.md +++ b/java-numbers/README.md @@ -1,7 +1,7 @@ -========= - ## Java Number Cookbooks and Examples +This module contains articles about numbers in Java. + ### Relevant Articles: - [Number of Digits in an Integer in Java](http://www.baeldung.com/java-number-of-digits-in-int) - [How to Round a Number to N Decimal Places in Java](http://www.baeldung.com/java-round-decimal-number) @@ -13,3 +13,4 @@ - [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) - [Convert Double to String, Removing Decimal Places](https://www.baeldung.com/java-double-to-string) - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) +- More articles: [[next -->]](/../java-numbers-2) diff --git a/java-rmi/README.md b/java-rmi/README.md index 201c4c8e66..244f986639 100644 --- a/java-rmi/README.md +++ b/java-rmi/README.md @@ -1,3 +1,7 @@ +## Java RMI + +This module contains articles about RMI (Remote Method Invocation) in Java. + ### Relevant articles - [Getting Started with Java RMI](https://www.baeldung.com/java-rmi) diff --git a/java-spi/README.md b/java-spi/README.md index 25e2d10da4..2ccef98a10 100644 --- a/java-spi/README.md +++ b/java-spi/README.md @@ -1,3 +1,6 @@ +## Java SPI + +This module contains articles about the SPI (Service Provider Interface) in Java. ### Relevant Articles: diff --git a/java-streams-2/README.md b/java-streams-2/README.md index 851d3d71e2..66fbe69ed4 100644 --- a/java-streams-2/README.md +++ b/java-streams-2/README.md @@ -1,4 +1,9 @@ +## Java Streams Cookbooks and Examples + +This module contains articles about the Stream API in Java. + ### Relevant Articles: - [Guide to Stream.reduce()](https://www.baeldung.com/java-stream-reduce) - [How to Break from Java Stream forEach](https://www.baeldung.com/java-break-stream-foreach) - [Java IntStream Conversions](https://www.baeldung.com/java-intstream-convert) +- More articles: [[<-- prev]](/java-streams) diff --git a/java-streams/README.md b/java-streams/README.md index 0d26c182ba..5c231f756f 100644 --- a/java-streams/README.md +++ b/java-streams/README.md @@ -1,7 +1,7 @@ -========= - ## Java Streams Cookbooks and Examples +This module contains articles about the Stream API in Java. + ### Relevant Articles: - [The Java 8 Stream API Tutorial](https://www.baeldung.com/java-8-streams) - [Introduction to Java 8 Streams](https://www.baeldung.com/java-8-streams-introduction) @@ -18,3 +18,4 @@ - [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count) - [Java 8 Streams peek() API](https://www.baeldung.com/java-streams-peek-api) - [Working With Maps Using Streams](https://www.baeldung.com/java-maps-streams) +- More articles: [[next -->]](/../java-streams-2) From f17cb73647432ee67979f28dfb26049bbbbe5262 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Fri, 4 Oct 2019 08:52:53 +0200 Subject: [PATCH 352/396] #BAEL-17521 add README descriptions (#7937) --- jee-7-security/README.md | 4 ++++ jee-7/README.md | 4 ++++ jee-kotlin/README.md | 4 ++++ jersey/README.md | 5 +++++ jgit/README.md | 6 +++++- jgroups/README.md | 7 ++----- jhipster-5/README.md | 3 ++- jib/README.md | 4 ++++ jjwt/README.md | 1 + jmeter/README.md | 6 +++--- 10 files changed, 34 insertions(+), 10 deletions(-) diff --git a/jee-7-security/README.md b/jee-7-security/README.md index 70d451382c..ced2beec46 100644 --- a/jee-7-security/README.md +++ b/jee-7-security/README.md @@ -1,2 +1,6 @@ +## JEE 7 Security + +This module contains articles about security in JEE 7. + ### Relevant Articles: - [Securing Java EE with Spring Security](https://www.baeldung.com/java-ee-spring-security) diff --git a/jee-7/README.md b/jee-7/README.md index 2ae7335ce0..2c45fe2c67 100644 --- a/jee-7/README.md +++ b/jee-7/README.md @@ -1,3 +1,7 @@ +## JEE 7 + +This module contains articles about JEE 7. + ### Relevant Articles: - [Scheduling in Java EE](https://www.baeldung.com/scheduling-in-java-enterprise-edition) - [JSON Processing in Java EE 7](https://www.baeldung.com/jee7-json) diff --git a/jee-kotlin/README.md b/jee-kotlin/README.md index 43dcd992ca..aa3aa58b4e 100644 --- a/jee-kotlin/README.md +++ b/jee-kotlin/README.md @@ -1,2 +1,6 @@ +## JEE in Kotlin + +This module contains articles about Java EE with Kotlin. + ### Relevant Articles: - [Java EE Application with Kotlin](https://www.baeldung.com/java-ee-kotlin-app) diff --git a/jersey/README.md b/jersey/README.md index 1db89ec723..09de7051ca 100644 --- a/jersey/README.md +++ b/jersey/README.md @@ -1,3 +1,8 @@ +## Jersey + +This module contains articles about Jersey. + +### Relevant Articles - [Jersey Filters and Interceptors](https://www.baeldung.com/jersey-filters-interceptors) - [Jersey MVC Support](https://www.baeldung.com/jersey-mvc) - [Bean Validation in Jersey](https://www.baeldung.com/jersey-bean-validation) diff --git a/jgit/README.md b/jgit/README.md index d89104293d..b48f3c7a87 100644 --- a/jgit/README.md +++ b/jgit/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## JGit + +This module contains articles about JGit. + +### Relevant articles: - [A Guide to JGit](https://www.baeldung.com/jgit) diff --git a/jgroups/README.md b/jgroups/README.md index 128007bb7e..046ac89c1f 100644 --- a/jgroups/README.md +++ b/jgroups/README.md @@ -1,5 +1,7 @@ ## Reliable Messaging with JGroups Tutorial Project +This module contains articles about JGroups. + ### Relevant Article: - [Reliable Messaging with JGroups](https://www.baeldung.com/jgroups) @@ -8,8 +10,3 @@ This Maven project contains the Java code for the article linked above. ### Package Organization Java classes for the intro tutorial are in the org.baeldung.jgroups package. - - -### Running the tests - -``` diff --git a/jhipster-5/README.md b/jhipster-5/README.md index 2731281b3e..ba05641af0 100644 --- a/jhipster-5/README.md +++ b/jhipster-5/README.md @@ -1,2 +1,3 @@ +## JHipster 5 -This is an aggregator module for JHipster 5 modules. +This module contains articles about JHipster 5. This is an aggregator module, articles are in the relevant submodules. diff --git a/jib/README.md b/jib/README.md index 82bd2fed42..e0ff7c4058 100644 --- a/jib/README.md +++ b/jib/README.md @@ -1,3 +1,7 @@ +## Jib + +This module contains articles about Jib. + ### Relevant Articles: - [Dockerizing Java Apps using Jib](https://www.baeldung.com/jib-dockerizing) diff --git a/jjwt/README.md b/jjwt/README.md index 04a85f3ded..25f5a8f6f0 100644 --- a/jjwt/README.md +++ b/jjwt/README.md @@ -1,5 +1,6 @@ ## JWT Fun +This module contains articles about JJWT. This tutorial walks you through the various features supported by the [JJWT](https://github.com/jwtk/jjwt) library - a fluent interface Java JWT building and parsing library. ### Build and Run diff --git a/jmeter/README.md b/jmeter/README.md index 58522067b2..81300afe7c 100644 --- a/jmeter/README.md +++ b/jmeter/README.md @@ -1,7 +1,7 @@ -BASIC CRUD API with Spring Boot -================================ +## JMeter -This is the code of a simple API for some CRUD operations build using Spring Boot. +This module contains articles about JMeter. +It contains the code of a simple API for some CRUD operations built using Spring Boot. ### Requirements From 8efd122412240e6038b3e0e0644c2fb6c1b5d223 Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Fri, 4 Oct 2019 10:13:23 +0300 Subject: [PATCH 353/396] rename jenkins/hello-world to jenkins/plugins --- jenkins/hello-world/README.md | 7 ------- jenkins/plugins/README.md | 7 +++++++ jenkins/{hello-world => plugins}/pom.xml | 4 ++-- .../java/com/baeldung/jenkins/plugins}/ProjectStats.java | 2 +- .../jenkins/plugins}/ProjectStatsBuildWrapper.java | 2 +- .../src/main/resources/logback.xml | 0 .../{hello-world => plugins}/src/main/resources/stats.html | 0 pom.xml | 4 ++-- 8 files changed, 13 insertions(+), 13 deletions(-) delete mode 100644 jenkins/hello-world/README.md create mode 100644 jenkins/plugins/README.md rename jenkins/{hello-world => plugins}/pom.xml (98%) rename jenkins/{hello-world/src/main/java/com/baeldung/jenkins/helloworld => plugins/src/main/java/com/baeldung/jenkins/plugins}/ProjectStats.java (90%) rename jenkins/{hello-world/src/main/java/com/baeldung/jenkins/helloworld => plugins/src/main/java/com/baeldung/jenkins/plugins}/ProjectStatsBuildWrapper.java (99%) rename jenkins/{hello-world => plugins}/src/main/resources/logback.xml (100%) rename jenkins/{hello-world => plugins}/src/main/resources/stats.html (100%) diff --git a/jenkins/hello-world/README.md b/jenkins/hello-world/README.md deleted file mode 100644 index 5f6b9f364a..0000000000 --- a/jenkins/hello-world/README.md +++ /dev/null @@ -1,7 +0,0 @@ -## Jenkins Plugins - -This module contains articles about Jenkins plugins. - -### Relevant articles: - -- [Writing a Jenkins Plugin](http://www.baeldung.com/jenkins-custom-plugin) diff --git a/jenkins/plugins/README.md b/jenkins/plugins/README.md new file mode 100644 index 0000000000..cf7aa3dba8 --- /dev/null +++ b/jenkins/plugins/README.md @@ -0,0 +1,7 @@ +## Jenkins plugins + +This module contains articles about various Jenkins plugins. + +### Relevant articles: + +- [Writing a Jenkins Plugin](https://www.baeldung.com/jenkins-custom-plugin) diff --git a/jenkins/hello-world/pom.xml b/jenkins/plugins/pom.xml similarity index 98% rename from jenkins/hello-world/pom.xml rename to jenkins/plugins/pom.xml index f00a551173..1db7cec394 100644 --- a/jenkins/hello-world/pom.xml +++ b/jenkins/plugins/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - hello-world + plugins 1.0-SNAPSHOT - hello-world + plugins hpi A sample Jenkins Hello World plugin diff --git a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStats.java b/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java similarity index 90% rename from jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStats.java rename to jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java index 67af636bb4..46899c49d1 100644 --- a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStats.java +++ b/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStats.java @@ -1,4 +1,4 @@ -package com.baeldung.jenkins.helloworld; +package com.baeldung.jenkins.plugins; public class ProjectStats { diff --git a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStatsBuildWrapper.java b/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java similarity index 99% rename from jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStatsBuildWrapper.java rename to jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java index 9a7213c76f..39500a42cb 100644 --- a/jenkins/hello-world/src/main/java/com/baeldung/jenkins/helloworld/ProjectStatsBuildWrapper.java +++ b/jenkins/plugins/src/main/java/com/baeldung/jenkins/plugins/ProjectStatsBuildWrapper.java @@ -1,4 +1,4 @@ -package com.baeldung.jenkins.helloworld; +package com.baeldung.jenkins.plugins; import hudson.Extension; import hudson.FilePath; diff --git a/jenkins/hello-world/src/main/resources/logback.xml b/jenkins/plugins/src/main/resources/logback.xml similarity index 100% rename from jenkins/hello-world/src/main/resources/logback.xml rename to jenkins/plugins/src/main/resources/logback.xml diff --git a/jenkins/hello-world/src/main/resources/stats.html b/jenkins/plugins/src/main/resources/stats.html similarity index 100% rename from jenkins/hello-world/src/main/resources/stats.html rename to jenkins/plugins/src/main/resources/stats.html diff --git a/pom.xml b/pom.xml index 733aaad056..539f089e58 100644 --- a/pom.xml +++ b/pom.xml @@ -1039,7 +1039,7 @@ core-kotlin-2 core-kotlin-io - jenkins/hello-world + jenkins/plugins jhipster jws @@ -1589,7 +1589,7 @@ core-kotlin core-kotlin-2 - jenkins/hello-world + jenkins/plugins jhipster jws From 0ba79b88b4fc28b82ddce5cbb58a38b76a1f2d19 Mon Sep 17 00:00:00 2001 From: Martin van Wingerden Date: Wed, 2 Oct 2019 13:26:01 +0200 Subject: [PATCH 354/396] Include the link to https://www.baeldung.com/javax-validation-groups --- javaxval/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/javaxval/README.md b/javaxval/README.md index 46b7deab2a..2b4164671d 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -8,3 +8,4 @@ This module contains articles about Bean Validation. - [Method Constraints with Bean Validation 2.0](https://www.baeldung.com/javax-validation-method-constraints) - [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank) - [Javax BigDecimal Validation](https://www.baeldung.com/javax-bigdecimal-validation) +- [Grouping Javax Validation Constraints](https://www.baeldung.com/javax-validation-groups) From 76e0fe46428a47a521d15d7b8322cb5e33650bca Mon Sep 17 00:00:00 2001 From: Martin van Wingerden Date: Wed, 2 Oct 2019 13:37:28 +0200 Subject: [PATCH 355/396] Reformatting code of javaxval before starting on [BAEL-3306] --- .../src/main/java/org/baeldung/Customer.java | 10 +- .../main/java/org/baeldung/CustomerMap.java | 4 +- .../appplication/Application.java | 4 +- .../bigdecimal/Invoice.java | 16 +- .../entities/UserNotBlank.java | 6 +- .../entities/UserNotEmpty.java | 8 +- .../entities/UserNotNull.java | 8 +- .../validationgroup/RegistrationForm.java | 162 +++++++++--------- .../javaxval/beanvalidation/User.java | 9 +- .../ValidReservationValidator.java | 6 +- 10 files changed, 116 insertions(+), 117 deletions(-) diff --git a/javaxval/src/main/java/org/baeldung/Customer.java b/javaxval/src/main/java/org/baeldung/Customer.java index a90fb419de..f301fe6c80 100644 --- a/javaxval/src/main/java/org/baeldung/Customer.java +++ b/javaxval/src/main/java/org/baeldung/Customer.java @@ -10,16 +10,16 @@ import javax.validation.constraints.PositiveOrZero; public class Customer { - @NotBlank(message="Name cannot be empty") + @NotBlank(message = "Name cannot be empty") private String name; - private List<@NotBlank(message="Address must not be blank") String> addresses; - + private List<@NotBlank(message = "Address must not be blank") String> addresses; + private Integer age; - + @PositiveOrZero private OptionalInt numberOfOrders; - + //@NotBlank private Profile profile; diff --git a/javaxval/src/main/java/org/baeldung/CustomerMap.java b/javaxval/src/main/java/org/baeldung/CustomerMap.java index 37446cf86e..d8830a7f42 100644 --- a/javaxval/src/main/java/org/baeldung/CustomerMap.java +++ b/javaxval/src/main/java/org/baeldung/CustomerMap.java @@ -6,8 +6,8 @@ import javax.validation.constraints.Email; import javax.validation.constraints.NotNull; public class CustomerMap { - - private Map<@Email(message="Must be a valid email") String, @NotNull Customer> customers; + + private Map<@Email(message = "Must be a valid email") String, @NotNull Customer> customers; public Map getCustomers() { return customers; diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java index c9f2ab6f98..f60eab3e63 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java @@ -6,9 +6,9 @@ import org.baeldung.javabeanconstraints.entities.UserNotBlank; public class Application { - public static void main(String[] args) throws Exception { + public static void main(String[] args) { Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); UserNotBlank user = new UserNotBlank(" "); - validator.validate(user).stream().forEach(violation -> System.out.println(violation.getMessage())); + validator.validate(user).stream().forEach(violation -> System.out.println(violation.getMessage())); } } diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java index 6df1b79a60..886123dad7 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java @@ -6,14 +6,14 @@ import javax.validation.constraints.DecimalMin; import javax.validation.constraints.Digits; public class Invoice { - - @DecimalMin(value = "0.0", inclusive = false) - @Digits(integer=3, fraction=2) + + @DecimalMin(value = "0.0", inclusive = false) + @Digits(integer = 3, fraction = 2) private BigDecimal price; private String description; - - public Invoice(BigDecimal price, String description) { - this.price = price; - this.description = description; - } + + public Invoice(BigDecimal price, String description) { + this.price = price; + this.description = description; + } } diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java index 2ea6a3af56..b49e587ce5 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java @@ -6,15 +6,15 @@ public class UserNotBlank { @NotBlank(message = "Name is mandatory") private final String name; - + public UserNotBlank(String name) { this.name = name; } - + public String getName() { return name; } - + @Override public String toString() { return "User{" + "name=" + name + "}"; diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java index 39e34b63d3..0da768b103 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java @@ -3,18 +3,18 @@ package org.baeldung.javabeanconstraints.entities; import javax.validation.constraints.NotEmpty; public class UserNotEmpty { - + @NotEmpty(message = "Name is mandatory") private final String name; - + public UserNotEmpty(String name) { this.name = name; } - + public String getName() { return name; } - + @Override public String toString() { return "User{" + "name=" + name + "}"; diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java index 598c9ba9f9..63a1017b75 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java @@ -3,18 +3,18 @@ package org.baeldung.javabeanconstraints.entities; import javax.validation.constraints.NotNull; public class UserNotNull { - + @NotNull(message = "Name is mandatory") private final String name; - + public UserNotNull(String name) { this.name = name; } - + public String getName() { return name; } - + @Override public String toString() { return "User{" + "name=" + name + "}"; diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java index ac8da5c26b..4cebe0e218 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java @@ -4,107 +4,107 @@ import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; public class RegistrationForm { - @NotBlank(groups = BasicInfo.class) - private String firstName; - @NotBlank(groups = BasicInfo.class) - private String lastName; - @Email(groups = BasicInfo.class) - private String email; - @NotBlank(groups = BasicInfo.class) - private String phone; + @NotBlank(groups = BasicInfo.class) + private String firstName; + @NotBlank(groups = BasicInfo.class) + private String lastName; + @Email(groups = BasicInfo.class) + private String email; + @NotBlank(groups = BasicInfo.class) + private String phone; - @NotBlank(groups = { BasicInfo.class, AdvanceInfo.class }) - private String captcha; + @NotBlank(groups = {BasicInfo.class, AdvanceInfo.class}) + private String captcha; - @NotBlank(groups = AdvanceInfo.class) - private String street; - @NotBlank(groups = AdvanceInfo.class) - private String houseNumber; - @NotBlank(groups = AdvanceInfo.class) - private String zipCode; - @NotBlank(groups = AdvanceInfo.class) - private String city; - @NotBlank(groups = AdvanceInfo.class) - private String contry; + @NotBlank(groups = AdvanceInfo.class) + private String street; + @NotBlank(groups = AdvanceInfo.class) + private String houseNumber; + @NotBlank(groups = AdvanceInfo.class) + private String zipCode; + @NotBlank(groups = AdvanceInfo.class) + private String city; + @NotBlank(groups = AdvanceInfo.class) + private String contry; - public String getStreet() { - return street; - } + public String getStreet() { + return street; + } - public void setStreet(String street) { - this.street = street; - } + public void setStreet(String street) { + this.street = street; + } - public String getHouseNumber() { - return houseNumber; - } + public String getHouseNumber() { + return houseNumber; + } - public void setHouseNumber(String houseNumber) { - this.houseNumber = houseNumber; - } + public void setHouseNumber(String houseNumber) { + this.houseNumber = houseNumber; + } - public String getZipCode() { - return zipCode; - } + public String getZipCode() { + return zipCode; + } - public void setZipCode(String zipCode) { - this.zipCode = zipCode; - } + public void setZipCode(String zipCode) { + this.zipCode = zipCode; + } - public String getCity() { - return city; - } + public String getCity() { + return city; + } - public void setCity(String city) { - this.city = city; - } + public void setCity(String city) { + this.city = city; + } - public String getContry() { - return contry; - } + public String getContry() { + return contry; + } - public void setContry(String contry) { - this.contry = contry; - } + public void setContry(String contry) { + this.contry = contry; + } - public String getFirstName() { - return firstName; - } + public String getFirstName() { + return firstName; + } - public void setFirstName(String firstName) { - this.firstName = firstName; - } + public void setFirstName(String firstName) { + this.firstName = firstName; + } - public String getLastName() { - return lastName; - } + public String getLastName() { + return lastName; + } - public void setLastName(String lastName) { - this.lastName = lastName; - } + public void setLastName(String lastName) { + this.lastName = lastName; + } - public String getEmail() { - return email; - } + public String getEmail() { + return email; + } - public void setEmail(String email) { - this.email = email; - } + public void setEmail(String email) { + this.email = email; + } - public String getPhone() { - return phone; - } + public String getPhone() { + return phone; + } - public void setPhone(String phone) { - this.phone = phone; - } - - public String getCaptcha() { - return captcha; - } + public void setPhone(String phone) { + this.phone = phone; + } - public void setCaptcha(String captcha) { - this.captcha = captcha; - } + public String getCaptcha() { + return captcha; + } + + public void setCaptcha(String captcha) { + this.captcha = captcha; + } } diff --git a/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java index cf80266c9d..8303edd033 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/beanvalidation/User.java @@ -8,10 +8,10 @@ import javax.validation.constraints.AssertTrue; import javax.validation.constraints.Email; import javax.validation.constraints.Max; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; import javax.validation.constraints.Past; import javax.validation.constraints.Size; -import javax.validation.constraints.NotBlank; public class User { @@ -30,9 +30,9 @@ public class User { @Email(message = "Email should be valid") private String email; - - List<@NotBlank String> preferences; - + + private List<@NotBlank String> preferences; + private LocalDate dateOfBirth; public int getAge() { @@ -90,5 +90,4 @@ public class User { public void setPreferences(List preferences) { this.preferences = preferences; } - } diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java index 7b730480ed..3d3a84ab9f 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java @@ -24,9 +24,9 @@ public class ValidReservationValidator implements ConstraintValidator 0); + && reservation.getRoom() > 0); } } From 86dd449968afc4ddb44a1f9dbce629ca5ee69b79 Mon Sep 17 00:00:00 2001 From: Martin van Wingerden Date: Wed, 2 Oct 2019 13:52:41 +0200 Subject: [PATCH 356/396] Formatted using the eclipse formatter --- .../src/main/java/org/baeldung/Customer.java | 1 - .../appplication/Application.java | 8 +- .../validationgroup/CompleteInfo.java | 2 +- .../validationgroup/RegistrationForm.java | 12 +- .../MethodValidationConfig.java | 4 +- .../ConsistentDateParameterValidator.java | 3 +- .../constraints/ConsistentDateParameters.java | 10 +- .../constraints/ValidReservation.java | 13 +- .../ValidReservationValidator.java | 11 +- .../methodvalidation/model/Customer.java | 4 +- .../methodvalidation/model/Reservation.java | 9 +- .../model/ReservationManagement.java | 15 +- .../ContainerValidationIntegrationTest.java | 10 +- .../bigdecimal/InvoiceUnitTest.java | 36 ++- .../test/UserNotBlankUnitTest.java | 38 +-- .../test/UserNotEmptyUnitTest.java | 32 +-- .../test/UserNotNullUnitTest.java | 28 ++- .../RegistrationFormUnitTest.java | 225 +++++++++--------- .../ValidationIntegrationTest.java | 22 +- .../ContainerValidationIntegrationTest.java | 9 +- .../ValidationIntegrationTest.java | 24 +- 21 files changed, 275 insertions(+), 241 deletions(-) diff --git a/javaxval/src/main/java/org/baeldung/Customer.java b/javaxval/src/main/java/org/baeldung/Customer.java index f301fe6c80..02a95cc546 100644 --- a/javaxval/src/main/java/org/baeldung/Customer.java +++ b/javaxval/src/main/java/org/baeldung/Customer.java @@ -20,7 +20,6 @@ public class Customer { @PositiveOrZero private OptionalInt numberOfOrders; - //@NotBlank private Profile profile; public String getName() { diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java index f60eab3e63..e5927a093e 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java @@ -2,13 +2,17 @@ package org.baeldung.javabeanconstraints.appplication; import javax.validation.Validation; import javax.validation.Validator; + import org.baeldung.javabeanconstraints.entities.UserNotBlank; public class Application { public static void main(String[] args) { - Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); + Validator validator = Validation.buildDefaultValidatorFactory() + .getValidator(); UserNotBlank user = new UserNotBlank(" "); - validator.validate(user).stream().forEach(violation -> System.out.println(violation.getMessage())); + validator.validate(user) + .stream() + .forEach(violation -> System.out.println(violation.getMessage())); } } diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java index c989ea3a6f..4d9de8150a 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java @@ -2,7 +2,7 @@ package org.baeldung.javabeanconstraints.validationgroup; import javax.validation.GroupSequence; -@GroupSequence({BasicInfo.class, AdvanceInfo.class}) +@GroupSequence({ BasicInfo.class, AdvanceInfo.class }) public interface CompleteInfo { } diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java index 4cebe0e218..197b9adad2 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java +++ b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java @@ -13,7 +13,7 @@ public class RegistrationForm { @NotBlank(groups = BasicInfo.class) private String phone; - @NotBlank(groups = {BasicInfo.class, AdvanceInfo.class}) + @NotBlank(groups = { BasicInfo.class, AdvanceInfo.class }) private String captcha; @NotBlank(groups = AdvanceInfo.class) @@ -25,7 +25,7 @@ public class RegistrationForm { @NotBlank(groups = AdvanceInfo.class) private String city; @NotBlank(groups = AdvanceInfo.class) - private String contry; + private String country; public String getStreet() { return street; @@ -59,12 +59,12 @@ public class RegistrationForm { this.city = city; } - public String getContry() { - return contry; + public String getCountry() { + return country; } - public void setContry(String contry) { - this.contry = contry; + public void setCountry(String country) { + this.country = country; } public String getFirstName() { diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java index 206a145337..817f2370ef 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/MethodValidationConfig.java @@ -1,5 +1,7 @@ package org.baeldung.javaxval.methodvalidation; +import java.time.LocalDate; + import org.baeldung.javaxval.methodvalidation.model.Customer; import org.baeldung.javaxval.methodvalidation.model.Reservation; import org.springframework.beans.factory.config.BeanDefinition; @@ -9,8 +11,6 @@ import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; import org.springframework.validation.beanvalidation.MethodValidationPostProcessor; -import java.time.LocalDate; - @Configuration @ComponentScan({ "org.baeldung.javaxval.methodvalidation.model" }) public class MethodValidationConfig { diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java index f1c97760d7..df09cfa906 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameterValidator.java @@ -1,10 +1,11 @@ package org.baeldung.javaxval.methodvalidation.constraints; +import java.time.LocalDate; + import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import javax.validation.constraintvalidation.SupportedValidationTarget; import javax.validation.constraintvalidation.ValidationTarget; -import java.time.LocalDate; @SupportedValidationTarget(ValidationTarget.PARAMETERS) public class ConsistentDateParameterValidator implements ConstraintValidator { diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java index 6b321f545c..bdfabe05ba 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ConsistentDateParameters.java @@ -1,13 +1,15 @@ package org.baeldung.javaxval.methodvalidation.constraints; -import javax.validation.Constraint; -import javax.validation.Payload; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + import java.lang.annotation.Documented; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.ElementType.*; -import static java.lang.annotation.RetentionPolicy.RUNTIME; +import javax.validation.Constraint; +import javax.validation.Payload; @Constraint(validatedBy = ConsistentDateParameterValidator.class) @Target({ METHOD, CONSTRUCTOR }) diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java index f9cdea1483..842f9e0621 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservation.java @@ -1,15 +1,16 @@ package org.baeldung.javaxval.methodvalidation.constraints; -import javax.validation.Constraint; -import javax.validation.Payload; -import java.lang.annotation.Documented; -import java.lang.annotation.Retention; -import java.lang.annotation.Target; - import static java.lang.annotation.ElementType.CONSTRUCTOR; import static java.lang.annotation.ElementType.METHOD; import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + @Constraint(validatedBy = ValidReservationValidator.class) @Target({ METHOD, CONSTRUCTOR }) @Retention(RUNTIME) diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java index 3d3a84ab9f..c139d1affc 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/constraints/ValidReservationValidator.java @@ -1,10 +1,11 @@ package org.baeldung.javaxval.methodvalidation.constraints; -import org.baeldung.javaxval.methodvalidation.model.Reservation; +import java.time.LocalDate; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; -import java.time.LocalDate; + +import org.baeldung.javaxval.methodvalidation.model.Reservation; public class ValidReservationValidator implements ConstraintValidator { @@ -24,9 +25,9 @@ public class ValidReservationValidator implements ConstraintValidator 0); + && reservation.getRoom() > 0); } } diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java index fe9ad7080e..99a32d6277 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Customer.java @@ -1,10 +1,10 @@ package org.baeldung.javaxval.methodvalidation.model; -import org.springframework.validation.annotation.Validated; - import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; +import org.springframework.validation.annotation.Validated; + @Validated public class Customer { diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java index a8c01d2be1..5775bdd66b 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/Reservation.java @@ -1,13 +1,14 @@ package org.baeldung.javaxval.methodvalidation.model; +import java.time.LocalDate; + +import javax.validation.Valid; +import javax.validation.constraints.Positive; + import org.baeldung.javaxval.methodvalidation.constraints.ConsistentDateParameters; import org.baeldung.javaxval.methodvalidation.constraints.ValidReservation; import org.springframework.validation.annotation.Validated; -import javax.validation.Valid; -import javax.validation.constraints.Positive; -import java.time.LocalDate; - @Validated public class Reservation { diff --git a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java index f6fec1a15d..e480e7912d 100644 --- a/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/methodvalidation/model/ReservationManagement.java @@ -1,17 +1,20 @@ package org.baeldung.javaxval.methodvalidation.model; +import java.time.LocalDate; +import java.util.List; + +import javax.validation.Valid; +import javax.validation.constraints.Future; +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import javax.validation.constraints.Size; + import org.baeldung.javaxval.methodvalidation.constraints.ConsistentDateParameters; -import org.baeldung.javaxval.methodvalidation.constraints.ValidReservation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; -import javax.validation.Valid; -import javax.validation.constraints.*; -import java.time.LocalDate; -import java.util.List; - @Controller @Validated public class ReservationManagement { diff --git a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java index dff02ff13d..aa2cf577de 100644 --- a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java @@ -10,8 +10,8 @@ import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; -import org.baeldung.valueextractors.ProfileValueExtractor; +import org.baeldung.valueextractors.ProfileValueExtractor; import org.junit.Before; import org.junit.Test; @@ -20,8 +20,10 @@ public class ContainerValidationIntegrationTest { @Before public void setup() { - ValidatorFactory factory = Validation.byDefaultProvider().configure() - .addValueExtractor(new ProfileValueExtractor()).buildValidatorFactory(); + ValidatorFactory factory = Validation.byDefaultProvider() + .configure() + .addValueExtractor(new ProfileValueExtractor()) + .buildValidatorFactory(); validator = factory.getValidator(); } @@ -74,7 +76,7 @@ public class ContainerValidationIntegrationTest { assertEquals(0, violations.size()); } - //@Test + // @Test public void whenProfileCompanyNameBlank_thenValidationFails() { Customer customer = new Customer(); customer.setName("John"); diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java index 860177f4c9..a07328e2fb 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java @@ -13,51 +13,49 @@ import org.junit.BeforeClass; import org.junit.Test; public class InvoiceUnitTest { - - private static Validator validator; + + private static Validator validator; @BeforeClass public static void setupValidatorInstance() { - validator = Validation.buildDefaultValidatorFactory().getValidator(); + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); } - + @Test public void whenPriceIntegerDigitLessThanThreeWithDecimalValue_thenShouldGiveConstraintViolations() { - Invoice invoice = new Invoice(new BigDecimal(10.21), "Book purchased"); + Invoice invoice = new Invoice(new BigDecimal(10.21), "Book purchased"); Set> violations = validator.validate(invoice); assertThat(violations.size()).isEqualTo(1); - violations.forEach(action-> assertThat(action.getMessage()) - .isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)")); + violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)")); } - + @Test public void whenPriceIntegerDigitLessThanThreeWithIntegerValue_thenShouldNotGiveConstraintViolations() { - Invoice invoice = new Invoice(new BigDecimal(10), "Book purchased"); + Invoice invoice = new Invoice(new BigDecimal(10), "Book purchased"); Set> violations = validator.validate(invoice); assertThat(violations.size()).isEqualTo(0); } - + @Test public void whenPriceIntegerDigitGreaterThanThree_thenShouldGiveConstraintViolations() { - Invoice invoice = new Invoice(new BigDecimal(1021.21), "Book purchased"); + Invoice invoice = new Invoice(new BigDecimal(1021.21), "Book purchased"); Set> violations = validator.validate(invoice); assertThat(violations.size()).isEqualTo(1); - violations.forEach(action-> assertThat(action.getMessage()) - .isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)")); + violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("numeric value out of bounds (<3 digits>.<2 digits> expected)")); } - + @Test public void whenPriceIsZero_thenShouldGiveConstraintViolations() { - Invoice invoice = new Invoice(new BigDecimal(000.00), "Book purchased"); + Invoice invoice = new Invoice(new BigDecimal(000.00), "Book purchased"); Set> violations = validator.validate(invoice); assertThat(violations.size()).isEqualTo(1); - violations.forEach(action-> assertThat(action.getMessage()) - .isEqualTo("must be greater than 0.0")); + violations.forEach(action -> assertThat(action.getMessage()).isEqualTo("must be greater than 0.0")); } - + @Test public void whenPriceIsGreaterThanZero_thenShouldNotGiveConstraintViolations() { - Invoice invoice = new Invoice(new BigDecimal(100.50), "Book purchased"); + Invoice invoice = new Invoice(new BigDecimal(100.50), "Book purchased"); Set> violations = validator.validate(invoice); assertThat(violations.size()).isEqualTo(0); } diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java index 954833fef1..48ecb2e649 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java @@ -1,63 +1,67 @@ package org.baeldung.javabeanconstraints.test; +import static org.assertj.core.api.Assertions.assertThat; + import java.util.Set; + import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; -import static org.assertj.core.api.Assertions.assertThat; + import org.baeldung.javabeanconstraints.entities.UserNotBlank; import org.junit.BeforeClass; import org.junit.Test; public class UserNotBlankUnitTest { - + private static Validator validator; @BeforeClass public static void setupValidatorInstance() { - validator = Validation.buildDefaultValidatorFactory().getValidator(); + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); } - + @Test public void whenNotBlankName_thenNoConstraintViolations() { UserNotBlank user = new UserNotBlank("John"); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(0); } - + @Test public void whenBlankName_thenOneConstraintViolation() { UserNotBlank user = new UserNotBlank(" "); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(1); } - + @Test public void whenEmptyName_thenOneConstraintViolation() { UserNotBlank user = new UserNotBlank(""); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(1); } - + @Test public void whenNullName_thenOneConstraintViolation() { UserNotBlank user = new UserNotBlank(null); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(1); } - + @Test public void whenToString_thenCorrect() { UserNotBlank user = new UserNotBlank("John"); - + assertThat(user.toString()).isEqualTo("User{name=John}"); } } diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java index c2675ed8b6..6398d2bb91 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java @@ -1,54 +1,58 @@ package org.baeldung.javabeanconstraints.test; +import static org.assertj.core.api.Assertions.assertThat; + import java.util.Set; + import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; -import static org.assertj.core.api.Assertions.assertThat; + import org.baeldung.javabeanconstraints.entities.UserNotEmpty; import org.junit.BeforeClass; import org.junit.Test; public class UserNotEmptyUnitTest { - + private static Validator validator; @BeforeClass public static void setupValidatorInstance() { - validator = Validation.buildDefaultValidatorFactory().getValidator(); + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); } - + @Test public void whenNotEmptyName_thenNoConstraintViolations() { UserNotEmpty user = new UserNotEmpty("John"); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(0); } - + @Test public void whenEmptyName_thenOneConstraintViolation() { UserNotEmpty user = new UserNotEmpty(""); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(1); } - + @Test public void whenNullName_thenOneConstraintViolation() { UserNotEmpty user = new UserNotEmpty(null); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(1); } - + @Test public void whenToString_thenCorrect() { UserNotEmpty user = new UserNotEmpty("John"); - + assertThat(user.toString()).isEqualTo("User{name=John}"); } } diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java index 3dd1811947..f9387f9199 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java @@ -1,10 +1,13 @@ package org.baeldung.javabeanconstraints.test; +import static org.assertj.core.api.Assertions.assertThat; + import java.util.Set; + import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; -import static org.assertj.core.api.Assertions.assertThat; + import org.baeldung.javabeanconstraints.entities.UserNotNull; import org.junit.BeforeClass; import org.junit.Test; @@ -15,40 +18,41 @@ public class UserNotNullUnitTest { @BeforeClass public static void setupValidatorInstance() { - validator = Validation.buildDefaultValidatorFactory().getValidator(); + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); } @Test public void whenNotNullName_thenNoConstraintViolations() { UserNotNull user = new UserNotNull("John"); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(0); } - + @Test public void whenNullName_thenOneConstraintViolation() { UserNotNull user = new UserNotNull(null); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(1); } - + @Test public void whenEmptyName_thenNoConstraintViolations() { UserNotNull user = new UserNotNull(""); - + Set> violations = validator.validate(user); - + assertThat(violations.size()).isEqualTo(0); } - + @Test public void whenToString_thenCorrect() { UserNotNull user = new UserNotNull("John"); - + assertThat(user.toString()).isEqualTo("User{name=John}"); } } diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java index bd7034476e..efe61bf926 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java @@ -12,126 +12,133 @@ import org.junit.BeforeClass; import org.junit.Test; public class RegistrationFormUnitTest { - private static Validator validator; + private static Validator validator; - @BeforeClass - public static void setupValidatorInstance() { - validator = Validation.buildDefaultValidatorFactory().getValidator(); - } + @BeforeClass + public static void setupValidatorInstance() { + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + } - @Test - public void whenBasicInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForBasicInfo() { - RegistrationForm form = buildRegistrationFormWithBasicInfo(); - form.setFirstName(""); - Set> violations = validator.validate(form, BasicInfo.class); - assertThat(violations.size()).isEqualTo(1); - violations.forEach(action -> { - assertThat(action.getMessage()).isEqualTo("must not be blank"); - assertThat(action.getPropertyPath().toString()).isEqualTo("firstName"); - }); - } + @Test + public void whenBasicInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForBasicInfo() { + RegistrationForm form = buildRegistrationFormWithBasicInfo(); + form.setFirstName(""); + Set> violations = validator.validate(form, BasicInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath() + .toString()).isEqualTo("firstName"); + }); + } - @Test - public void whenAdvanceInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForAdvanceInfo() { - RegistrationForm form = buildRegistrationFormWithAdvanceInfo(); - form.setZipCode(""); - Set> violations = validator.validate(form, AdvanceInfo.class); - assertThat(violations.size()).isEqualTo(1); - violations.forEach(action -> { - assertThat(action.getMessage()).isEqualTo("must not be blank"); - assertThat(action.getPropertyPath().toString()).isEqualTo("zipCode"); - }); - } + @Test + public void whenAdvanceInfoIsNotComplete_thenShouldGiveConstraintViolationsOnlyForAdvanceInfo() { + RegistrationForm form = buildRegistrationFormWithAdvanceInfo(); + form.setZipCode(""); + Set> violations = validator.validate(form, AdvanceInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath() + .toString()).isEqualTo("zipCode"); + }); + } - @Test - public void whenCaptchaIsBlank_thenShouldGiveConstraintViolationsForBasicInfo() { - RegistrationForm form = buildRegistrationFormWithBasicInfo(); - form.setCaptcha(""); - Set> violations = validator.validate(form, BasicInfo.class); - assertThat(violations.size()).isEqualTo(1); - violations.forEach(action -> { - assertThat(action.getMessage()).isEqualTo("must not be blank"); - assertThat(action.getPropertyPath().toString()).isEqualTo("captcha"); - }); - } + @Test + public void whenCaptchaIsBlank_thenShouldGiveConstraintViolationsForBasicInfo() { + RegistrationForm form = buildRegistrationFormWithBasicInfo(); + form.setCaptcha(""); + Set> violations = validator.validate(form, BasicInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath() + .toString()).isEqualTo("captcha"); + }); + } - @Test - public void whenCaptchaIsBlank_thenShouldGiveConstraintViolationsForAdvanceInfo() { - RegistrationForm form = buildRegistrationFormWithAdvanceInfo(); - form.setCaptcha(""); - Set> violations = validator.validate(form, AdvanceInfo.class); - assertThat(violations.size()).isEqualTo(1); - violations.forEach(action -> { - assertThat(action.getMessage()).isEqualTo("must not be blank"); - assertThat(action.getPropertyPath().toString()).isEqualTo("captcha"); - }); - } + @Test + public void whenCaptchaIsBlank_thenShouldGiveConstraintViolationsForAdvanceInfo() { + RegistrationForm form = buildRegistrationFormWithAdvanceInfo(); + form.setCaptcha(""); + Set> violations = validator.validate(form, AdvanceInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath() + .toString()).isEqualTo("captcha"); + }); + } - @Test - public void whenBasicInfoIsNotComplete_thenShouldGiveConstraintViolationsForBasicInfoOnly() { - RegistrationForm form = buildRegistrationFormWithBasicInfo(); - form.setFirstName(""); - Set> violations = validator.validate(form, CompleteInfo.class); - assertThat(violations.size()).isEqualTo(1); - violations.forEach(action -> { - assertThat(action.getMessage()).isEqualTo("must not be blank"); - assertThat(action.getPropertyPath().toString()).isEqualTo("firstName"); - }); - } + @Test + public void whenBasicInfoIsNotComplete_thenShouldGiveConstraintViolationsForBasicInfoOnly() { + RegistrationForm form = buildRegistrationFormWithBasicInfo(); + form.setFirstName(""); + Set> violations = validator.validate(form, CompleteInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath() + .toString()).isEqualTo("firstName"); + }); + } - @Test - public void whenBasicInfoIsCompleteAndAdvanceInfoIsNotComplete_thenShouldGiveConstraintViolationsForAdvanceInfo() { - RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); - form.setZipCode(""); - Set> violations = validator.validate(form, CompleteInfo.class); - assertThat(violations.size()).isEqualTo(1); - violations.forEach(action -> { - assertThat(action.getMessage()).isEqualTo("must not be blank"); - assertThat(action.getPropertyPath().toString()).isEqualTo("zipCode"); - }); - } + @Test + public void whenBasicInfoIsCompleteAndAdvanceInfoIsNotComplete_thenShouldGiveConstraintViolationsForAdvanceInfo() { + RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); + form.setZipCode(""); + Set> violations = validator.validate(form, CompleteInfo.class); + assertThat(violations.size()).isEqualTo(1); + violations.forEach(action -> { + assertThat(action.getMessage()).isEqualTo("must not be blank"); + assertThat(action.getPropertyPath() + .toString()).isEqualTo("zipCode"); + }); + } - @Test - public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolationsWithCompleteInfoValidationGroup() { - RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); - Set> violations = validator.validate(form, CompleteInfo.class); - assertThat(violations.size()).isEqualTo(0); - } + @Test + public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolationsWithCompleteInfoValidationGroup() { + RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); + Set> violations = validator.validate(form, CompleteInfo.class); + assertThat(violations.size()).isEqualTo(0); + } - @Test - public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolations() { - RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); - Set> violations = validator.validate(form); - assertThat(violations.size()).isEqualTo(0); - } + @Test + public void whenBasicAndAdvanceInfoIsComplete_thenShouldNotGiveConstraintViolations() { + RegistrationForm form = buildRegistrationFormWithBasicAndAdvanceInfo(); + Set> violations = validator.validate(form); + assertThat(violations.size()).isEqualTo(0); + } - private RegistrationForm buildRegistrationFormWithBasicInfo() { - RegistrationForm form = new RegistrationForm(); - form.setFirstName("devender"); - form.setLastName("kumar"); - form.setEmail("anyemail@yopmail.com"); - form.setPhone("12345"); - form.setCaptcha("Y2HAhU5T"); - return form; - } + private RegistrationForm buildRegistrationFormWithBasicInfo() { + RegistrationForm form = new RegistrationForm(); + form.setFirstName("devender"); + form.setLastName("kumar"); + form.setEmail("anyemail@yopmail.com"); + form.setPhone("12345"); + form.setCaptcha("Y2HAhU5T"); + return form; + } - private RegistrationForm buildRegistrationFormWithAdvanceInfo() { - RegistrationForm form = new RegistrationForm(); - return populateAdvanceInfo(form); - } + private RegistrationForm buildRegistrationFormWithAdvanceInfo() { + RegistrationForm form = new RegistrationForm(); + return populateAdvanceInfo(form); + } - private RegistrationForm populateAdvanceInfo(RegistrationForm form) { - form.setCity("Berlin"); - form.setContry("DE"); - form.setStreet("alexa str."); - form.setZipCode("19923"); - form.setHouseNumber("2a"); - form.setCaptcha("Y2HAhU5T"); - return form; - } + private RegistrationForm populateAdvanceInfo(RegistrationForm form) { + form.setCity("Berlin"); + form.setCountry("DE"); + form.setStreet("alexa str."); + form.setZipCode("19923"); + form.setHouseNumber("2a"); + form.setCaptcha("Y2HAhU5T"); + return form; + } - private RegistrationForm buildRegistrationFormWithBasicAndAdvanceInfo() { - RegistrationForm form = buildRegistrationFormWithBasicInfo(); - return populateAdvanceInfo(form); - } + private RegistrationForm buildRegistrationFormWithBasicAndAdvanceInfo() { + RegistrationForm form = buildRegistrationFormWithBasicInfo(); + return populateAdvanceInfo(form); + } } diff --git a/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java index 6639d60ac6..3d54955177 100644 --- a/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/beanvalidation/ValidationIntegrationTest.java @@ -94,7 +94,7 @@ public class ValidationIntegrationTest { Set> violations = validator.validate(user); assertEquals(1, violations.size()); } - + @Test public void givenBlankPreference_thenValidationFails() { User user = createUser(); @@ -107,18 +107,18 @@ public class ValidationIntegrationTest { @Test public void givenEmptyOptional_thenValidationSucceeds() { User user = createUser(); - - Set> violations = validator.validate(user); - assertEquals(0, violations.size()); - } - - @Test - public void givenPastDateOfBirth_thenValidationSuccess() { - User user = createUser(); - user.setDateOfBirth(LocalDate.of(1980, 5, 20)); Set> violations = validator.validate(user); assertEquals(0, violations.size()); - + } + + @Test + public void givenPastDateOfBirth_thenValidationSuccess() { + User user = createUser(); + user.setDateOfBirth(LocalDate.of(1980, 5, 20)); + + Set> violations = validator.validate(user); + assertEquals(0, violations.size()); + } } diff --git a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java index 2363bf8f5d..8febdca0ee 100644 --- a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ContainerValidationIntegrationTest.java @@ -1,5 +1,10 @@ package org.baeldung.javaxval.methodvalidation; +import java.time.LocalDate; +import java.util.List; + +import javax.validation.ConstraintViolationException; + import org.baeldung.javaxval.methodvalidation.model.Customer; import org.baeldung.javaxval.methodvalidation.model.Reservation; import org.baeldung.javaxval.methodvalidation.model.ReservationManagement; @@ -12,10 +17,6 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; -import javax.validation.ConstraintViolationException; -import java.time.LocalDate; -import java.util.List; - @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = { MethodValidationConfig.class }, loader = AnnotationConfigContextLoader.class) public class ContainerValidationIntegrationTest { diff --git a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java index 6b53d3a107..9baeba7189 100644 --- a/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/methodvalidation/ValidationIntegrationTest.java @@ -1,21 +1,23 @@ package org.baeldung.javaxval.methodvalidation; +import static org.junit.Assert.assertEquals; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import java.time.LocalDate; +import java.util.Collections; +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.ValidatorFactory; +import javax.validation.executable.ExecutableValidator; + import org.baeldung.javaxval.methodvalidation.model.Customer; import org.baeldung.javaxval.methodvalidation.model.Reservation; import org.baeldung.javaxval.methodvalidation.model.ReservationManagement; import org.junit.Before; import org.junit.Test; -import static org.junit.Assert.*; - -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.ValidatorFactory; -import javax.validation.executable.ExecutableValidator; -import java.lang.reflect.Constructor; -import java.lang.reflect.Method; -import java.time.LocalDate; -import java.util.Collections; -import java.util.Set; public class ValidationIntegrationTest { From 5aba544fb8ea057478d70c3fc7e15d4866e6223e Mon Sep 17 00:00:00 2001 From: Martin van Wingerden Date: Wed, 2 Oct 2019 13:58:31 +0200 Subject: [PATCH 357/396] Re-enabled a disabled test and made the tests independent of machine locale --- javaxval/src/main/java/org/baeldung/Customer.java | 1 + .../java/org/baeldung/ContainerValidationIntegrationTest.java | 2 +- .../javabeanconstraints/bigdecimal/InvoiceUnitTest.java | 3 +++ .../validationgroup/RegistrationFormUnitTest.java | 3 +++ 4 files changed, 8 insertions(+), 1 deletion(-) diff --git a/javaxval/src/main/java/org/baeldung/Customer.java b/javaxval/src/main/java/org/baeldung/Customer.java index 02a95cc546..f7f4a27b4a 100644 --- a/javaxval/src/main/java/org/baeldung/Customer.java +++ b/javaxval/src/main/java/org/baeldung/Customer.java @@ -20,6 +20,7 @@ public class Customer { @PositiveOrZero private OptionalInt numberOfOrders; + @NotBlank private Profile profile; public String getName() { diff --git a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java index aa2cf577de..afa7c0c16c 100644 --- a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java @@ -76,7 +76,7 @@ public class ContainerValidationIntegrationTest { assertEquals(0, violations.size()); } - // @Test + @Test public void whenProfileCompanyNameBlank_thenValidationFails() { Customer customer = new Customer(); customer.setName("John"); diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java index a07328e2fb..50206259ae 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java @@ -3,6 +3,7 @@ package org.baeldung.javabeanconstraints.bigdecimal; import static org.assertj.core.api.Assertions.assertThat; import java.math.BigDecimal; +import java.util.Locale; import java.util.Set; import javax.validation.ConstraintViolation; @@ -18,6 +19,8 @@ public class InvoiceUnitTest { @BeforeClass public static void setupValidatorInstance() { + Locale.setDefault(Locale.US); + validator = Validation.buildDefaultValidatorFactory() .getValidator(); } diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java index efe61bf926..e0b1aa7bf8 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java @@ -2,6 +2,7 @@ package org.baeldung.javabeanconstraints.validationgroup; import static org.assertj.core.api.Assertions.assertThat; +import java.util.Locale; import java.util.Set; import javax.validation.ConstraintViolation; @@ -16,6 +17,8 @@ public class RegistrationFormUnitTest { @BeforeClass public static void setupValidatorInstance() { + Locale.setDefault(Locale.US); + validator = Validation.buildDefaultValidatorFactory() .getValidator(); } From 3d296c30a548cbb85067c89224647b9297180c8a Mon Sep 17 00:00:00 2001 From: Martin van Wingerden Date: Wed, 2 Oct 2019 19:55:24 +0200 Subject: [PATCH 358/396] Moved classes/package to right package --- .../validationgroup/AdvanceInfo.java | 5 - .../validationgroup/BasicInfo.java | 5 - .../bigdecimal/Invoice.java | 2 +- .../container/validation}/Customer.java | 2 +- .../container/validation}/CustomerMap.java | 2 +- .../container/validation}/Profile.java | 2 +- .../ProfileValueExtractor.java | 4 +- .../application}/Application.java | 36 ++--- .../entities/UserNotBlank.java | 44 +++--- .../entities/UserNotEmpty.java | 44 +++--- .../entities/UserNotNull.java | 44 +++--- .../javaxval/validationgroup/AdvanceInfo.java | 5 + .../javaxval/validationgroup/BasicInfo.java | 5 + .../validationgroup/CompleteInfo.java | 2 +- .../validationgroup/RegistrationForm.java | 2 +- ....validation.valueextraction.ValueExtractor | 2 +- .../bigdecimal/InvoiceUnitTest.java | 2 +- .../ContainerValidationIntegrationTest.java | 7 +- .../test/UserNotBlankUnitTest.java | 134 +++++++++--------- .../test/UserNotEmptyUnitTest.java | 116 +++++++-------- .../test/UserNotNullUnitTest.java | 116 +++++++-------- .../RegistrationFormUnitTest.java | 2 +- 22 files changed, 293 insertions(+), 290 deletions(-) delete mode 100644 javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java delete mode 100644 javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java rename javaxval/src/main/java/org/baeldung/{javabeanconstraints => javaxval}/bigdecimal/Invoice.java (89%) rename javaxval/src/main/java/org/baeldung/{ => javaxval/container/validation}/Customer.java (96%) rename javaxval/src/main/java/org/baeldung/{ => javaxval/container/validation}/CustomerMap.java (89%) rename javaxval/src/main/java/org/baeldung/{ => javaxval/container/validation}/Profile.java (81%) rename javaxval/src/main/java/org/baeldung/{ => javaxval/container/validation}/valueextractors/ProfileValueExtractor.java (79%) rename javaxval/src/main/java/org/baeldung/{javabeanconstraints/appplication => javaxval/javabeanconstraints/application}/Application.java (76%) rename javaxval/src/main/java/org/baeldung/{ => javaxval}/javabeanconstraints/entities/UserNotBlank.java (84%) rename javaxval/src/main/java/org/baeldung/{ => javaxval}/javabeanconstraints/entities/UserNotEmpty.java (84%) rename javaxval/src/main/java/org/baeldung/{ => javaxval}/javabeanconstraints/entities/UserNotNull.java (83%) create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java rename javaxval/src/main/java/org/baeldung/{javabeanconstraints => javaxval}/validationgroup/CompleteInfo.java (69%) rename javaxval/src/main/java/org/baeldung/{javabeanconstraints => javaxval}/validationgroup/RegistrationForm.java (97%) rename javaxval/src/test/java/org/baeldung/{javabeanconstraints => javaxval}/bigdecimal/InvoiceUnitTest.java (98%) rename javaxval/src/test/java/org/baeldung/{ => javaxval/container/validation}/ContainerValidationIntegrationTest.java (90%) rename javaxval/src/test/java/org/baeldung/{ => javaxval}/javabeanconstraints/test/UserNotBlankUnitTest.java (90%) rename javaxval/src/test/java/org/baeldung/{ => javaxval}/javabeanconstraints/test/UserNotEmptyUnitTest.java (89%) rename javaxval/src/test/java/org/baeldung/{ => javaxval}/javabeanconstraints/test/UserNotNullUnitTest.java (89%) rename javaxval/src/test/java/org/baeldung/{javabeanconstraints => javaxval}/validationgroup/RegistrationFormUnitTest.java (99%) diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java deleted file mode 100644 index 4d5df052c2..0000000000 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/AdvanceInfo.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.javabeanconstraints.validationgroup; - -public interface AdvanceInfo { - -} diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java b/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java deleted file mode 100644 index 4564a7a702..0000000000 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/BasicInfo.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.baeldung.javabeanconstraints.validationgroup; - -public interface BasicInfo { - -} diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java b/javaxval/src/main/java/org/baeldung/javaxval/bigdecimal/Invoice.java similarity index 89% rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java rename to javaxval/src/main/java/org/baeldung/javaxval/bigdecimal/Invoice.java index 886123dad7..087701f166 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/bigdecimal/Invoice.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/bigdecimal/Invoice.java @@ -1,4 +1,4 @@ -package org.baeldung.javabeanconstraints.bigdecimal; +package org.baeldung.javaxval.bigdecimal; import java.math.BigDecimal; diff --git a/javaxval/src/main/java/org/baeldung/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Customer.java similarity index 96% rename from javaxval/src/main/java/org/baeldung/Customer.java rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/Customer.java index f7f4a27b4a..6ca5ba3ee1 100644 --- a/javaxval/src/main/java/org/baeldung/Customer.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Customer.java @@ -1,4 +1,4 @@ -package org.baeldung; +package org.baeldung.javaxval.container.validation; import java.util.List; import java.util.Optional; diff --git a/javaxval/src/main/java/org/baeldung/CustomerMap.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/CustomerMap.java similarity index 89% rename from javaxval/src/main/java/org/baeldung/CustomerMap.java rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/CustomerMap.java index d8830a7f42..82cf0f2b0c 100644 --- a/javaxval/src/main/java/org/baeldung/CustomerMap.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/CustomerMap.java @@ -1,4 +1,4 @@ -package org.baeldung; +package org.baeldung.javaxval.container.validation; import java.util.Map; diff --git a/javaxval/src/main/java/org/baeldung/Profile.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Profile.java similarity index 81% rename from javaxval/src/main/java/org/baeldung/Profile.java rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/Profile.java index ec73a5c62f..41260540fc 100644 --- a/javaxval/src/main/java/org/baeldung/Profile.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/Profile.java @@ -1,4 +1,4 @@ -package org.baeldung; +package org.baeldung.javaxval.container.validation; public class Profile { private String companyName; diff --git a/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java similarity index 79% rename from javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java rename to javaxval/src/main/java/org/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java index f192034261..ebc618e80e 100644 --- a/javaxval/src/main/java/org/baeldung/valueextractors/ProfileValueExtractor.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/container/validation/valueextractors/ProfileValueExtractor.java @@ -1,10 +1,10 @@ -package org.baeldung.valueextractors; +package org.baeldung.javaxval.container.validation.valueextractors; import javax.validation.valueextraction.ExtractedValue; import javax.validation.valueextraction.UnwrapByDefault; import javax.validation.valueextraction.ValueExtractor; -import org.baeldung.Profile; +import org.baeldung.javaxval.container.validation.Profile; @UnwrapByDefault public class ProfileValueExtractor implements ValueExtractor<@ExtractedValue(type = String.class) Profile> { diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/application/Application.java similarity index 76% rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/application/Application.java index e5927a093e..22095084c5 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/appplication/Application.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/application/Application.java @@ -1,18 +1,18 @@ -package org.baeldung.javabeanconstraints.appplication; - -import javax.validation.Validation; -import javax.validation.Validator; - -import org.baeldung.javabeanconstraints.entities.UserNotBlank; - -public class Application { - - public static void main(String[] args) { - Validator validator = Validation.buildDefaultValidatorFactory() - .getValidator(); - UserNotBlank user = new UserNotBlank(" "); - validator.validate(user) - .stream() - .forEach(violation -> System.out.println(violation.getMessage())); - } -} +package org.baeldung.javaxval.javabeanconstraints.application; + +import javax.validation.Validation; +import javax.validation.Validator; + +import org.baeldung.javaxval.javabeanconstraints.entities.UserNotBlank; + +public class Application { + + public static void main(String[] args) { + Validator validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + UserNotBlank user = new UserNotBlank(" "); + validator.validate(user) + .stream() + .forEach(violation -> System.out.println(violation.getMessage())); + } +} diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java similarity index 84% rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java index b49e587ce5..d86b6a65d2 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotBlank.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotBlank.java @@ -1,22 +1,22 @@ -package org.baeldung.javabeanconstraints.entities; - -import javax.validation.constraints.NotBlank; - -public class UserNotBlank { - - @NotBlank(message = "Name is mandatory") - private final String name; - - public UserNotBlank(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return "User{" + "name=" + name + "}"; - } -} +package org.baeldung.javaxval.javabeanconstraints.entities; + +import javax.validation.constraints.NotBlank; + +public class UserNotBlank { + + @NotBlank(message = "Name is mandatory") + private final String name; + + public UserNotBlank(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return "User{" + "name=" + name + "}"; + } +} diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java similarity index 84% rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java index 0da768b103..2082265145 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotEmpty.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotEmpty.java @@ -1,22 +1,22 @@ -package org.baeldung.javabeanconstraints.entities; - -import javax.validation.constraints.NotEmpty; - -public class UserNotEmpty { - - @NotEmpty(message = "Name is mandatory") - private final String name; - - public UserNotEmpty(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return "User{" + "name=" + name + "}"; - } -} +package org.baeldung.javaxval.javabeanconstraints.entities; + +import javax.validation.constraints.NotEmpty; + +public class UserNotEmpty { + + @NotEmpty(message = "Name is mandatory") + private final String name; + + public UserNotEmpty(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return "User{" + "name=" + name + "}"; + } +} diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java similarity index 83% rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java rename to javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java index 63a1017b75..e2f9e7ec57 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/entities/UserNotNull.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/javabeanconstraints/entities/UserNotNull.java @@ -1,22 +1,22 @@ -package org.baeldung.javabeanconstraints.entities; - -import javax.validation.constraints.NotNull; - -public class UserNotNull { - - @NotNull(message = "Name is mandatory") - private final String name; - - public UserNotNull(String name) { - this.name = name; - } - - public String getName() { - return name; - } - - @Override - public String toString() { - return "User{" + "name=" + name + "}"; - } -} +package org.baeldung.javaxval.javabeanconstraints.entities; + +import javax.validation.constraints.NotNull; + +public class UserNotNull { + + @NotNull(message = "Name is mandatory") + private final String name; + + public UserNotNull(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + @Override + public String toString() { + return "User{" + "name=" + name + "}"; + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java new file mode 100644 index 0000000000..9a398e9e7e --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/AdvanceInfo.java @@ -0,0 +1,5 @@ +package org.baeldung.javaxval.validationgroup; + +public interface AdvanceInfo { + +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java new file mode 100644 index 0000000000..6959f52bfa --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/BasicInfo.java @@ -0,0 +1,5 @@ +package org.baeldung.javaxval.validationgroup; + +public interface BasicInfo { + +} diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/CompleteInfo.java similarity index 69% rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java rename to javaxval/src/main/java/org/baeldung/javaxval/validationgroup/CompleteInfo.java index 4d9de8150a..e34f318b5f 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/CompleteInfo.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/CompleteInfo.java @@ -1,4 +1,4 @@ -package org.baeldung.javabeanconstraints.validationgroup; +package org.baeldung.javaxval.validationgroup; import javax.validation.GroupSequence; diff --git a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/RegistrationForm.java similarity index 97% rename from javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java rename to javaxval/src/main/java/org/baeldung/javaxval/validationgroup/RegistrationForm.java index 197b9adad2..190a0c1280 100644 --- a/javaxval/src/main/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationForm.java +++ b/javaxval/src/main/java/org/baeldung/javaxval/validationgroup/RegistrationForm.java @@ -1,4 +1,4 @@ -package org.baeldung.javabeanconstraints.validationgroup; +package org.baeldung.javaxval.validationgroup; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; diff --git a/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor index e77a30cfe4..16bacf1097 100644 --- a/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor +++ b/javaxval/src/main/resources/META-INF/services/javax.validation.valueextraction.ValueExtractor @@ -1 +1 @@ -org.baeldung.valueextractors.ProfileValueExtractor \ No newline at end of file +org.baeldung.javaxval.container.validation.valueextractors.ProfileValueExtractor \ No newline at end of file diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java similarity index 98% rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java rename to javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java index 50206259ae..0517642828 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/bigdecimal/InvoiceUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.javabeanconstraints.bigdecimal; +package org.baeldung.javaxval.bigdecimal; import static org.assertj.core.api.Assertions.assertThat; diff --git a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java similarity index 90% rename from javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java rename to javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java index afa7c0c16c..fc92c06f9a 100644 --- a/javaxval/src/test/java/org/baeldung/ContainerValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung; +package org.baeldung.javaxval.container.validation; import static org.junit.Assert.assertEquals; @@ -11,7 +11,10 @@ import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; -import org.baeldung.valueextractors.ProfileValueExtractor; +import org.baeldung.javaxval.container.validation.Customer; +import org.baeldung.javaxval.container.validation.CustomerMap; +import org.baeldung.javaxval.container.validation.Profile; +import org.baeldung.javaxval.container.validation.valueextractors.ProfileValueExtractor; import org.junit.Before; import org.junit.Test; diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotBlankUnitTest.java similarity index 90% rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java rename to javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotBlankUnitTest.java index 48ecb2e649..e3a51d4e27 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotBlankUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotBlankUnitTest.java @@ -1,67 +1,67 @@ -package org.baeldung.javabeanconstraints.test; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Set; - -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; - -import org.baeldung.javabeanconstraints.entities.UserNotBlank; -import org.junit.BeforeClass; -import org.junit.Test; - -public class UserNotBlankUnitTest { - - private static Validator validator; - - @BeforeClass - public static void setupValidatorInstance() { - validator = Validation.buildDefaultValidatorFactory() - .getValidator(); - } - - @Test - public void whenNotBlankName_thenNoConstraintViolations() { - UserNotBlank user = new UserNotBlank("John"); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(0); - } - - @Test - public void whenBlankName_thenOneConstraintViolation() { - UserNotBlank user = new UserNotBlank(" "); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(1); - } - - @Test - public void whenEmptyName_thenOneConstraintViolation() { - UserNotBlank user = new UserNotBlank(""); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(1); - } - - @Test - public void whenNullName_thenOneConstraintViolation() { - UserNotBlank user = new UserNotBlank(null); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(1); - } - - @Test - public void whenToString_thenCorrect() { - UserNotBlank user = new UserNotBlank("John"); - - assertThat(user.toString()).isEqualTo("User{name=John}"); - } -} +package org.baeldung.javaxval.javabeanconstraints.test; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +import org.baeldung.javaxval.javabeanconstraints.entities.UserNotBlank; +import org.junit.BeforeClass; +import org.junit.Test; + +public class UserNotBlankUnitTest { + + private static Validator validator; + + @BeforeClass + public static void setupValidatorInstance() { + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + } + + @Test + public void whenNotBlankName_thenNoConstraintViolations() { + UserNotBlank user = new UserNotBlank("John"); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(0); + } + + @Test + public void whenBlankName_thenOneConstraintViolation() { + UserNotBlank user = new UserNotBlank(" "); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(1); + } + + @Test + public void whenEmptyName_thenOneConstraintViolation() { + UserNotBlank user = new UserNotBlank(""); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(1); + } + + @Test + public void whenNullName_thenOneConstraintViolation() { + UserNotBlank user = new UserNotBlank(null); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(1); + } + + @Test + public void whenToString_thenCorrect() { + UserNotBlank user = new UserNotBlank("John"); + + assertThat(user.toString()).isEqualTo("User{name=John}"); + } +} diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotEmptyUnitTest.java similarity index 89% rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java rename to javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotEmptyUnitTest.java index 6398d2bb91..22fbab6997 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotEmptyUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotEmptyUnitTest.java @@ -1,58 +1,58 @@ -package org.baeldung.javabeanconstraints.test; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Set; - -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; - -import org.baeldung.javabeanconstraints.entities.UserNotEmpty; -import org.junit.BeforeClass; -import org.junit.Test; - -public class UserNotEmptyUnitTest { - - private static Validator validator; - - @BeforeClass - public static void setupValidatorInstance() { - validator = Validation.buildDefaultValidatorFactory() - .getValidator(); - } - - @Test - public void whenNotEmptyName_thenNoConstraintViolations() { - UserNotEmpty user = new UserNotEmpty("John"); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(0); - } - - @Test - public void whenEmptyName_thenOneConstraintViolation() { - UserNotEmpty user = new UserNotEmpty(""); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(1); - } - - @Test - public void whenNullName_thenOneConstraintViolation() { - UserNotEmpty user = new UserNotEmpty(null); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(1); - } - - @Test - public void whenToString_thenCorrect() { - UserNotEmpty user = new UserNotEmpty("John"); - - assertThat(user.toString()).isEqualTo("User{name=John}"); - } -} +package org.baeldung.javaxval.javabeanconstraints.test; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +import org.baeldung.javaxval.javabeanconstraints.entities.UserNotEmpty; +import org.junit.BeforeClass; +import org.junit.Test; + +public class UserNotEmptyUnitTest { + + private static Validator validator; + + @BeforeClass + public static void setupValidatorInstance() { + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + } + + @Test + public void whenNotEmptyName_thenNoConstraintViolations() { + UserNotEmpty user = new UserNotEmpty("John"); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(0); + } + + @Test + public void whenEmptyName_thenOneConstraintViolation() { + UserNotEmpty user = new UserNotEmpty(""); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(1); + } + + @Test + public void whenNullName_thenOneConstraintViolation() { + UserNotEmpty user = new UserNotEmpty(null); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(1); + } + + @Test + public void whenToString_thenCorrect() { + UserNotEmpty user = new UserNotEmpty("John"); + + assertThat(user.toString()).isEqualTo("User{name=John}"); + } +} diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotNullUnitTest.java similarity index 89% rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java rename to javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotNullUnitTest.java index f9387f9199..a684668ae3 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/test/UserNotNullUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/javabeanconstraints/test/UserNotNullUnitTest.java @@ -1,58 +1,58 @@ -package org.baeldung.javabeanconstraints.test; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.util.Set; - -import javax.validation.ConstraintViolation; -import javax.validation.Validation; -import javax.validation.Validator; - -import org.baeldung.javabeanconstraints.entities.UserNotNull; -import org.junit.BeforeClass; -import org.junit.Test; - -public class UserNotNullUnitTest { - - private static Validator validator; - - @BeforeClass - public static void setupValidatorInstance() { - validator = Validation.buildDefaultValidatorFactory() - .getValidator(); - } - - @Test - public void whenNotNullName_thenNoConstraintViolations() { - UserNotNull user = new UserNotNull("John"); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(0); - } - - @Test - public void whenNullName_thenOneConstraintViolation() { - UserNotNull user = new UserNotNull(null); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(1); - } - - @Test - public void whenEmptyName_thenNoConstraintViolations() { - UserNotNull user = new UserNotNull(""); - - Set> violations = validator.validate(user); - - assertThat(violations.size()).isEqualTo(0); - } - - @Test - public void whenToString_thenCorrect() { - UserNotNull user = new UserNotNull("John"); - - assertThat(user.toString()).isEqualTo("User{name=John}"); - } -} +package org.baeldung.javaxval.javabeanconstraints.test; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +import org.baeldung.javaxval.javabeanconstraints.entities.UserNotNull; +import org.junit.BeforeClass; +import org.junit.Test; + +public class UserNotNullUnitTest { + + private static Validator validator; + + @BeforeClass + public static void setupValidatorInstance() { + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + } + + @Test + public void whenNotNullName_thenNoConstraintViolations() { + UserNotNull user = new UserNotNull("John"); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(0); + } + + @Test + public void whenNullName_thenOneConstraintViolation() { + UserNotNull user = new UserNotNull(null); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(1); + } + + @Test + public void whenEmptyName_thenNoConstraintViolations() { + UserNotNull user = new UserNotNull(""); + + Set> violations = validator.validate(user); + + assertThat(violations.size()).isEqualTo(0); + } + + @Test + public void whenToString_thenCorrect() { + UserNotNull user = new UserNotNull("John"); + + assertThat(user.toString()).isEqualTo("User{name=John}"); + } +} diff --git a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java similarity index 99% rename from javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java rename to javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java index e0b1aa7bf8..a341c39531 100644 --- a/javaxval/src/test/java/org/baeldung/javabeanconstraints/validationgroup/RegistrationFormUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.javabeanconstraints.validationgroup; +package org.baeldung.javaxval.validationgroup; import static org.assertj.core.api.Assertions.assertThat; From 00d903dc6bec76619d14d201444ad1c75bec6b2e Mon Sep 17 00:00:00 2001 From: Martin van Wingerden Date: Fri, 4 Oct 2019 10:45:58 +0200 Subject: [PATCH 359/396] Add a parent class for locale aware tests --- .../javaxval/LocaleAwareUnitTest.java | 23 +++++++++++++++++++ .../javaxval/bigdecimal/InvoiceUnitTest.java | 6 ++--- .../ContainerValidationIntegrationTest.java | 3 --- .../RegistrationFormUnitTest.java | 6 ++--- 4 files changed, 27 insertions(+), 11 deletions(-) create mode 100644 javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java diff --git a/javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java new file mode 100644 index 0000000000..5623b50a72 --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/javaxval/LocaleAwareUnitTest.java @@ -0,0 +1,23 @@ +package org.baeldung.javaxval; + +import java.util.Locale; + +import org.junit.AfterClass; +import org.junit.BeforeClass; + +public abstract class LocaleAwareUnitTest { + private static Locale previousDefault; + + @BeforeClass + public static void setupLocale() { + previousDefault = Locale.getDefault(); + + Locale.setDefault(Locale.US); + } + + @AfterClass + public static void resetLocale() { + Locale.setDefault(previousDefault); + } + +} diff --git a/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java index 0517642828..6a53d67f30 100644 --- a/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/bigdecimal/InvoiceUnitTest.java @@ -3,24 +3,22 @@ package org.baeldung.javaxval.bigdecimal; import static org.assertj.core.api.Assertions.assertThat; import java.math.BigDecimal; -import java.util.Locale; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; +import org.baeldung.javaxval.LocaleAwareUnitTest; import org.junit.BeforeClass; import org.junit.Test; -public class InvoiceUnitTest { +public class InvoiceUnitTest extends LocaleAwareUnitTest { private static Validator validator; @BeforeClass public static void setupValidatorInstance() { - Locale.setDefault(Locale.US); - validator = Validation.buildDefaultValidatorFactory() .getValidator(); } diff --git a/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java b/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java index fc92c06f9a..25c8111732 100644 --- a/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/container/validation/ContainerValidationIntegrationTest.java @@ -11,9 +11,6 @@ import javax.validation.Validation; import javax.validation.Validator; import javax.validation.ValidatorFactory; -import org.baeldung.javaxval.container.validation.Customer; -import org.baeldung.javaxval.container.validation.CustomerMap; -import org.baeldung.javaxval.container.validation.Profile; import org.baeldung.javaxval.container.validation.valueextractors.ProfileValueExtractor; import org.junit.Before; import org.junit.Test; diff --git a/javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java index a341c39531..df70ca0bce 100644 --- a/javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java +++ b/javaxval/src/test/java/org/baeldung/javaxval/validationgroup/RegistrationFormUnitTest.java @@ -2,23 +2,21 @@ package org.baeldung.javaxval.validationgroup; import static org.assertj.core.api.Assertions.assertThat; -import java.util.Locale; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; +import org.baeldung.javaxval.LocaleAwareUnitTest; import org.junit.BeforeClass; import org.junit.Test; -public class RegistrationFormUnitTest { +public class RegistrationFormUnitTest extends LocaleAwareUnitTest { private static Validator validator; @BeforeClass public static void setupValidatorInstance() { - Locale.setDefault(Locale.US); - validator = Validation.buildDefaultValidatorFactory() .getValidator(); } From bf3435372cdc57f4fc98f0bfa589a644bdc8ac49 Mon Sep 17 00:00:00 2001 From: Martin van Wingerden Date: Fri, 4 Oct 2019 10:53:11 +0200 Subject: [PATCH 360/396] [BAEL-3306] Validations for Enum types Added code belonging to the blog validations for Enum types. --- javaxval/README.md | 1 + .../enums/CustomerTypeSubSetValidator.java | 24 ++++++ .../enums/EnumNamePatternValidator.java | 33 ++++++++ .../javaxval/enums/EnumSubSetValidator.java | 25 ++++++ .../InheritedCustomerTypeSubSetValidator.java | 11 +++ .../javaxval/enums/ValueOfEnumValidator.java | 31 ++++++++ .../enums/constraints/CustomerTypeSubset.java | 45 +++++++++++ .../enums/constraints/EnumNamePattern.java | 45 +++++++++++ .../enums/constraints/ValueOfEnum.java | 44 +++++++++++ .../javaxval/enums/demo/Customer.java | 77 +++++++++++++++++++ .../javaxval/enums/demo/CustomerType.java | 5 ++ .../CustomerTypeSubSetValidatorUnitTest.java | 45 +++++++++++ .../EnumNamePatternValidatorUnitTest.java | 54 +++++++++++++ .../enums/ValueOfEnumValidatorUnitTest.java | 52 +++++++++++++ .../javaxval/enums/demo/CustomerUnitTest.java | 66 ++++++++++++++++ 15 files changed, 558 insertions(+) create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java create mode 100644 javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java create mode 100644 javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java create mode 100644 javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java create mode 100644 javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java create mode 100644 javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java diff --git a/javaxval/README.md b/javaxval/README.md index 2b4164671d..64903d7463 100644 --- a/javaxval/README.md +++ b/javaxval/README.md @@ -9,3 +9,4 @@ This module contains articles about Bean Validation. - [Difference Between @NotNull, @NotEmpty, and @NotBlank Constraints in Bean Validation](https://www.baeldung.com/java-bean-validation-not-null-empty-blank) - [Javax BigDecimal Validation](https://www.baeldung.com/javax-bigdecimal-validation) - [Grouping Javax Validation Constraints](https://www.baeldung.com/javax-validation-groups) +- [Javax Validations for Enums](https://www.baeldung.com/javax-validations-for-enums/) diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java new file mode 100644 index 0000000000..c730cb937f --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidator.java @@ -0,0 +1,24 @@ +package org.baeldung.javaxval.enums; + +import java.util.Arrays; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +import org.baeldung.javaxval.enums.constraints.CustomerTypeSubset; +import org.baeldung.javaxval.enums.demo.CustomerType; + +public class CustomerTypeSubSetValidator implements ConstraintValidator { + private CustomerType[] subset; + + @Override + public void initialize(CustomerTypeSubset constraint) { + this.subset = constraint.anyOf(); + } + + @Override + public boolean isValid(CustomerType value, ConstraintValidatorContext context) { + return value == null || Arrays.asList(subset) + .contains(value); + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java new file mode 100644 index 0000000000..a279813461 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumNamePatternValidator.java @@ -0,0 +1,33 @@ +package org.baeldung.javaxval.enums; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.regex.PatternSyntaxException; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +import org.baeldung.javaxval.enums.constraints.EnumNamePattern; + +public class EnumNamePatternValidator implements ConstraintValidator> { + private Pattern pattern; + + @Override + public void initialize(EnumNamePattern constraintAnnotation) { + try { + pattern = Pattern.compile(constraintAnnotation.regexp()); + } catch (PatternSyntaxException e) { + throw new IllegalArgumentException("Given regex is invalid", e); + } + } + + @Override + public boolean isValid(Enum value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + + Matcher m = pattern.matcher(value.name()); + return m.matches(); + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java new file mode 100644 index 0000000000..339b4fb03b --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/EnumSubSetValidator.java @@ -0,0 +1,25 @@ +package org.baeldung.javaxval.enums; + +import java.lang.annotation.Annotation; +import java.util.Arrays; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +public abstract class EnumSubSetValidator implements ConstraintValidator { + private U[] subset; + + protected void initialize(U[] subset) { + this.subset = subset; + } + + @Override + public boolean isValid(U value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + + return Arrays.asList(subset) + .contains(value); + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java new file mode 100644 index 0000000000..1cd31c4187 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/InheritedCustomerTypeSubSetValidator.java @@ -0,0 +1,11 @@ +package org.baeldung.javaxval.enums; + +import org.baeldung.javaxval.enums.constraints.CustomerTypeSubset; +import org.baeldung.javaxval.enums.demo.CustomerType; + +public class InheritedCustomerTypeSubSetValidator extends EnumSubSetValidator { + @Override + public void initialize(CustomerTypeSubset constraint) { + super.initialize(constraint.anyOf()); + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java new file mode 100644 index 0000000000..7184dae49b --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/ValueOfEnumValidator.java @@ -0,0 +1,31 @@ +package org.baeldung.javaxval.enums; + +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import javax.validation.ConstraintValidator; +import javax.validation.ConstraintValidatorContext; + +import org.baeldung.javaxval.enums.constraints.ValueOfEnum; + +public class ValueOfEnumValidator implements ConstraintValidator { + private List acceptedValues; + + @Override + public void initialize(ValueOfEnum annotation) { + acceptedValues = Stream.of(annotation.enumClass() + .getEnumConstants()) + .map(Enum::name) + .collect(Collectors.toList()); + } + + @Override + public boolean isValid(CharSequence value, ConstraintValidatorContext context) { + if (value == null) { + return true; + } + + return acceptedValues.contains(value.toString()); + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java new file mode 100644 index 0000000000..44009e6723 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/CustomerTypeSubset.java @@ -0,0 +1,45 @@ +package org.baeldung.javaxval.enums.constraints; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +import org.baeldung.javaxval.enums.CustomerTypeSubSetValidator; +import org.baeldung.javaxval.enums.demo.CustomerType; + +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = CustomerTypeSubSetValidator.class) +public @interface CustomerTypeSubset { + /** + * @return subset of CustomerType enum + */ + CustomerType[] anyOf(); + + /** + * @return the error message template + */ + String message() default "must be any of {anyOf}"; + + /** + * @return the groups the constraint belongs to + */ + Class[] groups() default {}; + + /** + * @return the payload associated to the constraint + */ + Class[] payload() default {}; +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java new file mode 100644 index 0000000000..403cdcd0b4 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/EnumNamePattern.java @@ -0,0 +1,45 @@ +package org.baeldung.javaxval.enums.constraints; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +import org.baeldung.javaxval.enums.EnumNamePatternValidator; + +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = EnumNamePatternValidator.class) +public @interface EnumNamePattern { + + /** + * @return the regular expression to match + */ + String regexp(); + + /** + * @return the error message template + */ + String message() default "must match \"{regexp}\""; + + /** + * @return the groups the constraint belongs to + */ + Class[] groups() default {}; + + /** + * @return the payload associated to the constraint + */ + Class[] payload() default {}; +} \ No newline at end of file diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java new file mode 100644 index 0000000000..0f9677d982 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/constraints/ValueOfEnum.java @@ -0,0 +1,44 @@ +package org.baeldung.javaxval.enums.constraints; + +import static java.lang.annotation.ElementType.ANNOTATION_TYPE; +import static java.lang.annotation.ElementType.CONSTRUCTOR; +import static java.lang.annotation.ElementType.FIELD; +import static java.lang.annotation.ElementType.METHOD; +import static java.lang.annotation.ElementType.PARAMETER; +import static java.lang.annotation.ElementType.TYPE_USE; +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.Target; + +import javax.validation.Constraint; +import javax.validation.Payload; + +import org.baeldung.javaxval.enums.ValueOfEnumValidator; + +@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE }) +@Retention(RUNTIME) +@Documented +@Constraint(validatedBy = ValueOfEnumValidator.class) +public @interface ValueOfEnum { + /** + * @return class containing enum values to which this String should match + */ + Class> enumClass(); + + /** + * @return the error message template + */ + String message() default "must be any of enum {enumClass}"; + + /** + * @return the groups the constraint belongs to + */ + Class[] groups() default {}; + + /** + * @return the payload associated to the constraint + */ + Class[] payload() default {}; +} \ No newline at end of file diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java new file mode 100644 index 0000000000..db3486ab5f --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/Customer.java @@ -0,0 +1,77 @@ +package org.baeldung.javaxval.enums.demo; + +import javax.validation.constraints.NotNull; + +import org.baeldung.javaxval.enums.constraints.CustomerTypeSubset; +import org.baeldung.javaxval.enums.constraints.EnumNamePattern; +import org.baeldung.javaxval.enums.constraints.ValueOfEnum; + +public class Customer { + @ValueOfEnum(enumClass = CustomerType.class) + private String customerTypeString; + + @NotNull + @CustomerTypeSubset(anyOf = { CustomerType.NEW, CustomerType.OLD }) + private CustomerType customerTypeOfSubset; + + @EnumNamePattern(regexp = "NEW|DEFAULT") + private CustomerType customerTypeMatchesPattern; + + public Customer() { + } + + public Customer(String customerTypeString, CustomerType customerTypeOfSubset, CustomerType customerTypeMatchesPattern) { + this.customerTypeString = customerTypeString; + this.customerTypeOfSubset = customerTypeOfSubset; + this.customerTypeMatchesPattern = customerTypeMatchesPattern; + } + + public String getCustomerTypeString() { + return customerTypeString; + } + + public void setCustomerTypeString(String customerTypeString) { + this.customerTypeString = customerTypeString; + } + + public CustomerType getCustomerTypeOfSubset() { + return customerTypeOfSubset; + } + + public void setCustomerTypeOfSubset(CustomerType customerTypeOfSubset) { + this.customerTypeOfSubset = customerTypeOfSubset; + } + + public CustomerType getCustomerTypeMatchesPattern() { + return customerTypeMatchesPattern; + } + + public void setCustomerTypeMatchesPattern(CustomerType customerTypeMatchesPattern) { + this.customerTypeMatchesPattern = customerTypeMatchesPattern; + } + + public static class Builder { + private String customerTypeString; + private CustomerType customerTypeOfSubset = CustomerType.NEW; + private CustomerType customerTypeMatchesPattern; + + public Builder withCustomerTypeString(String customerTypeString) { + this.customerTypeString = customerTypeString; + return this; + } + + public Builder withCustomerTypeOfSubset(CustomerType customerTypeOfSubset) { + this.customerTypeOfSubset = customerTypeOfSubset; + return this; + } + + public Builder withCustomerTypeMatchesPattern(CustomerType customerTypeMatchesPattern) { + this.customerTypeMatchesPattern = customerTypeMatchesPattern; + return this; + } + + public Customer build() { + return new Customer(customerTypeString, customerTypeOfSubset, customerTypeMatchesPattern); + } + } +} diff --git a/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java new file mode 100644 index 0000000000..937f3a3817 --- /dev/null +++ b/javaxval/src/main/java/org/baeldung/javaxval/enums/demo/CustomerType.java @@ -0,0 +1,5 @@ +package org.baeldung.javaxval.enums.demo; + +public enum CustomerType { + NEW, OLD, DEFAULT +} diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java new file mode 100644 index 0000000000..5aae504b23 --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/CustomerTypeSubSetValidatorUnitTest.java @@ -0,0 +1,45 @@ +package org.baeldung.javaxval.enums; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +import org.baeldung.javaxval.enums.demo.Customer; +import org.baeldung.javaxval.enums.demo.CustomerType; +import org.baeldung.javaxval.enums.demo.CustomerUnitTest; +import org.junit.BeforeClass; +import org.junit.Test; + +public class CustomerTypeSubSetValidatorUnitTest { + + private static Validator validator; + + @BeforeClass + public static void setupValidatorInstance() { + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + } + + @Test + public void whenEnumAnyOfSubset_thenShouldNotReportConstraintViolations() { + Customer customer = new Customer.Builder().withCustomerTypeOfSubset(CustomerType.NEW) + .build(); + Set> violations = validator.validate(customer); + assertThat(violations.isEmpty()).isTrue(); + } + + @Test + public void whenEnumNotAnyOfSubset_thenShouldGiveOccurrenceOfConstraintViolations() { + Customer customer = new Customer.Builder().withCustomerTypeOfSubset(CustomerType.DEFAULT) + .build(); + Set> violations = validator.validate(customer); + assertThat(violations.size()).isEqualTo(1); + + assertThat(violations).anyMatch(CustomerUnitTest.havingPropertyPath("customerTypeOfSubset") + .and(CustomerUnitTest.havingMessage("must be any of [NEW, OLD]"))); + } +} \ No newline at end of file diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java new file mode 100644 index 0000000000..48f7de2c34 --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/EnumNamePatternValidatorUnitTest.java @@ -0,0 +1,54 @@ +package org.baeldung.javaxval.enums; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.baeldung.javaxval.enums.demo.CustomerType.DEFAULT; +import static org.baeldung.javaxval.enums.demo.CustomerType.OLD; + +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +import org.baeldung.javaxval.enums.demo.Customer; +import org.baeldung.javaxval.enums.demo.CustomerUnitTest; +import org.junit.BeforeClass; +import org.junit.Test; + +public class EnumNamePatternValidatorUnitTest { + + private static Validator validator; + + @BeforeClass + public static void setupValidatorInstance() { + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + } + + @Test + public void whenEnumMatchesRegex_thenShouldNotReportConstraintViolations() { + Customer customer = new Customer.Builder().withCustomerTypeMatchesPattern(DEFAULT) + .build(); + Set> violations = validator.validate(customer); + assertThat(violations.isEmpty()).isTrue(); + } + + @Test + public void whenEnumNull_thenShouldNotReportConstraintViolations() { + Customer customer = new Customer.Builder().withCustomerTypeMatchesPattern(null) + .build(); + Set> violations = validator.validate(customer); + assertThat(violations.isEmpty()).isTrue(); + } + + @Test + public void whenEnumDoesNotMatchRegex_thenShouldGiveOccurrenceOfConstraintViolations() { + Customer customer = new Customer.Builder().withCustomerTypeMatchesPattern(OLD) + .build(); + Set> violations = validator.validate(customer); + assertThat(violations.size()).isEqualTo(1); + + assertThat(violations).anyMatch(CustomerUnitTest.havingPropertyPath("customerTypeMatchesPattern") + .and(CustomerUnitTest.havingMessage("must match \"NEW|DEFAULT\""))); + } +} \ No newline at end of file diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java new file mode 100644 index 0000000000..0784b58b77 --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/ValueOfEnumValidatorUnitTest.java @@ -0,0 +1,52 @@ +package org.baeldung.javaxval.enums; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +import org.baeldung.javaxval.enums.demo.Customer; +import org.baeldung.javaxval.enums.demo.CustomerUnitTest; +import org.junit.BeforeClass; +import org.junit.Test; + +public class ValueOfEnumValidatorUnitTest { + + private static Validator validator; + + @BeforeClass + public static void setupValidatorInstance() { + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + } + + @Test + public void whenStringAnyOfEnum_thenShouldNotReportConstraintViolations() { + Customer customer = new Customer.Builder().withCustomerTypeString("DEFAULT") + .build(); + Set> violations = validator.validate(customer); + assertThat(violations.isEmpty()).isTrue(); + } + + @Test + public void whenStringNull_thenShouldNotReportConstraintViolations() { + Customer customer = new Customer.Builder().withCustomerTypeString(null) + .build(); + Set> violations = validator.validate(customer); + assertThat(violations.isEmpty()).isTrue(); + } + + @Test + public void whenStringNotAnyOfEnum_thenShouldGiveOccurrenceOfConstraintViolations() { + Customer customer = new Customer.Builder().withCustomerTypeString("test") + .build(); + Set> violations = validator.validate(customer); + assertThat(violations.size()).isEqualTo(1); + + assertThat(violations).anyMatch(CustomerUnitTest.havingPropertyPath("customerTypeString") + .and(CustomerUnitTest.havingMessage("must be any of enum class org.baeldung.javaxval.enums.demo.CustomerType"))); + } +} \ No newline at end of file diff --git a/javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java b/javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java new file mode 100644 index 0000000000..6a064b640f --- /dev/null +++ b/javaxval/src/test/java/org/baeldung/javaxval/enums/demo/CustomerUnitTest.java @@ -0,0 +1,66 @@ +package org.baeldung.javaxval.enums.demo; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Set; +import java.util.function.Predicate; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.Validator; + +import org.baeldung.javaxval.LocaleAwareUnitTest; +import org.junit.BeforeClass; +import org.junit.Test; + +public class CustomerUnitTest extends LocaleAwareUnitTest { + + private static Validator validator; + + @BeforeClass + public static void setupValidatorInstance() { + validator = Validation.buildDefaultValidatorFactory() + .getValidator(); + } + + @Test + public void whenAllAcceptable_thenShouldNotGiveConstraintViolations() { + Customer customer = new Customer(); + customer.setCustomerTypeOfSubset(CustomerType.NEW); + Set> violations = validator.validate(customer); + assertThat(violations).isEmpty(); + } + + @Test + public void whenAllNull_thenOnlyNotNullShouldGiveConstraintViolations() { + Customer customer = new Customer(); + Set> violations = validator.validate(customer); + assertThat(violations.size()).isEqualTo(1); + + assertThat(violations).anyMatch(havingPropertyPath("customerTypeOfSubset").and(havingMessage("must not be null"))); + } + + @Test + public void whenAllInvalid_thenViolationsShouldBeReported() { + Customer customer = new Customer(); + customer.setCustomerTypeString("invalid"); + customer.setCustomerTypeOfSubset(CustomerType.DEFAULT); + customer.setCustomerTypeMatchesPattern(CustomerType.OLD); + + Set> violations = validator.validate(customer); + assertThat(violations.size()).isEqualTo(3); + + assertThat(violations).anyMatch(havingPropertyPath("customerTypeString").and(havingMessage("must be any of enum class org.baeldung.javaxval.enums.demo.CustomerType"))); + assertThat(violations).anyMatch(havingPropertyPath("customerTypeOfSubset").and(havingMessage("must be any of [NEW, OLD]"))); + assertThat(violations).anyMatch(havingPropertyPath("customerTypeMatchesPattern").and(havingMessage("must match \"NEW|DEFAULT\""))); + } + + public static Predicate> havingMessage(String message) { + return l -> message.equals(l.getMessage()); + } + + public static Predicate> havingPropertyPath(String propertyPath) { + return l -> propertyPath.equals(l.getPropertyPath() + .toString()); + } +} \ No newline at end of file From a0cbfa3b061a11832c710c83e13a85a5af48d550 Mon Sep 17 00:00:00 2001 From: wugangca Date: Fri, 4 Oct 2019 06:30:54 -0600 Subject: [PATCH 361/396] =?UTF-8?q?BAEL-2988=20Move=20the=20code=20from=20?= =?UTF-8?q?spring-rest-simple=20to=20spring-mvc-simple-=E2=80=A6=20(#7914)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * BAEL-2988 Move the code from spring-rest-simple to spring-mvc-simple-2, based on the review feedback. * BAEL-2988 revert previous changes in the spring-rest-simple --- .../com/baeldung/spring/config/MvcConfig.java | 22 +++++++++++++++++++ .../converter/StringToEnumConverter.java | 4 ++-- .../spring/enums}/EnumController.java | 6 ++--- .../GlobalControllerExceptionHandler.java | 2 +- .../com/baeldung/spring}/model/Modes.java | 2 +- .../java/com/baeldung/config/MvcConfig.java | 7 ------ 6 files changed, 28 insertions(+), 15 deletions(-) create mode 100644 spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/MvcConfig.java rename {spring-rest-simple/src/main/java/com/baeldung => spring-mvc-simple-2/src/main/java/com/baeldung/spring}/config/converter/StringToEnumConverter.java (86%) rename {spring-rest-simple/src/main/java/com/baeldung/cors => spring-mvc-simple-2/src/main/java/com/baeldung/spring/enums}/EnumController.java (81%) rename {spring-rest-simple/src/main/java/com/baeldung => spring-mvc-simple-2/src/main/java/com/baeldung/spring}/exceptions/GlobalControllerExceptionHandler.java (94%) rename {spring-rest-simple/src/main/java/com/baeldung => spring-mvc-simple-2/src/main/java/com/baeldung/spring}/model/Modes.java (53%) diff --git a/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/MvcConfig.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/MvcConfig.java new file mode 100644 index 0000000000..ad99e8169b --- /dev/null +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/MvcConfig.java @@ -0,0 +1,22 @@ +package com.baeldung.spring.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.format.FormatterRegistry; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import com.baeldung.spring.config.converter.StringToEnumConverter; + +@Configuration +@EnableWebMvc +public class MvcConfig implements WebMvcConfigurer { + + public MvcConfig() { + super(); + } + + @Override + public void addFormatters(FormatterRegistry registry) { + registry.addConverter(new StringToEnumConverter()); + } +} diff --git a/spring-rest-simple/src/main/java/com/baeldung/config/converter/StringToEnumConverter.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/converter/StringToEnumConverter.java similarity index 86% rename from spring-rest-simple/src/main/java/com/baeldung/config/converter/StringToEnumConverter.java rename to spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/converter/StringToEnumConverter.java index 349ee5a796..b481f691bf 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/config/converter/StringToEnumConverter.java +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/config/converter/StringToEnumConverter.java @@ -1,9 +1,9 @@ -package com.baeldung.config.converter; +package com.baeldung.spring.config.converter; import org.springframework.core.convert.converter.Converter; import org.springframework.stereotype.Component; -import com.baeldung.model.Modes; +import com.baeldung.spring.model.Modes; @Component public class StringToEnumConverter implements Converter { diff --git a/spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/enums/EnumController.java similarity index 81% rename from spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java rename to spring-mvc-simple-2/src/main/java/com/baeldung/spring/enums/EnumController.java index 34ce4d3927..356e751d5e 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/cors/EnumController.java +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/enums/EnumController.java @@ -1,15 +1,13 @@ -package com.baeldung.cors; +package com.baeldung.spring.enums; -import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.baeldung.model.Modes; +import com.baeldung.spring.model.Modes; -@CrossOrigin(maxAge = 3600) @RestController @RequestMapping("/enums") public class EnumController { diff --git a/spring-rest-simple/src/main/java/com/baeldung/exceptions/GlobalControllerExceptionHandler.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/exceptions/GlobalControllerExceptionHandler.java similarity index 94% rename from spring-rest-simple/src/main/java/com/baeldung/exceptions/GlobalControllerExceptionHandler.java rename to spring-mvc-simple-2/src/main/java/com/baeldung/spring/exceptions/GlobalControllerExceptionHandler.java index 78fbcf97dd..2e0f1b6559 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/exceptions/GlobalControllerExceptionHandler.java +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/exceptions/GlobalControllerExceptionHandler.java @@ -1,4 +1,4 @@ -package com.baeldung.exceptions; +package com.baeldung.spring.exceptions; import org.springframework.core.convert.ConversionFailedException; import org.springframework.http.HttpStatus; diff --git a/spring-rest-simple/src/main/java/com/baeldung/model/Modes.java b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/model/Modes.java similarity index 53% rename from spring-rest-simple/src/main/java/com/baeldung/model/Modes.java rename to spring-mvc-simple-2/src/main/java/com/baeldung/spring/model/Modes.java index d3a1ab4a61..dc05448f3f 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/model/Modes.java +++ b/spring-mvc-simple-2/src/main/java/com/baeldung/spring/model/Modes.java @@ -1,4 +1,4 @@ -package com.baeldung.model; +package com.baeldung.spring.model; public enum Modes { ALPHA, BETA; diff --git a/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java b/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java index 246049b722..48b627a344 100644 --- a/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java +++ b/spring-rest-simple/src/main/java/com/baeldung/config/MvcConfig.java @@ -2,7 +2,6 @@ package com.baeldung.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; -import org.springframework.format.FormatterRegistry; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; @@ -18,7 +17,6 @@ import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import com.baeldung.config.converter.KryoHttpMessageConverter; -import com.baeldung.config.converter.StringToEnumConverter; import java.text.SimpleDateFormat; import java.util.List; @@ -73,9 +71,4 @@ public class MvcConfig implements WebMvcConfigurer { public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**"); } - - @Override - public void addFormatters(FormatterRegistry registry) { - registry.addConverter(new StringToEnumConverter()); - } } From 4ad1a192f829f6c71291747510078972a33fdd80 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 5 Oct 2019 19:32:30 +0530 Subject: [PATCH 362/396] BAEL-18132 Fix the integrations tests in spring-boot -Modified tests to used Random Port instead of Defined Port to avoid port conflicts --- ...ationTest.java => ContactAppUnitTest.java} | 27 ++++++++++++++----- ...ppWithObjectMapperCustomizerUnitTest.java} | 23 ++++++++++++---- 2 files changed, 38 insertions(+), 12 deletions(-) rename spring-boot/src/test/java/com/baeldung/jsondateformat/{ContactAppIntegrationTest.java => ContactAppUnitTest.java} (87%) rename spring-boot/src/test/java/com/baeldung/jsondateformat/{ContactAppWithObjectMapperCustomizerIntegrationTest.java => ContactAppWithObjectMapperCustomizerUnitTest.java} (82%) diff --git a/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java similarity index 87% rename from spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java rename to spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java index 86af985d8a..7be85b5e4f 100644 --- a/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppUnitTest.java @@ -2,11 +2,14 @@ package com.baeldung.jsondateformat; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; + +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.ResponseEntity; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit4.SpringRunner; @@ -22,23 +25,33 @@ import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = DEFINED_PORT, classes = ContactApp.class) +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContactApp.class) @TestPropertySource(properties = { "spring.jackson.date-format=yyyy-MM-dd HH:mm:ss" }) -public class ContactAppIntegrationTest { +public class ContactAppUnitTest { private final ObjectMapper mapper = new ObjectMapper(); @Autowired TestRestTemplate restTemplate; + + @LocalServerPort + int port; + + String url; + @Before + public void before() { + url=String.format("http://localhost:%s", port); + } + @Test public void givenJsonFormatAnnotationAndJava8DateType_whenGet_thenReturnExpectedDateFormat() throws IOException, ParseException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts", String.class); assertEquals(200, response.getStatusCodeValue()); @@ -53,7 +66,7 @@ public class ContactAppIntegrationTest { @Test public void givenJsonFormatAnnotationAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/javaUtilDate", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/javaUtilDate", String.class); assertEquals(200, response.getStatusCodeValue()); @@ -68,7 +81,7 @@ public class ContactAppIntegrationTest { @Test public void givenDefaultDateFormatInAppPropertiesAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/plainWithJavaUtilDate", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plainWithJavaUtilDate", String.class); assertEquals(200, response.getStatusCodeValue()); @@ -83,7 +96,7 @@ public class ContactAppIntegrationTest { @Test(expected = DateTimeParseException.class) public void givenDefaultDateFormatInAppPropertiesAndJava8DateType_whenGet_thenNotApplyFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/plain", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plain", String.class); assertEquals(200, response.getStatusCodeValue()); diff --git a/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java similarity index 82% rename from spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerIntegrationTest.java rename to spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java index 554283d758..114f9bfc1a 100644 --- a/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/jsondateformat/ContactAppWithObjectMapperCustomizerUnitTest.java @@ -2,11 +2,14 @@ package com.baeldung.jsondateformat; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; + +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.web.client.TestRestTemplate; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.http.ResponseEntity; import org.springframework.test.context.junit4.SpringRunner; @@ -19,20 +22,30 @@ import java.util.Map; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.DEFINED_PORT; +import static org.springframework.boot.test.context.SpringBootTest.WebEnvironment.RANDOM_PORT; @RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = DEFINED_PORT, classes = ContactApp.class) -public class ContactAppWithObjectMapperCustomizerIntegrationTest { +@SpringBootTest(webEnvironment = RANDOM_PORT, classes = ContactApp.class) +public class ContactAppWithObjectMapperCustomizerUnitTest { private final ObjectMapper mapper = new ObjectMapper(); @Autowired TestRestTemplate restTemplate; + @LocalServerPort + int port; + + String url; + + @Before + public void before() { + url=String.format("http://localhost:%s", port); + } + @Test public void givenDefaultDateFormatInAppPropertiesAndLegacyDateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/plainWithJavaUtilDate", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plainWithJavaUtilDate", String.class); assertEquals(200, response.getStatusCodeValue()); @@ -47,7 +60,7 @@ public class ContactAppWithObjectMapperCustomizerIntegrationTest { @Test public void givenDefaultDateFormatInAppPropertiesAndJava8DateType_whenGet_thenReturnExpectedDateFormat() throws IOException { - ResponseEntity response = restTemplate.getForEntity("http://localhost:8080/contacts/plain", String.class); + ResponseEntity response = restTemplate.getForEntity(url + "/contacts/plain", String.class); assertEquals(200, response.getStatusCodeValue()); From eeb46ed00ad5c57e57ca5df16a67665a533781ef Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sat, 5 Oct 2019 15:16:40 +0100 Subject: [PATCH 363/396] Changing AutoValue module to Code-Generation --- {autovalue => code-generation}/README.md | 3 ++- {autovalue => code-generation}/pom.xml | 4 ++-- .../src/main/java/com/baeldung/autofactory/App.java | 0 .../src/main/java/com/baeldung/autofactory/CustomStorage.java | 0 .../java/com/baeldung/autofactory/custom/AbstractFactory.java | 0 .../java/com/baeldung/autofactory/custom/CustomPhone.java | 0 .../main/java/com/baeldung/autofactory/custom/SmartPhone.java | 0 .../src/main/java/com/baeldung/autofactory/model/Camera.java | 0 .../java/com/baeldung/autofactory/model/ClassicPhone.java | 0 .../src/main/java/com/baeldung/autofactory/model/Phone.java | 0 .../com/baeldung/autofactory/modules/SonyCameraModule.java | 0 .../baeldung/autofactory/provided/IntermediateAssembler.java | 0 .../com/baeldung/autofactory/provider/SonyCameraProvider.java | 0 .../baeldung/autoservice/BingTranslationServiceProvider.java | 0 .../autoservice/GoogleTranslationServiceProvider.java | 0 .../java/com/baeldung/autoservice/TranslationService.java | 0 .../src/main/java/com/baeldung/autovalue/AutoValueMoney.java | 0 .../com/baeldung/autovalue/AutoValueMoneyWithBuilder.java | 0 .../src/main/java/com/baeldung/autovalue/Foo.java | 0 .../src/main/java/com/baeldung/autovalue/ImmutableMoney.java | 0 .../src/main/java/com/baeldung/autovalue/MutableMoney.java | 0 {autovalue => code-generation}/src/main/resources/logback.xml | 0 .../com/baeldung/autoservice/TranslationServiceUnitTest.java | 0 .../src/test/java/com/baeldung/autovalue/MoneyUnitTest.java | 0 pom.xml | 4 ++-- 25 files changed, 6 insertions(+), 5 deletions(-) rename {autovalue => code-generation}/README.md (93%) rename {autovalue => code-generation}/pom.xml (95%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/App.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/CustomStorage.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/model/Camera.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/model/Phone.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autoservice/TranslationService.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autovalue/AutoValueMoney.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autovalue/Foo.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autovalue/ImmutableMoney.java (100%) rename {autovalue => code-generation}/src/main/java/com/baeldung/autovalue/MutableMoney.java (100%) rename {autovalue => code-generation}/src/main/resources/logback.xml (100%) rename {autovalue => code-generation}/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java (100%) rename {autovalue => code-generation}/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java (100%) diff --git a/autovalue/README.md b/code-generation/README.md similarity index 93% rename from autovalue/README.md rename to code-generation/README.md index cdeed98e6d..289a336f99 100644 --- a/autovalue/README.md +++ b/code-generation/README.md @@ -1,8 +1,9 @@ -## AutoValue +## Code Generation This module contains articles about automatic code generation ### Relevant Articles: + - [Introduction to AutoValue](https://www.baeldung.com/introduction-to-autovalue) - [Introduction to AutoFactory](https://www.baeldung.com/autofactory) - [Google AutoService](https://www.baeldung.com/google-autoservice) diff --git a/autovalue/pom.xml b/code-generation/pom.xml similarity index 95% rename from autovalue/pom.xml rename to code-generation/pom.xml index a10e8ef055..7aefc1b5b3 100644 --- a/autovalue/pom.xml +++ b/code-generation/pom.xml @@ -2,9 +2,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 com.baeldung - autovalue + code-generation 1.0 - autovalue + code-generation com.baeldung diff --git a/autovalue/src/main/java/com/baeldung/autofactory/App.java b/code-generation/src/main/java/com/baeldung/autofactory/App.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/App.java rename to code-generation/src/main/java/com/baeldung/autofactory/App.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/CustomStorage.java b/code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/CustomStorage.java rename to code-generation/src/main/java/com/baeldung/autofactory/CustomStorage.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java b/code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java rename to code-generation/src/main/java/com/baeldung/autofactory/custom/AbstractFactory.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java b/code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java rename to code-generation/src/main/java/com/baeldung/autofactory/custom/CustomPhone.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java b/code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java rename to code-generation/src/main/java/com/baeldung/autofactory/custom/SmartPhone.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/model/Camera.java b/code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/model/Camera.java rename to code-generation/src/main/java/com/baeldung/autofactory/model/Camera.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java b/code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java rename to code-generation/src/main/java/com/baeldung/autofactory/model/ClassicPhone.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/model/Phone.java b/code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/model/Phone.java rename to code-generation/src/main/java/com/baeldung/autofactory/model/Phone.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java b/code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java rename to code-generation/src/main/java/com/baeldung/autofactory/modules/SonyCameraModule.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java b/code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java rename to code-generation/src/main/java/com/baeldung/autofactory/provided/IntermediateAssembler.java diff --git a/autovalue/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java b/code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java rename to code-generation/src/main/java/com/baeldung/autofactory/provider/SonyCameraProvider.java diff --git a/autovalue/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java b/code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java rename to code-generation/src/main/java/com/baeldung/autoservice/BingTranslationServiceProvider.java diff --git a/autovalue/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java b/code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java rename to code-generation/src/main/java/com/baeldung/autoservice/GoogleTranslationServiceProvider.java diff --git a/autovalue/src/main/java/com/baeldung/autoservice/TranslationService.java b/code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autoservice/TranslationService.java rename to code-generation/src/main/java/com/baeldung/autoservice/TranslationService.java diff --git a/autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoney.java b/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoney.java rename to code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoney.java diff --git a/autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java b/code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java rename to code-generation/src/main/java/com/baeldung/autovalue/AutoValueMoneyWithBuilder.java diff --git a/autovalue/src/main/java/com/baeldung/autovalue/Foo.java b/code-generation/src/main/java/com/baeldung/autovalue/Foo.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autovalue/Foo.java rename to code-generation/src/main/java/com/baeldung/autovalue/Foo.java diff --git a/autovalue/src/main/java/com/baeldung/autovalue/ImmutableMoney.java b/code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autovalue/ImmutableMoney.java rename to code-generation/src/main/java/com/baeldung/autovalue/ImmutableMoney.java diff --git a/autovalue/src/main/java/com/baeldung/autovalue/MutableMoney.java b/code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java similarity index 100% rename from autovalue/src/main/java/com/baeldung/autovalue/MutableMoney.java rename to code-generation/src/main/java/com/baeldung/autovalue/MutableMoney.java diff --git a/autovalue/src/main/resources/logback.xml b/code-generation/src/main/resources/logback.xml similarity index 100% rename from autovalue/src/main/resources/logback.xml rename to code-generation/src/main/resources/logback.xml diff --git a/autovalue/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java b/code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java similarity index 100% rename from autovalue/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java rename to code-generation/src/test/java/com/baeldung/autoservice/TranslationServiceUnitTest.java diff --git a/autovalue/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java b/code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java similarity index 100% rename from autovalue/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java rename to code-generation/src/test/java/com/baeldung/autovalue/MoneyUnitTest.java diff --git a/pom.xml b/pom.xml index 733aaad056..0723c742ae 100644 --- a/pom.xml +++ b/pom.xml @@ -366,7 +366,6 @@ asciidoctor asm atomix - autovalue aws aws-lambda axon @@ -381,6 +380,7 @@ checker-plugin cloud-foundry-uaa/cf-uaa-oauth2-client cloud-foundry-uaa/cf-uaa-oauth2-resource-server + code-generation core-groovy core-groovy-2 core-groovy-collections @@ -1118,7 +1118,6 @@ asciidoctor asm atomix - autovalue aws aws-lambda axon @@ -1131,6 +1130,7 @@ checker-plugin cloud-foundry-uaa/cf-uaa-oauth2-client cloud-foundry-uaa/cf-uaa-oauth2-resource-server + code-generation core-groovy core-groovy-2 core-groovy-collections From 931e71095c79e0fd795cf3adc4c6f787d48295ca Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sat, 5 Oct 2019 16:58:08 +0100 Subject: [PATCH 364/396] Updated README language --- core-java-modules/core-java-lang-2/README.md | 2 +- core-java-modules/core-java-lang-syntax-2/README.md | 6 ++++-- core-java-modules/core-java-lang-syntax/README.md | 2 +- core-java-modules/core-java-lang/README.md | 2 +- core-java-modules/core-java-networking-2/README.md | 2 +- core-java-modules/core-java-networking/README.md | 2 +- core-java-modules/core-java-perf/README.md | 2 +- core-scala/README.md | 2 +- 8 files changed, 11 insertions(+), 9 deletions(-) diff --git a/core-java-modules/core-java-lang-2/README.md b/core-java-modules/core-java-lang-2/README.md index b03abe38f4..9904e59035 100644 --- a/core-java-modules/core-java-lang-2/README.md +++ b/core-java-modules/core-java-lang-2/README.md @@ -1,6 +1,6 @@ ## Core Java Lang (Part 2) -This module contains articles about core Java language +This module contains articles about core features in the Java language ### Relevant Articles: - [Java Primitives versus Objects](https://www.baeldung.com/java-primitives-vs-objects) diff --git a/core-java-modules/core-java-lang-syntax-2/README.md b/core-java-modules/core-java-lang-syntax-2/README.md index 4cef971f75..d8daadf2aa 100644 --- a/core-java-modules/core-java-lang-syntax-2/README.md +++ b/core-java-modules/core-java-lang-syntax-2/README.md @@ -1,6 +1,8 @@ -========= +## Core Java Lang Syntax -## Core Java Lang Syntax Cookbooks and Examples +This module contains articles about Java syntax ### Relevant Articles: + - [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword) +- [[<-- Prev]](/core-java-modules/core-java-lang-syntax) diff --git a/core-java-modules/core-java-lang-syntax/README.md b/core-java-modules/core-java-lang-syntax/README.md index 1c95997bd5..6f3120ec2c 100644 --- a/core-java-modules/core-java-lang-syntax/README.md +++ b/core-java-modules/core-java-lang-syntax/README.md @@ -1,6 +1,6 @@ ## Core Java Lang Syntax -This module contains articles about core Java syntax +This module contains articles about Java syntax ### Relevant Articles: - [The Basics of Java Generics](http://www.baeldung.com/java-generics) diff --git a/core-java-modules/core-java-lang/README.md b/core-java-modules/core-java-lang/README.md index 312423ecee..cb460d6295 100644 --- a/core-java-modules/core-java-lang/README.md +++ b/core-java-modules/core-java-lang/README.md @@ -1,6 +1,6 @@ ## Core Java Lang -This module contains articles about core Java language +This module contains articles about core features in the Java language ### Relevant Articles: diff --git a/core-java-modules/core-java-networking-2/README.md b/core-java-modules/core-java-networking-2/README.md index 8fac91a0ae..c384a28b64 100644 --- a/core-java-modules/core-java-networking-2/README.md +++ b/core-java-modules/core-java-networking-2/README.md @@ -1,6 +1,6 @@ ## Core Java Networking (Part 2) -This module contains articles about core Java networking +This module contains articles about networking in Java ### Relevant Articles diff --git a/core-java-modules/core-java-networking/README.md b/core-java-modules/core-java-networking/README.md index c766e5d635..4038e9803a 100644 --- a/core-java-modules/core-java-networking/README.md +++ b/core-java-modules/core-java-networking/README.md @@ -1,6 +1,6 @@ ## Core Java Networking -This module contains articles about core Java networking +This module contains articles about networking in Java ### Relevant Articles diff --git a/core-java-modules/core-java-perf/README.md b/core-java-modules/core-java-perf/README.md index e644c73eea..d1d646ac7f 100644 --- a/core-java-modules/core-java-perf/README.md +++ b/core-java-modules/core-java-perf/README.md @@ -1,6 +1,6 @@ ## Core Java Performance -This module contains articles about core Java performance +This module contains articles about performance of Java applications ### Relevant Articles: - [Verbose Garbage Collection in Java](https://www.baeldung.com/java-verbose-gc) diff --git a/core-scala/README.md b/core-scala/README.md index cfdb0c44ed..e6fc75d59e 100644 --- a/core-scala/README.md +++ b/core-scala/README.md @@ -1,6 +1,6 @@ ## Core Scala -This module contains articles about core Scala +This module contains articles about Scala's core features ### Relevant Articles: From 2bb48cbedc50c26d055ce82c79c0770f658ecce1 Mon Sep 17 00:00:00 2001 From: Afshin Date: Sat, 5 Oct 2019 21:07:21 +0200 Subject: [PATCH 365/396] Wildcard imports are replaced by named classes and static import is removed --- .../baeldung/encoding/CharacterEncodingExamples.java | 8 +++++++- .../encoding/CharacterEncodingExamplesUnitTest.java | 11 +++++++---- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java index 51b2347823..c1898a6723 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java @@ -1,6 +1,12 @@ package com.baeldung.encoding; -import java.io.*; +import java.io.BufferedReader; +import java.io.ByteArrayInputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.CodingErrorAction; diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index 1a875738d0..d87eafcee9 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -4,7 +4,12 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; -import java.nio.charset.*; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; +import java.nio.charset.MalformedInputException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; @@ -15,8 +20,6 @@ import org.junit.Assert; import org.junit.Test; import org.junit.jupiter.api.Assertions; -import static java.nio.file.Files.newInputStream; - public class CharacterEncodingExamplesUnitTest { @Test @@ -100,7 +103,7 @@ public class CharacterEncodingExamplesUnitTest { allCandidateCharSets.forEach(charset -> { try { CharsetDecoder charsetDecoder = charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT); - Reader reader = new InputStreamReader(newInputStream(path), charsetDecoder); + Reader reader = new InputStreamReader(Files.newInputStream(path), charsetDecoder); BufferedReader bufferedReader = new BufferedReader(reader); while (bufferedReader.readLine() != null) { } From afa47a9b313c4ce39697cf6d321d4f3807f29040 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Sun, 6 Oct 2019 08:42:14 +0200 Subject: [PATCH 366/396] #BAEL-17522 update acronyms --- jmh/README.md | 2 +- jni/README.md | 2 +- jsf/README.md | 2 +- jta/README.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/jmh/README.md b/jmh/README.md index 257bb7bf85..3a5370c9f2 100644 --- a/jmh/README.md +++ b/jmh/README.md @@ -1,6 +1,6 @@ ## Java Microbenchmark Harness -This module contains articles about JMH (the Java Microbenchmark Harness). +This module contains articles about the Java Microbenchmark Harness (JMH). ### Relevant articles: diff --git a/jni/README.md b/jni/README.md index e65b89ca8a..6b984e6590 100644 --- a/jni/README.md +++ b/jni/README.md @@ -1,6 +1,6 @@ ## JNI -This module contains articles about JNI (the Java Native Interface). +This module contains articles about the Java Native Interface (JNI). ### Relevant Articles: diff --git a/jsf/README.md b/jsf/README.md index c82268c14b..7d586f9872 100644 --- a/jsf/README.md +++ b/jsf/README.md @@ -1,6 +1,6 @@ ## JSF -This module contains articles about JSF (JavaServer Faces). +This module contains articles about JavaServer Faces (JSF). ### Relevant Articles: - [Guide to JSF Expression Language 3.0](https://www.baeldung.com/jsf-expression-language-el-3) diff --git a/jta/README.md b/jta/README.md index 862c9e620a..0351177a0d 100644 --- a/jta/README.md +++ b/jta/README.md @@ -1,6 +1,6 @@ ## JTA -This module contains articles about JTA. +This module contains articles about the Java Transaction API (JTA). ### Relevant Articles: - [Guide to Java EE JTA](https://www.baeldung.com/jee-jta) From be24e03a4848d16a4151b9e013f71571cf398cfa Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 6 Oct 2019 12:27:05 +0530 Subject: [PATCH 367/396] [BAEL-17473] - Moved articles to corrrect places, formatted pom.xmls and added description in readme files --- spring-boot-artifacts/README.md | 5 +- spring-boot-artifacts/pom.xml | 53 +++++++--------- spring-boot-deployment/README.md | 6 +- spring-boot-deployment/pom.xml | 60 +++++++++---------- .../compare/ComparisonApplication.java | 0 .../baeldung/compare/StartupEventHandler.java | 0 .../src/main/resources/application.properties | 8 ++- spring-boot-environment/README.md | 5 ++ spring-boot-environment/pom.xml | 16 ++--- .../baeldung/properties/ConfProperties.java | 0 .../ExternalPropertyConfigurer.java | 0 .../ExternalPropertyFileLoader.java | 0 .../main/resources/external/conf.properties | 0 ...rnalPropertyFileLoaderIntegrationTest.java | 0 spring-boot-runtime/README.md | 8 ++- spring-boot-runtime/pom.xml | 16 ++--- .../resources/application-tomcat.properties | 0 17 files changed, 95 insertions(+), 82 deletions(-) rename {spring-boot-runtime => spring-boot-deployment}/src/main/java/com/baeldung/compare/ComparisonApplication.java (100%) rename {spring-boot-runtime => spring-boot-deployment}/src/main/java/com/baeldung/compare/StartupEventHandler.java (100%) rename {spring-boot-artifacts => spring-boot-environment}/src/main/java/com/baeldung/properties/ConfProperties.java (100%) rename {spring-boot-artifacts => spring-boot-environment}/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java (100%) rename {spring-boot-artifacts => spring-boot-environment}/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java (100%) rename {spring-boot-artifacts => spring-boot-environment}/src/main/resources/external/conf.properties (100%) rename {spring-boot-artifacts => spring-boot-environment}/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java (100%) rename {spring-boot-deployment => spring-boot-runtime}/src/main/resources/application-tomcat.properties (100%) diff --git a/spring-boot-artifacts/README.md b/spring-boot-artifacts/README.md index 0a3f1b7e60..4025e43a65 100644 --- a/spring-boot-artifacts/README.md +++ b/spring-boot-artifacts/README.md @@ -1,7 +1,10 @@ +## Spring Boot Artifacts + +This module contains articles about configuring the Spring Boot build process. + ### Relevant Articles: - [Spring Boot Dependency Management with a Custom Parent](https://www.baeldung.com/spring-boot-dependency-management-custom-parent) - [Create a Fat Jar App with Spring Boot](https://www.baeldung.com/deployable-fat-jar-spring-boot) - [Intro to Spring Boot Starters](https://www.baeldung.com/spring-boot-starters) - - [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar) - [Introduction to WebJars](https://www.baeldung.com/maven-webjars) - [A Quick Guide to Maven Wrapper](https://www.baeldung.com/maven-wrapper) \ No newline at end of file diff --git a/spring-boot-artifacts/pom.xml b/spring-boot-artifacts/pom.xml index 756864895d..8301533606 100644 --- a/spring-boot-artifacts/pom.xml +++ b/spring-boot-artifacts/pom.xml @@ -101,15 +101,6 @@ ${project.artifactId} - - - src/main/resources - true - - **/conf.properties - - - org.springframework.boot @@ -126,28 +117,28 @@ - org.apache.maven.plugins - maven-failsafe-plugin - 2.18 - - - - integration-tests - - integration-test - verify - - - - - **/ExternalPropertyFileLoaderIntegrationTest.java - - - - - + org.apache.maven.plugins + maven-failsafe-plugin + 2.18 + + + + integration-tests + + integration-test + verify + + + + + **/ExternalPropertyFileLoaderIntegrationTest.java + + + + + diff --git a/spring-boot-deployment/README.md b/spring-boot-deployment/README.md index 90c5d05e33..6171decf2d 100644 --- a/spring-boot-deployment/README.md +++ b/spring-boot-deployment/README.md @@ -1,5 +1,9 @@ +## Spring Boot Deployment + +This module contains articles about deployment of a Spring Boot Application + ### Relevant Articles: - [Deploy a Spring Boot WAR into a Tomcat Server](https://www.baeldung.com/spring-boot-war-tomcat-deploy) - [Spring Boot Console Application](https://www.baeldung.com/spring-boot-console-app) - [How to Configure Spring Boot Tomcat](https://www.baeldung.com/spring-boot-configure-tomcat) - - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs) + - [Comparing Embedded Servlet Containers in Spring Boot](https://www.baeldung.com/spring-boot-servlet-containers) \ No newline at end of file diff --git a/spring-boot-deployment/pom.xml b/spring-boot-deployment/pom.xml index 6802452ddf..69a54fd482 100644 --- a/spring-boot-deployment/pom.xml +++ b/spring-boot-deployment/pom.xml @@ -102,14 +102,14 @@ ${project.artifactId} - - src/main/resources - true - - **/conf.properties - - - + + src/main/resources + true + + **/conf.properties + + + org.springframework.boot @@ -126,28 +126,28 @@ - org.apache.maven.plugins - maven-failsafe-plugin - 2.18 - - - - integration-tests - - integration-test - verify - - - - - **/ExternalPropertyFileLoaderIntegrationTest.java - - - - - + org.apache.maven.plugins + maven-failsafe-plugin + 2.18 + + + + integration-tests + + integration-test + verify + + + + + **/ExternalPropertyFileLoaderIntegrationTest.java + + + + + diff --git a/spring-boot-runtime/src/main/java/com/baeldung/compare/ComparisonApplication.java b/spring-boot-deployment/src/main/java/com/baeldung/compare/ComparisonApplication.java similarity index 100% rename from spring-boot-runtime/src/main/java/com/baeldung/compare/ComparisonApplication.java rename to spring-boot-deployment/src/main/java/com/baeldung/compare/ComparisonApplication.java diff --git a/spring-boot-runtime/src/main/java/com/baeldung/compare/StartupEventHandler.java b/spring-boot-deployment/src/main/java/com/baeldung/compare/StartupEventHandler.java similarity index 100% rename from spring-boot-runtime/src/main/java/com/baeldung/compare/StartupEventHandler.java rename to spring-boot-deployment/src/main/java/com/baeldung/compare/StartupEventHandler.java diff --git a/spring-boot-deployment/src/main/resources/application.properties b/spring-boot-deployment/src/main/resources/application.properties index 709574239b..27b7915cff 100644 --- a/spring-boot-deployment/src/main/resources/application.properties +++ b/spring-boot-deployment/src/main/resources/application.properties @@ -1 +1,7 @@ -spring.main.allow-bean-definition-overriding=true \ No newline at end of file +management.endpoints.web.exposure.include=* +management.metrics.enable.root=true +management.metrics.enable.jvm=true +management.endpoint.restart.enabled=true +spring.datasource.jmx-enabled=false +spring.main.allow-bean-definition-overriding=true +management.endpoint.shutdown.enabled=true \ No newline at end of file diff --git a/spring-boot-environment/README.md b/spring-boot-environment/README.md index 57cf8b2461..e916c503bc 100644 --- a/spring-boot-environment/README.md +++ b/spring-boot-environment/README.md @@ -1,2 +1,7 @@ +## Spring Boot Environment + +This module contains articles about configuring the Spring Boot `Environment` + ### Relevant Articles: - [EnvironmentPostProcessor in Spring Boot](https://www.baeldung.com/spring-boot-environmentpostprocessor) + - [Spring Properties File Outside jar](https://www.baeldung.com/spring-properties-file-outside-jar) \ No newline at end of file diff --git a/spring-boot-environment/pom.xml b/spring-boot-environment/pom.xml index a957dcde1b..4e4a363fee 100644 --- a/spring-boot-environment/pom.xml +++ b/spring-boot-environment/pom.xml @@ -90,14 +90,14 @@ ${project.artifactId} - - src/main/resources - true - - **/conf.properties - - - + + src/main/resources + true + + **/conf.properties + + + diff --git a/spring-boot-artifacts/src/main/java/com/baeldung/properties/ConfProperties.java b/spring-boot-environment/src/main/java/com/baeldung/properties/ConfProperties.java similarity index 100% rename from spring-boot-artifacts/src/main/java/com/baeldung/properties/ConfProperties.java rename to spring-boot-environment/src/main/java/com/baeldung/properties/ConfProperties.java diff --git a/spring-boot-artifacts/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java b/spring-boot-environment/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java similarity index 100% rename from spring-boot-artifacts/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java rename to spring-boot-environment/src/main/java/com/baeldung/properties/ExternalPropertyConfigurer.java diff --git a/spring-boot-artifacts/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java b/spring-boot-environment/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java similarity index 100% rename from spring-boot-artifacts/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java rename to spring-boot-environment/src/main/java/com/baeldung/properties/ExternalPropertyFileLoader.java diff --git a/spring-boot-artifacts/src/main/resources/external/conf.properties b/spring-boot-environment/src/main/resources/external/conf.properties similarity index 100% rename from spring-boot-artifacts/src/main/resources/external/conf.properties rename to spring-boot-environment/src/main/resources/external/conf.properties diff --git a/spring-boot-artifacts/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java b/spring-boot-environment/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java similarity index 100% rename from spring-boot-artifacts/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java rename to spring-boot-environment/src/test/java/com/baeldung/properties/ExternalPropertyFileLoaderIntegrationTest.java diff --git a/spring-boot-runtime/README.md b/spring-boot-runtime/README.md index f9ca12c605..d3dc19493d 100644 --- a/spring-boot-runtime/README.md +++ b/spring-boot-runtime/README.md @@ -1,6 +1,10 @@ +## Spring Boot Runtime + +This module contains articles about administering a Spring Boot runtime + ### Relevant Articles: - [Shutdown a Spring Boot Application](https://www.baeldung.com/spring-boot-shutdown) - - [Comparing Embedded Servlet Containers in Spring Boot](https://www.baeldung.com/spring-boot-servlet-containers) - [Programmatically Restarting a Spring Boot Application](https://www.baeldung.com/java-restart-spring-boot-app) - [Logging HTTP Requests with Spring Boot Actuator HTTP Tracing](https://www.baeldung.com/spring-boot-actuator-http) - - [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) \ No newline at end of file + - [How to Disable Console Logging in Spring Boot](https://www.baeldung.com/spring-boot-disable-console-logging) + - [Spring Boot Embedded Tomcat Logs](https://www.baeldung.com/spring-boot-embedded-tomcat-logs) \ No newline at end of file diff --git a/spring-boot-runtime/pom.xml b/spring-boot-runtime/pom.xml index eab8ca3cc2..dca9b47410 100644 --- a/spring-boot-runtime/pom.xml +++ b/spring-boot-runtime/pom.xml @@ -100,14 +100,14 @@ ${project.artifactId} - - src/main/resources - true - - **/conf.properties - - - + + src/main/resources + true + + **/conf.properties + + + diff --git a/spring-boot-deployment/src/main/resources/application-tomcat.properties b/spring-boot-runtime/src/main/resources/application-tomcat.properties similarity index 100% rename from spring-boot-deployment/src/main/resources/application-tomcat.properties rename to spring-boot-runtime/src/main/resources/application-tomcat.properties From b927b33465523259daf3ab38f7dec45cffb70186 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 6 Oct 2019 12:30:15 +0530 Subject: [PATCH 368/396] [BAEL-17473] - Formatted spring-mvc-simple-2 pom.xml --- spring-mvc-simple-2/pom.xml | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/spring-mvc-simple-2/pom.xml b/spring-mvc-simple-2/pom.xml index 3ae577cb03..7faa832552 100644 --- a/spring-mvc-simple-2/pom.xml +++ b/spring-mvc-simple-2/pom.xml @@ -20,7 +20,7 @@ org.springframework.boot spring-boot-starter-web - + org.springframework.boot spring-boot-starter-test @@ -89,14 +89,14 @@ ${project.artifactId} - - src/main/resources - true - - **/conf.properties - - - + + src/main/resources + true + + **/conf.properties + + + From 750aab063e2c2da5d6f9cfdb110a24ed9c1b38e3 Mon Sep 17 00:00:00 2001 From: Afshin Date: Sun, 6 Oct 2019 11:07:21 +0200 Subject: [PATCH 369/396] indentations are adjusted --- .../CharacterEncodingExamplesUnitTest.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index d87eafcee9..a8cee6881d 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -76,37 +76,37 @@ public class CharacterEncodingExamplesUnitTest { @Test public void givenUTF8String_decodeByUS_ASCII_ReplaceMalformedInputSequence() throws IOException { String input = "The façade pattern is a software design pattern."; - Assertions.assertEquals(CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPLACE), - "The fa��ade pattern is a software design pattern."); + Assertions.assertEquals("The fa��ade pattern is a software design pattern.", + CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPLACE)); } @Test public void givenUTF8String_decodeByUS_ASCII_IgnoreMalformedInputSequence() throws IOException { String input = "The façade pattern is a software design pattern."; Assertions.assertEquals( - CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.IGNORE), - "The faade pattern is a software design pattern."); + "The faade pattern is a software design pattern.", + CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); } @Test public void givenUTF8String_decodeByUS_ASCII_ReportMalformedInputSequence() { String input = "The façade pattern is a software design pattern."; Assertions.assertThrows(MalformedInputException.class, - () -> CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); + () -> CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); } @Test public void givenTextFile_FindSuitableCandidateEncodings() { Path path = Paths.get("src/test/resources/encoding.txt"); - List allCandidateCharSets = Arrays.asList(StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); + List allCandidateCharSets = Arrays.asList( + StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); List suitableCharsets = new ArrayList<>(); allCandidateCharSets.forEach(charset -> { try { CharsetDecoder charsetDecoder = charset.newDecoder().onMalformedInput(CodingErrorAction.REPORT); Reader reader = new InputStreamReader(Files.newInputStream(path), charsetDecoder); BufferedReader bufferedReader = new BufferedReader(reader); - while (bufferedReader.readLine() != null) { - } + bufferedReader.readLine(); suitableCharsets.add(charset); } catch (MalformedInputException ignored) { } catch (IOException ex) { From da1ac659fb1ae9c982fe3226a0906c5bdfb06a10 Mon Sep 17 00:00:00 2001 From: Afshin Date: Sun, 6 Oct 2019 11:22:18 +0200 Subject: [PATCH 370/396] decodeText implementation is reformatted --- .../com/baeldung/encoding/CharacterEncodingExamples.java | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java index c1898a6723..1ed5f9e62a 100644 --- a/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java +++ b/core-java-modules/core-java/src/main/java/com/baeldung/encoding/CharacterEncodingExamples.java @@ -39,10 +39,7 @@ public class CharacterEncodingExamples { CharsetDecoder charsetDecoder = charset.newDecoder(); charsetDecoder.onMalformedInput(codingErrorAction); return new BufferedReader( - new InputStreamReader( - new ByteArrayInputStream(input.getBytes()), - charsetDecoder)) - .readLine(); - + new InputStreamReader( + new ByteArrayInputStream(input.getBytes()), charsetDecoder)).readLine(); } } From 6f6f8913551fefb5d7260e00970c8c393101057f Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 6 Oct 2019 11:26:14 +0200 Subject: [PATCH 371/396] move spring-all/spring43 to spring-4 module * WebMvcConfigurer default methods are available only in Spring 5+ changed AttributeAnnotationConfiguration to extend WebMvcConfigurerAdapter --- spring-4/README.md | 1 + spring-4/pom.xml | 23 +++++++++++++++++++ .../AttributeAnnotationsTestController.java | 0 .../ParamInterceptor.java | 0 .../java/org/baeldung/spring43/cache/Foo.java | 0 .../baeldung/spring43/cache/FooService.java | 0 .../spring43/composedmapping/Appointment.java | 0 .../composedmapping/AppointmentService.java | 0 .../AppointmentsController.java | 0 .../baeldung/spring43/ctor/FooRepository.java | 0 .../baeldung/spring43/ctor/FooService.java | 0 .../spring43/defaultmethods/DateHolder.java | 0 .../spring43/defaultmethods/IDateHolder.java | 0 .../spring43/depresolution/FooRepository.java | 0 .../spring43/depresolution/FooService.java | 0 .../scopeannotations/AppPreferences.java | 0 .../InstanceCountingService.java | 0 .../scopeannotations/LoginAction.java | 0 .../scopeannotations/ScopeTestController.java | 0 .../scopeannotations/UserPreferences.java | 0 .../main/resources/defaultmethods-context.xml | 0 .../main/resources/implicit-ctor-context.xml | 0 .../AttributeAnnotationConfiguration.java | 4 ++-- .../AttributeAnnotationIntegrationTest.java | 0 .../cache/CacheRefinementsConfiguration.java | 0 .../CacheRefinementsIntegrationTest.java | 0 .../ComposedMappingConfiguration.java | 2 +- .../ComposedMappingIntegrationTest.java | 0 ...onConstructorInjectionIntegrationTest.java | 0 .../ctor/FooRepositoryConfiguration.java | 0 .../ctor/FooServiceConfiguration.java | 0 .../ImplicitConstructorIntegrationTest.java | 0 ...efaultMethodsInjectionIntegrationTest.java | 0 .../ITransactionalUnitTest.java | 0 .../TransactionalIntegrationTest.java | 0 .../TransactionalTestConfiguration.java | 0 .../ObjectProviderConfiguration.java | 0 .../ObjectProviderIntegrationTest.java | 0 .../ScopeAnnotationsConfiguration.java | 0 .../ScopeAnnotationsIntegrationTest.java | 0 spring-all/README.md | 1 - spring-all/pom.xml | 14 ----------- 42 files changed, 27 insertions(+), 18 deletions(-) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationsTestController.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/attributeannotations/ParamInterceptor.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/cache/Foo.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/cache/FooService.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/composedmapping/Appointment.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/composedmapping/AppointmentService.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/composedmapping/AppointmentsController.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/ctor/FooRepository.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/ctor/FooService.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/defaultmethods/DateHolder.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/defaultmethods/IDateHolder.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/depresolution/FooRepository.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/depresolution/FooService.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/scopeannotations/AppPreferences.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/scopeannotations/InstanceCountingService.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/scopeannotations/LoginAction.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/scopeannotations/ScopeTestController.java (100%) rename {spring-all => spring-4}/src/main/java/org/baeldung/spring43/scopeannotations/UserPreferences.java (100%) rename {spring-all => spring-4}/src/main/resources/defaultmethods-context.xml (100%) rename {spring-all => spring-4}/src/main/resources/implicit-ctor-context.xml (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationConfiguration.java (91%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationIntegrationTest.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/cache/CacheRefinementsConfiguration.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/cache/CacheRefinementsIntegrationTest.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingConfiguration.java (97%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingIntegrationTest.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/ctor/ConfigurationConstructorInjectionIntegrationTest.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/ctor/FooRepositoryConfiguration.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/ctor/FooServiceConfiguration.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/ctor/ImplicitConstructorIntegrationTest.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/defaultmethods/DefaultMethodsInjectionIntegrationTest.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/defaultmethods/ITransactionalUnitTest.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalIntegrationTest.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalTestConfiguration.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderConfiguration.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderIntegrationTest.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsConfiguration.java (100%) rename {spring-all => spring-4}/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsIntegrationTest.java (100%) diff --git a/spring-4/README.md b/spring-4/README.md index 57cb8c3eeb..584b93a3a3 100644 --- a/spring-4/README.md +++ b/spring-4/README.md @@ -2,3 +2,4 @@ - [A Guide to Flips for Spring](http://www.baeldung.com/flips-spring) - [Configuring a Hikari Connection Pool with Spring Boot](https://www.baeldung.com/spring-boot-hikari) - [Spring JSON-P with Jackson](http://www.baeldung.com/spring-jackson-jsonp) +- [What’s New in Spring 4.3?](http://www.baeldung.com/whats-new-in-spring-4-3) diff --git a/spring-4/pom.xml b/spring-4/pom.xml index 59b74782ec..6c282b76a0 100644 --- a/spring-4/pom.xml +++ b/spring-4/pom.xml @@ -67,6 +67,27 @@ tomcat-embed-jasper provided + + org.apache.logging.log4j + log4j-api + + + org.apache.logging.log4j + log4j-core + + + org.easymock + easymock + ${easymock.version} + test + + + + org.hsqldb + hsqldb + ${hsqldb.version} + test + @@ -88,6 +109,8 @@ com.baeldung.flips.ApplicationConfig 1.0.1 + 3.6 + 2.4.0 diff --git a/spring-all/src/main/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationsTestController.java b/spring-4/src/main/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationsTestController.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationsTestController.java rename to spring-4/src/main/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationsTestController.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/attributeannotations/ParamInterceptor.java b/spring-4/src/main/java/org/baeldung/spring43/attributeannotations/ParamInterceptor.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/attributeannotations/ParamInterceptor.java rename to spring-4/src/main/java/org/baeldung/spring43/attributeannotations/ParamInterceptor.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/cache/Foo.java b/spring-4/src/main/java/org/baeldung/spring43/cache/Foo.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/cache/Foo.java rename to spring-4/src/main/java/org/baeldung/spring43/cache/Foo.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/cache/FooService.java b/spring-4/src/main/java/org/baeldung/spring43/cache/FooService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/cache/FooService.java rename to spring-4/src/main/java/org/baeldung/spring43/cache/FooService.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/composedmapping/Appointment.java b/spring-4/src/main/java/org/baeldung/spring43/composedmapping/Appointment.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/composedmapping/Appointment.java rename to spring-4/src/main/java/org/baeldung/spring43/composedmapping/Appointment.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/composedmapping/AppointmentService.java b/spring-4/src/main/java/org/baeldung/spring43/composedmapping/AppointmentService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/composedmapping/AppointmentService.java rename to spring-4/src/main/java/org/baeldung/spring43/composedmapping/AppointmentService.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/composedmapping/AppointmentsController.java b/spring-4/src/main/java/org/baeldung/spring43/composedmapping/AppointmentsController.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/composedmapping/AppointmentsController.java rename to spring-4/src/main/java/org/baeldung/spring43/composedmapping/AppointmentsController.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/ctor/FooRepository.java b/spring-4/src/main/java/org/baeldung/spring43/ctor/FooRepository.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/ctor/FooRepository.java rename to spring-4/src/main/java/org/baeldung/spring43/ctor/FooRepository.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/ctor/FooService.java b/spring-4/src/main/java/org/baeldung/spring43/ctor/FooService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/ctor/FooService.java rename to spring-4/src/main/java/org/baeldung/spring43/ctor/FooService.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/defaultmethods/DateHolder.java b/spring-4/src/main/java/org/baeldung/spring43/defaultmethods/DateHolder.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/defaultmethods/DateHolder.java rename to spring-4/src/main/java/org/baeldung/spring43/defaultmethods/DateHolder.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/defaultmethods/IDateHolder.java b/spring-4/src/main/java/org/baeldung/spring43/defaultmethods/IDateHolder.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/defaultmethods/IDateHolder.java rename to spring-4/src/main/java/org/baeldung/spring43/defaultmethods/IDateHolder.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/depresolution/FooRepository.java b/spring-4/src/main/java/org/baeldung/spring43/depresolution/FooRepository.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/depresolution/FooRepository.java rename to spring-4/src/main/java/org/baeldung/spring43/depresolution/FooRepository.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/depresolution/FooService.java b/spring-4/src/main/java/org/baeldung/spring43/depresolution/FooService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/depresolution/FooService.java rename to spring-4/src/main/java/org/baeldung/spring43/depresolution/FooService.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/scopeannotations/AppPreferences.java b/spring-4/src/main/java/org/baeldung/spring43/scopeannotations/AppPreferences.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/scopeannotations/AppPreferences.java rename to spring-4/src/main/java/org/baeldung/spring43/scopeannotations/AppPreferences.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/scopeannotations/InstanceCountingService.java b/spring-4/src/main/java/org/baeldung/spring43/scopeannotations/InstanceCountingService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/scopeannotations/InstanceCountingService.java rename to spring-4/src/main/java/org/baeldung/spring43/scopeannotations/InstanceCountingService.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/scopeannotations/LoginAction.java b/spring-4/src/main/java/org/baeldung/spring43/scopeannotations/LoginAction.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/scopeannotations/LoginAction.java rename to spring-4/src/main/java/org/baeldung/spring43/scopeannotations/LoginAction.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/scopeannotations/ScopeTestController.java b/spring-4/src/main/java/org/baeldung/spring43/scopeannotations/ScopeTestController.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/scopeannotations/ScopeTestController.java rename to spring-4/src/main/java/org/baeldung/spring43/scopeannotations/ScopeTestController.java diff --git a/spring-all/src/main/java/org/baeldung/spring43/scopeannotations/UserPreferences.java b/spring-4/src/main/java/org/baeldung/spring43/scopeannotations/UserPreferences.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring43/scopeannotations/UserPreferences.java rename to spring-4/src/main/java/org/baeldung/spring43/scopeannotations/UserPreferences.java diff --git a/spring-all/src/main/resources/defaultmethods-context.xml b/spring-4/src/main/resources/defaultmethods-context.xml similarity index 100% rename from spring-all/src/main/resources/defaultmethods-context.xml rename to spring-4/src/main/resources/defaultmethods-context.xml diff --git a/spring-all/src/main/resources/implicit-ctor-context.xml b/spring-4/src/main/resources/implicit-ctor-context.xml similarity index 100% rename from spring-all/src/main/resources/implicit-ctor-context.xml rename to spring-4/src/main/resources/implicit-ctor-context.xml diff --git a/spring-all/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationConfiguration.java b/spring-4/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationConfiguration.java similarity index 91% rename from spring-all/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationConfiguration.java rename to spring-4/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationConfiguration.java index 347dd399e2..97ae651473 100644 --- a/spring-all/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationConfiguration.java +++ b/spring-4/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationConfiguration.java @@ -6,13 +6,13 @@ import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.ViewResolver; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import org.springframework.web.servlet.view.InternalResourceViewResolver; @Configuration @ComponentScan @EnableWebMvc -public class AttributeAnnotationConfiguration implements WebMvcConfigurer { +public class AttributeAnnotationConfiguration extends WebMvcConfigurerAdapter { @Bean public ViewResolver viewResolver() { diff --git a/spring-all/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationIntegrationTest.java b/spring-4/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationIntegrationTest.java rename to spring-4/src/test/java/org/baeldung/spring43/attributeannotations/AttributeAnnotationIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/cache/CacheRefinementsConfiguration.java b/spring-4/src/test/java/org/baeldung/spring43/cache/CacheRefinementsConfiguration.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/cache/CacheRefinementsConfiguration.java rename to spring-4/src/test/java/org/baeldung/spring43/cache/CacheRefinementsConfiguration.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/cache/CacheRefinementsIntegrationTest.java b/spring-4/src/test/java/org/baeldung/spring43/cache/CacheRefinementsIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/cache/CacheRefinementsIntegrationTest.java rename to spring-4/src/test/java/org/baeldung/spring43/cache/CacheRefinementsIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingConfiguration.java b/spring-4/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingConfiguration.java similarity index 97% rename from spring-all/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingConfiguration.java rename to spring-4/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingConfiguration.java index eddd56a11b..f1028ebefb 100644 --- a/spring-all/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingConfiguration.java +++ b/spring-4/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingConfiguration.java @@ -14,7 +14,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.context.annotation.Scope; -import static org.easymock.EasyMock.*; +import static org.easymock.EasyMock.replay; @Configuration @ComponentScan diff --git a/spring-all/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingIntegrationTest.java b/spring-4/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingIntegrationTest.java rename to spring-4/src/test/java/org/baeldung/spring43/composedmapping/ComposedMappingIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/ctor/ConfigurationConstructorInjectionIntegrationTest.java b/spring-4/src/test/java/org/baeldung/spring43/ctor/ConfigurationConstructorInjectionIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/ctor/ConfigurationConstructorInjectionIntegrationTest.java rename to spring-4/src/test/java/org/baeldung/spring43/ctor/ConfigurationConstructorInjectionIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/ctor/FooRepositoryConfiguration.java b/spring-4/src/test/java/org/baeldung/spring43/ctor/FooRepositoryConfiguration.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/ctor/FooRepositoryConfiguration.java rename to spring-4/src/test/java/org/baeldung/spring43/ctor/FooRepositoryConfiguration.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/ctor/FooServiceConfiguration.java b/spring-4/src/test/java/org/baeldung/spring43/ctor/FooServiceConfiguration.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/ctor/FooServiceConfiguration.java rename to spring-4/src/test/java/org/baeldung/spring43/ctor/FooServiceConfiguration.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/ctor/ImplicitConstructorIntegrationTest.java b/spring-4/src/test/java/org/baeldung/spring43/ctor/ImplicitConstructorIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/ctor/ImplicitConstructorIntegrationTest.java rename to spring-4/src/test/java/org/baeldung/spring43/ctor/ImplicitConstructorIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/defaultmethods/DefaultMethodsInjectionIntegrationTest.java b/spring-4/src/test/java/org/baeldung/spring43/defaultmethods/DefaultMethodsInjectionIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/defaultmethods/DefaultMethodsInjectionIntegrationTest.java rename to spring-4/src/test/java/org/baeldung/spring43/defaultmethods/DefaultMethodsInjectionIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/defaultmethods/ITransactionalUnitTest.java b/spring-4/src/test/java/org/baeldung/spring43/defaultmethods/ITransactionalUnitTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/defaultmethods/ITransactionalUnitTest.java rename to spring-4/src/test/java/org/baeldung/spring43/defaultmethods/ITransactionalUnitTest.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalIntegrationTest.java b/spring-4/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalIntegrationTest.java rename to spring-4/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalTestConfiguration.java b/spring-4/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalTestConfiguration.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalTestConfiguration.java rename to spring-4/src/test/java/org/baeldung/spring43/defaultmethods/TransactionalTestConfiguration.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderConfiguration.java b/spring-4/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderConfiguration.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderConfiguration.java rename to spring-4/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderConfiguration.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderIntegrationTest.java b/spring-4/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderIntegrationTest.java rename to spring-4/src/test/java/org/baeldung/spring43/depresolution/ObjectProviderIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsConfiguration.java b/spring-4/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsConfiguration.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsConfiguration.java rename to spring-4/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsConfiguration.java diff --git a/spring-all/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsIntegrationTest.java b/spring-4/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsIntegrationTest.java rename to spring-4/src/test/java/org/baeldung/spring43/scopeannotations/ScopeAnnotationsIntegrationTest.java diff --git a/spring-all/README.md b/spring-all/README.md index 16da3bc8a1..3ee610f370 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -13,7 +13,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) - [Spring Profiles](http://www.baeldung.com/spring-profiles) - [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor) -- [What’s New in Spring 4.3?](http://www.baeldung.com/whats-new-in-spring-4-3) - [Running Setup Data on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring) - [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) - [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) diff --git a/spring-all/pom.xml b/spring-all/pom.xml index 1b733555da..bb6169085e 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -141,20 +141,6 @@ mockito-core test - - org.easymock - easymock - ${easymock.version} - test - - - org.apache.logging.log4j - log4j-api - - - org.apache.logging.log4j - log4j-core - From f88952e7ec78c23db69fb58e5fa73d1d154e9022 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 6 Oct 2019 12:48:44 +0200 Subject: [PATCH 372/396] rename spring-all module * rename existing spring-core-2 to spring-core-3 * rename spring-all to spring-core-2 --- spring-all/README.md | 24 -- spring-all/pom.xml | 235 ------------------ {spring-all => spring-core-2}/.gitignore | 0 spring-core-2/README.md | 24 +- spring-core-2/pom.xml | 215 ++++++++++++++-- .../org/baeldung/autowire/sample/App.java | 0 .../baeldung/autowire/sample/AppConfig.java | 0 .../autowire/sample/BarFormatter.java | 0 .../org/baeldung/autowire/sample/FooDAO.java | 0 .../autowire/sample/FooFormatter.java | 0 .../baeldung/autowire/sample/FooService.java | 0 .../baeldung/autowire/sample/Formatter.java | 0 .../autowire/sample/FormatterType.java | 0 .../config/ConstructorBasedShipConfig.java | 0 .../bean/config/SetterBasedShipConfig.java | 0 .../org/baeldung/bean/injection/Helm.java | 0 .../org/baeldung/bean/injection/Ship.java | 0 .../CustomAnnotationConfiguration.java | 0 .../baeldung/customannotation/DataAccess.java | 0 .../DataAccessAnnotationProcessor.java | 0 .../DataAccessFieldCallback.java | 0 .../baeldung/customannotation/GenericDAO.java | 0 .../org/baeldung/customscope/TenantBean.java | 0 .../TenantBeanFactoryPostProcessor.java | 0 .../customscope/TenantBeansConfig.java | 0 .../org/baeldung/customscope/TenantScope.java | 0 .../customscope/TenantScopeConfig.java | 0 .../java/org/baeldung/nullibility/Person.java | 0 .../baeldung/nullibility/package-info.java | 0 .../main/java/org/baeldung/order/Average.java | 30 +-- .../java/org/baeldung/order/Excellent.java | 28 +-- .../main/java/org/baeldung/order/Good.java | 28 +-- .../main/java/org/baeldung/order/Rating.java | 12 +- .../java/org/baeldung/persistence/Setup.java | 0 .../java/org/baeldung/primary/Config.java | 0 .../baeldung/primary/DepartmentManager.java | 0 .../java/org/baeldung/primary/Employee.java | 0 .../org/baeldung/primary/GeneralManager.java | 0 .../java/org/baeldung/primary/Manager.java | 0 .../org/baeldung/primary/ManagerService.java | 0 .../baeldung/primary/PrimaryApplication.java | 0 .../baeldung/profiles/DatasourceConfig.java | 0 .../profiles/DevDatasourceConfig.java | 0 .../profiles/ProductionDatasourceConfig.java | 0 .../org/baeldung/profiles/ProfileManager.java | 0 .../profiles/SpringProfilesConfig.java | 0 .../main/java/org/baeldung/sample/Bar.java | 0 .../main/java/org/baeldung/sample/Foo.java | 0 .../baeldung/sampleabstract/BallService.java | 0 .../sampleabstract/BasketballService.java | 0 .../org/baeldung/sampleabstract/DemoApp.java | 0 .../sampleabstract/LogRepository.java | 0 .../sampleabstract/RuleRepository.java | 0 .../scopes/HelloMessageGenerator.java | 0 .../main/java/org/baeldung/scopes/Person.java | 0 .../org/baeldung/scopes/ScopesController.java | 0 .../main/java/org/baeldung/shell/Main.java | 0 .../shell/simple/SimpleBannerProvider.java | 0 .../org/baeldung/shell/simple/SimpleCLI.java | 0 .../simple/SimpleHistoryFileNameProvider.java | 0 .../shell/simple/SimplePromptProvider.java | 0 .../shell/simple/SimpleURLConverter.java | 0 .../baeldung/spring/config/CleanupBean.java | 0 .../baeldung/spring/config/CoreConfig.java | 0 .../spring/config/MainWebAppInitializer.java | 0 .../org/baeldung/spring/config/MvcConfig.java | 0 .../spring/config/PersistenceConfig.java | 0 .../baeldung/spring/config/ScopesConfig.java | 0 .../AsynchronousSpringEventsConfig.java | 0 .../AnnotationDrivenEventListener.java | 0 .../synchronous/ContextRefreshedListener.java | 0 .../synchronous/CustomSpringEvent.java | 0 .../CustomSpringEventListener.java | 0 .../CustomSpringEventPublisher.java | 0 .../synchronous/GenericSpringAppEvent.java | 0 .../synchronous/GenericSpringEvent.java | 0 .../GenericSpringEventListener.java | 0 .../GenericStringSpringAppEvent.java | 0 .../synchronous/GenericStringSpringEvent.java | 0 .../SynchronousSpringEventsConfig.java | 0 .../startup/AllStrategiesExampleBean.java | 0 .../startup/EventListenerExampleBean.java | 0 .../startup/InitMethodExampleBean.java | 0 .../startup/InitializingBeanExampleBean.java | 0 .../startup/InvalidInitExampleBean.java | 0 .../LogicInConstructorExampleBean.java | 0 .../startup/PostConstructExampleBean.java | 0 .../baeldung/startup/SpringStartupConfig.java | 0 .../StartupApplicationListenerExample.java | 0 .../META-INF/spring/spring-shell-plugin.xml | 0 .../src/main/resources/application.properties | 0 .../resources/beanInjection-constructor.xml | 0 .../main/resources/beanInjection-setter.xml | 0 .../src/main/resources/jdbc/schema.sql | 0 .../main/resources/jdbc/springJdbc-config.xml | 0 .../src/main/resources/jdbc/test-data.sql | 0 .../src/main/resources/log4j2.properties | 0 .../src/main/resources/logback.xml | 0 .../src/main/resources/scopes.xml | 0 .../main/resources/springProfiles-config.xml | 0 .../src/main/resources/startupConfig.xml | 0 .../sample/FooServiceIntegrationTest.java | 0 ...njectionWithJavaConfigIntegrationTest.java | 0 ...InjectionWithXMLConfigIntegrationTest.java | 0 ...njectionWithJavaConfigIntegrationTest.java | 0 ...InjectionWithXMLConfigIntegrationTest.java | 0 .../baeldung/customannotation/Account.java | 0 .../customannotation/BeanWithGenericDAO.java | 0 .../DataAccessAnnotationIntegrationTest.java | 0 ...ataAccessFieldCallbackIntegrationTest.java | 0 .../org/baeldung/customannotation/Person.java | 0 .../TenantScopeIntegrationTest.java | 0 .../order/RatingRetrieverUnitTest.java | 74 +++--- ...vProfileWithAnnotationIntegrationTest.java | 0 ...nProfileWithAnnotationIntegrationTest.java | 0 ...lesWithMavenPropertiesIntegrationTest.java | 0 .../SpringProfilesWithXMLIntegrationTest.java | 0 .../scopes/ScopesIntegrationTest.java | 0 .../simple/SimpleCLIIntegrationTest.java | 0 ...nousCustomSpringEventsIntegrationTest.java | 0 ...ntextRefreshedListenerIntegrationTest.java | 0 ...enericAppEventListenerIntegrationTest.java | 0 ...nousCustomSpringEventsIntegrationTest.java | 0 .../startup/SpringStartupIntegrationTest.java | 0 ...SpringStartupXMLConfigIntegrationTest.java | 0 .../src/test/resources/.gitignore | 0 spring-core-3/README.md | 3 + spring-core-3/pom.xml | 60 +++++ .../baeldung/getbean/AnnotationConfig.java | 0 .../main/java/com/baeldung/getbean/Lion.java | 0 .../main/java/com/baeldung/getbean/Tiger.java | 0 .../getbean/GetBeanByNameAndTypeUnitTest.java | 0 .../getbean/GetBeanByNameUnitTest.java | 0 ...NameWithConstructorParametersUnitTest.java | 0 .../getbean/GetBeanByTypeUnitTest.java | 0 ...TypeWithConstructorParametersUnitTest.java | 0 136 files changed, 366 insertions(+), 367 deletions(-) delete mode 100644 spring-all/README.md delete mode 100644 spring-all/pom.xml rename {spring-all => spring-core-2}/.gitignore (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/autowire/sample/App.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/autowire/sample/AppConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/autowire/sample/BarFormatter.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/autowire/sample/FooDAO.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/autowire/sample/FooFormatter.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/autowire/sample/FooService.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/autowire/sample/Formatter.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/autowire/sample/FormatterType.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/bean/config/ConstructorBasedShipConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/bean/config/SetterBasedShipConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/bean/injection/Helm.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/bean/injection/Ship.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customannotation/CustomAnnotationConfiguration.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customannotation/DataAccess.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customannotation/DataAccessAnnotationProcessor.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customannotation/DataAccessFieldCallback.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customannotation/GenericDAO.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customscope/TenantBean.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customscope/TenantBeanFactoryPostProcessor.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customscope/TenantBeansConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customscope/TenantScope.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/customscope/TenantScopeConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/nullibility/Person.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/nullibility/package-info.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/order/Average.java (95%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/order/Excellent.java (94%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/order/Good.java (94%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/order/Rating.java (93%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/persistence/Setup.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/primary/Config.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/primary/DepartmentManager.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/primary/Employee.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/primary/GeneralManager.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/primary/Manager.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/primary/ManagerService.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/primary/PrimaryApplication.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/profiles/DatasourceConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/profiles/DevDatasourceConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/profiles/ProductionDatasourceConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/profiles/ProfileManager.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/profiles/SpringProfilesConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/sample/Bar.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/sample/Foo.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/sampleabstract/BallService.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/sampleabstract/BasketballService.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/sampleabstract/DemoApp.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/sampleabstract/LogRepository.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/sampleabstract/RuleRepository.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/scopes/HelloMessageGenerator.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/scopes/Person.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/scopes/ScopesController.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/shell/Main.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/shell/simple/SimpleCLI.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/spring/config/CleanupBean.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/spring/config/CoreConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/spring/config/MainWebAppInitializer.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/spring/config/MvcConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/spring/config/PersistenceConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/spring/config/ScopesConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/asynchronous/AsynchronousSpringEventsConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEvent.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventListener.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/springevents/synchronous/SynchronousSpringEventsConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/startup/AllStrategiesExampleBean.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/startup/EventListenerExampleBean.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/startup/InitMethodExampleBean.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/startup/InitializingBeanExampleBean.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/startup/InvalidInitExampleBean.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/startup/LogicInConstructorExampleBean.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/startup/PostConstructExampleBean.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/startup/SpringStartupConfig.java (100%) rename {spring-all => spring-core-2}/src/main/java/org/baeldung/startup/StartupApplicationListenerExample.java (100%) rename {spring-all => spring-core-2}/src/main/resources/META-INF/spring/spring-shell-plugin.xml (100%) rename {spring-all => spring-core-2}/src/main/resources/application.properties (100%) rename {spring-all => spring-core-2}/src/main/resources/beanInjection-constructor.xml (100%) rename {spring-all => spring-core-2}/src/main/resources/beanInjection-setter.xml (100%) rename {spring-all => spring-core-2}/src/main/resources/jdbc/schema.sql (100%) rename {spring-all => spring-core-2}/src/main/resources/jdbc/springJdbc-config.xml (100%) rename {spring-all => spring-core-2}/src/main/resources/jdbc/test-data.sql (100%) rename {spring-all => spring-core-2}/src/main/resources/log4j2.properties (100%) rename {spring-all => spring-core-2}/src/main/resources/logback.xml (100%) rename {spring-all => spring-core-2}/src/main/resources/scopes.xml (100%) rename {spring-all => spring-core-2}/src/main/resources/springProfiles-config.xml (100%) rename {spring-all => spring-core-2}/src/main/resources/startupConfig.xml (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/autowire/sample/FooServiceIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithJavaConfigIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithXMLConfigIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithJavaConfigIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithXMLConfigIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/customannotation/Account.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/customannotation/BeanWithGenericDAO.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/customannotation/DataAccessAnnotationIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/customannotation/DataAccessFieldCallbackIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/customannotation/Person.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/customscope/TenantScopeIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/order/RatingRetrieverUnitTest.java (97%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/profiles/DevProfileWithAnnotationIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/profiles/ProductionProfileWithAnnotationIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/profiles/SpringProfilesWithXMLIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/scopes/ScopesIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/springevents/asynchronous/AsynchronousCustomSpringEventsIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/startup/SpringStartupIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/java/org/baeldung/startup/SpringStartupXMLConfigIntegrationTest.java (100%) rename {spring-all => spring-core-2}/src/test/resources/.gitignore (100%) create mode 100644 spring-core-3/README.md create mode 100644 spring-core-3/pom.xml rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/getbean/AnnotationConfig.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/getbean/Lion.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/getbean/Tiger.java (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java (100%) diff --git a/spring-all/README.md b/spring-all/README.md deleted file mode 100644 index 3ee610f370..0000000000 --- a/spring-all/README.md +++ /dev/null @@ -1,24 +0,0 @@ -========= - -## Spring General Example Project - -This project is used to replicate Spring Exceptions only. - -### The Course - -The "REST With Spring" Classes: http://bit.ly/restwithspring - -### Relevant articles: - -- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) -- [Spring Profiles](http://www.baeldung.com/spring-profiles) -- [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor) -- [Running Setup Data on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring) -- [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) -- [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) -- [A CLI with Spring Shell](http://www.baeldung.com/spring-shell-cli) -- [@Order in Spring](http://www.baeldung.com/spring-order) -- [Spring @Primary Annotation](http://www.baeldung.com/spring-primary) -- [Spring Events](https://www.baeldung.com/spring-events) -- [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) -- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) \ No newline at end of file diff --git a/spring-all/pom.xml b/spring-all/pom.xml deleted file mode 100644 index bb6169085e..0000000000 --- a/spring-all/pom.xml +++ /dev/null @@ -1,235 +0,0 @@ - - 4.0.0 - spring-all - 0.1-SNAPSHOT - spring-all - war - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - com.fasterxml.jackson.core - jackson-databind - - - - org.springframework - spring-web - - - org.springframework - spring-webmvc - - - org.springframework - spring-orm - - - org.springframework - spring-context - - - org.springframework.retry - spring-retry - - - org.springframework.shell - spring-shell - ${org.springframework.shell.version} - - - org.springframework - spring-websocket - - - org.springframework - spring-messaging - - - javax.annotation - javax.annotation-api - ${annotation-api.version} - - - - org.springframework - spring-aspects - - - - org.hibernate - hibernate-core - - - org.javassist - javassist - ${javassist.version} - - - mysql - mysql-connector-java - runtime - - - org.hsqldb - hsqldb - - - - org.hibernate - hibernate-validator - ${hibernate.version} - - - - javax.servlet - javax.servlet-api - provided - - - javax.servlet - jstl - runtime - - - - com.google.guava - guava - ${guava.version} - - - net.sf.jasperreports - jasperreports - ${jasperreports.version} - - - commons-logging - commons-logging - - - - - - org.springframework - spring-test - test - - - org.assertj - assertj-core - test - - - org.hamcrest - hamcrest-core - test - - - org.hamcrest - hamcrest-library - test - - - org.mockito - mockito-core - test - - - - - net.javacrumbs.shedlock - shedlock-spring - ${shedlock.version} - - - net.javacrumbs.shedlock - shedlock-provider-jdbc-template - ${shedlock.version} - - - - - - - org.springframework - spring-framework-bom - ${org.springframework.version} - pom - import - - - org.springframework - spring-core - ${org.springframework.version} - - - org.springframework.boot - spring-boot-starter-thymeleaf - ${org.springframework.version} - - - - - - spring-all - - - src/main/resources - true - - - - - org.apache.maven.plugins - maven-war-plugin - 3.2.2 - - false - - - - - - - dev - - true - - - dev - - - - prod - - prod - - - - - - org.baeldung.sample.App - - 5.0.6.RELEASE - 1.2.0.RELEASE - 1.3.2 - - 5.2.5.Final - - - 25.1-jre - 3.6 - 3.6.1 - 6.6.0 - 2.1.0 - 3.22.0-GA - - - diff --git a/spring-all/.gitignore b/spring-core-2/.gitignore similarity index 100% rename from spring-all/.gitignore rename to spring-core-2/.gitignore diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 4c9e3b9ddf..d346943ac4 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -1,3 +1,23 @@ -## Relevant Articles: +========= -- [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean) +## Spring General Example Project + +This project is used to replicate Spring Exceptions only. + +### The Course + +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant articles: + +- [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) +- [Spring Profiles](http://www.baeldung.com/spring-profiles) +- [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor) +- [Running Setup Data on Startup in Spring](http://www.baeldung.com/running-setup-logic-on-startup-in-spring) +- [Quick Guide to Spring Bean Scopes](http://www.baeldung.com/spring-bean-scopes) +- [Custom Scope in Spring](http://www.baeldung.com/spring-custom-scope) +- [@Order in Spring](http://www.baeldung.com/spring-order) +- [Spring @Primary Annotation](http://www.baeldung.com/spring-primary) +- [Spring Events](https://www.baeldung.com/spring-events) +- [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) +- [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) \ No newline at end of file diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index d68beda64a..f4132bfb35 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -1,60 +1,235 @@ - - 4.0.0 spring-core-2 + 0.1-SNAPSHOT spring-core-2 + war + parent-boot-2 com.baeldung - parent-spring-5 0.0.1-SNAPSHOT - ../parent-spring-5 + ../parent-boot-2 + + com.fasterxml.jackson.core + jackson-databind + + org.springframework - spring-beans - ${spring.version} + spring-web + + + org.springframework + spring-webmvc + + + org.springframework + spring-orm org.springframework spring-context - ${spring.version} + + + org.springframework.retry + spring-retry + + + org.springframework.shell + spring-shell + ${org.springframework.shell.version} org.springframework - spring-core - ${spring.version} + spring-websocket - org.junit.jupiter - junit-jupiter-engine - ${junit-jupiter.version} + org.springframework + spring-messaging + + + javax.annotation + javax.annotation-api + ${annotation-api.version} + + + + org.springframework + spring-aspects + + + + org.hibernate + hibernate-core + + + org.javassist + javassist + ${javassist.version} + + + mysql + mysql-connector-java + runtime + + + org.hsqldb + hsqldb + + + + org.hibernate + hibernate-validator + ${hibernate.version} + + + + javax.servlet + javax.servlet-api + provided + + + javax.servlet + jstl + runtime + + + + com.google.guava + guava + ${guava.version} + + + net.sf.jasperreports + jasperreports + ${jasperreports.version} + + + commons-logging + commons-logging + + + + + + org.springframework + spring-test test - org.junit.jupiter - junit-jupiter-api - ${junit-jupiter.version} + org.assertj + assertj-core test + + org.hamcrest + hamcrest-core + test + + + org.hamcrest + hamcrest-library + test + + + org.mockito + mockito-core + test + + + + + net.javacrumbs.shedlock + shedlock-spring + ${shedlock.version} + + + net.javacrumbs.shedlock + shedlock-provider-jdbc-template + ${shedlock.version} + + + + + org.springframework + spring-framework-bom + ${org.springframework.version} + pom + import + + + org.springframework + spring-core + ${org.springframework.version} + + + org.springframework.boot + spring-boot-starter-thymeleaf + ${org.springframework.version} + + + + + spring-all + + + src/main/resources + true + + org.apache.maven.plugins - maven-surefire-plugin - ${maven.surefire.version} + maven-war-plugin + 3.2.2 + + false + + + + dev + + true + + + dev + + + + prod + + prod + + + - 2.22.1 + org.baeldung.sample.App + + 5.0.6.RELEASE + 1.2.0.RELEASE + 1.3.2 + + 5.2.5.Final + + + 25.1-jre + 3.6 + 3.6.1 + 6.6.0 + 2.1.0 + 3.22.0-GA - \ No newline at end of file + diff --git a/spring-all/src/main/java/org/baeldung/autowire/sample/App.java b/spring-core-2/src/main/java/org/baeldung/autowire/sample/App.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/autowire/sample/App.java rename to spring-core-2/src/main/java/org/baeldung/autowire/sample/App.java diff --git a/spring-all/src/main/java/org/baeldung/autowire/sample/AppConfig.java b/spring-core-2/src/main/java/org/baeldung/autowire/sample/AppConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/autowire/sample/AppConfig.java rename to spring-core-2/src/main/java/org/baeldung/autowire/sample/AppConfig.java diff --git a/spring-all/src/main/java/org/baeldung/autowire/sample/BarFormatter.java b/spring-core-2/src/main/java/org/baeldung/autowire/sample/BarFormatter.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/autowire/sample/BarFormatter.java rename to spring-core-2/src/main/java/org/baeldung/autowire/sample/BarFormatter.java diff --git a/spring-all/src/main/java/org/baeldung/autowire/sample/FooDAO.java b/spring-core-2/src/main/java/org/baeldung/autowire/sample/FooDAO.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/autowire/sample/FooDAO.java rename to spring-core-2/src/main/java/org/baeldung/autowire/sample/FooDAO.java diff --git a/spring-all/src/main/java/org/baeldung/autowire/sample/FooFormatter.java b/spring-core-2/src/main/java/org/baeldung/autowire/sample/FooFormatter.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/autowire/sample/FooFormatter.java rename to spring-core-2/src/main/java/org/baeldung/autowire/sample/FooFormatter.java diff --git a/spring-all/src/main/java/org/baeldung/autowire/sample/FooService.java b/spring-core-2/src/main/java/org/baeldung/autowire/sample/FooService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/autowire/sample/FooService.java rename to spring-core-2/src/main/java/org/baeldung/autowire/sample/FooService.java diff --git a/spring-all/src/main/java/org/baeldung/autowire/sample/Formatter.java b/spring-core-2/src/main/java/org/baeldung/autowire/sample/Formatter.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/autowire/sample/Formatter.java rename to spring-core-2/src/main/java/org/baeldung/autowire/sample/Formatter.java diff --git a/spring-all/src/main/java/org/baeldung/autowire/sample/FormatterType.java b/spring-core-2/src/main/java/org/baeldung/autowire/sample/FormatterType.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/autowire/sample/FormatterType.java rename to spring-core-2/src/main/java/org/baeldung/autowire/sample/FormatterType.java diff --git a/spring-all/src/main/java/org/baeldung/bean/config/ConstructorBasedShipConfig.java b/spring-core-2/src/main/java/org/baeldung/bean/config/ConstructorBasedShipConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/bean/config/ConstructorBasedShipConfig.java rename to spring-core-2/src/main/java/org/baeldung/bean/config/ConstructorBasedShipConfig.java diff --git a/spring-all/src/main/java/org/baeldung/bean/config/SetterBasedShipConfig.java b/spring-core-2/src/main/java/org/baeldung/bean/config/SetterBasedShipConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/bean/config/SetterBasedShipConfig.java rename to spring-core-2/src/main/java/org/baeldung/bean/config/SetterBasedShipConfig.java diff --git a/spring-all/src/main/java/org/baeldung/bean/injection/Helm.java b/spring-core-2/src/main/java/org/baeldung/bean/injection/Helm.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/bean/injection/Helm.java rename to spring-core-2/src/main/java/org/baeldung/bean/injection/Helm.java diff --git a/spring-all/src/main/java/org/baeldung/bean/injection/Ship.java b/spring-core-2/src/main/java/org/baeldung/bean/injection/Ship.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/bean/injection/Ship.java rename to spring-core-2/src/main/java/org/baeldung/bean/injection/Ship.java diff --git a/spring-all/src/main/java/org/baeldung/customannotation/CustomAnnotationConfiguration.java b/spring-core-2/src/main/java/org/baeldung/customannotation/CustomAnnotationConfiguration.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customannotation/CustomAnnotationConfiguration.java rename to spring-core-2/src/main/java/org/baeldung/customannotation/CustomAnnotationConfiguration.java diff --git a/spring-all/src/main/java/org/baeldung/customannotation/DataAccess.java b/spring-core-2/src/main/java/org/baeldung/customannotation/DataAccess.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customannotation/DataAccess.java rename to spring-core-2/src/main/java/org/baeldung/customannotation/DataAccess.java diff --git a/spring-all/src/main/java/org/baeldung/customannotation/DataAccessAnnotationProcessor.java b/spring-core-2/src/main/java/org/baeldung/customannotation/DataAccessAnnotationProcessor.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customannotation/DataAccessAnnotationProcessor.java rename to spring-core-2/src/main/java/org/baeldung/customannotation/DataAccessAnnotationProcessor.java diff --git a/spring-all/src/main/java/org/baeldung/customannotation/DataAccessFieldCallback.java b/spring-core-2/src/main/java/org/baeldung/customannotation/DataAccessFieldCallback.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customannotation/DataAccessFieldCallback.java rename to spring-core-2/src/main/java/org/baeldung/customannotation/DataAccessFieldCallback.java diff --git a/spring-all/src/main/java/org/baeldung/customannotation/GenericDAO.java b/spring-core-2/src/main/java/org/baeldung/customannotation/GenericDAO.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customannotation/GenericDAO.java rename to spring-core-2/src/main/java/org/baeldung/customannotation/GenericDAO.java diff --git a/spring-all/src/main/java/org/baeldung/customscope/TenantBean.java b/spring-core-2/src/main/java/org/baeldung/customscope/TenantBean.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customscope/TenantBean.java rename to spring-core-2/src/main/java/org/baeldung/customscope/TenantBean.java diff --git a/spring-all/src/main/java/org/baeldung/customscope/TenantBeanFactoryPostProcessor.java b/spring-core-2/src/main/java/org/baeldung/customscope/TenantBeanFactoryPostProcessor.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customscope/TenantBeanFactoryPostProcessor.java rename to spring-core-2/src/main/java/org/baeldung/customscope/TenantBeanFactoryPostProcessor.java diff --git a/spring-all/src/main/java/org/baeldung/customscope/TenantBeansConfig.java b/spring-core-2/src/main/java/org/baeldung/customscope/TenantBeansConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customscope/TenantBeansConfig.java rename to spring-core-2/src/main/java/org/baeldung/customscope/TenantBeansConfig.java diff --git a/spring-all/src/main/java/org/baeldung/customscope/TenantScope.java b/spring-core-2/src/main/java/org/baeldung/customscope/TenantScope.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customscope/TenantScope.java rename to spring-core-2/src/main/java/org/baeldung/customscope/TenantScope.java diff --git a/spring-all/src/main/java/org/baeldung/customscope/TenantScopeConfig.java b/spring-core-2/src/main/java/org/baeldung/customscope/TenantScopeConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/customscope/TenantScopeConfig.java rename to spring-core-2/src/main/java/org/baeldung/customscope/TenantScopeConfig.java diff --git a/spring-all/src/main/java/org/baeldung/nullibility/Person.java b/spring-core-2/src/main/java/org/baeldung/nullibility/Person.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/nullibility/Person.java rename to spring-core-2/src/main/java/org/baeldung/nullibility/Person.java diff --git a/spring-all/src/main/java/org/baeldung/nullibility/package-info.java b/spring-core-2/src/main/java/org/baeldung/nullibility/package-info.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/nullibility/package-info.java rename to spring-core-2/src/main/java/org/baeldung/nullibility/package-info.java diff --git a/spring-all/src/main/java/org/baeldung/order/Average.java b/spring-core-2/src/main/java/org/baeldung/order/Average.java similarity index 95% rename from spring-all/src/main/java/org/baeldung/order/Average.java rename to spring-core-2/src/main/java/org/baeldung/order/Average.java index d1d9117fb1..3deffaf1ae 100644 --- a/spring-all/src/main/java/org/baeldung/order/Average.java +++ b/spring-core-2/src/main/java/org/baeldung/order/Average.java @@ -1,15 +1,15 @@ -package org.baeldung.order; - -import org.springframework.core.Ordered; -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -@Component -@Order(Ordered.LOWEST_PRECEDENCE) -public class Average implements Rating { - - @Override - public int getRating() { - return 3; - } -} +package org.baeldung.order; + +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(Ordered.LOWEST_PRECEDENCE) +public class Average implements Rating { + + @Override + public int getRating() { + return 3; + } +} diff --git a/spring-all/src/main/java/org/baeldung/order/Excellent.java b/spring-core-2/src/main/java/org/baeldung/order/Excellent.java similarity index 94% rename from spring-all/src/main/java/org/baeldung/order/Excellent.java rename to spring-core-2/src/main/java/org/baeldung/order/Excellent.java index e5f125593f..96fea4ac9b 100644 --- a/spring-all/src/main/java/org/baeldung/order/Excellent.java +++ b/spring-core-2/src/main/java/org/baeldung/order/Excellent.java @@ -1,14 +1,14 @@ -package org.baeldung.order; - -import org.springframework.stereotype.Component; -import org.springframework.core.annotation.Order; - -@Component -@Order(1) -public class Excellent implements Rating { - - @Override - public int getRating() { - return 1; - } -} +package org.baeldung.order; + +import org.springframework.stereotype.Component; +import org.springframework.core.annotation.Order; + +@Component +@Order(1) +public class Excellent implements Rating { + + @Override + public int getRating() { + return 1; + } +} diff --git a/spring-all/src/main/java/org/baeldung/order/Good.java b/spring-core-2/src/main/java/org/baeldung/order/Good.java similarity index 94% rename from spring-all/src/main/java/org/baeldung/order/Good.java rename to spring-core-2/src/main/java/org/baeldung/order/Good.java index 3dd9852cc4..4b3e268504 100644 --- a/spring-all/src/main/java/org/baeldung/order/Good.java +++ b/spring-core-2/src/main/java/org/baeldung/order/Good.java @@ -1,14 +1,14 @@ -package org.baeldung.order; - -import org.springframework.core.annotation.Order; -import org.springframework.stereotype.Component; - -@Component -@Order(2) -public class Good implements Rating { - - @Override - public int getRating() { - return 2; - } -} +package org.baeldung.order; + +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +@Order(2) +public class Good implements Rating { + + @Override + public int getRating() { + return 2; + } +} diff --git a/spring-all/src/main/java/org/baeldung/order/Rating.java b/spring-core-2/src/main/java/org/baeldung/order/Rating.java similarity index 93% rename from spring-all/src/main/java/org/baeldung/order/Rating.java rename to spring-core-2/src/main/java/org/baeldung/order/Rating.java index dd0391a3d9..10f2780522 100644 --- a/spring-all/src/main/java/org/baeldung/order/Rating.java +++ b/spring-core-2/src/main/java/org/baeldung/order/Rating.java @@ -1,6 +1,6 @@ -package org.baeldung.order; - -public interface Rating { - - int getRating(); -} +package org.baeldung.order; + +public interface Rating { + + int getRating(); +} diff --git a/spring-all/src/main/java/org/baeldung/persistence/Setup.java b/spring-core-2/src/main/java/org/baeldung/persistence/Setup.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/persistence/Setup.java rename to spring-core-2/src/main/java/org/baeldung/persistence/Setup.java diff --git a/spring-all/src/main/java/org/baeldung/primary/Config.java b/spring-core-2/src/main/java/org/baeldung/primary/Config.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/primary/Config.java rename to spring-core-2/src/main/java/org/baeldung/primary/Config.java diff --git a/spring-all/src/main/java/org/baeldung/primary/DepartmentManager.java b/spring-core-2/src/main/java/org/baeldung/primary/DepartmentManager.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/primary/DepartmentManager.java rename to spring-core-2/src/main/java/org/baeldung/primary/DepartmentManager.java diff --git a/spring-all/src/main/java/org/baeldung/primary/Employee.java b/spring-core-2/src/main/java/org/baeldung/primary/Employee.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/primary/Employee.java rename to spring-core-2/src/main/java/org/baeldung/primary/Employee.java diff --git a/spring-all/src/main/java/org/baeldung/primary/GeneralManager.java b/spring-core-2/src/main/java/org/baeldung/primary/GeneralManager.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/primary/GeneralManager.java rename to spring-core-2/src/main/java/org/baeldung/primary/GeneralManager.java diff --git a/spring-all/src/main/java/org/baeldung/primary/Manager.java b/spring-core-2/src/main/java/org/baeldung/primary/Manager.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/primary/Manager.java rename to spring-core-2/src/main/java/org/baeldung/primary/Manager.java diff --git a/spring-all/src/main/java/org/baeldung/primary/ManagerService.java b/spring-core-2/src/main/java/org/baeldung/primary/ManagerService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/primary/ManagerService.java rename to spring-core-2/src/main/java/org/baeldung/primary/ManagerService.java diff --git a/spring-all/src/main/java/org/baeldung/primary/PrimaryApplication.java b/spring-core-2/src/main/java/org/baeldung/primary/PrimaryApplication.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/primary/PrimaryApplication.java rename to spring-core-2/src/main/java/org/baeldung/primary/PrimaryApplication.java diff --git a/spring-all/src/main/java/org/baeldung/profiles/DatasourceConfig.java b/spring-core-2/src/main/java/org/baeldung/profiles/DatasourceConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/profiles/DatasourceConfig.java rename to spring-core-2/src/main/java/org/baeldung/profiles/DatasourceConfig.java diff --git a/spring-all/src/main/java/org/baeldung/profiles/DevDatasourceConfig.java b/spring-core-2/src/main/java/org/baeldung/profiles/DevDatasourceConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/profiles/DevDatasourceConfig.java rename to spring-core-2/src/main/java/org/baeldung/profiles/DevDatasourceConfig.java diff --git a/spring-all/src/main/java/org/baeldung/profiles/ProductionDatasourceConfig.java b/spring-core-2/src/main/java/org/baeldung/profiles/ProductionDatasourceConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/profiles/ProductionDatasourceConfig.java rename to spring-core-2/src/main/java/org/baeldung/profiles/ProductionDatasourceConfig.java diff --git a/spring-all/src/main/java/org/baeldung/profiles/ProfileManager.java b/spring-core-2/src/main/java/org/baeldung/profiles/ProfileManager.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/profiles/ProfileManager.java rename to spring-core-2/src/main/java/org/baeldung/profiles/ProfileManager.java diff --git a/spring-all/src/main/java/org/baeldung/profiles/SpringProfilesConfig.java b/spring-core-2/src/main/java/org/baeldung/profiles/SpringProfilesConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/profiles/SpringProfilesConfig.java rename to spring-core-2/src/main/java/org/baeldung/profiles/SpringProfilesConfig.java diff --git a/spring-all/src/main/java/org/baeldung/sample/Bar.java b/spring-core-2/src/main/java/org/baeldung/sample/Bar.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/sample/Bar.java rename to spring-core-2/src/main/java/org/baeldung/sample/Bar.java diff --git a/spring-all/src/main/java/org/baeldung/sample/Foo.java b/spring-core-2/src/main/java/org/baeldung/sample/Foo.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/sample/Foo.java rename to spring-core-2/src/main/java/org/baeldung/sample/Foo.java diff --git a/spring-all/src/main/java/org/baeldung/sampleabstract/BallService.java b/spring-core-2/src/main/java/org/baeldung/sampleabstract/BallService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/sampleabstract/BallService.java rename to spring-core-2/src/main/java/org/baeldung/sampleabstract/BallService.java diff --git a/spring-all/src/main/java/org/baeldung/sampleabstract/BasketballService.java b/spring-core-2/src/main/java/org/baeldung/sampleabstract/BasketballService.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/sampleabstract/BasketballService.java rename to spring-core-2/src/main/java/org/baeldung/sampleabstract/BasketballService.java diff --git a/spring-all/src/main/java/org/baeldung/sampleabstract/DemoApp.java b/spring-core-2/src/main/java/org/baeldung/sampleabstract/DemoApp.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/sampleabstract/DemoApp.java rename to spring-core-2/src/main/java/org/baeldung/sampleabstract/DemoApp.java diff --git a/spring-all/src/main/java/org/baeldung/sampleabstract/LogRepository.java b/spring-core-2/src/main/java/org/baeldung/sampleabstract/LogRepository.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/sampleabstract/LogRepository.java rename to spring-core-2/src/main/java/org/baeldung/sampleabstract/LogRepository.java diff --git a/spring-all/src/main/java/org/baeldung/sampleabstract/RuleRepository.java b/spring-core-2/src/main/java/org/baeldung/sampleabstract/RuleRepository.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/sampleabstract/RuleRepository.java rename to spring-core-2/src/main/java/org/baeldung/sampleabstract/RuleRepository.java diff --git a/spring-all/src/main/java/org/baeldung/scopes/HelloMessageGenerator.java b/spring-core-2/src/main/java/org/baeldung/scopes/HelloMessageGenerator.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scopes/HelloMessageGenerator.java rename to spring-core-2/src/main/java/org/baeldung/scopes/HelloMessageGenerator.java diff --git a/spring-all/src/main/java/org/baeldung/scopes/Person.java b/spring-core-2/src/main/java/org/baeldung/scopes/Person.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scopes/Person.java rename to spring-core-2/src/main/java/org/baeldung/scopes/Person.java diff --git a/spring-all/src/main/java/org/baeldung/scopes/ScopesController.java b/spring-core-2/src/main/java/org/baeldung/scopes/ScopesController.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scopes/ScopesController.java rename to spring-core-2/src/main/java/org/baeldung/scopes/ScopesController.java diff --git a/spring-all/src/main/java/org/baeldung/shell/Main.java b/spring-core-2/src/main/java/org/baeldung/shell/Main.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/shell/Main.java rename to spring-core-2/src/main/java/org/baeldung/shell/Main.java diff --git a/spring-all/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java b/spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java rename to spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java diff --git a/spring-all/src/main/java/org/baeldung/shell/simple/SimpleCLI.java b/spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleCLI.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/shell/simple/SimpleCLI.java rename to spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleCLI.java diff --git a/spring-all/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java b/spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java rename to spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java diff --git a/spring-all/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java b/spring-core-2/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java rename to spring-core-2/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java diff --git a/spring-all/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java b/spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java rename to spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java diff --git a/spring-all/src/main/java/org/baeldung/spring/config/CleanupBean.java b/spring-core-2/src/main/java/org/baeldung/spring/config/CleanupBean.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring/config/CleanupBean.java rename to spring-core-2/src/main/java/org/baeldung/spring/config/CleanupBean.java diff --git a/spring-all/src/main/java/org/baeldung/spring/config/CoreConfig.java b/spring-core-2/src/main/java/org/baeldung/spring/config/CoreConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring/config/CoreConfig.java rename to spring-core-2/src/main/java/org/baeldung/spring/config/CoreConfig.java diff --git a/spring-all/src/main/java/org/baeldung/spring/config/MainWebAppInitializer.java b/spring-core-2/src/main/java/org/baeldung/spring/config/MainWebAppInitializer.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring/config/MainWebAppInitializer.java rename to spring-core-2/src/main/java/org/baeldung/spring/config/MainWebAppInitializer.java diff --git a/spring-all/src/main/java/org/baeldung/spring/config/MvcConfig.java b/spring-core-2/src/main/java/org/baeldung/spring/config/MvcConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring/config/MvcConfig.java rename to spring-core-2/src/main/java/org/baeldung/spring/config/MvcConfig.java diff --git a/spring-all/src/main/java/org/baeldung/spring/config/PersistenceConfig.java b/spring-core-2/src/main/java/org/baeldung/spring/config/PersistenceConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring/config/PersistenceConfig.java rename to spring-core-2/src/main/java/org/baeldung/spring/config/PersistenceConfig.java diff --git a/spring-all/src/main/java/org/baeldung/spring/config/ScopesConfig.java b/spring-core-2/src/main/java/org/baeldung/spring/config/ScopesConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/spring/config/ScopesConfig.java rename to spring-core-2/src/main/java/org/baeldung/spring/config/ScopesConfig.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/asynchronous/AsynchronousSpringEventsConfig.java b/spring-core-2/src/main/java/org/baeldung/springevents/asynchronous/AsynchronousSpringEventsConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/asynchronous/AsynchronousSpringEventsConfig.java rename to spring-core-2/src/main/java/org/baeldung/springevents/asynchronous/AsynchronousSpringEventsConfig.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/AnnotationDrivenEventListener.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/ContextRefreshedListener.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEvent.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEvent.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEvent.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEvent.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventListener.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventListener.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventListener.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventListener.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/CustomSpringEventPublisher.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericSpringAppEvent.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEvent.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericSpringEventListener.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringAppEvent.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/GenericStringSpringEvent.java diff --git a/spring-all/src/main/java/org/baeldung/springevents/synchronous/SynchronousSpringEventsConfig.java b/spring-core-2/src/main/java/org/baeldung/springevents/synchronous/SynchronousSpringEventsConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/springevents/synchronous/SynchronousSpringEventsConfig.java rename to spring-core-2/src/main/java/org/baeldung/springevents/synchronous/SynchronousSpringEventsConfig.java diff --git a/spring-all/src/main/java/org/baeldung/startup/AllStrategiesExampleBean.java b/spring-core-2/src/main/java/org/baeldung/startup/AllStrategiesExampleBean.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/startup/AllStrategiesExampleBean.java rename to spring-core-2/src/main/java/org/baeldung/startup/AllStrategiesExampleBean.java diff --git a/spring-all/src/main/java/org/baeldung/startup/EventListenerExampleBean.java b/spring-core-2/src/main/java/org/baeldung/startup/EventListenerExampleBean.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/startup/EventListenerExampleBean.java rename to spring-core-2/src/main/java/org/baeldung/startup/EventListenerExampleBean.java diff --git a/spring-all/src/main/java/org/baeldung/startup/InitMethodExampleBean.java b/spring-core-2/src/main/java/org/baeldung/startup/InitMethodExampleBean.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/startup/InitMethodExampleBean.java rename to spring-core-2/src/main/java/org/baeldung/startup/InitMethodExampleBean.java diff --git a/spring-all/src/main/java/org/baeldung/startup/InitializingBeanExampleBean.java b/spring-core-2/src/main/java/org/baeldung/startup/InitializingBeanExampleBean.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/startup/InitializingBeanExampleBean.java rename to spring-core-2/src/main/java/org/baeldung/startup/InitializingBeanExampleBean.java diff --git a/spring-all/src/main/java/org/baeldung/startup/InvalidInitExampleBean.java b/spring-core-2/src/main/java/org/baeldung/startup/InvalidInitExampleBean.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/startup/InvalidInitExampleBean.java rename to spring-core-2/src/main/java/org/baeldung/startup/InvalidInitExampleBean.java diff --git a/spring-all/src/main/java/org/baeldung/startup/LogicInConstructorExampleBean.java b/spring-core-2/src/main/java/org/baeldung/startup/LogicInConstructorExampleBean.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/startup/LogicInConstructorExampleBean.java rename to spring-core-2/src/main/java/org/baeldung/startup/LogicInConstructorExampleBean.java diff --git a/spring-all/src/main/java/org/baeldung/startup/PostConstructExampleBean.java b/spring-core-2/src/main/java/org/baeldung/startup/PostConstructExampleBean.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/startup/PostConstructExampleBean.java rename to spring-core-2/src/main/java/org/baeldung/startup/PostConstructExampleBean.java diff --git a/spring-all/src/main/java/org/baeldung/startup/SpringStartupConfig.java b/spring-core-2/src/main/java/org/baeldung/startup/SpringStartupConfig.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/startup/SpringStartupConfig.java rename to spring-core-2/src/main/java/org/baeldung/startup/SpringStartupConfig.java diff --git a/spring-all/src/main/java/org/baeldung/startup/StartupApplicationListenerExample.java b/spring-core-2/src/main/java/org/baeldung/startup/StartupApplicationListenerExample.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/startup/StartupApplicationListenerExample.java rename to spring-core-2/src/main/java/org/baeldung/startup/StartupApplicationListenerExample.java diff --git a/spring-all/src/main/resources/META-INF/spring/spring-shell-plugin.xml b/spring-core-2/src/main/resources/META-INF/spring/spring-shell-plugin.xml similarity index 100% rename from spring-all/src/main/resources/META-INF/spring/spring-shell-plugin.xml rename to spring-core-2/src/main/resources/META-INF/spring/spring-shell-plugin.xml diff --git a/spring-all/src/main/resources/application.properties b/spring-core-2/src/main/resources/application.properties similarity index 100% rename from spring-all/src/main/resources/application.properties rename to spring-core-2/src/main/resources/application.properties diff --git a/spring-all/src/main/resources/beanInjection-constructor.xml b/spring-core-2/src/main/resources/beanInjection-constructor.xml similarity index 100% rename from spring-all/src/main/resources/beanInjection-constructor.xml rename to spring-core-2/src/main/resources/beanInjection-constructor.xml diff --git a/spring-all/src/main/resources/beanInjection-setter.xml b/spring-core-2/src/main/resources/beanInjection-setter.xml similarity index 100% rename from spring-all/src/main/resources/beanInjection-setter.xml rename to spring-core-2/src/main/resources/beanInjection-setter.xml diff --git a/spring-all/src/main/resources/jdbc/schema.sql b/spring-core-2/src/main/resources/jdbc/schema.sql similarity index 100% rename from spring-all/src/main/resources/jdbc/schema.sql rename to spring-core-2/src/main/resources/jdbc/schema.sql diff --git a/spring-all/src/main/resources/jdbc/springJdbc-config.xml b/spring-core-2/src/main/resources/jdbc/springJdbc-config.xml similarity index 100% rename from spring-all/src/main/resources/jdbc/springJdbc-config.xml rename to spring-core-2/src/main/resources/jdbc/springJdbc-config.xml diff --git a/spring-all/src/main/resources/jdbc/test-data.sql b/spring-core-2/src/main/resources/jdbc/test-data.sql similarity index 100% rename from spring-all/src/main/resources/jdbc/test-data.sql rename to spring-core-2/src/main/resources/jdbc/test-data.sql diff --git a/spring-all/src/main/resources/log4j2.properties b/spring-core-2/src/main/resources/log4j2.properties similarity index 100% rename from spring-all/src/main/resources/log4j2.properties rename to spring-core-2/src/main/resources/log4j2.properties diff --git a/spring-all/src/main/resources/logback.xml b/spring-core-2/src/main/resources/logback.xml similarity index 100% rename from spring-all/src/main/resources/logback.xml rename to spring-core-2/src/main/resources/logback.xml diff --git a/spring-all/src/main/resources/scopes.xml b/spring-core-2/src/main/resources/scopes.xml similarity index 100% rename from spring-all/src/main/resources/scopes.xml rename to spring-core-2/src/main/resources/scopes.xml diff --git a/spring-all/src/main/resources/springProfiles-config.xml b/spring-core-2/src/main/resources/springProfiles-config.xml similarity index 100% rename from spring-all/src/main/resources/springProfiles-config.xml rename to spring-core-2/src/main/resources/springProfiles-config.xml diff --git a/spring-all/src/main/resources/startupConfig.xml b/spring-core-2/src/main/resources/startupConfig.xml similarity index 100% rename from spring-all/src/main/resources/startupConfig.xml rename to spring-core-2/src/main/resources/startupConfig.xml diff --git a/spring-all/src/test/java/org/baeldung/autowire/sample/FooServiceIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/autowire/sample/FooServiceIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/autowire/sample/FooServiceIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/autowire/sample/FooServiceIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithJavaConfigIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithJavaConfigIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithJavaConfigIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithJavaConfigIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithXMLConfigIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithXMLConfigIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithXMLConfigIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/bean/injection/ConstructorBasedBeanInjectionWithXMLConfigIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithJavaConfigIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithJavaConfigIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithJavaConfigIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithJavaConfigIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithXMLConfigIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithXMLConfigIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithXMLConfigIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/bean/injection/SetterBasedBeanInjectionWithXMLConfigIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/customannotation/Account.java b/spring-core-2/src/test/java/org/baeldung/customannotation/Account.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/customannotation/Account.java rename to spring-core-2/src/test/java/org/baeldung/customannotation/Account.java diff --git a/spring-all/src/test/java/org/baeldung/customannotation/BeanWithGenericDAO.java b/spring-core-2/src/test/java/org/baeldung/customannotation/BeanWithGenericDAO.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/customannotation/BeanWithGenericDAO.java rename to spring-core-2/src/test/java/org/baeldung/customannotation/BeanWithGenericDAO.java diff --git a/spring-all/src/test/java/org/baeldung/customannotation/DataAccessAnnotationIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/customannotation/DataAccessAnnotationIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/customannotation/DataAccessAnnotationIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/customannotation/DataAccessAnnotationIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/customannotation/DataAccessFieldCallbackIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/customannotation/DataAccessFieldCallbackIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/customannotation/DataAccessFieldCallbackIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/customannotation/DataAccessFieldCallbackIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/customannotation/Person.java b/spring-core-2/src/test/java/org/baeldung/customannotation/Person.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/customannotation/Person.java rename to spring-core-2/src/test/java/org/baeldung/customannotation/Person.java diff --git a/spring-all/src/test/java/org/baeldung/customscope/TenantScopeIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/customscope/TenantScopeIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/customscope/TenantScopeIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/customscope/TenantScopeIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/order/RatingRetrieverUnitTest.java b/spring-core-2/src/test/java/org/baeldung/order/RatingRetrieverUnitTest.java similarity index 97% rename from spring-all/src/test/java/org/baeldung/order/RatingRetrieverUnitTest.java rename to spring-core-2/src/test/java/org/baeldung/order/RatingRetrieverUnitTest.java index a624f757fc..96993ccd7c 100644 --- a/spring-all/src/test/java/org/baeldung/order/RatingRetrieverUnitTest.java +++ b/spring-core-2/src/test/java/org/baeldung/order/RatingRetrieverUnitTest.java @@ -1,37 +1,37 @@ -package org.baeldung.order; - - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.assertThat; - -import java.util.List; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader = AnnotationConfigContextLoader.class) -public class RatingRetrieverUnitTest { - - @Configuration - @ComponentScan(basePackages = {"org.baeldung.order"}) - static class ContextConfiguration {} - - @Autowired - private List ratings; - - @Test - public void givenOrderOnComponents_whenInjected_thenAutowireByOrderValue() { - assertThat(ratings.get(0).getRating(), is(equalTo(1))); - assertThat(ratings.get(1).getRating(), is(equalTo(2))); - assertThat(ratings.get(2).getRating(), is(equalTo(3))); - } - -} +package org.baeldung.order; + + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +import java.util.List; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; +import org.springframework.test.context.support.AnnotationConfigContextLoader; + +@RunWith(SpringJUnit4ClassRunner.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class) +public class RatingRetrieverUnitTest { + + @Configuration + @ComponentScan(basePackages = {"org.baeldung.order"}) + static class ContextConfiguration {} + + @Autowired + private List ratings; + + @Test + public void givenOrderOnComponents_whenInjected_thenAutowireByOrderValue() { + assertThat(ratings.get(0).getRating(), is(equalTo(1))); + assertThat(ratings.get(1).getRating(), is(equalTo(2))); + assertThat(ratings.get(2).getRating(), is(equalTo(3))); + } + +} diff --git a/spring-all/src/test/java/org/baeldung/profiles/DevProfileWithAnnotationIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/profiles/DevProfileWithAnnotationIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/profiles/DevProfileWithAnnotationIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/profiles/DevProfileWithAnnotationIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/profiles/ProductionProfileWithAnnotationIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/profiles/ProductionProfileWithAnnotationIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/profiles/ProductionProfileWithAnnotationIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/profiles/ProductionProfileWithAnnotationIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/profiles/SpringProfilesWithMavenPropertiesIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/profiles/SpringProfilesWithXMLIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/profiles/SpringProfilesWithXMLIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/profiles/SpringProfilesWithXMLIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/profiles/SpringProfilesWithXMLIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/scopes/ScopesIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/scopes/ScopesIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/scopes/ScopesIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/scopes/ScopesIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/springevents/asynchronous/AsynchronousCustomSpringEventsIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/springevents/asynchronous/AsynchronousCustomSpringEventsIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/springevents/asynchronous/AsynchronousCustomSpringEventsIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/springevents/asynchronous/AsynchronousCustomSpringEventsIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/springevents/synchronous/ContextRefreshedListenerIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/springevents/synchronous/GenericAppEventListenerIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/springevents/synchronous/SynchronousCustomSpringEventsIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/startup/SpringStartupIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/startup/SpringStartupIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/startup/SpringStartupIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/startup/SpringStartupIntegrationTest.java diff --git a/spring-all/src/test/java/org/baeldung/startup/SpringStartupXMLConfigIntegrationTest.java b/spring-core-2/src/test/java/org/baeldung/startup/SpringStartupXMLConfigIntegrationTest.java similarity index 100% rename from spring-all/src/test/java/org/baeldung/startup/SpringStartupXMLConfigIntegrationTest.java rename to spring-core-2/src/test/java/org/baeldung/startup/SpringStartupXMLConfigIntegrationTest.java diff --git a/spring-all/src/test/resources/.gitignore b/spring-core-2/src/test/resources/.gitignore similarity index 100% rename from spring-all/src/test/resources/.gitignore rename to spring-core-2/src/test/resources/.gitignore diff --git a/spring-core-3/README.md b/spring-core-3/README.md new file mode 100644 index 0000000000..4c9e3b9ddf --- /dev/null +++ b/spring-core-3/README.md @@ -0,0 +1,3 @@ +## Relevant Articles: + +- [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean) diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml new file mode 100644 index 0000000000..4d83d03ffd --- /dev/null +++ b/spring-core-3/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + spring-core-3 + spring-core-3 + + + com.baeldung + parent-spring-5 + 0.0.1-SNAPSHOT + ../parent-spring-5 + + + + + org.springframework + spring-beans + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-core + ${spring.version} + + + org.junit.jupiter + junit-jupiter-engine + ${junit-jupiter.version} + test + + + org.junit.jupiter + junit-jupiter-api + ${junit-jupiter.version} + test + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven.surefire.version} + + + + + + 2.22.1 + + + \ No newline at end of file diff --git a/spring-core-2/src/main/java/com/baeldung/getbean/AnnotationConfig.java b/spring-core-3/src/main/java/com/baeldung/getbean/AnnotationConfig.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/getbean/AnnotationConfig.java rename to spring-core-3/src/main/java/com/baeldung/getbean/AnnotationConfig.java diff --git a/spring-core-2/src/main/java/com/baeldung/getbean/Lion.java b/spring-core-3/src/main/java/com/baeldung/getbean/Lion.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/getbean/Lion.java rename to spring-core-3/src/main/java/com/baeldung/getbean/Lion.java diff --git a/spring-core-2/src/main/java/com/baeldung/getbean/Tiger.java b/spring-core-3/src/main/java/com/baeldung/getbean/Tiger.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/getbean/Tiger.java rename to spring-core-3/src/main/java/com/baeldung/getbean/Tiger.java diff --git a/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java b/spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java rename to spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByNameAndTypeUnitTest.java diff --git a/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java b/spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java rename to spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByNameUnitTest.java diff --git a/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java b/spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java rename to spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByNameWithConstructorParametersUnitTest.java diff --git a/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java b/spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java rename to spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByTypeUnitTest.java diff --git a/spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java b/spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java rename to spring-core-3/src/test/java/com/baeldung/getbean/GetBeanByTypeWithConstructorParametersUnitTest.java From 6839533ec04ae7d5d3164e217ebbe1fca1c09f67 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 6 Oct 2019 12:55:49 +0200 Subject: [PATCH 373/396] extract spring-shell module --- .gitignore | 3 +- spring-shell/.gitignore | 15 ++++++++++ spring-shell/README.md | 3 ++ spring-shell/pom.xml | 28 +++++++++++++++++++ .../main/java/org/baeldung/shell/Main.java | 0 .../shell/simple/SimpleBannerProvider.java | 0 .../org/baeldung/shell/simple/SimpleCLI.java | 0 .../simple/SimpleHistoryFileNameProvider.java | 0 .../shell/simple/SimplePromptProvider.java | 0 .../shell/simple/SimpleURLConverter.java | 0 .../META-INF/spring/spring-shell-plugin.xml | 0 .../simple/SimpleCLIIntegrationTest.java | 0 spring-shell/src/test/resources/.gitignore | 13 +++++++++ 13 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 spring-shell/.gitignore create mode 100644 spring-shell/README.md create mode 100644 spring-shell/pom.xml rename {spring-core-2 => spring-shell}/src/main/java/org/baeldung/shell/Main.java (100%) rename {spring-core-2 => spring-shell}/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java (100%) rename {spring-core-2 => spring-shell}/src/main/java/org/baeldung/shell/simple/SimpleCLI.java (100%) rename {spring-core-2 => spring-shell}/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java (100%) rename {spring-core-2 => spring-shell}/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java (100%) rename {spring-core-2 => spring-shell}/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java (100%) rename {spring-core-2 => spring-shell}/src/main/resources/META-INF/spring/spring-shell-plugin.xml (100%) rename {spring-core-2 => spring-shell}/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java (100%) create mode 100644 spring-shell/src/test/resources/.gitignore diff --git a/.gitignore b/.gitignore index 2edea19340..52c0ca0295 100644 --- a/.gitignore +++ b/.gitignore @@ -82,4 +82,5 @@ jta/transaction-logs/ software-security/sql-injection-samples/derby.log spring-soap/src/main/java/com/baeldung/springsoap/gen/ /report-*.json -transaction.log \ No newline at end of file +transaction.log +*-shell.log \ No newline at end of file diff --git a/spring-shell/.gitignore b/spring-shell/.gitignore new file mode 100644 index 0000000000..786d76230c --- /dev/null +++ b/spring-shell/.gitignore @@ -0,0 +1,15 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear + +*-shell.log \ No newline at end of file diff --git a/spring-shell/README.md b/spring-shell/README.md new file mode 100644 index 0000000000..2762f3a9c0 --- /dev/null +++ b/spring-shell/README.md @@ -0,0 +1,3 @@ +### Relevant articles: + +- [A CLI with Spring Shell](http://www.baeldung.com/spring-shell-cli) diff --git a/spring-shell/pom.xml b/spring-shell/pom.xml new file mode 100644 index 0000000000..8d13e4af5e --- /dev/null +++ b/spring-shell/pom.xml @@ -0,0 +1,28 @@ + + 4.0.0 + spring-core-2 + 0.1-SNAPSHOT + spring-core-2 + war + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + org.springframework.shell + spring-shell + ${org.springframework.shell.version} + + + + + 1.2.0.RELEASE + + + diff --git a/spring-core-2/src/main/java/org/baeldung/shell/Main.java b/spring-shell/src/main/java/org/baeldung/shell/Main.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/shell/Main.java rename to spring-shell/src/main/java/org/baeldung/shell/Main.java diff --git a/spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java b/spring-shell/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java rename to spring-shell/src/main/java/org/baeldung/shell/simple/SimpleBannerProvider.java diff --git a/spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleCLI.java b/spring-shell/src/main/java/org/baeldung/shell/simple/SimpleCLI.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleCLI.java rename to spring-shell/src/main/java/org/baeldung/shell/simple/SimpleCLI.java diff --git a/spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java b/spring-shell/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java rename to spring-shell/src/main/java/org/baeldung/shell/simple/SimpleHistoryFileNameProvider.java diff --git a/spring-core-2/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java b/spring-shell/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java rename to spring-shell/src/main/java/org/baeldung/shell/simple/SimplePromptProvider.java diff --git a/spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java b/spring-shell/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java similarity index 100% rename from spring-core-2/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java rename to spring-shell/src/main/java/org/baeldung/shell/simple/SimpleURLConverter.java diff --git a/spring-core-2/src/main/resources/META-INF/spring/spring-shell-plugin.xml b/spring-shell/src/main/resources/META-INF/spring/spring-shell-plugin.xml similarity index 100% rename from spring-core-2/src/main/resources/META-INF/spring/spring-shell-plugin.xml rename to spring-shell/src/main/resources/META-INF/spring/spring-shell-plugin.xml diff --git a/spring-core-2/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java b/spring-shell/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java similarity index 100% rename from spring-core-2/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java rename to spring-shell/src/test/java/org/baeldung/shell/simple/SimpleCLIIntegrationTest.java diff --git a/spring-shell/src/test/resources/.gitignore b/spring-shell/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/spring-shell/src/test/resources/.gitignore @@ -0,0 +1,13 @@ +*.class + +#folders# +/target +/neoDb* +/data +/src/main/webapp/WEB-INF/classes +*/META-INF/* + +# Packaged files # +*.jar +*.war +*.ear \ No newline at end of file From 45eab1339e91ed1f5543fe55ba8d919deb645782 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sun, 6 Oct 2019 12:15:11 +0100 Subject: [PATCH 374/396] ADD README descriptions 32 --- ethereum/README.md | 2 ++ feign/README.md | 8 +++----- flyway-cdi-extension/README.md | 4 ++++ geotools/README.md | 4 ++++ google-cloud/README.md | 12 ++++++------ google-web-toolkit/README.md | 5 +++++ gradle/README.md | 4 ++++ grails/README.md | 4 ++++ graphql/graphql-java/README.md | 4 ++++ grpc/README.md | 4 ++++ 10 files changed, 40 insertions(+), 11 deletions(-) diff --git a/ethereum/README.md b/ethereum/README.md index 7eccea7135..5bae4bbebd 100644 --- a/ethereum/README.md +++ b/ethereum/README.md @@ -1,5 +1,7 @@ ## Ethereum +This module contains articles about the Ethereum blockchain + ### Relevant Articles: - [Introduction to EthereumJ](https://www.baeldung.com/ethereumj) - [Creating and Deploying Smart Contracts with Solidity](https://www.baeldung.com/smart-contracts-ethereum-solidity) diff --git a/feign/README.md b/feign/README.md index 5aa0e3f56f..03051671d5 100644 --- a/feign/README.md +++ b/feign/README.md @@ -1,10 +1,8 @@ -## Feign Hypermedia Client ## +## Feign -This is the implementation of a [spring-hypermedia-api][1] client using Feign. - -[1]: https://github.com/eugenp/spring-hypermedia-api +This module contains articles about Feign ### Relevant Articles: - [Intro to Feign](https://www.baeldung.com/intro-to-feign) -- [Introduction to SLF4J](https://www.baeldung.com/slf4j-with-log4j2-logback) + diff --git a/flyway-cdi-extension/README.md b/flyway-cdi-extension/README.md index 3e03d5aee8..2f4e8cdb7a 100644 --- a/flyway-cdi-extension/README.md +++ b/flyway-cdi-extension/README.md @@ -1,3 +1,7 @@ +## Flyway CDI Extension + +This module contains articles about context and dependency injection (CDI) with Flyway + ### Relevant articles - [CDI Portable Extension and Flyway](https://www.baeldung.com/cdi-portable-extension) diff --git a/geotools/README.md b/geotools/README.md index 98f1e2c283..5529386070 100644 --- a/geotools/README.md +++ b/geotools/README.md @@ -1,3 +1,7 @@ +## GeoTools + +This module contains articles about GeoTools + ### Relevant Articles [Introduction to GeoTools](https://www.baeldung.com/geo-tools) diff --git a/google-cloud/README.md b/google-cloud/README.md index c6c49b88bf..5458fb1a93 100644 --- a/google-cloud/README.md +++ b/google-cloud/README.md @@ -1,16 +1,16 @@ -## Google Cloud Tutorial Project +## Google Cloud + +This module contains articles about Google Cloud ### Relevant Article: + - [Intro to Google Cloud Storage With Java](https://www.baeldung.com/java-google-cloud-storage) ### Overview + This Maven project contains the Java code for the article linked above. ### Package Organization + Java classes for the intro tutorial are in the org.baeldung.google.cloud package. Please note that Google Cloud requires a user account and credentials, as explained in the tutorial. - - -### Running the tests - -``` diff --git a/google-web-toolkit/README.md b/google-web-toolkit/README.md index d2a8b324ec..df9158cddc 100644 --- a/google-web-toolkit/README.md +++ b/google-web-toolkit/README.md @@ -1,2 +1,7 @@ +## Google Web Toolkit + +This module contains articles about Google Web Toolkit (GWT) + ### Relevant Articles: + - [Introduction to GWT](https://www.baeldung.com/gwt) diff --git a/gradle/README.md b/gradle/README.md index 0ad0ff3e45..84a8508e2c 100644 --- a/gradle/README.md +++ b/gradle/README.md @@ -1,3 +1,7 @@ +## Gradle + +This module contains articles about Gradle + ## Relevant articles: - [Introduction to Gradle](https://www.baeldung.com/gradle) - [Writing Custom Gradle Plugins](https://www.baeldung.com/gradle-create-plugin) diff --git a/grails/README.md b/grails/README.md index b93ac5de2e..ec9bb2a504 100644 --- a/grails/README.md +++ b/grails/README.md @@ -1,3 +1,7 @@ +## Grails + +This module contains articles about Grails + ### Relevant articles - [Build an MVC Web Application with Grails](https://www.baeldung.com/grails-mvc-application) diff --git a/graphql/graphql-java/README.md b/graphql/graphql-java/README.md index 240b62f6b4..e3fd818400 100644 --- a/graphql/graphql-java/README.md +++ b/graphql/graphql-java/README.md @@ -1,3 +1,7 @@ +## GraphQL Java + +This module contains articles about GraphQL with Java + ## Relevant articles: - [Introduction to GraphQL](https://www.baeldung.com/graphql) diff --git a/grpc/README.md b/grpc/README.md index 17128dd19f..d65dc03e54 100644 --- a/grpc/README.md +++ b/grpc/README.md @@ -1,2 +1,6 @@ +## gRPC + +This module contains articles about gRPC + ### Relevant Articles: - [Introduction to gRPC](https://www.baeldung.com/grpc-introduction) From dff3b5b16b40d57a3da717bb6fdaeb8488233369 Mon Sep 17 00:00:00 2001 From: Sjmillington Date: Sun, 6 Oct 2019 12:25:00 +0100 Subject: [PATCH 375/396] Add README descriptions 33 --- gson/README.md | 6 +++--- guava-collections-set/README.md | 4 +++- guava-collections/README.md | 6 +++--- guava-io/README.md | 4 ++++ guava-modules/README.md | 3 ++- guava/README.md | 3 ++- guice/README.md | 5 ++++- hazelcast/README.md | 4 ++++ helidon/README.md | 4 ++++ httpclient/README.md | 7 ++++--- 10 files changed, 33 insertions(+), 13 deletions(-) diff --git a/gson/README.md b/gson/README.md index 8b882f2d3e..df6ba0f516 100644 --- a/gson/README.md +++ b/gson/README.md @@ -1,9 +1,9 @@ -========= - -## GSON Cookbooks and Examples +## GSON +This module contains articles about Gson ### Relevant Articles: + - [Gson Deserialization Cookbook](https://www.baeldung.com/gson-deserialization-guide) - [Jackson vs Gson](https://www.baeldung.com/jackson-vs-gson) - [Exclude Fields from Serialization in Gson](https://www.baeldung.com/gson-exclude-fields-serialization) diff --git a/guava-collections-set/README.md b/guava-collections-set/README.md index e24552aae8..2e8e1ecdd0 100644 --- a/guava-collections-set/README.md +++ b/guava-collections-set/README.md @@ -1,4 +1,6 @@ -# Guava +## Guava Collections Set + +This module contains articles about Google Guava sets ## Relevant Articles: diff --git a/guava-collections/README.md b/guava-collections/README.md index 95397f0ff0..4d8eafc8d7 100644 --- a/guava-collections/README.md +++ b/guava-collections/README.md @@ -1,9 +1,9 @@ -========= - -## Guava and Hamcrest Cookbooks and Examples +## Guava Collections +This module contains articles about Google Guava collections ### Relevant Articles: + - [Guava Collections Cookbook](https://www.baeldung.com/guava-collections) - [Guava Ordering Cookbook](https://www.baeldung.com/guava-order) - [Hamcrest Collections Cookbook](https://www.baeldung.com/hamcrest-collections-arrays) diff --git a/guava-io/README.md b/guava-io/README.md index 0737accbed..81188295e7 100644 --- a/guava-io/README.md +++ b/guava-io/README.md @@ -1,3 +1,7 @@ +## Guava IO + +This module contains articles about input/output (IO) with Google Guava + ### Relevant Articles: - [Using Guava CountingOutputStream](https://www.baeldung.com/guava-counting-outputstream) diff --git a/guava-modules/README.md b/guava-modules/README.md index 79e45a89e7..898b8b7d9f 100644 --- a/guava-modules/README.md +++ b/guava-modules/README.md @@ -1,3 +1,4 @@ - ## Guava Modules +This module contains other modules about Google Guava + diff --git a/guava/README.md b/guava/README.md index a9694daf0b..651506e16d 100644 --- a/guava/README.md +++ b/guava/README.md @@ -1,5 +1,6 @@ +## Guava -## Guava Examples +This module contains articles a Google Guava ### Relevant Articles: - [Guava Functional Cookbook](https://www.baeldung.com/guava-functions-predicates) diff --git a/guice/README.md b/guice/README.md index cc3a8755c0..712639dfce 100644 --- a/guice/README.md +++ b/guice/README.md @@ -1,5 +1,8 @@ -## Google Guice Tutorials Project +## Google Guice + +This module contains articles about Google Guice ### Relevant Articles + - [Guide to Google Guice](https://www.baeldung.com/guice) - [Guice vs Spring – Dependency Injection](https://www.baeldung.com/guice-spring-dependency-injection) diff --git a/hazelcast/README.md b/hazelcast/README.md index 8ba6dc122b..a37009ef7e 100644 --- a/hazelcast/README.md +++ b/hazelcast/README.md @@ -1,3 +1,7 @@ +## Hazelcast + +This module contains articles about Hazelcast + ### Relevant Articles: - [Guide to Hazelcast with Java](https://www.baeldung.com/java-hazelcast) - [Introduction to Hazelcast Jet](https://www.baeldung.com/hazelcast-jet) diff --git a/helidon/README.md b/helidon/README.md index a092faf9f2..fa5bade4fe 100644 --- a/helidon/README.md +++ b/helidon/README.md @@ -1,3 +1,7 @@ +## Helidon + +This module contains articles about Helidon + ### Relevant articles - [Microservices with Oracle Helidon](https://www.baeldung.com/microservices-oracle-helidon) diff --git a/httpclient/README.md b/httpclient/README.md index 6bce5567ec..678b195965 100644 --- a/httpclient/README.md +++ b/httpclient/README.md @@ -1,9 +1,10 @@ -========= -## HttpClient 4.x Cookbooks and Examples +## HttpClient 4.x + +This module contains articles about HttpClient 4.x ###The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring +The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: From 6b80543360fc0a89cdf43184eced0b19eeda3b32 Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Sun, 6 Oct 2019 15:57:30 +0300 Subject: [PATCH 376/396] Move articles out of core-java-lang part 2 --- .../core-java-lang-oop-2/README.md | 1 - .../core-java-lang-operators/README.md | 1 + .../CompoundOperatorsUnitTest.java | 0 .../diamond => diamondoperator}/Car.java | 2 +- .../DiamondOperatorUnitTest.java | 2 +- .../diamond => diamondoperator}/Diesel.java | 2 +- .../diamond => diamondoperator}/Engine.java | 2 +- .../diamond => diamondoperator}/Vehicle.java | 2 +- .../{test => }/InstanceOfUnitTest.java | 2 +- .../core-java-lang-syntax-2/README.md | 6 +++++ .../ConditionalBranches.java | 2 +- .../core}/controlstructures/Loops.java | 2 +- .../core}/nativekeyword/DateTimeUtils.java | 2 +- .../core}/nativekeyword/NativeMainApp.java | 4 +--- .../com/baeldung/core}/packages/TodoApp.java | 6 ++--- .../com/baeldung/core}/packages/TodoList.java | 6 ++--- .../core}/packages/domain/TodoItem.java | 2 +- .../Employee.java | 2 +- .../ExampleClass.java | 2 +- .../PublicOuterClass.java | 2 +- .../core}/scope/BracketScopeExample.java | 2 +- .../core}/scope/ClassScopeExample.java | 2 +- .../core}/scope/LoopScopeExample.java | 2 +- .../core}/scope/MethodScopeExample.java | 2 +- .../core}/scope/NestedScopesExample.java | 2 +- .../doublebrace/DoubleBraceUnitTest.java | 2 +- .../DateTimeUtilsManualTest.java | 6 ++--- .../core}/packages/PackagesUnitTest.java | 9 ++++---- .../core-java-lang-syntax/README.md | 22 +++++++------------ ...WhenUsingLoops.java => LoopsUnitTest.java} | 2 +- core-java-modules/core-java-lang/README.md | 10 --------- .../java/com/baeldung/system/ChatWindow.java | 0 .../com/baeldung/system/DateTimeService.java | 0 .../baeldung/system/EnvironmentVariables.java | 0 .../com/baeldung/system/SystemErrDemo.java | 0 .../com/baeldung/system/SystemExitDemo.java | 0 .../com/baeldung/system/SystemOutDemo.java | 0 .../com/baeldung/system/UserCredentials.java | 0 .../system/DateTimeServiceUnitTest.java | 0 .../system/EnvironmentVariablesUnitTest.java | 0 .../system/SystemArrayCopyUnitTest.java | 0 .../baeldung/system/SystemNanoUnitTest.java | 0 .../system/SystemPropertiesUnitTest.java | 0 43 files changed, 49 insertions(+), 62 deletions(-) rename core-java-modules/{core-java-lang => core-java-lang-operators}/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java (100%) rename core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/{java/diamond => diamondoperator}/Car.java (62%) rename core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/{java/diamond => diamondoperator}/DiamondOperatorUnitTest.java (87%) rename core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/{java/diamond => diamondoperator}/Diesel.java (76%) rename core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/{java/diamond => diamondoperator}/Engine.java (54%) rename core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/{java/diamond => diamondoperator}/Vehicle.java (56%) rename core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/{test => }/InstanceOfUnitTest.java (97%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/controlstructures/ConditionalBranches.java (97%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/controlstructures/Loops.java (99%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/nativekeyword/DateTimeUtils.java (78%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/nativekeyword/NativeMainApp.java (74%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/packages/TodoApp.java (86%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/packages/TodoList.java (84%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/packages/domain/TodoItem.java (94%) rename core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/{modifiers => privatemodifier}/Employee.java (96%) rename core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/{modifiers => privatemodifier}/ExampleClass.java (84%) rename core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/{modifiers => privatemodifier}/PublicOuterClass.java (90%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/scope/BracketScopeExample.java (89%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/scope/ClassScopeExample.java (86%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/scope/LoopScopeExample.java (92%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/scope/MethodScopeExample.java (87%) rename core-java-modules/{core-java-lang/src/main/java/com/baeldung => core-java-lang-syntax-2/src/main/java/com/baeldung/core}/scope/NestedScopesExample.java (86%) rename core-java-modules/{core-java-lang-operators/src/test/java/com/baeldung/java => core-java-lang-syntax-2/src/test/java/com/baeldung/core}/doublebrace/DoubleBraceUnitTest.java (96%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-lang-syntax-2/src/test/java/com/baeldung/core}/nativekeyword/DateTimeUtilsManualTest.java (95%) rename core-java-modules/{core-java-lang/src/test/java/com/baeldung => core-java-lang-syntax-2/src/test/java/com/baeldung/core}/packages/PackagesUnitTest.java (85%) rename core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/{WhenUsingLoops.java => LoopsUnitTest.java} (98%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/main/java/com/baeldung/system/ChatWindow.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/main/java/com/baeldung/system/DateTimeService.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/main/java/com/baeldung/system/EnvironmentVariables.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/main/java/com/baeldung/system/SystemErrDemo.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/main/java/com/baeldung/system/SystemExitDemo.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/main/java/com/baeldung/system/SystemOutDemo.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/main/java/com/baeldung/system/UserCredentials.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/test/java/com/baeldung/system/SystemNanoUnitTest.java (100%) rename core-java-modules/{core-java-lang-syntax => core-java-lang}/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java (100%) diff --git a/core-java-modules/core-java-lang-oop-2/README.md b/core-java-modules/core-java-lang-oop-2/README.md index dca7b14d68..e2c30bbb40 100644 --- a/core-java-modules/core-java-lang-oop-2/README.md +++ b/core-java-modules/core-java-lang-oop-2/README.md @@ -7,7 +7,6 @@ This module contains articles about Object-oriented programming (OOP) in Java - [Cannot Reference “X” Before Supertype Constructor Has Been Called](https://www.baeldung.com/java-cannot-reference-x-before-supertype-constructor-error) - [Anonymous Classes in Java](https://www.baeldung.com/java-anonymous-classes) - [Raw Types in Java](https://www.baeldung.com/raw-types-java) -- [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword) - [Marker Interfaces in Java](https://www.baeldung.com/java-marker-interfaces) - [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) - [Immutable Objects in Java](https://www.baeldung.com/java-immutable-object) diff --git a/core-java-modules/core-java-lang-operators/README.md b/core-java-modules/core-java-lang-operators/README.md index 280c630882..f9fa49ee0d 100644 --- a/core-java-modules/core-java-lang-operators/README.md +++ b/core-java-modules/core-java-lang-operators/README.md @@ -4,3 +4,4 @@ - [The Modulo Operator in Java](https://www.baeldung.com/modulo-java) - [Java instanceof Operator](https://www.baeldung.com/java-instanceof) - [A Guide to Increment and Decrement Unary Operators in Java](https://www.baeldung.com/java-unary-operators) +- [Java Compound Operators](https://www.baeldung.com/java-compound-operators) diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Car.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Car.java similarity index 62% rename from core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Car.java rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Car.java index a680c4e670..7fa52a5eb1 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Car.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Car.java @@ -1,4 +1,4 @@ -package com.baeldung.java.diamond; +package com.baeldung.diamondoperator; public class Car implements Vehicle { diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/DiamondOperatorUnitTest.java similarity index 87% rename from core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/DiamondOperatorUnitTest.java index ee5f639926..b50119b3c6 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/DiamondOperatorUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.diamond; +package com.baeldung.diamondoperator; import static org.junit.Assert.assertNotNull; diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Diesel.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Diesel.java similarity index 76% rename from core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Diesel.java rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Diesel.java index 90eb7d9340..0b92d11318 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Diesel.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Diesel.java @@ -1,4 +1,4 @@ -package com.baeldung.java.diamond; +package com.baeldung.diamondoperator; public class Diesel implements Engine { diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Engine.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Engine.java similarity index 54% rename from core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Engine.java rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Engine.java index 746baf3254..0afd48114a 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Engine.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Engine.java @@ -1,4 +1,4 @@ -package com.baeldung.java.diamond; +package com.baeldung.diamondoperator; public interface Engine { diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Vehicle.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Vehicle.java similarity index 56% rename from core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Vehicle.java rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Vehicle.java index 8395cdd970..89a5dfefef 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/diamond/Vehicle.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/diamondoperator/Vehicle.java @@ -1,4 +1,4 @@ -package com.baeldung.java.diamond; +package com.baeldung.diamondoperator; public interface Vehicle { diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java similarity index 97% rename from core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java rename to core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java index 6966fa3944..0e082b69d3 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/test/InstanceOfUnitTest.java +++ b/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/keyword/InstanceOfUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.keyword.test; +package com.baeldung.keyword; import org.junit.Assert; import org.junit.jupiter.api.Test; diff --git a/core-java-modules/core-java-lang-syntax-2/README.md b/core-java-modules/core-java-lang-syntax-2/README.md index d8daadf2aa..a3b11865af 100644 --- a/core-java-modules/core-java-lang-syntax-2/README.md +++ b/core-java-modules/core-java-lang-syntax-2/README.md @@ -5,4 +5,10 @@ This module contains articles about Java syntax ### Relevant Articles: - [Java ‘private’ Access Modifier](https://www.baeldung.com/java-private-keyword) +- [Guide to Java Packages](https://www.baeldung.com/java-packages) +- [If-Else Statement in Java](https://www.baeldung.com/java-if-else) +- [Control Structures in Java](https://www.baeldung.com/java-control-structures) +- [Java Double Brace Initialization](https://www.baeldung.com/java-double-brace-initialization) +- [The Java Native Keyword and Methods](https://www.baeldung.com/java-native) +- [Variable Scope in Java](https://www.baeldung.com/java-variable-scope) - [[<-- Prev]](/core-java-modules/core-java-lang-syntax) diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/ConditionalBranches.java similarity index 97% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/ConditionalBranches.java index bace609699..e15386f048 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/ConditionalBranches.java @@ -1,4 +1,4 @@ -package com.baeldung.controlstructures; +package com.baeldung.core.controlstructures; public class ConditionalBranches { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/Loops.java similarity index 99% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/Loops.java index bc4515bfc7..9d73127cae 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/controlstructures/Loops.java @@ -1,4 +1,4 @@ -package com.baeldung.controlstructures; +package com.baeldung.core.controlstructures; public class Loops { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/DateTimeUtils.java similarity index 78% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/DateTimeUtils.java index 0762b0eb8a..1d101719ca 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/DateTimeUtils.java @@ -1,4 +1,4 @@ -package com.baeldung.nativekeyword; +package com.baeldung.core.nativekeyword; public class DateTimeUtils { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/NativeMainApp.java similarity index 74% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/NativeMainApp.java index 76fe548ed3..4bf6b88840 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/nativekeyword/NativeMainApp.java @@ -1,6 +1,4 @@ -package com.baeldung.nativekeyword; - -import com.baeldung.nativekeyword.DateTimeUtils; +package com.baeldung.core.nativekeyword; public class NativeMainApp { public static void main(String[] args) { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoApp.java similarity index 86% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoApp.java index 0f4a56f708..d8283f6b0d 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoApp.java @@ -1,9 +1,9 @@ -package com.baeldung.packages; +package com.baeldung.core.packages; + +import com.baeldung.core.packages.domain.TodoItem; import java.time.LocalDate; -import com.baeldung.packages.domain.TodoItem; - public class TodoApp { public static void main(String[] args) { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoList.java similarity index 84% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoList.java index 6ed6cd4ec1..f9f6ac3aca 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/TodoList.java @@ -1,10 +1,10 @@ -package com.baeldung.packages; +package com.baeldung.core.packages; + +import com.baeldung.core.packages.domain.TodoItem; import java.util.ArrayList; import java.util.List; -import com.baeldung.packages.domain.TodoItem; - public class TodoList { private List todoItems; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/domain/TodoItem.java similarity index 94% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/domain/TodoItem.java index 972e574a7f..195f763974 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/packages/domain/TodoItem.java @@ -1,4 +1,4 @@ -package com.baeldung.packages.domain; +package com.baeldung.core.packages.domain; import java.time.LocalDate; diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/Employee.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/Employee.java similarity index 96% rename from core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/Employee.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/Employee.java index 6ec68d6ebb..4598400e93 100644 --- a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/Employee.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/Employee.java @@ -1,4 +1,4 @@ -package com.baeldung.core.modifiers; +package com.baeldung.core.privatemodifier; public class Employee { diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java similarity index 84% rename from core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java index 41f0b7a690..8659b4ad9c 100644 --- a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/ExampleClass.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/ExampleClass.java @@ -1,4 +1,4 @@ -package com.baeldung.core.modifiers; +package com.baeldung.core.privatemodifier; public class ExampleClass { diff --git a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java similarity index 90% rename from core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java index 329ebf3bb6..8a9e8a8eb3 100644 --- a/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/modifiers/PublicOuterClass.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/privatemodifier/PublicOuterClass.java @@ -1,4 +1,4 @@ -package com.baeldung.core.modifiers; +package com.baeldung.core.privatemodifier; public class PublicOuterClass { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/BracketScopeExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/BracketScopeExample.java similarity index 89% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/BracketScopeExample.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/BracketScopeExample.java index 8deec35c16..99feeb060d 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/BracketScopeExample.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/BracketScopeExample.java @@ -1,4 +1,4 @@ -package com.baeldung.scope; +package com.baeldung.core.scope; public class BracketScopeExample { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/ClassScopeExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/ClassScopeExample.java similarity index 86% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/ClassScopeExample.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/ClassScopeExample.java index c81fcc9550..8bcfee44f2 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/ClassScopeExample.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/ClassScopeExample.java @@ -1,4 +1,4 @@ -package com.baeldung.scope; +package com.baeldung.core.scope; public class ClassScopeExample { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/LoopScopeExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/LoopScopeExample.java similarity index 92% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/LoopScopeExample.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/LoopScopeExample.java index be41252623..8067085404 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/LoopScopeExample.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/LoopScopeExample.java @@ -1,4 +1,4 @@ -package com.baeldung.scope; +package com.baeldung.core.scope; import java.util.Arrays; import java.util.List; diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/MethodScopeExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/MethodScopeExample.java similarity index 87% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/MethodScopeExample.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/MethodScopeExample.java index 63a6a25271..86b2021c6d 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/MethodScopeExample.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/MethodScopeExample.java @@ -1,4 +1,4 @@ -package com.baeldung.scope; +package com.baeldung.core.scope; public class MethodScopeExample { diff --git a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/NestedScopesExample.java b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/NestedScopesExample.java similarity index 86% rename from core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/NestedScopesExample.java rename to core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/NestedScopesExample.java index c3c5bec221..51351d237c 100644 --- a/core-java-modules/core-java-lang/src/main/java/com/baeldung/scope/NestedScopesExample.java +++ b/core-java-modules/core-java-lang-syntax-2/src/main/java/com/baeldung/core/scope/NestedScopesExample.java @@ -1,4 +1,4 @@ -package com.baeldung.scope; +package com.baeldung.core.scope; public class NestedScopesExample { diff --git a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/doublebrace/DoubleBraceUnitTest.java similarity index 96% rename from core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java rename to core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/doublebrace/DoubleBraceUnitTest.java index b03b01d074..fe47dd4c26 100644 --- a/core-java-modules/core-java-lang-operators/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java +++ b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/doublebrace/DoubleBraceUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.doublebrace; +package com.baeldung.core.doublebrace; import org.junit.Test; diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/nativekeyword/DateTimeUtilsManualTest.java similarity index 95% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java rename to core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/nativekeyword/DateTimeUtilsManualTest.java index ac27c11c68..1c70acc483 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java +++ b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/nativekeyword/DateTimeUtilsManualTest.java @@ -1,11 +1,11 @@ -package com.baeldung.nativekeyword; - -import static org.junit.Assert.assertNotNull; +package com.baeldung.core.nativekeyword; import org.junit.BeforeClass; import org.junit.Test; import org.slf4j.Logger; +import static org.junit.Assert.assertNotNull; + public class DateTimeUtilsManualTest { private static final Logger LOG = org.slf4j.LoggerFactory.getLogger(DateTimeUtilsManualTest.class); diff --git a/core-java-modules/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/packages/PackagesUnitTest.java similarity index 85% rename from core-java-modules/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java rename to core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/packages/PackagesUnitTest.java index 212fb7b3c7..b1237e9948 100644 --- a/core-java-modules/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java +++ b/core-java-modules/core-java-lang-syntax-2/src/test/java/com/baeldung/core/packages/PackagesUnitTest.java @@ -1,12 +1,11 @@ -package com.baeldung.packages; +package com.baeldung.core.packages; -import static org.junit.Assert.assertEquals; +import com.baeldung.core.packages.domain.TodoItem; +import org.junit.Test; import java.time.LocalDate; -import org.junit.Test; - -import com.baeldung.packages.domain.TodoItem; +import static org.junit.Assert.assertEquals; public class PackagesUnitTest { diff --git a/core-java-modules/core-java-lang-syntax/README.md b/core-java-modules/core-java-lang-syntax/README.md index 6f3120ec2c..25f5c63dbc 100644 --- a/core-java-modules/core-java-lang-syntax/README.md +++ b/core-java-modules/core-java-lang-syntax/README.md @@ -3,20 +3,14 @@ This module contains articles about Java syntax ### Relevant Articles: -- [The Basics of Java Generics](http://www.baeldung.com/java-generics) -- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions) -- [Java Double Brace Initialization](http://www.baeldung.com/java-double-brace-initialization) -- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator) -- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break) -- [A Guide to Creating Objects in Java](http://www.baeldung.com/java-initialization) -- [A Guide to Java Loops](http://www.baeldung.com/java-loops) -- [Varargs in Java](http://www.baeldung.com/java-varargs) -- [A Guide to Java Enums](http://www.baeldung.com/a-guide-to-java-enums) -- [Infinite Loops in Java](http://www.baeldung.com/infinite-loops-java) -- [Quick Guide to java.lang.System](http://www.baeldung.com/java-lang-system) +- [The Basics of Java Generics](https://www.baeldung.com/java-generics) +- [Java Primitive Conversions](https://www.baeldung.com/java-primitive-conversions) +- [The Java continue and break Keywords](https://www.baeldung.com/java-continue-and-break) +- [A Guide to Creating Objects in Java](https://www.baeldung.com/java-initialization) +- [A Guide to Java Loops](https://www.baeldung.com/java-loops) +- [Varargs in Java](https://www.baeldung.com/java-varargs) +- [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums) +- [Infinite Loops in Java](https://www.baeldung.com/infinite-loops-java) - [Java Switch Statement](https://www.baeldung.com/java-switch) -- [The Modulo Operator in Java](https://www.baeldung.com/modulo-java) -- [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator) -- [Java instanceof Operator](https://www.baeldung.com/java-instanceof) - [Breaking Out of Nested Loops](https://www.baeldung.com/java-breaking-out-nested-loop) - [[More -->]](/core-java-modules/core-java-lang-syntax-2) diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java similarity index 98% rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java rename to core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java index f82f9ddaa7..5a8b116a2c 100644 --- a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java +++ b/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/loops/LoopsUnitTest.java @@ -12,7 +12,7 @@ import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; -public class WhenUsingLoops { +public class LoopsUnitTest { private LoopsInJava loops = new LoopsInJava(); private static List list = new ArrayList<>(); diff --git a/core-java-modules/core-java-lang/README.md b/core-java-modules/core-java-lang/README.md index 4b211177d9..3c33409e7e 100644 --- a/core-java-modules/core-java-lang/README.md +++ b/core-java-modules/core-java-lang/README.md @@ -6,29 +6,19 @@ This module contains articles about core features in the Java language - [Generate equals() and hashCode() with Eclipse](https://www.baeldung.com/java-eclipse-equals-and-hashcode) - [Iterating Over Enum Values in Java](https://www.baeldung.com/java-enum-iteration) -- [Java Double Brace Initialization](https://www.baeldung.com/java-double-brace-initialization) -- [Guide to the Diamond Operator in Java](https://www.baeldung.com/java-diamond-operator) - [Comparator and Comparable in Java](https://www.baeldung.com/java-comparator-comparable) -- [The Java continue and break Keywords](https://www.baeldung.com/java-continue-and-break) - [Nested Classes in Java](https://www.baeldung.com/java-nested-classes) - [A Guide to Inner Interfaces in Java](https://www.baeldung.com/java-inner-interfaces) - [Recursion In Java](https://www.baeldung.com/java-recursion) - [A Guide to the finalize Method in Java](https://www.baeldung.com/java-finalize) -- [Infinite Loops in Java](https://www.baeldung.com/infinite-loops-java) - [Quick Guide to java.lang.System](https://www.baeldung.com/java-lang-system) - [Using Java Assertions](https://www.baeldung.com/java-assert) - [Static and Dynamic Binding in Java](https://www.baeldung.com/java-static-dynamic-binding) - [Synthetic Constructs in Java](https://www.baeldung.com/java-synthetic) - [How to Separate Double into Integer and Decimal Parts](https://www.baeldung.com/java-separate-double-into-integer-decimal-parts) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) -- [Java Compound Operators](https://www.baeldung.com/java-compound-operators) -- [Guide to Java Packages](https://www.baeldung.com/java-packages) -- [The Java Native Keyword and Methods](https://www.baeldung.com/java-native) -- [If-Else Statement in Java](https://www.baeldung.com/java-if-else) -- [Control Structures in Java](https://www.baeldung.com/java-control-structures) - [Java Interfaces](https://www.baeldung.com/java-interfaces) - [Attaching Values to Java Enum](https://www.baeldung.com/java-enum-values) -- [Variable Scope in Java](https://www.baeldung.com/java-variable-scope) - [Java Classes and Objects](https://www.baeldung.com/java-classes-objects) - [A Guide to Java Enums](https://www.baeldung.com/a-guide-to-java-enums) - [[More --> ]](/core-java-modules/core-java-lang-2) \ No newline at end of file diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java diff --git a/core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java b/core-java-modules/core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java rename to core-java-modules/core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java diff --git a/core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java b/core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java similarity index 100% rename from core-java-modules/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java rename to core-java-modules/core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java From 322ca0d57896e30d07d234a8559a58959420f3d1 Mon Sep 17 00:00:00 2001 From: Maciej Andrearczyk Date: Sun, 6 Oct 2019 16:59:40 +0200 Subject: [PATCH 377/396] BAEL-3285 | Removed block() calls --- .../reactive/webclient/simultaneous/Client.java | 15 ++++++--------- .../simultaneous/ClientIntegrationTest.java | 4 +++- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java index 9afe50af58..bbfc88322b 100644 --- a/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java +++ b/spring-5-reactive-client/src/main/java/com/baeldung/reactive/webclient/simultaneous/Client.java @@ -41,28 +41,25 @@ public class Client { .bodyToMono(User.class); } - public List fetchUsers(List userIds) { + public Flux fetchUsers(List userIds) { return Flux.fromIterable(userIds) .parallel() .runOn(Schedulers.elastic()) .flatMap(this::getUser) - .collectSortedList((u1, u2) -> u2.id() - u1.id()) - .block(); + .ordered((u1, u2) -> u2.id() - u1.id()); } - public List fetchUserAndOtherUser(int id) { + public Flux fetchUserAndOtherUser(int id) { return Flux.merge(getUser(id), getOtherUser(id)) .parallel() .runOn(Schedulers.elastic()) - .collectSortedList((u1, u2) -> u2.id() - u1.id()) - .block(); + .ordered((u1, u2) -> u2.id() - u1.id()); } - public UserWithItem fetchUserAndItem(int userId, int itemId) { + public Mono fetchUserAndItem(int userId, int itemId) { Mono user = getUser(userId).subscribeOn(Schedulers.elastic()); Mono item = getItem(itemId).subscribeOn(Schedulers.elastic()); - return Mono.zip(user, item, UserWithItem::new) - .block(); + return Mono.zip(user, item, UserWithItem::new); } } diff --git a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java index 0acedf15b0..d74a64d9c9 100644 --- a/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java +++ b/spring-5-reactive-client/src/test/java/com/baeldung/reactive/webclient/simultaneous/ClientIntegrationTest.java @@ -56,7 +56,9 @@ public class ClientIntegrationTest { // Act long start = System.currentTimeMillis(); - List users = client.fetchUsers(userIds); + List users = client.fetchUsers(userIds) + .collectList() + .block(); long end = System.currentTimeMillis(); // Assert From 56102c9a519d54de3a25db1f568ec7478745f8c5 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 6 Oct 2019 19:37:23 +0200 Subject: [PATCH 378/396] cleanup; fix code formatting --- .../src/main/resources/META-INF/kmodule.xml | 2 +- .../main/resources/employeeEmailReport.jrxml | 34 +++---- .../src/main/resources/employeeReport.jrxml | 11 ++- .../CacheEvictAnnotationIntegrationTest.java | 90 +++++++++---------- .../CacheManagerEvictIntegrationTest.java | 64 ++++++------- spring-core-2/pom.xml | 18 ---- .../resources/beanInjection-constructor.xml | 16 ++-- .../main/resources/beanInjection-setter.xml | 16 ++-- spring-core-2/src/main/resources/logback.xml | 8 +- spring-core-2/src/main/resources/scopes.xml | 8 +- .../main/resources/springProfiles-config.xml | 5 +- .../src/main/resources/test-mvc.xml | 32 +++---- .../src/main/webapp/WEB-INF/greeting.xml | 12 +-- .../webapp/WEB-INF/normal-webapp-servlet.xml | 18 ++-- .../webapp/WEB-INF/rootApplicationContext.xml | 12 +-- .../webapp/WEB-INF/secure-webapp-servlet.xml | 18 ++-- .../src/main/webapp/WEB-INF/view/sample.jsp | 2 +- .../webapp/WEB-INF/view/scopesExample.jsp | 8 +- .../src/main/webapp/WEB-INF/view/welcome.jsp | 10 +-- .../src/main/webapp/WEB-INF/web-old.xml | 12 +-- .../src/main/webapp/WEB-INF/welcome.jsp | 6 +- spring-scheduling/pom.xml | 9 ++ .../src/main/resources/springAsync-config.xml | 7 +- .../main/resources/springScheduled-config.xml | 16 ++-- .../META-INF/spring/spring-shell-plugin.xml | 5 +- 25 files changed, 223 insertions(+), 216 deletions(-) diff --git a/libraries-2/src/main/resources/META-INF/kmodule.xml b/libraries-2/src/main/resources/META-INF/kmodule.xml index 1b9ce1ce71..9e2597d5de 100644 --- a/libraries-2/src/main/resources/META-INF/kmodule.xml +++ b/libraries-2/src/main/resources/META-INF/kmodule.xml @@ -1,3 +1,3 @@ - + \ No newline at end of file diff --git a/libraries-2/src/main/resources/employeeEmailReport.jrxml b/libraries-2/src/main/resources/employeeEmailReport.jrxml index ad4aaaac90..1e60344e47 100644 --- a/libraries-2/src/main/resources/employeeEmailReport.jrxml +++ b/libraries-2/src/main/resources/employeeEmailReport.jrxml @@ -1,17 +1,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/libraries-2/src/main/resources/employeeReport.jrxml b/libraries-2/src/main/resources/employeeReport.jrxml index 3d2be226fb..434c3e1338 100644 --- a/libraries-2/src/main/resources/employeeReport.jrxml +++ b/libraries-2/src/main/resources/employeeReport.jrxml @@ -1,12 +1,16 @@ - + - = $P{minSalary} AND $P!{condition}]]> + = $P{minSalary} AND $P!{condition}]]> @@ -44,7 +48,8 @@ - + + diff --git a/spring-caching/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java b/spring-caching/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java index e00305d4a2..28b0d26bed 100644 --- a/spring-caching/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java +++ b/spring-caching/src/test/java/org/baeldung/caching/test/CacheEvictAnnotationIntegrationTest.java @@ -26,54 +26,54 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @ContextConfiguration public class CacheEvictAnnotationIntegrationTest { - @Configuration - @EnableCaching - static class ContextConfiguration { + @Configuration + @EnableCaching + static class ContextConfiguration { - @Bean - public CachingService cachingService() { - return new CachingService(); - } - - @Bean - public CacheManager cacheManager(){ - SimpleCacheManager cacheManager = new SimpleCacheManager(); - List caches = new ArrayList<>(); - caches.add(cacheBean().getObject()); - cacheManager.setCaches(caches ); - return cacheManager; - } - - @Bean - public ConcurrentMapCacheFactoryBean cacheBean(){ - ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); - cacheFactoryBean.setName("first"); - return cacheFactoryBean; - } - } + @Bean + public CachingService cachingService() { + return new CachingService(); + } - @Autowired - CachingService cachingService; + @Bean + public CacheManager cacheManager() { + SimpleCacheManager cacheManager = new SimpleCacheManager(); + List caches = new ArrayList<>(); + caches.add(cacheBean().getObject()); + cacheManager.setCaches(caches); + return cacheManager; + } - @Before - public void before() { - cachingService.putToCache("first", "key1", "Baeldung"); - cachingService.putToCache("first", "key2", "Article"); - } + @Bean + public ConcurrentMapCacheFactoryBean cacheBean() { + ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); + cacheFactoryBean.setName("first"); + return cacheFactoryBean; + } + } - @Test - public void givenFirstCache_whenSingleCacheValueEvictRequested_thenEmptyCacheValue() { - cachingService.evictSingleCacheValue("key1"); - String key1 = cachingService.getFromCache("first", "key1"); - assertThat(key1, is(nullValue())); - } + @Autowired + CachingService cachingService; - @Test - public void givenFirstCache_whenAllCacheValueEvictRequested_thenEmptyCache() { - cachingService.evictAllCacheValues(); - String key1 = cachingService.getFromCache("first", "key1"); - String key2 = cachingService.getFromCache("first", "key2"); - assertThat(key1, is(nullValue())); - assertThat(key2, is(nullValue())); - } + @Before + public void before() { + cachingService.putToCache("first", "key1", "Baeldung"); + cachingService.putToCache("first", "key2", "Article"); + } + + @Test + public void givenFirstCache_whenSingleCacheValueEvictRequested_thenEmptyCacheValue() { + cachingService.evictSingleCacheValue("key1"); + String key1 = cachingService.getFromCache("first", "key1"); + assertThat(key1, is(nullValue())); + } + + @Test + public void givenFirstCache_whenAllCacheValueEvictRequested_thenEmptyCache() { + cachingService.evictAllCacheValues(); + String key1 = cachingService.getFromCache("first", "key1"); + String key2 = cachingService.getFromCache("first", "key2"); + assertThat(key1, is(nullValue())); + assertThat(key2, is(nullValue())); + } } diff --git a/spring-caching/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java b/spring-caching/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java index 4b12ed60b6..ffcc88febc 100644 --- a/spring-caching/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java +++ b/spring-caching/src/test/java/org/baeldung/caching/test/CacheManagerEvictIntegrationTest.java @@ -24,39 +24,39 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration public class CacheManagerEvictIntegrationTest { - - @Configuration - static class ContextConfiguration { - @Bean - public CachingService cachingService() { - return new CachingService(); - } - - @Bean - public CacheManager cacheManager(){ - SimpleCacheManager cacheManager = new SimpleCacheManager(); - List caches = new ArrayList<>(); - caches.add(cacheBeanFirst().getObject()); - caches.add(cacheBeanSecond().getObject()); - cacheManager.setCaches(caches ); - return cacheManager; - } - - @Bean - public ConcurrentMapCacheFactoryBean cacheBeanFirst(){ - ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); - cacheFactoryBean.setName("first"); - return cacheFactoryBean; - } - - @Bean - public ConcurrentMapCacheFactoryBean cacheBeanSecond(){ - ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); - cacheFactoryBean.setName("second"); - return cacheFactoryBean; - } - } + @Configuration + static class ContextConfiguration { + + @Bean + public CachingService cachingService() { + return new CachingService(); + } + + @Bean + public CacheManager cacheManager() { + SimpleCacheManager cacheManager = new SimpleCacheManager(); + List caches = new ArrayList<>(); + caches.add(cacheBeanFirst().getObject()); + caches.add(cacheBeanSecond().getObject()); + cacheManager.setCaches(caches); + return cacheManager; + } + + @Bean + public ConcurrentMapCacheFactoryBean cacheBeanFirst() { + ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); + cacheFactoryBean.setName("first"); + return cacheFactoryBean; + } + + @Bean + public ConcurrentMapCacheFactoryBean cacheBeanSecond() { + ConcurrentMapCacheFactoryBean cacheFactoryBean = new ConcurrentMapCacheFactoryBean(); + cacheFactoryBean.setName("second"); + return cacheFactoryBean; + } + } @Autowired CachingService cachingService; diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index f4132bfb35..032f6a05fc 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -39,11 +39,6 @@ org.springframework.retry spring-retry - - org.springframework.shell - spring-shell - ${org.springframework.shell.version} - org.springframework spring-websocket @@ -104,17 +99,6 @@ guava ${guava.version} - - net.sf.jasperreports - jasperreports - ${jasperreports.version} - - - commons-logging - commons-logging - - - org.springframework @@ -218,7 +202,6 @@ org.baeldung.sample.App 5.0.6.RELEASE - 1.2.0.RELEASE 1.3.2 5.2.5.Final @@ -227,7 +210,6 @@ 25.1-jre 3.6 3.6.1 - 6.6.0 2.1.0 3.22.0-GA diff --git a/spring-core-2/src/main/resources/beanInjection-constructor.xml b/spring-core-2/src/main/resources/beanInjection-constructor.xml index a0713fd9f8..5a2ffe767c 100644 --- a/spring-core-2/src/main/resources/beanInjection-constructor.xml +++ b/spring-core-2/src/main/resources/beanInjection-constructor.xml @@ -1,15 +1,15 @@ - - - - - + + + + + - + \ No newline at end of file diff --git a/spring-core-2/src/main/resources/beanInjection-setter.xml b/spring-core-2/src/main/resources/beanInjection-setter.xml index b2d3a05594..0e82e3be1c 100644 --- a/spring-core-2/src/main/resources/beanInjection-setter.xml +++ b/spring-core-2/src/main/resources/beanInjection-setter.xml @@ -1,14 +1,14 @@ - - - - - + + + + + - + \ No newline at end of file diff --git a/spring-core-2/src/main/resources/logback.xml b/spring-core-2/src/main/resources/logback.xml index 56af2d397e..7bd5154680 100644 --- a/spring-core-2/src/main/resources/logback.xml +++ b/spring-core-2/src/main/resources/logback.xml @@ -7,13 +7,13 @@ - - + + - + - + \ No newline at end of file diff --git a/spring-core-2/src/main/resources/scopes.xml b/spring-core-2/src/main/resources/scopes.xml index faecd727fa..8fdb186c28 100644 --- a/spring-core-2/src/main/resources/scopes.xml +++ b/spring-core-2/src/main/resources/scopes.xml @@ -1,10 +1,10 @@ + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> - + - + diff --git a/spring-core-2/src/main/resources/springProfiles-config.xml b/spring-core-2/src/main/resources/springProfiles-config.xml index 5f71c02e20..985ab6ba86 100644 --- a/spring-core-2/src/main/resources/springProfiles-config.xml +++ b/spring-core-2/src/main/resources/springProfiles-config.xml @@ -1,6 +1,7 @@ - diff --git a/spring-mvc-basics-2/src/main/resources/test-mvc.xml b/spring-mvc-basics-2/src/main/resources/test-mvc.xml index 15f950ed4f..8013170379 100644 --- a/spring-mvc-basics-2/src/main/resources/test-mvc.xml +++ b/spring-mvc-basics-2/src/main/resources/test-mvc.xml @@ -1,24 +1,24 @@ - - - - - - /WEB-INF/ - - - .jsp - - - \ No newline at end of file + + + + + + /WEB-INF/ + + + .jsp + + + \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/greeting.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/greeting.xml index 3f0ae83455..1ad5484d80 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/greeting.xml +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/greeting.xml @@ -1,11 +1,11 @@ - - - - + + + + \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/normal-webapp-servlet.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/normal-webapp-servlet.xml index 0a7a0919a8..8addbe3cf3 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/normal-webapp-servlet.xml +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/normal-webapp-servlet.xml @@ -1,16 +1,16 @@ - + - - - - - + + + + + \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/rootApplicationContext.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/rootApplicationContext.xml index af03661ebc..12e5d8f161 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/rootApplicationContext.xml +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/rootApplicationContext.xml @@ -1,14 +1,14 @@ - - - + + + \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/secure-webapp-servlet.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/secure-webapp-servlet.xml index 6cdd3971bf..86797ad081 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/secure-webapp-servlet.xml +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/secure-webapp-servlet.xml @@ -1,16 +1,16 @@ - + - - - - - + + + + + \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/sample.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/sample.jsp index 7cc14b5dcd..4c64bf97f2 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/sample.jsp +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/sample.jsp @@ -2,6 +2,6 @@ -

    This is the body of the sample view

    +

    This is the body of the sample view

    \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/scopesExample.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/scopesExample.jsp index 0946f1b5ef..e9abcf194c 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/scopesExample.jsp +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/scopesExample.jsp @@ -2,9 +2,9 @@ -

    Bean Scopes Examples

    -
    Previous Message: ${previousMessage } -
    Current Message: ${currentMessage } -
    +

    Bean Scopes Examples

    +
    Previous Message: ${previousMessage } +
    Current Message: ${currentMessage } +
    \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/welcome.jsp b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/welcome.jsp index 6a82fb1d5a..4eda3c58e2 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/welcome.jsp +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/view/welcome.jsp @@ -1,11 +1,11 @@ - Spring Web Contexts + Spring Web Contexts -
    -
    - Normal Web Application : ${message} -
    +
    +
    + Normal Web Application : ${message} +
    \ No newline at end of file diff --git a/spring-mvc-basics-2/src/main/webapp/WEB-INF/web-old.xml b/spring-mvc-basics-2/src/main/webapp/WEB-INF/web-old.xml index 42020e75c4..03322279e2 100644 --- a/spring-mvc-basics-2/src/main/webapp/WEB-INF/web-old.xml +++ b/spring-mvc-basics-2/src/main/webapp/WEB-INF/web-old.xml @@ -15,10 +15,10 @@ org.springframework.web.context.ContextLoaderListener --> - + - + - + + spring-security-kerberos oauth2-framework-impl @@ -641,7 +642,6 @@ spring-activiti spring-akka - spring-all spring-amqp spring-aop spring-apache-camel @@ -689,6 +689,7 @@ spring-core spring-core-2 + spring-core-3 spring-cucumber spring-data-rest @@ -1337,7 +1338,6 @@ spring-5-security-cognito spring-activiti spring-akka - spring-all spring-amqp spring-aop spring-apache-camel @@ -1372,7 +1372,7 @@ spring-boot-property-exp spring-boot-security spring-boot-vue - + spring-caching spring-cloud spring-cloud-bus @@ -1411,6 +1411,7 @@ spring-mobile spring-mockito + spring-mvc-basics-2 spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java @@ -1439,6 +1440,7 @@ spring-resttemplate spring-roo + spring-scheduling spring-security-acl spring-security-angular/server spring-security-cache-control @@ -1461,6 +1463,7 @@ spring-security-thymeleaf spring-security-x509 spring-session + spring-shell spring-sleuth spring-soap spring-social-login From adaff1d253df97727ce0a892fc189baae765a91c Mon Sep 17 00:00:00 2001 From: catalin-burcea Date: Sat, 5 Oct 2019 19:13:09 +0300 Subject: [PATCH 380/396] Split or move guava-collections module --- guava-collections-map/README.md | 12 ++ guava-collections-map/pom.xml | 32 ++++++ .../ClassToInstanceMapUnitTest.java | 2 +- .../GuavaMapInitializeUnitTest.java | 2 +- .../guava/maps/GuavaMapsUnitTest.java | 103 +----------------- .../multimap}/GuavaMultiMapUnitTest.java | 2 +- .../rangemap}/GuavaRangeMapUnitTest.java | 2 +- guava-collections/.gitignore | 13 --- guava-collections/README.md | 6 +- guava-collections/pom.xml | 2 +- .../GuavaCollectionsExamplesUnitTest.java | 2 +- ...avaFilterTransformCollectionsUnitTest.java | 2 +- .../guava/joinsplit}/GuavaStringUnitTest.java | 2 +- .../guava/lists/GuavaListsUnitTest.java | 82 ++++++++++++++ .../GuavaOrderingExamplesUnitTest.java | 2 +- .../ordering}/GuavaOrderingUnitTest.java | 2 +- .../CollectionApachePartitionUnitTest.java | 2 +- .../CollectionGuavaPartitionUnitTest.java | 2 +- .../CollectionJavaPartitionUnitTest.java | 2 +- .../guava/queues}/EvictingQueueUnitTest.java | 2 +- .../queues}/MinMaxPriorityQueueUnitTest.java | 2 +- .../guava/table}/GuavaTableUnitTest.java | 2 +- .../hamcrest/HamcrestExamplesUnitTest.java | 2 +- .../src/test/resources/.gitignore | 13 --- guava/README.md | 1 - pom.xml | 2 + 26 files changed, 149 insertions(+), 149 deletions(-) create mode 100644 guava-collections-map/README.md create mode 100644 guava-collections-map/pom.xml rename {guava-collections/src/test/java/org/baeldung/guava => guava-collections-map/src/test/java/com/baeldung/guava/classtoinstancemap}/ClassToInstanceMapUnitTest.java (97%) rename {guava-collections/src/test/java/org/baeldung/guava/maps/initialize => guava-collections-map/src/test/java/com/baeldung/guava/initializemaps}/GuavaMapInitializeUnitTest.java (95%) rename guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java => guava-collections-map/src/test/java/com/baeldung/guava/maps/GuavaMapsUnitTest.java (51%) rename {guava-collections/src/test/java/org/baeldung/guava => guava-collections-map/src/test/java/com/baeldung/guava/multimap}/GuavaMultiMapUnitTest.java (97%) rename {guava-collections/src/test/java/org/baeldung/guava => guava-collections-map/src/test/java/com/baeldung/guava/rangemap}/GuavaRangeMapUnitTest.java (99%) delete mode 100644 guava-collections/.gitignore rename guava-collections/src/test/java/{org/baeldung/guava => com/baeldung/guava/collections}/GuavaCollectionsExamplesUnitTest.java (99%) rename guava-collections/src/test/java/{org/baeldung/guava => com/baeldung/guava/filtertransform}/GuavaFilterTransformCollectionsUnitTest.java (99%) rename guava-collections/src/test/java/{org/baeldung/guava => com/baeldung/guava/joinsplit}/GuavaStringUnitTest.java (99%) create mode 100644 guava-collections/src/test/java/com/baeldung/guava/lists/GuavaListsUnitTest.java rename guava-collections/src/test/java/{org/baeldung/guava => com/baeldung/guava/ordering}/GuavaOrderingExamplesUnitTest.java (99%) rename guava-collections/src/test/java/{org/baeldung/guava => com/baeldung/guava/ordering}/GuavaOrderingUnitTest.java (98%) rename guava-collections/src/test/java/{org/baeldung/java => com/baeldung/guava/partition}/CollectionApachePartitionUnitTest.java (97%) rename guava-collections/src/test/java/{org/baeldung/java => com/baeldung/guava/partition}/CollectionGuavaPartitionUnitTest.java (98%) rename guava-collections/src/test/java/{org/baeldung/java => com/baeldung/guava/partition}/CollectionJavaPartitionUnitTest.java (98%) rename guava-collections/src/test/java/{org/baeldung/guava => com/baeldung/guava/queues}/EvictingQueueUnitTest.java (95%) rename guava-collections/src/test/java/{org/baeldung/guava => com/baeldung/guava/queues}/MinMaxPriorityQueueUnitTest.java (97%) rename guava-collections/src/test/java/{org/baeldung/guava => com/baeldung/guava/table}/GuavaTableUnitTest.java (99%) rename guava-collections/src/test/java/{org => com}/baeldung/hamcrest/HamcrestExamplesUnitTest.java (99%) delete mode 100644 guava-collections/src/test/resources/.gitignore diff --git a/guava-collections-map/README.md b/guava-collections-map/README.md new file mode 100644 index 0000000000..b3ec5e2157 --- /dev/null +++ b/guava-collections-map/README.md @@ -0,0 +1,12 @@ +========= + +## Guava Collections Map examples + +This module contains articles about map collections in Guava + +### Relevant Articles: +- [Guava – Maps](https://www.baeldung.com/guava-maps) +- [Guide to Guava Multimap](https://www.baeldung.com/guava-multimap) +- [Guide to Guava RangeMap](https://www.baeldung.com/guava-rangemap) +- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) +- [Guide to Guava ClassToInstanceMap](https://www.baeldung.com/guava-class-to-instance-map) \ No newline at end of file diff --git a/guava-collections-map/pom.xml b/guava-collections-map/pom.xml new file mode 100644 index 0000000000..45bb6b8caa --- /dev/null +++ b/guava-collections-map/pom.xml @@ -0,0 +1,32 @@ + + 4.0.0 + com.baeldung.guava + guava-collections-map + 0.1.0-SNAPSHOT + guava-collections-map + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + + + guava-collections-map + + + src/main/resources + true + + + + + + + + \ No newline at end of file diff --git a/guava-collections/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/classtoinstancemap/ClassToInstanceMapUnitTest.java similarity index 97% rename from guava-collections/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java rename to guava-collections-map/src/test/java/com/baeldung/guava/classtoinstancemap/ClassToInstanceMapUnitTest.java index 295672d7ad..b9807379eb 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/ClassToInstanceMapUnitTest.java +++ b/guava-collections-map/src/test/java/com/baeldung/guava/classtoinstancemap/ClassToInstanceMapUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.classtoinstancemap; import com.google.common.collect.ClassToInstanceMap; import com.google.common.collect.ImmutableClassToInstanceMap; import com.google.common.collect.MutableClassToInstanceMap; diff --git a/guava-collections/src/test/java/org/baeldung/guava/maps/initialize/GuavaMapInitializeUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/initializemaps/GuavaMapInitializeUnitTest.java similarity index 95% rename from guava-collections/src/test/java/org/baeldung/guava/maps/initialize/GuavaMapInitializeUnitTest.java rename to guava-collections-map/src/test/java/com/baeldung/guava/initializemaps/GuavaMapInitializeUnitTest.java index 2414afb720..0866496ef5 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/maps/initialize/GuavaMapInitializeUnitTest.java +++ b/guava-collections-map/src/test/java/com/baeldung/guava/initializemaps/GuavaMapInitializeUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava.maps.initialize; +package com.baeldung.guava.initializemaps; import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.Assert.*; diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/maps/GuavaMapsUnitTest.java similarity index 51% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java rename to guava-collections-map/src/test/java/com/baeldung/guava/maps/GuavaMapsUnitTest.java index ab38afa5c4..4108df8c96 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionTypesUnitTest.java +++ b/guava-collections-map/src/test/java/com/baeldung/guava/maps/GuavaMapsUnitTest.java @@ -1,115 +1,18 @@ -package org.baeldung.guava; +package com.baeldung.guava.maps; -import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; import java.util.List; import java.util.Map; -import java.util.Set; import org.junit.Test; import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.base.Predicates; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.BiMap; -import com.google.common.collect.ClassToInstanceMap; -import com.google.common.collect.ContiguousSet; -import com.google.common.collect.DiscreteDomain; -import com.google.common.collect.HashBasedTable; -import com.google.common.collect.HashBiMap; -import com.google.common.collect.HashMultiset; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSortedMap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Multimap; -import com.google.common.collect.Multimaps; -import com.google.common.collect.Multiset; -import com.google.common.collect.Multisets; -import com.google.common.collect.MutableClassToInstanceMap; -import com.google.common.collect.Ordering; -import com.google.common.collect.Range; -import com.google.common.collect.RangeSet; -import com.google.common.collect.Sets; -import com.google.common.collect.Table; -import com.google.common.collect.Tables; -import com.google.common.collect.TreeRangeSet; +import com.google.common.collect.*; -public class GuavaCollectionTypesUnitTest { - - @Test - public void whenCreateList_thenCreated() { - final List names = Lists.newArrayList("John", "Adam", "Jane"); - - names.add("Tom"); - assertEquals(4, names.size()); - - names.remove("Adam"); - assertThat(names, contains("John", "Jane", "Tom")); - } - - @Test - public void whenReverseList_thenReversed() { - final List names = Lists.newArrayList("John", "Adam", "Jane"); - - final List reversed = Lists.reverse(names); - assertThat(reversed, contains("Jane", "Adam", "John")); - } - - @Test - public void whenCreateCharacterListFromString_thenCreated() { - final List chars = Lists.charactersOf("John"); - - assertEquals(4, chars.size()); - assertThat(chars, contains('J', 'o', 'h', 'n')); - } - - @Test - public void whenPartitionList_thenPartitioned() { - final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom", "Viki", "Tyler"); - final List> result = Lists.partition(names, 2); - - assertEquals(3, result.size()); - assertThat(result.get(0), contains("John", "Jane")); - assertThat(result.get(1), contains("Adam", "Tom")); - assertThat(result.get(2), contains("Viki", "Tyler")); - } - - @Test - public void whenRemoveDuplicatesFromList_thenRemoved() { - final List chars = Lists.newArrayList('h', 'e', 'l', 'l', 'o'); - assertEquals(5, chars.size()); - - final List result = ImmutableSet.copyOf(chars).asList(); - assertThat(result, contains('h', 'e', 'l', 'o')); - } - - @Test - public void whenRemoveNullFromList_thenRemoved() { - final List names = Lists.newArrayList("John", null, "Adam", null, "Jane"); - Iterables.removeIf(names, Predicates.isNull()); - - assertEquals(3, names.size()); - assertThat(names, contains("John", "Adam", "Jane")); - } - - @Test - public void whenCreateImmutableList_thenCreated() { - final List names = Lists.newArrayList("John", "Adam", "Jane"); - - names.add("Tom"); - assertEquals(4, names.size()); - - final ImmutableList immutable = ImmutableList.copyOf(names); - assertThat(immutable, contains("John", "Adam", "Jane", "Tom")); - } +public class GuavaMapsUnitTest { @Test public void whenCreateImmutableMap_thenCreated() { diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/multimap/GuavaMultiMapUnitTest.java similarity index 97% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java rename to guava-collections-map/src/test/java/com/baeldung/guava/multimap/GuavaMultiMapUnitTest.java index f51dcadefc..06e85e41e5 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaMultiMapUnitTest.java +++ b/guava-collections-map/src/test/java/com/baeldung/guava/multimap/GuavaMultiMapUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.multimap; import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Multimap; diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java b/guava-collections-map/src/test/java/com/baeldung/guava/rangemap/GuavaRangeMapUnitTest.java similarity index 99% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java rename to guava-collections-map/src/test/java/com/baeldung/guava/rangemap/GuavaRangeMapUnitTest.java index c0c5efea23..f221a2dcf8 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaRangeMapUnitTest.java +++ b/guava-collections-map/src/test/java/com/baeldung/guava/rangemap/GuavaRangeMapUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.rangemap; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNull; diff --git a/guava-collections/.gitignore b/guava-collections/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/guava-collections/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/guava-collections/README.md b/guava-collections/README.md index 95397f0ff0..f2e5fa3577 100644 --- a/guava-collections/README.md +++ b/guava-collections/README.md @@ -6,15 +6,11 @@ ### Relevant Articles: - [Guava Collections Cookbook](https://www.baeldung.com/guava-collections) - [Guava Ordering Cookbook](https://www.baeldung.com/guava-order) +- [Guide to Guava’s Ordering](https://www.baeldung.com/guava-ordering) - [Hamcrest Collections Cookbook](https://www.baeldung.com/hamcrest-collections-arrays) - [Partition a List in Java](https://www.baeldung.com/java-list-split) - [Filtering and Transforming Collections in Guava](https://www.baeldung.com/guava-filter-and-transform-a-collection) - [Guava – Join and Split Collections](https://www.baeldung.com/guava-joiner-and-splitter-tutorial) - [Guava – Lists](https://www.baeldung.com/guava-lists) -- [Guava – Maps](https://www.baeldung.com/guava-maps) -- [Guide to Guava Multimap](https://www.baeldung.com/guava-multimap) -- [Guide to Guava RangeMap](https://www.baeldung.com/guava-rangemap) - [Guide to Guava MinMaxPriorityQueue and EvictingQueue](https://www.baeldung.com/guava-minmax-priority-queue-and-evicting-queue) -- [Initialize a HashMap in Java](https://www.baeldung.com/java-initialize-hashmap) - [Guide to Guava Table](https://www.baeldung.com/guava-table) -- [Guide to Guava ClassToInstanceMap](https://www.baeldung.com/guava-class-to-instance-map) diff --git a/guava-collections/pom.xml b/guava-collections/pom.xml index ecda3c9595..8cdb086029 100644 --- a/guava-collections/pom.xml +++ b/guava-collections/pom.xml @@ -43,7 +43,7 @@ - guava + guava-collections src/main/resources diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/collections/GuavaCollectionsExamplesUnitTest.java similarity index 99% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/collections/GuavaCollectionsExamplesUnitTest.java index 7b5cef6055..86e8dea21c 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaCollectionsExamplesUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/collections/GuavaCollectionsExamplesUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.collections; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/filtertransform/GuavaFilterTransformCollectionsUnitTest.java similarity index 99% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/filtertransform/GuavaFilterTransformCollectionsUnitTest.java index 8562193665..447149f002 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaFilterTransformCollectionsUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/filtertransform/GuavaFilterTransformCollectionsUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.filtertransform; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/joinsplit/GuavaStringUnitTest.java similarity index 99% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/joinsplit/GuavaStringUnitTest.java index a08efd7c31..73c4c3291e 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaStringUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/joinsplit/GuavaStringUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.joinsplit; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsString; diff --git a/guava-collections/src/test/java/com/baeldung/guava/lists/GuavaListsUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/lists/GuavaListsUnitTest.java new file mode 100644 index 0000000000..2f414dcdb1 --- /dev/null +++ b/guava-collections/src/test/java/com/baeldung/guava/lists/GuavaListsUnitTest.java @@ -0,0 +1,82 @@ +package com.baeldung.guava.lists; + +import com.google.common.base.Predicates; +import com.google.common.collect.*; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; +import static org.hamcrest.Matchers.contains; + +public class GuavaListsUnitTest { + + @Test + public void whenCreateList_thenCreated() { + final List names = Lists.newArrayList("John", "Adam", "Jane"); + + names.add("Tom"); + assertEquals(4, names.size()); + + names.remove("Adam"); + assertThat(names, contains("John", "Jane", "Tom")); + } + + @Test + public void whenReverseList_thenReversed() { + final List names = Lists.newArrayList("John", "Adam", "Jane"); + + final List reversed = Lists.reverse(names); + assertThat(reversed, contains("Jane", "Adam", "John")); + } + + @Test + public void whenCreateCharacterListFromString_thenCreated() { + final List chars = Lists.charactersOf("John"); + + assertEquals(4, chars.size()); + assertThat(chars, contains('J', 'o', 'h', 'n')); + } + + @Test + public void whenPartitionList_thenPartitioned() { + final List names = Lists.newArrayList("John", "Jane", "Adam", "Tom", "Viki", "Tyler"); + final List> result = Lists.partition(names, 2); + + assertEquals(3, result.size()); + assertThat(result.get(0), contains("John", "Jane")); + assertThat(result.get(1), contains("Adam", "Tom")); + assertThat(result.get(2), contains("Viki", "Tyler")); + } + + @Test + public void whenRemoveDuplicatesFromList_thenRemoved() { + final List chars = Lists.newArrayList('h', 'e', 'l', 'l', 'o'); + assertEquals(5, chars.size()); + + final List result = ImmutableSet.copyOf(chars).asList(); + assertThat(result, contains('h', 'e', 'l', 'o')); + } + + @Test + public void whenRemoveNullFromList_thenRemoved() { + final List names = Lists.newArrayList("John", null, "Adam", null, "Jane"); + Iterables.removeIf(names, Predicates.isNull()); + + assertEquals(3, names.size()); + assertThat(names, contains("John", "Adam", "Jane")); + } + + @Test + public void whenCreateImmutableList_thenCreated() { + final List names = Lists.newArrayList("John", "Adam", "Jane"); + + names.add("Tom"); + assertEquals(4, names.size()); + + final ImmutableList immutable = ImmutableList.copyOf(names); + assertThat(immutable, contains("John", "Adam", "Jane", "Tom")); + } + +} diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingExamplesUnitTest.java similarity index 99% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingExamplesUnitTest.java index b8be06deb4..46ceccd7ba 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingExamplesUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingExamplesUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.ordering; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.nullValue; diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingUnitTest.java similarity index 98% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingUnitTest.java index dd250898fd..73d464bde5 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaOrderingUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/ordering/GuavaOrderingUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.ordering; import com.google.common.base.Function; import com.google.common.collect.Ordering; diff --git a/guava-collections/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionApachePartitionUnitTest.java similarity index 97% rename from guava-collections/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/partition/CollectionApachePartitionUnitTest.java index 1071d4a5fb..1cb566dd6b 100644 --- a/guava-collections/src/test/java/org/baeldung/java/CollectionApachePartitionUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionApachePartitionUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java; +package com.baeldung.guava.partition; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; diff --git a/guava-collections/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionGuavaPartitionUnitTest.java similarity index 98% rename from guava-collections/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/partition/CollectionGuavaPartitionUnitTest.java index c4ddb35da2..8eb259b490 100644 --- a/guava-collections/src/test/java/org/baeldung/java/CollectionGuavaPartitionUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionGuavaPartitionUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java; +package com.baeldung.guava.partition; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; diff --git a/guava-collections/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionJavaPartitionUnitTest.java similarity index 98% rename from guava-collections/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/partition/CollectionJavaPartitionUnitTest.java index 63583987ea..d62ca275c1 100644 --- a/guava-collections/src/test/java/org/baeldung/java/CollectionJavaPartitionUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/partition/CollectionJavaPartitionUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.java; +package com.baeldung.guava.partition; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; diff --git a/guava-collections/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/queues/EvictingQueueUnitTest.java similarity index 95% rename from guava-collections/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/queues/EvictingQueueUnitTest.java index e4d29d2e92..b9abef8d1f 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/EvictingQueueUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/queues/EvictingQueueUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.queues; import com.google.common.collect.EvictingQueue; diff --git a/guava-collections/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/queues/MinMaxPriorityQueueUnitTest.java similarity index 97% rename from guava-collections/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/queues/MinMaxPriorityQueueUnitTest.java index 1c4df03c86..95446e0d44 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/MinMaxPriorityQueueUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/queues/MinMaxPriorityQueueUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.queues; import com.google.common.collect.MinMaxPriorityQueue; diff --git a/guava-collections/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java b/guava-collections/src/test/java/com/baeldung/guava/table/GuavaTableUnitTest.java similarity index 99% rename from guava-collections/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java rename to guava-collections/src/test/java/com/baeldung/guava/table/GuavaTableUnitTest.java index 28e132074e..e9a9560afd 100644 --- a/guava-collections/src/test/java/org/baeldung/guava/GuavaTableUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/guava/table/GuavaTableUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.guava; +package com.baeldung.guava.table; import static org.assertj.core.api.Assertions.*; import java.util.List; diff --git a/guava-collections/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java b/guava-collections/src/test/java/com/baeldung/hamcrest/HamcrestExamplesUnitTest.java similarity index 99% rename from guava-collections/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java rename to guava-collections/src/test/java/com/baeldung/hamcrest/HamcrestExamplesUnitTest.java index 82b6b8c87c..820f065957 100644 --- a/guava-collections/src/test/java/org/baeldung/hamcrest/HamcrestExamplesUnitTest.java +++ b/guava-collections/src/test/java/com/baeldung/hamcrest/HamcrestExamplesUnitTest.java @@ -1,4 +1,4 @@ -package org.baeldung.hamcrest; +package com.baeldung.hamcrest; import static org.hamcrest.Matchers.contains; import static org.hamcrest.Matchers.containsInAnyOrder; diff --git a/guava-collections/src/test/resources/.gitignore b/guava-collections/src/test/resources/.gitignore deleted file mode 100644 index 83c05e60c8..0000000000 --- a/guava-collections/src/test/resources/.gitignore +++ /dev/null @@ -1,13 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/guava/README.md b/guava/README.md index a9694daf0b..f4d84437cc 100644 --- a/guava/README.md +++ b/guava/README.md @@ -3,7 +3,6 @@ ### Relevant Articles: - [Guava Functional Cookbook](https://www.baeldung.com/guava-functions-predicates) -- [Guide to Guava’s Ordering](https://www.baeldung.com/guava-ordering) - [Guide to Guava’s PreConditions](https://www.baeldung.com/guava-preconditions) - [Introduction to Guava CacheLoader](https://www.baeldung.com/guava-cacheloader) - [Introduction to Guava Memoizer](https://www.baeldung.com/guava-memoizer) diff --git a/pom.xml b/pom.xml index d15e7f22ff..2349d3642f 100644 --- a/pom.xml +++ b/pom.xml @@ -459,6 +459,7 @@ guava guava-io guava-collections + guava-collections-map guava-collections-set guava-modules @@ -1204,6 +1205,7 @@ guava guava-io guava-collections + guava-collections-map guava-collections-set guava-modules From 2cc76b5a956400b27470c893a7b9274c3c1f7543 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 6 Oct 2019 20:36:09 +0200 Subject: [PATCH 381/396] fixups after fork sync --- spring-core-2/README.md | 5 ----- spring-core-3/README.md | 4 ++++ spring-core-3/pom.xml | 7 +++++++ .../src/main/java/com/baeldung/beanfactory/Employee.java | 0 .../main/java/com/baeldung/collection/BaeldungBean.java | 0 .../java/com/baeldung/collection/CollectionConfig.java | 0 .../com/baeldung/collection/CollectionInjectionDemo.java | 0 .../main/java/com/baeldung/collection/CollectionsBean.java | 0 .../com/baeldung/factorybean/FactoryBeanAppConfig.java | 0 .../com/baeldung/factorybean/NonSingleToolFactory.java | 0 .../src/main/java/com/baeldung/factorybean/README.md | 0 .../java/com/baeldung/factorybean/SingleToolFactory.java | 0 .../src/main/java/com/baeldung/factorybean/Tool.java | 0 .../main/java/com/baeldung/factorybean/ToolFactory.java | 0 .../src/main/resources/factorybean-abstract-spring-ctx.xml | 0 .../src/main/resources/factorybean-spring-ctx.xml | 0 .../BeanFactoryWithClassPathResourceIntegrationTest.java | 0 .../src/test/java/com/baeldung/beanfactory/README.md | 0 .../factorybean/AbstractFactoryBeanIntegrationTest.java | 0 .../factorybean/FactoryBeanJavaConfigIntegrationTest.java | 0 .../factorybean/FactoryBeanXmlConfigIntegrationTest.java | 0 .../src/test/resources/beanfactory-example.xml | 0 22 files changed, 11 insertions(+), 5 deletions(-) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/beanfactory/Employee.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/collection/BaeldungBean.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/collection/CollectionConfig.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/collection/CollectionsBean.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/factorybean/README.md (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/factorybean/SingleToolFactory.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/factorybean/Tool.java (100%) rename {spring-core-2 => spring-core-3}/src/main/java/com/baeldung/factorybean/ToolFactory.java (100%) rename {spring-core-2 => spring-core-3}/src/main/resources/factorybean-abstract-spring-ctx.xml (100%) rename {spring-core-2 => spring-core-3}/src/main/resources/factorybean-spring-ctx.xml (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/beanfactory/README.md (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java (100%) rename {spring-core-2 => spring-core-3}/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java (100%) rename {spring-core-2 => spring-core-3}/src/test/resources/beanfactory-example.xml (100%) diff --git a/spring-core-2/README.md b/spring-core-2/README.md index 7ff3a628a1..bcb1ce1fb4 100644 --- a/spring-core-2/README.md +++ b/spring-core-2/README.md @@ -4,8 +4,6 @@ This module contains articles about core Spring functionality ## Relevant Articles: -- [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean) - - [Guide to Spring @Autowired](http://www.baeldung.com/spring-autowire) - [Spring Profiles](http://www.baeldung.com/spring-profiles) - [A Spring Custom Annotation for a Better DAO](http://www.baeldung.com/spring-annotation-bean-pre-processor) @@ -17,7 +15,4 @@ This module contains articles about core Spring functionality - [Spring Events](https://www.baeldung.com/spring-events) - [Spring Null-Safety Annotations](https://www.baeldung.com/spring-null-safety-annotations) - [Using @Autowired in Abstract Classes](https://www.baeldung.com/spring-autowired-abstract-class) -- [Exploring the Spring BeanFactory API](https://www.baeldung.com/spring-beanfactory) -- [How to use the Spring FactoryBean?](https://www.baeldung.com/spring-factorybean) -- [Spring – Injecting Collections](https://www.baeldung.com/spring-injecting-collections) - More articles: [[<-- prev]](/spring-core) \ No newline at end of file diff --git a/spring-core-3/README.md b/spring-core-3/README.md index 4c9e3b9ddf..7ca95ae78e 100644 --- a/spring-core-3/README.md +++ b/spring-core-3/README.md @@ -1,3 +1,7 @@ ## Relevant Articles: - [Understanding getBean() in Spring](https://www.baeldung.com/spring-getbean) +- [Exploring the Spring BeanFactory API](https://www.baeldung.com/spring-beanfactory) +- [How to use the Spring FactoryBean?](https://www.baeldung.com/spring-factorybean) +- [Spring – Injecting Collections](https://www.baeldung.com/spring-injecting-collections) +- More articles: [[<-- prev]](/spring-core-2) \ No newline at end of file diff --git a/spring-core-3/pom.xml b/spring-core-3/pom.xml index 7ed4a2df86..cd82f23320 100644 --- a/spring-core-3/pom.xml +++ b/spring-core-3/pom.xml @@ -29,10 +29,16 @@ spring-core ${spring.version}
    + + javax.annotation + javax.annotation-api + ${annotation-api.version} + org.springframework spring-test ${spring.version} + test org.junit.jupiter @@ -60,6 +66,7 @@ 2.22.1 + 1.3.2 \ No newline at end of file diff --git a/spring-core-2/src/main/java/com/baeldung/beanfactory/Employee.java b/spring-core-3/src/main/java/com/baeldung/beanfactory/Employee.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/beanfactory/Employee.java rename to spring-core-3/src/main/java/com/baeldung/beanfactory/Employee.java diff --git a/spring-core-2/src/main/java/com/baeldung/collection/BaeldungBean.java b/spring-core-3/src/main/java/com/baeldung/collection/BaeldungBean.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/collection/BaeldungBean.java rename to spring-core-3/src/main/java/com/baeldung/collection/BaeldungBean.java diff --git a/spring-core-2/src/main/java/com/baeldung/collection/CollectionConfig.java b/spring-core-3/src/main/java/com/baeldung/collection/CollectionConfig.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/collection/CollectionConfig.java rename to spring-core-3/src/main/java/com/baeldung/collection/CollectionConfig.java diff --git a/spring-core-2/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java b/spring-core-3/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java rename to spring-core-3/src/main/java/com/baeldung/collection/CollectionInjectionDemo.java diff --git a/spring-core-2/src/main/java/com/baeldung/collection/CollectionsBean.java b/spring-core-3/src/main/java/com/baeldung/collection/CollectionsBean.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/collection/CollectionsBean.java rename to spring-core-3/src/main/java/com/baeldung/collection/CollectionsBean.java diff --git a/spring-core-2/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java b/spring-core-3/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java rename to spring-core-3/src/main/java/com/baeldung/factorybean/FactoryBeanAppConfig.java diff --git a/spring-core-2/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java b/spring-core-3/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java rename to spring-core-3/src/main/java/com/baeldung/factorybean/NonSingleToolFactory.java diff --git a/spring-core-2/src/main/java/com/baeldung/factorybean/README.md b/spring-core-3/src/main/java/com/baeldung/factorybean/README.md similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/factorybean/README.md rename to spring-core-3/src/main/java/com/baeldung/factorybean/README.md diff --git a/spring-core-2/src/main/java/com/baeldung/factorybean/SingleToolFactory.java b/spring-core-3/src/main/java/com/baeldung/factorybean/SingleToolFactory.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/factorybean/SingleToolFactory.java rename to spring-core-3/src/main/java/com/baeldung/factorybean/SingleToolFactory.java diff --git a/spring-core-2/src/main/java/com/baeldung/factorybean/Tool.java b/spring-core-3/src/main/java/com/baeldung/factorybean/Tool.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/factorybean/Tool.java rename to spring-core-3/src/main/java/com/baeldung/factorybean/Tool.java diff --git a/spring-core-2/src/main/java/com/baeldung/factorybean/ToolFactory.java b/spring-core-3/src/main/java/com/baeldung/factorybean/ToolFactory.java similarity index 100% rename from spring-core-2/src/main/java/com/baeldung/factorybean/ToolFactory.java rename to spring-core-3/src/main/java/com/baeldung/factorybean/ToolFactory.java diff --git a/spring-core-2/src/main/resources/factorybean-abstract-spring-ctx.xml b/spring-core-3/src/main/resources/factorybean-abstract-spring-ctx.xml similarity index 100% rename from spring-core-2/src/main/resources/factorybean-abstract-spring-ctx.xml rename to spring-core-3/src/main/resources/factorybean-abstract-spring-ctx.xml diff --git a/spring-core-2/src/main/resources/factorybean-spring-ctx.xml b/spring-core-3/src/main/resources/factorybean-spring-ctx.xml similarity index 100% rename from spring-core-2/src/main/resources/factorybean-spring-ctx.xml rename to spring-core-3/src/main/resources/factorybean-spring-ctx.xml diff --git a/spring-core-2/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java rename to spring-core-3/src/test/java/com/baeldung/beanfactory/BeanFactoryWithClassPathResourceIntegrationTest.java diff --git a/spring-core-2/src/test/java/com/baeldung/beanfactory/README.md b/spring-core-3/src/test/java/com/baeldung/beanfactory/README.md similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/beanfactory/README.md rename to spring-core-3/src/test/java/com/baeldung/beanfactory/README.md diff --git a/spring-core-2/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java rename to spring-core-3/src/test/java/com/baeldung/factorybean/AbstractFactoryBeanIntegrationTest.java diff --git a/spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java rename to spring-core-3/src/test/java/com/baeldung/factorybean/FactoryBeanJavaConfigIntegrationTest.java diff --git a/spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java b/spring-core-3/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java similarity index 100% rename from spring-core-2/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java rename to spring-core-3/src/test/java/com/baeldung/factorybean/FactoryBeanXmlConfigIntegrationTest.java diff --git a/spring-core-2/src/test/resources/beanfactory-example.xml b/spring-core-3/src/test/resources/beanfactory-example.xml similarity index 100% rename from spring-core-2/src/test/resources/beanfactory-example.xml rename to spring-core-3/src/test/resources/beanfactory-example.xml From 1d0596f23c70befa1b92743869c1787cdbf671fc Mon Sep 17 00:00:00 2001 From: Priyesh Mashelkar Date: Mon, 7 Oct 2019 04:42:45 +0100 Subject: [PATCH 382/396] BAEL-3300 The Spring TestExecutionListener (#7933) * Added module for article * Update pom.xml * Delete pom.xml * Update and rename ForecastProcessorTest.java to ForecastProcessorUnitTest.java * Updated code as per review comments * Delete .gitignore * Update pom.xml * BAEL-2904 Moved files * BAEL-2904 Deleted files from previous project * BAEL-2904 Moved classes for method reference article * Update pom.xml * BAEL-2904 Updated README.md * First draft * BAEL-3300 Added more tests * BAEL-3300 Removed unused imports * BAEL-3300 Run dos2unix on README.md --- .../AdditionService.java | 10 ++++++ .../AdditionServiceUnitTest.java | 22 ++++++++++++ .../CustomTestExecutionListener.java | 36 +++++++++++++++++++ ...ecutionListenersWithMergeModeUnitTest.java | 26 ++++++++++++++ ...tionListenersWithoutMergeModeUnitTest.java | 26 ++++++++++++++ .../test/resources/META-INF/spring.factories | 3 ++ 6 files changed, 123 insertions(+) create mode 100644 testing-modules/spring-testing/src/main/java/com/baeldung/testexecutionlisteners/AdditionService.java create mode 100644 testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/AdditionServiceUnitTest.java create mode 100644 testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/CustomTestExecutionListener.java create mode 100644 testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/TestExecutionListenersWithMergeModeUnitTest.java create mode 100644 testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/TestExecutionListenersWithoutMergeModeUnitTest.java create mode 100644 testing-modules/spring-testing/src/test/resources/META-INF/spring.factories diff --git a/testing-modules/spring-testing/src/main/java/com/baeldung/testexecutionlisteners/AdditionService.java b/testing-modules/spring-testing/src/main/java/com/baeldung/testexecutionlisteners/AdditionService.java new file mode 100644 index 0000000000..8711c4edc2 --- /dev/null +++ b/testing-modules/spring-testing/src/main/java/com/baeldung/testexecutionlisteners/AdditionService.java @@ -0,0 +1,10 @@ +package com.baeldung.testexecutionlisteners; + +import org.springframework.stereotype.Service; + +@Service +public class AdditionService { + public int add(int a, int b) { + return a + b; + } +} diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/AdditionServiceUnitTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/AdditionServiceUnitTest.java new file mode 100644 index 0000000000..bbe537a3ce --- /dev/null +++ b/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/AdditionServiceUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.testexecutionlisteners; + +import static org.junit.Assert.assertThat; + +import org.hamcrest.Matchers; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = AdditionService.class) +public class AdditionServiceUnitTest { + @Autowired + private AdditionService additionService; + + @Test + public void whenValidNumbersPassed_thenReturnSum() { + assertThat(additionService.add(5, 13), Matchers.is(18)); + } +} diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/CustomTestExecutionListener.java b/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/CustomTestExecutionListener.java new file mode 100644 index 0000000000..748137192d --- /dev/null +++ b/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/CustomTestExecutionListener.java @@ -0,0 +1,36 @@ +package com.baeldung.testexecutionlisteners; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.core.Ordered; +import org.springframework.test.context.TestContext; +import org.springframework.test.context.TestExecutionListener; + +public class CustomTestExecutionListener implements TestExecutionListener, Ordered { + private static final Logger logger = LoggerFactory.getLogger(CustomTestExecutionListener.class); + + public void beforeTestClass(TestContext testContext) throws Exception { + logger.info("beforeTestClass : {}", testContext.getTestClass()); + }; + + public void prepareTestInstance(TestContext testContext) throws Exception { + logger.info("prepareTestInstance : {}", testContext.getTestClass()); + }; + + public void beforeTestMethod(TestContext testContext) throws Exception { + logger.info("beforeTestMethod : {}", testContext.getTestMethod()); + }; + + public void afterTestMethod(TestContext testContext) throws Exception { + logger.info("afterTestMethod : {}", testContext.getTestMethod()); + }; + + public void afterTestClass(TestContext testContext) throws Exception { + logger.info("afterTestClass : {}", testContext.getTestClass()); + } + + @Override + public int getOrder() { + return Integer.MAX_VALUE; + }; +} diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/TestExecutionListenersWithMergeModeUnitTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/TestExecutionListenersWithMergeModeUnitTest.java new file mode 100644 index 0000000000..44937aa755 --- /dev/null +++ b/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/TestExecutionListenersWithMergeModeUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.testexecutionlisteners; + +import static org.junit.Assert.assertThat; + +import org.hamcrest.Matchers; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.TestExecutionListeners.MergeMode; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@TestExecutionListeners(value = { CustomTestExecutionListener.class }, + mergeMode = MergeMode.MERGE_WITH_DEFAULTS) +@ContextConfiguration(classes = AdditionService.class) +public class TestExecutionListenersWithMergeModeUnitTest { + @Autowired + private AdditionService additionService; + + @Test + public void whenValidNumbersPassed_thenReturnSum() { + assertThat(additionService.add(5, 13), Matchers.is(18)); + } +} diff --git a/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/TestExecutionListenersWithoutMergeModeUnitTest.java b/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/TestExecutionListenersWithoutMergeModeUnitTest.java new file mode 100644 index 0000000000..e25ab9f381 --- /dev/null +++ b/testing-modules/spring-testing/src/test/java/com/baeldung/testexecutionlisteners/TestExecutionListenersWithoutMergeModeUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.testexecutionlisteners; + +import static org.junit.Assert.assertThat; + +import org.hamcrest.Matchers; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.TestExecutionListeners; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.context.support.DependencyInjectionTestExecutionListener; + +@RunWith(SpringRunner.class) +@TestExecutionListeners(value = {CustomTestExecutionListener.class, + DependencyInjectionTestExecutionListener.class}) +@ContextConfiguration(classes = AdditionService.class) +public class TestExecutionListenersWithoutMergeModeUnitTest { + @Autowired + private AdditionService additionService; + + @Test + public void whenValidNumbersPassed_thenReturnSum() { + assertThat(additionService.add(5, 13), Matchers.is(18)); + } +} diff --git a/testing-modules/spring-testing/src/test/resources/META-INF/spring.factories b/testing-modules/spring-testing/src/test/resources/META-INF/spring.factories new file mode 100644 index 0000000000..74d21eb86b --- /dev/null +++ b/testing-modules/spring-testing/src/test/resources/META-INF/spring.factories @@ -0,0 +1,3 @@ +# Test Execution Listeners +org.springframework.test.context.TestExecutionListener=\ +com.baeldung.testexecutionlisteners.CustomTestExecutionListener From c2b029fd857f4a62e39b511cde9559bd71248c1d Mon Sep 17 00:00:00 2001 From: kwoyke Date: Mon, 7 Oct 2019 05:45:19 +0200 Subject: [PATCH 383/396] BAEL-3093: Configuring Skip Logic in Spring Batch (#7946) --- .../src/main/java/org/baeldung/batch/App.java | 12 ++- .../org/baeldung/batch/SpringBatchConfig.java | 83 ++++++++++++++++--- .../batch/service/CustomSkipPolicy.java | 29 +++++++ .../service/MissingUsernameException.java | 4 + .../service/NegativeAmountException.java | 14 ++++ .../batch/service/SkippingItemProcessor.java | 24 ++++++ .../resources/input/recordWithInvalidData.csv | 7 ++ 7 files changed, 158 insertions(+), 15 deletions(-) create mode 100644 spring-batch/src/main/java/org/baeldung/batch/service/CustomSkipPolicy.java create mode 100644 spring-batch/src/main/java/org/baeldung/batch/service/MissingUsernameException.java create mode 100644 spring-batch/src/main/java/org/baeldung/batch/service/NegativeAmountException.java create mode 100644 spring-batch/src/main/java/org/baeldung/batch/service/SkippingItemProcessor.java create mode 100644 spring-batch/src/main/resources/input/recordWithInvalidData.csv diff --git a/spring-batch/src/main/java/org/baeldung/batch/App.java b/spring-batch/src/main/java/org/baeldung/batch/App.java index 8bf58e65d2..749591aa03 100644 --- a/spring-batch/src/main/java/org/baeldung/batch/App.java +++ b/spring-batch/src/main/java/org/baeldung/batch/App.java @@ -18,9 +18,17 @@ public class App { // Spring xml config // ApplicationContext context = new ClassPathXmlApplicationContext("spring-batch.xml"); + runJob(context, "firstBatchJob"); + runJob(context, "skippingBatchJob"); + runJob(context, "skipPolicyBatchJob"); + } + + private static void runJob(AnnotationConfigApplicationContext context, String batchJobName) { final JobLauncher jobLauncher = (JobLauncher) context.getBean("jobLauncher"); - final Job job = (Job) context.getBean("firstBatchJob"); - System.out.println("Starting the batch job"); + final Job job = (Job) context.getBean(batchJobName); + + System.out.println("----------------------------------------"); + System.out.println("Starting the batch job: " + batchJobName); try { // To enable multiple execution of a job with the same parameters JobParameters jobParameters = new JobParametersBuilder() diff --git a/spring-batch/src/main/java/org/baeldung/batch/SpringBatchConfig.java b/spring-batch/src/main/java/org/baeldung/batch/SpringBatchConfig.java index 7b19935cc8..b318dda154 100644 --- a/spring-batch/src/main/java/org/baeldung/batch/SpringBatchConfig.java +++ b/spring-batch/src/main/java/org/baeldung/batch/SpringBatchConfig.java @@ -2,7 +2,11 @@ package org.baeldung.batch; import org.baeldung.batch.model.Transaction; import org.baeldung.batch.service.CustomItemProcessor; +import org.baeldung.batch.service.CustomSkipPolicy; +import org.baeldung.batch.service.MissingUsernameException; +import org.baeldung.batch.service.NegativeAmountException; import org.baeldung.batch.service.RecordFieldSetMapper; +import org.baeldung.batch.service.SkippingItemProcessor; import org.springframework.batch.core.Job; import org.springframework.batch.core.Step; import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; @@ -23,30 +27,31 @@ import org.springframework.core.io.Resource; import org.springframework.oxm.Marshaller; import org.springframework.oxm.jaxb.Jaxb2Marshaller; -import java.net.MalformedURLException; import java.text.ParseException; public class SpringBatchConfig { @Autowired - private JobBuilderFactory jobs; + private JobBuilderFactory jobBuilderFactory; @Autowired - private StepBuilderFactory steps; + private StepBuilderFactory stepBuilderFactory; @Value("input/record.csv") private Resource inputCsv; + @Value("input/recordWithInvalidData.csv") + private Resource invalidInputCsv; + @Value("file:xml/output.xml") private Resource outputXml; - @Bean - public ItemReader itemReader() throws UnexpectedInputException, ParseException { - FlatFileItemReader reader = new FlatFileItemReader(); + public ItemReader itemReader(Resource inputData) throws UnexpectedInputException, ParseException { + FlatFileItemReader reader = new FlatFileItemReader<>(); DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer(); String[] tokens = {"username", "userid", "transactiondate", "amount"}; tokenizer.setNames(tokens); - reader.setResource(inputCsv); - DefaultLineMapper lineMapper = new DefaultLineMapper(); + reader.setResource(inputData); + DefaultLineMapper lineMapper = new DefaultLineMapper<>(); lineMapper.setLineTokenizer(tokenizer); lineMapper.setFieldSetMapper(new RecordFieldSetMapper()); reader.setLinesToSkip(1); @@ -60,8 +65,13 @@ public class SpringBatchConfig { } @Bean - public ItemWriter itemWriter(Marshaller marshaller) throws MalformedURLException { - StaxEventItemWriter itemWriter = new StaxEventItemWriter(); + public ItemProcessor skippingItemProcessor() { + return new SkippingItemProcessor(); + } + + @Bean + public ItemWriter itemWriter(Marshaller marshaller) { + StaxEventItemWriter itemWriter = new StaxEventItemWriter<>(); itemWriter.setMarshaller(marshaller); itemWriter.setRootTagName("transactionRecord"); itemWriter.setResource(outputXml); @@ -76,13 +86,60 @@ public class SpringBatchConfig { } @Bean - protected Step step1(ItemReader reader, ItemProcessor processor, ItemWriter writer) { - return steps.get("step1").chunk(10).reader(reader).processor(processor).writer(writer).build(); + protected Step step1(@Qualifier("itemProcessor") ItemProcessor processor, + ItemWriter writer) throws ParseException { + return stepBuilderFactory.get("step1").chunk(10).reader(itemReader(inputCsv)).processor(processor).writer(writer).build(); } @Bean(name = "firstBatchJob") public Job job(@Qualifier("step1") Step step1) { - return jobs.get("firstBatchJob").start(step1).build(); + return jobBuilderFactory.get("firstBatchJob").start(step1).build(); + } + + @Bean + public Step skippingStep(@Qualifier("skippingItemProcessor") ItemProcessor processor, + ItemWriter writer) throws ParseException { + return stepBuilderFactory + .get("skippingStep") + .chunk(10) + .reader(itemReader(invalidInputCsv)) + .processor(processor) + .writer(writer) + .faultTolerant() + .skipLimit(2) + .skip(MissingUsernameException.class) + .skip(NegativeAmountException.class) + .build(); + } + + @Bean(name = "skippingBatchJob") + public Job skippingJob(@Qualifier("skippingStep") Step skippingStep) { + return jobBuilderFactory + .get("skippingBatchJob") + .start(skippingStep) + .build(); + } + + @Bean + public Step skipPolicyStep(@Qualifier("skippingItemProcessor") ItemProcessor processor, + ItemWriter writer) throws ParseException { + return stepBuilderFactory + .get("skipPolicyStep") + .chunk(10) + .reader(itemReader(invalidInputCsv)) + .processor(processor) + .writer(writer) + .faultTolerant() + .skipPolicy(new CustomSkipPolicy()) + .build(); + } + + @Bean(name = "skipPolicyBatchJob") + public Job skipPolicyBatchJob(@Qualifier("skipPolicyStep") Step skipPolicyStep) { + return jobBuilderFactory + .get("skipPolicyBatchJob") + .start(skipPolicyStep) + .build(); } } diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/CustomSkipPolicy.java b/spring-batch/src/main/java/org/baeldung/batch/service/CustomSkipPolicy.java new file mode 100644 index 0000000000..a156a65b6e --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/batch/service/CustomSkipPolicy.java @@ -0,0 +1,29 @@ +package org.baeldung.batch.service; + +import org.springframework.batch.core.step.skip.SkipLimitExceededException; +import org.springframework.batch.core.step.skip.SkipPolicy; + +public class CustomSkipPolicy implements SkipPolicy { + + private static final int MAX_SKIP_COUNT = 2; + private static final int INVALID_TX_AMOUNT_LIMIT = -1000; + + @Override + public boolean shouldSkip(Throwable throwable, int skipCount) throws SkipLimitExceededException { + + if (throwable instanceof MissingUsernameException && skipCount < MAX_SKIP_COUNT) { + return true; + } + + if (throwable instanceof NegativeAmountException && skipCount < MAX_SKIP_COUNT ) { + NegativeAmountException ex = (NegativeAmountException) throwable; + if(ex.getAmount() < INVALID_TX_AMOUNT_LIMIT){ + return false; + } else{ + return true; + } + } + + return false; + } +} diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/MissingUsernameException.java b/spring-batch/src/main/java/org/baeldung/batch/service/MissingUsernameException.java new file mode 100644 index 0000000000..2cf8f4d334 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/batch/service/MissingUsernameException.java @@ -0,0 +1,4 @@ +package org.baeldung.batch.service; + +public class MissingUsernameException extends RuntimeException { +} diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/NegativeAmountException.java b/spring-batch/src/main/java/org/baeldung/batch/service/NegativeAmountException.java new file mode 100644 index 0000000000..c9c05be671 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/batch/service/NegativeAmountException.java @@ -0,0 +1,14 @@ +package org.baeldung.batch.service; + +public class NegativeAmountException extends RuntimeException { + + private double amount; + + public NegativeAmountException(double amount){ + this.amount = amount; + } + + public double getAmount() { + return amount; + } +} diff --git a/spring-batch/src/main/java/org/baeldung/batch/service/SkippingItemProcessor.java b/spring-batch/src/main/java/org/baeldung/batch/service/SkippingItemProcessor.java new file mode 100644 index 0000000000..307a8213e2 --- /dev/null +++ b/spring-batch/src/main/java/org/baeldung/batch/service/SkippingItemProcessor.java @@ -0,0 +1,24 @@ +package org.baeldung.batch.service; + +import org.baeldung.batch.model.Transaction; +import org.springframework.batch.item.ItemProcessor; + +public class SkippingItemProcessor implements ItemProcessor { + + @Override + public Transaction process(Transaction transaction) { + + System.out.println("SkippingItemProcessor: " + transaction); + + if (transaction.getUsername() == null || transaction.getUsername().isEmpty()) { + throw new MissingUsernameException(); + } + + double txAmount = transaction.getAmount(); + if (txAmount < 0) { + throw new NegativeAmountException(txAmount); + } + + return transaction; + } +} diff --git a/spring-batch/src/main/resources/input/recordWithInvalidData.csv b/spring-batch/src/main/resources/input/recordWithInvalidData.csv new file mode 100644 index 0000000000..020edb9826 --- /dev/null +++ b/spring-batch/src/main/resources/input/recordWithInvalidData.csv @@ -0,0 +1,7 @@ +username, user_id, transaction_date, transaction_amount +devendra, 1234, 31/10/2015, 10000 +john, 2134, 3/12/2015, 12321 +robin, 2134, 2/02/2015, 23411 +, 2536, 3/10/2019, 100 +mike, 9876, 5/11/2018, -500 +, 3425, 10/10/2017, 100 \ No newline at end of file From 78cb7a3a3fe59c25d491d6abc5965f77d1981ad4 Mon Sep 17 00:00:00 2001 From: Afshin Date: Mon, 7 Oct 2019 11:52:22 +0200 Subject: [PATCH 384/396] Enhanced: given_when_then pattern naming and formatting problems are resolved --- .../CharacterEncodingExamplesUnitTest.java | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index a8cee6881d..821c434117 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -74,29 +74,28 @@ public class CharacterEncodingExamplesUnitTest { } @Test - public void givenUTF8String_decodeByUS_ASCII_ReplaceMalformedInputSequence() throws IOException { - String input = "The façade pattern is a software design pattern."; + public void givenUTF8String_whenDecodeByUS_ASCII_thenIgnoreMalformedInputSequence() throws IOException { + Assertions.assertEquals("The faade pattern is a software design pattern.", + CharacterEncodingExamples.decodeText( + "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); + } + + @Test + public void givenUTF8String_whenDecodeByUS_ASCII_thenReplaceMalformedInputSequence() throws IOException { Assertions.assertEquals("The fa��ade pattern is a software design pattern.", - CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPLACE)); + CharacterEncodingExamples.decodeText( + "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.REPLACE)); } @Test - public void givenUTF8String_decodeByUS_ASCII_IgnoreMalformedInputSequence() throws IOException { - String input = "The façade pattern is a software design pattern."; - Assertions.assertEquals( - "The faade pattern is a software design pattern.", - CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); - } - - @Test - public void givenUTF8String_decodeByUS_ASCII_ReportMalformedInputSequence() { - String input = "The façade pattern is a software design pattern."; + public void givenUTF8String_whenDecodeByUS_ASCII_thenReportMalformedInputSequence() { Assertions.assertThrows(MalformedInputException.class, - () -> CharacterEncodingExamples.decodeText(input, StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); + () -> CharacterEncodingExamples.decodeText( + "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); } @Test - public void givenTextFile_FindSuitableCandidateEncodings() { + public void givenTextFile_whenFindSuitableCandidateEncodings_thenProduceSuitableCandidateEncodings() { Path path = Paths.get("src/test/resources/encoding.txt"); List allCandidateCharSets = Arrays.asList( StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); @@ -113,6 +112,7 @@ public class CharacterEncodingExamplesUnitTest { ex.printStackTrace(); } }); + Assertions.assertEquals(suitableCharsets, Arrays.asList(StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1)); } From 7a9738b4bb1870bf3445c91e5810fbc3093251ba Mon Sep 17 00:00:00 2001 From: Afshin Date: Mon, 7 Oct 2019 12:20:54 +0200 Subject: [PATCH 385/396] Enhanced: reformatted code to synchronized it with the article --- .../CharacterEncodingExamplesUnitTest.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index 821c434117..39152c6fb1 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -75,23 +75,27 @@ public class CharacterEncodingExamplesUnitTest { @Test public void givenUTF8String_whenDecodeByUS_ASCII_thenIgnoreMalformedInputSequence() throws IOException { - Assertions.assertEquals("The faade pattern is a software design pattern.", - CharacterEncodingExamples.decodeText( - "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); + Assertions.assertEquals("The faade pattern is a software design pattern.", CharacterEncodingExamples.decodeText("The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.IGNORE)); } @Test public void givenUTF8String_whenDecodeByUS_ASCII_thenReplaceMalformedInputSequence() throws IOException { - Assertions.assertEquals("The fa��ade pattern is a software design pattern.", + Assertions.assertEquals( + "The fa��ade pattern is a software design pattern.", CharacterEncodingExamples.decodeText( - "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.REPLACE)); + "The façade pattern is a software design pattern.", + StandardCharsets.US_ASCII, + CodingErrorAction.REPLACE)); } @Test public void givenUTF8String_whenDecodeByUS_ASCII_thenReportMalformedInputSequence() { - Assertions.assertThrows(MalformedInputException.class, + Assertions.assertThrows( + MalformedInputException.class, () -> CharacterEncodingExamples.decodeText( - "The façade pattern is a software design pattern.", StandardCharsets.US_ASCII, CodingErrorAction.REPORT)); + "The façade pattern is a software design pattern.", + StandardCharsets.US_ASCII, + CodingErrorAction.REPORT)); } @Test @@ -99,6 +103,7 @@ public class CharacterEncodingExamplesUnitTest { Path path = Paths.get("src/test/resources/encoding.txt"); List allCandidateCharSets = Arrays.asList( StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); + List suitableCharsets = new ArrayList<>(); allCandidateCharSets.forEach(charset -> { try { From 3997dcc8e20b27063890d43961abcc5c27df3a7e Mon Sep 17 00:00:00 2001 From: Afshin Date: Mon, 7 Oct 2019 12:22:05 +0200 Subject: [PATCH 386/396] Enhanced: renamed a function --- .../baeldung/encoding/CharacterEncodingExamplesUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java index 39152c6fb1..fe3867a3c3 100644 --- a/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java +++ b/core-java-modules/core-java/src/test/java/com/baeldung/encoding/CharacterEncodingExamplesUnitTest.java @@ -99,7 +99,7 @@ public class CharacterEncodingExamplesUnitTest { } @Test - public void givenTextFile_whenFindSuitableCandidateEncodings_thenProduceSuitableCandidateEncodings() { + public void givenTextFile_whenLoopOverAllCandidateEncodings_thenProduceSuitableCandidateEncodings() { Path path = Paths.get("src/test/resources/encoding.txt"); List allCandidateCharSets = Arrays.asList( StandardCharsets.US_ASCII, StandardCharsets.UTF_8, StandardCharsets.ISO_8859_1); From 76bcf49a7ab52911889c18ab5d89cbedf54b9e5b Mon Sep 17 00:00:00 2001 From: Thabo Ntsoko Date: Mon, 7 Oct 2019 18:02:32 +0200 Subject: [PATCH 387/396] java-file-class demo code --- .../baeldung/file/FileClassDemoUnitTest.java | 179 ++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 core-java-modules/core-java-io-2/src/test/java/com/baeldung/file/FileClassDemoUnitTest.java diff --git a/core-java-modules/core-java-io-2/src/test/java/com/baeldung/file/FileClassDemoUnitTest.java b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/file/FileClassDemoUnitTest.java new file mode 100644 index 0000000000..b60a12d208 --- /dev/null +++ b/core-java-modules/core-java-io-2/src/test/java/com/baeldung/file/FileClassDemoUnitTest.java @@ -0,0 +1,179 @@ +package com.baeldung.file; + +import org.junit.Test; + +import java.io.*; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.*; + +public class FileClassDemoUnitTest { + + @Test + public void givenDirectoryCreated_whenMkdirIsInvoked_thenDirectoryIsDeleted() { + File directory = new File("testDirectory"); + if (!directory.isDirectory() || !directory.exists()) { + directory.mkdir(); + } + + assertTrue(directory.delete()); + } + + @Test + public void givenFileCreated_whenCreateNewFileIsInvoked_thenFileIsDeleted() throws IOException { + File file = new File("testFile.txt"); + if (!file.isFile() || !file.exists()) { + file.createNewFile(); + } + + assertTrue(file.delete()); + } + + + @Test + public void givenFileCreated_whenCreateNewFileInvoked_thenMetadataIsAsExpected() throws IOException { + + // different Operating systems have different separator characters + String separatorCharacter = System.getProperty("file.separator"); + + File parentDirectory = makeDirectory("filesDirectory"); + + File childFile = new File(parentDirectory, "file1.txt"); + childFile.createNewFile(); + + assertTrue(childFile.getName().equals("file1.txt")); + assertTrue(childFile.getParentFile().getName().equals(parentDirectory.getName())); + assertTrue(childFile.getPath().equals(parentDirectory.getPath() + separatorCharacter + "file1.txt")); + + removeDirectory(parentDirectory); + } + + + @Test(expected = FileNotFoundException.class) + public void givenReadOnlyFileCreated_whenCreateNewFileInvoked_thenFileCannotBeWrittenTo() throws IOException { + File parentDirectory = makeDirectory("filesDirectory"); + + File childFile = new File(parentDirectory, "file1.txt"); + childFile.createNewFile(); + + childFile.setWritable(false); + + FileOutputStream fos = new FileOutputStream(childFile); + fos.write("Hello World".getBytes()); // write operation + fos.flush(); + fos.close(); + + removeDirectory(parentDirectory); + } + + @Test(expected = FileNotFoundException.class) + public void givenWriteOnlyFileCreated_whenCreateNewFileInvoked_thenFileCannotBeReadFrom() throws IOException { + File parentDirectory = makeDirectory("filesDirectory"); + + File childFile = new File(parentDirectory, "file1.txt"); + childFile.createNewFile(); + + childFile.setReadable(false); + + FileInputStream fis = new FileInputStream(childFile); + fis.read(); // read operation + fis.close(); + + removeDirectory(parentDirectory); + } + + @Test + public void givenFilesCreatedInDirectory_whenCreateNewFileInvoked_thenTheyCanBeListedAsExpected() throws IOException { + File directory = makeDirectory("filtersDirectory"); + + File csvFile = new File(directory, "csvFile.csv"); + csvFile.createNewFile(); + + File txtFile = new File(directory, "txtFile.txt"); + txtFile.createNewFile(); + + //normal listing + assertEquals(2, directory.list().length); + + //filtered listing + FilenameFilter csvFilter = (dir, ext) -> ext.endsWith(".csv"); + assertEquals(1, directory.list(csvFilter).length); + + removeDirectory(directory); + } + + @Test + public void givenDirectoryIsCreated_whenMkdirInvoked_thenDirectoryCanBeRenamed() { + + File source = makeDirectory("source"); + File destination = makeDirectory("destination"); + source.renameTo(destination); + + assertFalse(source.isDirectory()); + assertTrue(destination.isDirectory()); + + removeDirectory(destination); + } + + @Test + public void givenDataIsWrittenToFile_whenWriteIsInvoked_thenFreeSpaceOnSystemDecreases() throws IOException { + + String name = System.getProperty("user.home") + System.getProperty("file.separator") + "test"; + File testDir = makeDirectory(name); + File sample = new File(testDir, "sample.txt"); + + long freeSpaceBeforeWrite = testDir.getFreeSpace(); + writeSampleDataToFile(sample); + + long freeSpaceAfterWrite = testDir.getFreeSpace(); + assertTrue(freeSpaceAfterWrite < freeSpaceBeforeWrite); + + removeDirectory(testDir); + } + + private static File makeDirectory(String directoryName) { + File directory = new File(directoryName); + directory.mkdir(); + if (directory.isDirectory()) { + return directory; + } + throw new RuntimeException("Directory not created for " + directoryName); + } + + private static void removeDirectory(File directory) { + // make sure you don't delete your home directory here + if (directory.getPath().equals(System.getProperty("user.home"))) { + return; + } + + // remove directory and its files from system + if (directory != null && directory.exists()) { + // delete all files inside the directory + File[] filesInDirectory = directory.listFiles(); + if (filesInDirectory != null) { + List files = Arrays.asList(filesInDirectory); + files.forEach(f -> deleteFile(f)); + } + + // finally delete the directory itself + deleteFile(directory); + } + } + + private static void deleteFile(File fileToDelete) { + if (fileToDelete != null && fileToDelete.exists()) { + fileToDelete.delete(); + } + } + + private static void writeSampleDataToFile(File sample) throws IOException { + //write sample text to file + try (FileOutputStream out = new FileOutputStream(sample)) { + for (int i = 1; i <= 100000; i++) { + String sampleText = "Sample line number " + i + "\n"; + out.write(sampleText.getBytes()); + } + } + } +} \ No newline at end of file From 07fae6db143b5bcb889c3e4b6714d29d3beeaab2 Mon Sep 17 00:00:00 2001 From: Rui Vilao Date: Mon, 7 Oct 2019 18:20:12 +0200 Subject: [PATCH 388/396] Renames backoff-jitter to a broader name: design-pattern-cloud. --- .../{backoff-jitter => design-patterns-cloud}/README.md | 0 patterns/{backoff-jitter => design-patterns-cloud}/pom.xml | 6 +++--- .../com/baeldung/backoff/jitter/BackoffWithJitterTest.java | 0 patterns/pom.xml | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) rename patterns/{backoff-jitter => design-patterns-cloud}/README.md (100%) rename patterns/{backoff-jitter => design-patterns-cloud}/pom.xml (95%) rename patterns/{backoff-jitter => design-patterns-cloud}/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterTest.java (100%) diff --git a/patterns/backoff-jitter/README.md b/patterns/design-patterns-cloud/README.md similarity index 100% rename from patterns/backoff-jitter/README.md rename to patterns/design-patterns-cloud/README.md diff --git a/patterns/backoff-jitter/pom.xml b/patterns/design-patterns-cloud/pom.xml similarity index 95% rename from patterns/backoff-jitter/pom.xml rename to patterns/design-patterns-cloud/pom.xml index 739aa87873..b5265a1f94 100644 --- a/patterns/backoff-jitter/pom.xml +++ b/patterns/design-patterns-cloud/pom.xml @@ -4,10 +4,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 com.baeldung - backoff-jitter + design-patterns-cloud 1.0.0-SNAPSHOT pom - backoff-jitter + design-patterns-cloud @@ -52,4 +52,4 @@ 0.16.0 - \ No newline at end of file + diff --git a/patterns/backoff-jitter/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterTest.java b/patterns/design-patterns-cloud/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterTest.java similarity index 100% rename from patterns/backoff-jitter/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterTest.java rename to patterns/design-patterns-cloud/src/test/java/com/baeldung/backoff/jitter/BackoffWithJitterTest.java diff --git a/patterns/pom.xml b/patterns/pom.xml index 196c3c3319..331415bf5b 100644 --- a/patterns/pom.xml +++ b/patterns/pom.xml @@ -24,7 +24,7 @@ design-patterns-structural solid dip - backoff-jitter + design-patterns-cloud From c73001019caaf7cbeded7b64e8065ec9a08f20bc Mon Sep 17 00:00:00 2001 From: Yavuz Tas <12643010+yavuztas@users.noreply.github.com> Date: Mon, 7 Oct 2019 20:39:22 +0200 Subject: [PATCH 389/396] PR-BAEL-2816 (#7733) * implement hexagonal architecture pattern * Add source code for article BAEL-2463 * add source code for article BAEL-2816 * remove irrelevant code * Remove unnecessary default constructors * Refactor equals and hashCode methods in Java 7+ way * Remove equals and hashCode implementations * Change test methods conventional order * change saveRelation method to private To make the code more clean and readable --- .../hibernate/wherejointable/Group.java | 56 +++++++++ .../hibernate/wherejointable/User.java | 74 +++++++++++ .../wherejointable/UserGroupRelation.java | 31 +++++ .../wherejointable/UserGroupRole.java | 7 ++ ...ibernateWhereJoinTableIntegrationTest.java | 118 ++++++++++++++++++ 5 files changed, 286 insertions(+) create mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/Group.java create mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/User.java create mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java create mode 100644 persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java create mode 100644 persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/Group.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/Group.java new file mode 100644 index 0000000000..04684eceac --- /dev/null +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/Group.java @@ -0,0 +1,56 @@ +package com.baeldung.hibernate.wherejointable; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToMany; + +@Entity(name = "e_group") +public class Group { + + @Id + @GeneratedValue + private Long id; + + private String name; + + @ManyToMany(mappedBy = "groups") + private List users = new ArrayList<>(); + + public Group(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getUsers() { + return users; + } + + public void setUsers(List users) { + this.users = users; + } + + @Override + public String toString() { + return "Group [name=" + name + "]"; + } + +} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/User.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/User.java new file mode 100644 index 0000000000..7fc077eeb2 --- /dev/null +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/User.java @@ -0,0 +1,74 @@ +package com.baeldung.hibernate.wherejointable; + +import java.util.ArrayList; +import java.util.List; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.ManyToMany; + +import org.hibernate.annotations.WhereJoinTable; + +@Entity +public class User { + + @Id + @GeneratedValue + private Long id; + + private String name; + + @ManyToMany + @JoinTable(name = "r_user_group", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "group_id")) + private List groups = new ArrayList<>(); + + @WhereJoinTable(clause = "role='MODERATOR'") + @ManyToMany + @JoinTable(name = "r_user_group", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "group_id")) + private List moderatorGroups = new ArrayList<>(); + + public User(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public List getGroups() { + return groups; + } + + public void setGroups(List groups) { + this.groups = groups; + } + + public void setModeratorGroups(List moderatorGroups) { + this.moderatorGroups = moderatorGroups; + } + + public List getModeratorGroups() { + return moderatorGroups; + } + + @Override + public String toString() { + return "User [name=" + name + "]"; + } + +} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java new file mode 100644 index 0000000000..00dd19699c --- /dev/null +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRelation.java @@ -0,0 +1,31 @@ +package com.baeldung.hibernate.wherejointable; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.Id; + +@Entity(name = "r_user_group") +public class UserGroupRelation implements Serializable { + + @Id + @Column(name = "user_id", insertable = false, updatable = false) + private final Long userId; + + @Id + @Column(name = "group_id", insertable = false, updatable = false) + private final Long groupId; + + @Enumerated(EnumType.STRING) + private final UserGroupRole role; + + public UserGroupRelation(Long userId, Long groupId, UserGroupRole role) { + this.userId = userId; + this.groupId = groupId; + this.role = role; + } + +} diff --git a/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java new file mode 100644 index 0000000000..62d9cb28ea --- /dev/null +++ b/persistence-modules/hibernate-mapping/src/main/java/com/baeldung/hibernate/wherejointable/UserGroupRole.java @@ -0,0 +1,7 @@ +package com.baeldung.hibernate.wherejointable; + +public enum UserGroupRole { + + MEMBER, MODERATOR + +} diff --git a/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java new file mode 100644 index 0000000000..93783216ce --- /dev/null +++ b/persistence-modules/hibernate-mapping/src/test/java/com/baeldung/hibernate/wherejointable/HibernateWhereJoinTableIntegrationTest.java @@ -0,0 +1,118 @@ +package com.baeldung.hibernate.wherejointable; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.dialect.H2Dialect; +import org.hibernate.service.ServiceRegistry; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +public class HibernateWhereJoinTableIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + /** + * Test data + */ + private User user1; + private User user2; + private User user3; + private Group group1; + private Group group2; + + @BeforeClass + public static void beforeTests() { + Configuration configuration = new Configuration().addAnnotatedClass(User.class) + .addAnnotatedClass(Group.class) + .addAnnotatedClass(UserGroupRelation.class) + .setProperty("hibernate.dialect", H2Dialect.class.getName()) + .setProperty("hibernate.connection.driver_class", org.h2.Driver.class.getName()) + .setProperty("hibernate.connection.url", "jdbc:h2:mem:test") + .setProperty("hibernate.connection.username", "sa") + .setProperty("hibernate.connection.password", "") + .setProperty("hibernate.hbm2ddl.auto", "update"); + + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder() + .applySettings(configuration.getProperties()) + .build(); + + sessionFactory = configuration.buildSessionFactory(serviceRegistry); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + + user1 = new User("user1"); + user2 = new User("user2"); + user3 = new User("user3"); + + group1 = new Group("group1"); + group2 = new Group("group2"); + + session.save(group1); + session.save(group2); + + session.save(user1); + session.save(user2); + session.save(user3); + + saveRelation(user1, group1, UserGroupRole.MODERATOR); + saveRelation(user2, group1, UserGroupRole.MODERATOR); + saveRelation(user3, group1, UserGroupRole.MEMBER); + + saveRelation(user1, group2, UserGroupRole.MEMBER); + saveRelation(user2, group2, UserGroupRole.MODERATOR); + } + + @After + public void tearDown() { + session.getTransaction().commit(); + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } + + @Test + public void givenUser1_getGroups_returnsAllGroups() { + List groups = user1.getGroups(); + assertEquals(2, groups.size()); + + assertTrue(groups.contains(group1)); + assertTrue(groups.contains(group2)); + } + + @Test + public void givenUser1_getModeratorGroups_returnsOnlyModeratorGroups() { + List groups = user1.getModeratorGroups(); + assertEquals(1, groups.size()); + + assertTrue(groups.contains(group1)); + } + + private void saveRelation(User user, Group group, UserGroupRole role) { + UserGroupRelation relation = new UserGroupRelation(user.getId(), group.getId(), role); + + session.save(relation); + session.flush(); + session.refresh(user); + session.refresh(group); + } + +} From ea44e531190043ab1a707372363d1878b606431b Mon Sep 17 00:00:00 2001 From: fejera Date: Wed, 9 Oct 2019 15:06:56 +0200 Subject: [PATCH 390/396] #7979 - fixed link --- java-streams/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java-streams/README.md b/java-streams/README.md index 5c231f756f..a57fdec7fa 100644 --- a/java-streams/README.md +++ b/java-streams/README.md @@ -18,4 +18,4 @@ This module contains articles about the Stream API in Java. - [Counting Matches on a Stream Filter](https://www.baeldung.com/java-stream-filter-count) - [Java 8 Streams peek() API](https://www.baeldung.com/java-streams-peek-api) - [Working With Maps Using Streams](https://www.baeldung.com/java-maps-streams) -- More articles: [[next -->]](/../java-streams-2) +- More articles: [[next -->]](/java-streams-2) From 36da8820a0a69ee0698ede88d173856f619ed360 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Wed, 9 Oct 2019 16:45:39 +0200 Subject: [PATCH 391/396] #BAEL-17524 add README descriptions (#7957) --- lombok/README.md | 6 +++++- lucene/README.md | 4 ++++ mapstruct/README.md | 4 ++++ maven-all/README.md | 6 +++++- maven-all/maven-war-plugin/README.md | 6 +++++- maven-all/maven/README.md | 5 +++++ maven-all/profiles/README.md | 6 +++++- maven-all/versions-maven-plugin/README.md | 6 +++++- maven-archetype/README.md | 5 ++++- maven-java-11/README.md | 7 +++++++ maven-polyglot/README.md | 4 ++++ mesos-marathon/README.md | 4 ++++ 12 files changed, 57 insertions(+), 6 deletions(-) create mode 100644 maven-java-11/README.md diff --git a/lombok/README.md b/lombok/README.md index 54a0984159..39d3cd6b05 100644 --- a/lombok/README.md +++ b/lombok/README.md @@ -1,4 +1,8 @@ -## Relevant Articles: +## Project Lombok + +This module contains articles about Project Lombok. + +### Relevant Articles: - [Introduction to Project Lombok](https://www.baeldung.com/intro-to-project-lombok) - [Using Lombok’s @Builder Annotation](https://www.baeldung.com/lombok-builder) - [Using Lombok’s @Getter for Boolean Fields](https://www.baeldung.com/lombok-getter-boolean) diff --git a/lucene/README.md b/lucene/README.md index 2bfd8bf4e1..ad83f26386 100644 --- a/lucene/README.md +++ b/lucene/README.md @@ -1,3 +1,7 @@ +## Apache Lucene + +This module contains articles about Apache Lucene. + ### Relevant Articles: - [Introduction to Apache Lucene](https://www.baeldung.com/lucene) diff --git a/mapstruct/README.md b/mapstruct/README.md index 92c55a131d..b784820b98 100644 --- a/mapstruct/README.md +++ b/mapstruct/README.md @@ -1,2 +1,6 @@ +## MapStruct + +This module contains articles about MapStruct. + ###Relevant Articles: - [Quick Guide to MapStruct](https://www.baeldung.com/mapstruct) diff --git a/maven-all/README.md b/maven-all/README.md index d014f323d2..b20d944b14 100644 --- a/maven-all/README.md +++ b/maven-all/README.md @@ -1,3 +1,7 @@ +## Apache Maven + +This module contains articles about Apache Maven. Please refer to its submodules. + ### Relevant Articles -- [Apache Maven Tutorial](https://www.baeldung.com/maven) \ No newline at end of file +- [Apache Maven Tutorial](https://www.baeldung.com/maven) diff --git a/maven-all/maven-war-plugin/README.md b/maven-all/maven-war-plugin/README.md index d559fea80b..09d33772f0 100644 --- a/maven-all/maven-war-plugin/README.md +++ b/maven-all/maven-war-plugin/README.md @@ -1,3 +1,7 @@ +## Maven WAR Plugin + +This module contains articles about the Maven WAR Plugin. + ### Relevant Articles -- [Eclipse Error: web.xml is missing and failOnMissingWebXml is set to true](https://www.baeldung.com/eclipse-error-web-xml-missing) \ No newline at end of file +- [Eclipse Error: web.xml is missing and failOnMissingWebXml is set to true](https://www.baeldung.com/eclipse-error-web-xml-missing) diff --git a/maven-all/maven/README.md b/maven-all/maven/README.md index acf7dfc47b..ced4a52703 100644 --- a/maven-all/maven/README.md +++ b/maven-all/maven/README.md @@ -1,3 +1,8 @@ +## Apache Maven + +This module contains articles about core Apache Maven. Articles about other Maven plugins (such as the Maven WAR Plugin) +have their own dedicated modules. + ### Relevant Articles - [Guide to the Core Maven Plugins](https://www.baeldung.com/core-maven-plugins) diff --git a/maven-all/profiles/README.md b/maven-all/profiles/README.md index 22d5d7f70c..cfbe5c397f 100644 --- a/maven-all/profiles/README.md +++ b/maven-all/profiles/README.md @@ -1,3 +1,7 @@ +## Maven Profiles + +This module contains articles about Maven profiles. + ### Relevant Articles -- [Guide to Maven Profiles](https://www.baeldung.com/maven-profiles) \ No newline at end of file +- [Guide to Maven Profiles](https://www.baeldung.com/maven-profiles) diff --git a/maven-all/versions-maven-plugin/README.md b/maven-all/versions-maven-plugin/README.md index 8f5670f802..19414a2a4b 100644 --- a/maven-all/versions-maven-plugin/README.md +++ b/maven-all/versions-maven-plugin/README.md @@ -1,3 +1,7 @@ +## Versions Maven Plugin + +This module contains articles about the Versions Maven Plugin. + ### Relevant Articles -- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version) \ No newline at end of file +- [Use the Latest Version of a Dependency in Maven](https://www.baeldung.com/maven-dependency-latest-version) diff --git a/maven-archetype/README.md b/maven-archetype/README.md index b707150854..ba5a83fe14 100644 --- a/maven-archetype/README.md +++ b/maven-archetype/README.md @@ -1,4 +1,7 @@ +## Maven Archetype + +This module contains articles about the Maven Archetype Plugin. + ### Relevant Articles: -================================ - [Guide to Maven Archetype](https://www.baeldung.com/maven-archetype) diff --git a/maven-java-11/README.md b/maven-java-11/README.md new file mode 100644 index 0000000000..fcb6ea3f06 --- /dev/null +++ b/maven-java-11/README.md @@ -0,0 +1,7 @@ +## Maven and Java 11 + +This module contains articles about Maven with Java 11+. + +### Relevant Articles: + +- [Multi-Module Maven Application with Java Modules](https://www.baeldung.com/maven-multi-module-project-java-jpms) diff --git a/maven-polyglot/README.md b/maven-polyglot/README.md index 8635c8eddf..037b921ae7 100644 --- a/maven-polyglot/README.md +++ b/maven-polyglot/README.md @@ -1,3 +1,7 @@ +## Maven Polyglot + +This module contains articles about Maven Polyglot. + To run the maven-polyglot-json-app successfully, you first have to build the maven-polyglot-json-extension module using: mvn clean install. ### Relevant Articles: diff --git a/mesos-marathon/README.md b/mesos-marathon/README.md index 09467ebfcb..65b2361698 100644 --- a/mesos-marathon/README.md +++ b/mesos-marathon/README.md @@ -1,3 +1,7 @@ +## Marathon and Mesos + +This module contains articles about Marathon and Mesos. + ### Relevant articles - [Simple Jenkins Pipeline with Marathon and Mesos](https://www.baeldung.com/jenkins-pipeline-with-marathon-mesos) From 34cae4c2583ec6d44b52719d8a5a8ee91744d639 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Wed, 9 Oct 2019 16:46:09 +0200 Subject: [PATCH 392/396] #BAEL-17526 add README descriptions (#7959) --- osgi/{readme.md => README.md} | 14 +++++++------- patterns/README.md | 3 +++ pdf/README.md | 4 ++++ performance-tests/README.md | 4 ++++ persistence-modules/README.md | 3 +++ play-framework/README.md | 6 +++++- protobuffer/README.md | 4 ++++ rabbitmq/README.md | 4 ++++ raml/README.MD | 5 +++-- ratpack/README.md | 4 ++++ 10 files changed, 41 insertions(+), 10 deletions(-) rename osgi/{readme.md => README.md} (94%) create mode 100644 patterns/README.md create mode 100644 persistence-modules/README.md diff --git a/osgi/readme.md b/osgi/README.md similarity index 94% rename from osgi/readme.md rename to osgi/README.md index ee5d7d66c4..732f624302 100644 --- a/osgi/readme.md +++ b/osgi/README.md @@ -1,5 +1,9 @@ -OSGi -==== +## OSGi + +This module contains articles about OSGi. + +### Relevant articles: + - [Introduction to OSGi](https://www.baeldung.com/osgi) Info --- @@ -84,11 +88,7 @@ Oxygen.1 Wed, 6 Sep 2017 -- 17:00 (-0400) org.eclipse.osgi_3.12.1.v20170821-1548.jar - = = NOT GOOD = = - - ## Relevant articles: - - [Introduction to OSGi](https://www.baeldung.com/osgi) - + = = NOT GOOD = = diff --git a/patterns/README.md b/patterns/README.md new file mode 100644 index 0000000000..bbc48e3f34 --- /dev/null +++ b/patterns/README.md @@ -0,0 +1,3 @@ +## Patterns + +This module contains articles about design patterns. diff --git a/pdf/README.md b/pdf/README.md index 8525dc4f69..8c7bd1fa26 100644 --- a/pdf/README.md +++ b/pdf/README.md @@ -1,3 +1,7 @@ +## PDF + +This module contains articles about PDF files. + ### Relevant Articles: - [PDF Conversions in Java](https://www.baeldung.com/pdf-conversions-java) - [Creating PDF Files in Java](https://www.baeldung.com/java-pdf-creation) diff --git a/performance-tests/README.md b/performance-tests/README.md index 918c81bb69..09ed26ae19 100644 --- a/performance-tests/README.md +++ b/performance-tests/README.md @@ -1,3 +1,7 @@ +## Performance Tests + +This module contains articles about performance testing. + ### Relevant Articles: - [Performance of Java Mapping Frameworks](https://www.baeldung.com/java-performance-mapping-frameworks) diff --git a/persistence-modules/README.md b/persistence-modules/README.md new file mode 100644 index 0000000000..f6abc5782a --- /dev/null +++ b/persistence-modules/README.md @@ -0,0 +1,3 @@ +## Persistence Modules + +This module contains articles about persistence. Actual articles go into its submodules. diff --git a/play-framework/README.md b/play-framework/README.md index 2309b67422..a28c3f7ad7 100644 --- a/play-framework/README.md +++ b/play-framework/README.md @@ -1,4 +1,8 @@ -###Relevant Articles: +## Play Framework + +This module contains articles about the Play Framework. + +### Relevant Articles: - [REST API with Play Framework in Java](https://www.baeldung.com/rest-api-with-play) - [Routing In Play Applications in Java](https://www.baeldung.com/routing-in-play) - [Introduction To Play In Java](https://www.baeldung.com/java-intro-to-the-play-framework) diff --git a/protobuffer/README.md b/protobuffer/README.md index 4302418a8b..329ad0e071 100644 --- a/protobuffer/README.md +++ b/protobuffer/README.md @@ -1,3 +1,7 @@ +## Google Protocol Buffer + +This module contains articles about Google Protocol Buffer. + ### Relevant articles - [Introduction to Google Protocol Buffer](https://www.baeldung.com/google-protocol-buffer) diff --git a/rabbitmq/README.md b/rabbitmq/README.md index 01e51bd784..218b1a4b14 100644 --- a/rabbitmq/README.md +++ b/rabbitmq/README.md @@ -1,3 +1,7 @@ +## RabbitMQ + +This module contains articles about RabbitMQ. + ### Relevant articles - [Introduction to RabbitMQ](https://www.baeldung.com/rabbitmq) diff --git a/raml/README.MD b/raml/README.MD index fcf0b41a18..2a3b9771be 100644 --- a/raml/README.MD +++ b/raml/README.MD @@ -1,2 +1,3 @@ -###The Course -The "REST With Spring" Classes: https://bit.ly/restwithspring +## RAML + +This module contains articles about the RESTful API Modeling Language (RAML). diff --git a/ratpack/README.md b/ratpack/README.md index 706fd0c8c3..9c24670709 100644 --- a/ratpack/README.md +++ b/ratpack/README.md @@ -1,3 +1,7 @@ +## Ratpack + +This module contains articles about Ratpack. + ### Relevant articles - [Introduction to Ratpack](https://www.baeldung.com/ratpack) From b3a46b828d31c0d3f613335820fee70f2ecc8707 Mon Sep 17 00:00:00 2001 From: Alessio Stalla Date: Wed, 9 Oct 2019 18:34:51 +0200 Subject: [PATCH 393/396] #BAEL-17527 add README descriptions (#7964) --- oauth2-framework-impl/README.md | 4 ++++ reactor-core/README.md | 4 ++++ resteasy/README.md | 5 ++--- restx/README.md | 6 +++++- rsocket/README.md | 6 +++++- rule-engines/README.md | 6 +++++- rxjava-2/README.md | 7 ++++++- rxjava/README.md | 7 ++++++- spf4j/README.md | 6 +++++- spring-boot-performance/README.md | 4 ++++ spring-boot-properties/README.md | 4 ++++ spring-mvc-basics/README.md | 5 +++-- twitter4j/README.md | 2 +- 13 files changed, 54 insertions(+), 12 deletions(-) diff --git a/oauth2-framework-impl/README.md b/oauth2-framework-impl/README.md index 60fefe3415..ea9686b451 100644 --- a/oauth2-framework-impl/README.md +++ b/oauth2-framework-impl/README.md @@ -1,3 +1,7 @@ +## OAuth 2.0 Implementation + +This module contains articles about the implementation of OAuth2 with Java EE. + ### Relevant Articles - [Implementing The OAuth 2.0 Authorization Framework Using Java EE](https://www.baeldung.com/java-ee-oauth2-implementation) diff --git a/reactor-core/README.md b/reactor-core/README.md index ba5b355d02..e3cca35f86 100644 --- a/reactor-core/README.md +++ b/reactor-core/README.md @@ -1,3 +1,7 @@ +## Reactor Core + +This module contains articles about Reactor Core. + ### Relevant articles - [Intro To Reactor Core](https://www.baeldung.com/reactor-core) diff --git a/resteasy/README.md b/resteasy/README.md index 3f3c833256..b576fbdf41 100644 --- a/resteasy/README.md +++ b/resteasy/README.md @@ -1,7 +1,6 @@ -========= - -## A Guide to RESTEasy +## RESTEasy +This module contains articles about RESTEasy. ### Relevant Articles: - [A Guide to RESTEasy](https://www.baeldung.com/resteasy-tutorial) diff --git a/restx/README.md b/restx/README.md index 665f7ea82d..a8180c984d 100644 --- a/restx/README.md +++ b/restx/README.md @@ -1,4 +1,8 @@ -# Relevant Articles +## RESTX + +This module contains articles about RESTX. + +### Relevant Articles * [Introduction to RESTX](https://www.baeldung.com/java-restx) diff --git a/rsocket/README.md b/rsocket/README.md index fa232bc515..b859842bf3 100644 --- a/rsocket/README.md +++ b/rsocket/README.md @@ -1,3 +1,7 @@ -Relevant articles +## RSocket + +This module contains articles about RSocket. + +### Relevant articles - [Introduction to RSocket](https://www.baeldung.com/rsocket) diff --git a/rule-engines/README.md b/rule-engines/README.md index 37d419daf5..64b1ec020d 100644 --- a/rule-engines/README.md +++ b/rule-engines/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Rule Engines + +This module contains articles about rule engines. Articles specific to a given rule engine go in the relevant submodule. + +### Relevant articles: - [List of Rules Engines in Java](https://www.baeldung.com/java-rule-engines) diff --git a/rxjava-2/README.md b/rxjava-2/README.md index 43c1a9942b..87f606a323 100644 --- a/rxjava-2/README.md +++ b/rxjava-2/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## RxJava + +This module contains articles about RxJava. + +### Relevant articles: - [RxJava and Error Handling](https://www.baeldung.com/rxjava-error-handling) - [RxJava 2 – Flowable](https://www.baeldung.com/rxjava-2-flowable) @@ -7,3 +11,4 @@ - [Combining RxJava Completables](https://www.baeldung.com/rxjava-completable) - [Converting Synchronous and Asynchronous APIs to Observables using RxJava2](https://www.baeldung.com/rxjava-apis-to-observables) - [RxJava Hooks](https://www.baeldung.com/rxjava-hooks) +- More articles: [[<-- prev]](/rxjava) diff --git a/rxjava/README.md b/rxjava/README.md index f9b7e2ba0d..c9308ddcc6 100644 --- a/rxjava/README.md +++ b/rxjava/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## RxJava + +This module contains articles about RxJava. + +### Relevant articles: - [Dealing with Backpressure with RxJava](https://www.baeldung.com/rxjava-backpressure) - [How to Test RxJava?](https://www.baeldung.com/rxjava-testing) @@ -13,3 +17,4 @@ - [Filtering Observables in RxJava](https://www.baeldung.com/rxjava-filtering) - [RxJava One Observable, Multiple Subscribers](https://www.baeldung.com/rxjava-multiple-subscribers-observable) - [Difference Between Flatmap and Switchmap in RxJava](https://www.baeldung.com/rxjava-flatmap-switchmap) +- More articles: [[next -->]](/rxjava-2) diff --git a/spf4j/README.md b/spf4j/README.md index a39cd01b5e..5c7bcf6116 100644 --- a/spf4j/README.md +++ b/spf4j/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## SPF4J + +This module contains articles about SPF4J. + +### Relevant articles: - [Introduction to SPF4J](https://www.baeldung.com/spf4j) diff --git a/spring-boot-performance/README.md b/spring-boot-performance/README.md index 015dd759a8..f6a11720de 100644 --- a/spring-boot-performance/README.md +++ b/spring-boot-performance/README.md @@ -1,3 +1,7 @@ +## Spring Boot Performance + +This module contains articles about Spring Boot performance. + ### Relevant Articles - [Lazy Initialization in Spring Boot 2](https://www.baeldung.com/spring-boot-lazy-initialization) diff --git a/spring-boot-properties/README.md b/spring-boot-properties/README.md index 48ff79537c..daf7c55ab3 100644 --- a/spring-boot-properties/README.md +++ b/spring-boot-properties/README.md @@ -1,3 +1,7 @@ +## Spring Boot Properties + +This module contains articles about Properties in Spring Boot. + ### Relevant Articles: - [Reloading Properties Files in Spring](https://www.baeldung.com/spring-reloading-properties) - [Guide to @ConfigurationProperties in Spring Boot](https://www.baeldung.com/configuration-properties-in-spring-boot) diff --git a/spring-mvc-basics/README.md b/spring-mvc-basics/README.md index a04c6e7ae7..0855015e70 100644 --- a/spring-mvc-basics/README.md +++ b/spring-mvc-basics/README.md @@ -1,6 +1,7 @@ -========= +## Spring MVC Basics -## Spring MVC Basics with Java Configuration Example Project +This module contains articles about the basics of Spring MVC. Articles about more specific areas of Spring MVC have +their own module. ### The Course The "REST With Spring" Classes: http://bit.ly/restwithspring diff --git a/twitter4j/README.md b/twitter4j/README.md index 8c9ee92348..e7295fe809 100644 --- a/twitter4j/README.md +++ b/twitter4j/README.md @@ -1,6 +1,6 @@ ## Twitter4J -This module contains articles about Twitter4J +This module contains articles about Twitter4J. ### Relevant articles From 62e264c52e9ad854e022ae084490f2fbbd3334e4 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Wed, 9 Oct 2019 17:35:05 +0100 Subject: [PATCH 394/396] Add README descriptions 31 (#7960) --- couchbase/README.md | 4 +++- custom-pmd/README.md | 6 ++++++ dagger/README.md | 4 ++++ data-structures/README.md | 4 ++++ ddd/README.md | 4 ++++ deeplearning4j/README.md | 5 +++-- disruptor/README.md | 6 +++++- dozer/README.md | 5 +++++ drools/README.MD | 5 +++++ dubbo/README.md | 6 +++++- 10 files changed, 44 insertions(+), 5 deletions(-) diff --git a/couchbase/README.md b/couchbase/README.md index c4c7df97da..913c413132 100644 --- a/couchbase/README.md +++ b/couchbase/README.md @@ -1,4 +1,6 @@ -## Couchbase SDK Tutorial Project +## Couchbase + +This module contains articles about Couchbase ### Relevant Articles: - [Introduction to Couchbase SDK for Java](https://www.baeldung.com/java-couchbase-sdk) diff --git a/custom-pmd/README.md b/custom-pmd/README.md index 065a1128f3..0c42106fe8 100644 --- a/custom-pmd/README.md +++ b/custom-pmd/README.md @@ -1 +1,7 @@ ## Custom PMD Rules + +This module contains articles about PMD + +### Relevant Articles: + +- [Introduction To PMD](https://www.baeldung.com/pmd) \ No newline at end of file diff --git a/dagger/README.md b/dagger/README.md index 81dc161ca1..d942622d0a 100644 --- a/dagger/README.md +++ b/dagger/README.md @@ -1,3 +1,7 @@ +## Dagger + +This module contains articles about Dagger + ### Relevant articles: - [Introduction to Dagger 2](https://www.baeldung.com/dagger-2) diff --git a/data-structures/README.md b/data-structures/README.md index 5ea9657173..b7f15c2eb8 100644 --- a/data-structures/README.md +++ b/data-structures/README.md @@ -1,3 +1,7 @@ +## Data Structures + +This module contains articles about data structures in Java + ## Relevant articles: - [The Trie Data Structure in Java](https://www.baeldung.com/trie-java) diff --git a/ddd/README.md b/ddd/README.md index 6b68fe2205..daeb663e3b 100644 --- a/ddd/README.md +++ b/ddd/README.md @@ -1,3 +1,7 @@ +## Domain-driven Design (DDD) + +This module contains articles about Domain-driven Design (DDD) + ### Relevant articles - [Persisting DDD Aggregates](https://www.baeldung.com/spring-persisting-ddd-aggregates) diff --git a/deeplearning4j/README.md b/deeplearning4j/README.md index eb1e19daa1..07954b1a11 100644 --- a/deeplearning4j/README.md +++ b/deeplearning4j/README.md @@ -1,5 +1,6 @@ -### Sample deeplearning4j Project -This is a sample project for the [deeplearning4j](https://deeplearning4j.org) library. +## Deeplearning4j + +This module contains articles about Deeplearning4j ### Relevant Articles: - [A Guide to Deeplearning4j](https://www.baeldung.com/deeplearning4j) diff --git a/disruptor/README.md b/disruptor/README.md index 8f977d090a..7d2fca4672 100644 --- a/disruptor/README.md +++ b/disruptor/README.md @@ -1,3 +1,7 @@ -## Relevant articles: +## Disruptor + +This module contains articles about LMAX Disruptor + +### Relevant articles: - [Concurrency with LMAX Disruptor – An Introduction](https://www.baeldung.com/lmax-disruptor-concurrency) diff --git a/dozer/README.md b/dozer/README.md index 2e610b836a..e87e889ce3 100644 --- a/dozer/README.md +++ b/dozer/README.md @@ -1,2 +1,7 @@ +## Dozer + +This module contains articles about Dozer + ### Relevant Articles: + - [A Guide to Mapping With Dozer](https://www.baeldung.com/dozer) diff --git a/drools/README.MD b/drools/README.MD index 1ff3dfba20..bcec0cc2f0 100644 --- a/drools/README.MD +++ b/drools/README.MD @@ -1,4 +1,9 @@ +## Drools + +This module contains articles about Drools + ### Relevant Articles: + - [Introduction to Drools](https://www.baeldung.com/drools) - [Drools Using Rules from Excel Files](https://www.baeldung.com/drools-excel) - [An Example of Backward Chaining in Drools](https://www.baeldung.com/drools-backward-chaining) diff --git a/dubbo/README.md b/dubbo/README.md index 566efe28f5..3ccca4960a 100644 --- a/dubbo/README.md +++ b/dubbo/README.md @@ -1,4 +1,8 @@ -## Relevant articles: +## Dubbo + +This module contains articles about Dubbo + +### Relevant articles: - [Introduction to Dubbo](https://www.baeldung.com/dubbo) From 97610a2f6d58fbbf23732c41f36e69a647227b5d Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 10 Oct 2019 10:10:26 +0530 Subject: [PATCH 395/396] Added fixes in root pom to fix integration builds --- pom.xml | 7 ++++++- spring-core-2/pom.xml | 2 +- spring-shell/pom.xml | 4 ++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index c5a9959573..03674dc58f 100644 --- a/pom.xml +++ b/pom.xml @@ -704,6 +704,7 @@ spring-boot-security spring-boot-testing spring-boot-vue + spring-caching spring-boot-libraries @@ -746,6 +747,7 @@ spring-mobile spring-mockito + spring-mvc-basics-2 spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java @@ -774,6 +776,8 @@ spring-rest-simple spring-resttemplate spring-roo + + spring-scheduling spring-security-acl spring-security-angular/server spring-security-cache-control @@ -798,6 +802,7 @@ spring-security-thymeleaf spring-security-x509 spring-session + spring-shell spring-sleuth spring-soap spring-social-login @@ -881,7 +886,6 @@ spring-5-security-cognito spring-activiti spring-akka - spring-all spring-aop spring-apache-camel spring-batch @@ -1432,6 +1436,7 @@ spring-core spring-core-2 + spring-core-3 spring-cucumber spring-data-rest diff --git a/spring-core-2/pom.xml b/spring-core-2/pom.xml index 032f6a05fc..21548d6984 100644 --- a/spring-core-2/pom.xml +++ b/spring-core-2/pom.xml @@ -162,7 +162,7 @@ - spring-all + spring-core-2 src/main/resources diff --git a/spring-shell/pom.xml b/spring-shell/pom.xml index 8d13e4af5e..1b6fe28fdd 100644 --- a/spring-shell/pom.xml +++ b/spring-shell/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - spring-core-2 + spring-shell 0.1-SNAPSHOT - spring-core-2 + spring-shell war From 26d4229f4dcf98beb8bc82d1ebbf98a59a6b2d1e Mon Sep 17 00:00:00 2001 From: eric-martin Date: Fri, 11 Oct 2019 20:22:14 -0500 Subject: [PATCH 396/396] Fixed method reference examples in labmda article --- .../java8/lambda/methodreference/MethodReferenceUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java index 835815aecd..957294153b 100644 --- a/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java +++ b/core-java-modules/core-java-lambdas/src/test/java/com/baeldung/java8/lambda/methodreference/MethodReferenceUnitTest.java @@ -35,9 +35,9 @@ public class MethodReferenceUnitTest { public void referenceToInstanceMethodOfArbitratyObjectOfParticularType() { List numbers = Arrays.asList(5, 3, 50, 24, 40, 2, 9, 18); numbers.stream() - .sorted((a, b) -> Integer.compare(a, b)); + .sorted((a, b) -> a.compareTo(b)); numbers.stream() - .sorted(Integer::compare); + .sorted(Integer::compareTo); } @Test

    UIA}2|bZ0%5O?g3I* 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�_X?gp`fKL$?P^yoi_GQ`bZueCyh))tx3~6)d-$ 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

  • Bk+KJay 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%0DkSsnTjJ)Prlnk0fJY;WP`j99@U9?)_s{L&4#ek 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

    UIA}2|bZ0%5O?g3I* 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�_X?gp`fKL$?P^yoi_GQ`bZueCyh))tx3~6)d-$ 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

  • Bk+KJay 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%0DkSsnTjJ)Prlnk0fJY;WP`j99@U9?)_s{L&4#ek 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