From c1d7b27f244b355da11a4aa562002d2b94bfd953 Mon Sep 17 00:00:00 2001 From: Rafael Zucareli Date: Wed, 1 Aug 2018 20:14:08 -0300 Subject: [PATCH 001/429] Add Subject alternative name I add a Subject alternative name (SAN) parameter in all commands. This make the generated certificate work in Google Chrome. Before that change Chrome presents a ERR_CERT_COMMON_NAME_INVALID even when you had add the certificate as a know Authority. --- spring-security-x509/keystore/Makefile | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/spring-security-x509/keystore/Makefile b/spring-security-x509/keystore/Makefile index 63498fea76..2b5b5e8abe 100644 --- a/spring-security-x509/keystore/Makefile +++ b/spring-security-x509/keystore/Makefile @@ -20,65 +20,65 @@ all: clean create-keystore add-host create-truststore add-client create-keystore: # Generate a certificate authority (CA) - keytool -genkey -alias ca -ext BC=ca:true \ + keytool -genkey -alias ca -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ -validity 3650 -dname $(DNAME_CA) \ -keystore $(KEYSTORE) -storepass $(PASSWORD) add-host: # Generate a host certificate - keytool -genkey -alias $(HOSTNAME) \ + keytool -genkey -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ -validity 3650 -dname $(DNAME_HOST) \ -keystore $(KEYSTORE) -storepass $(PASSWORD) # Generate a host certificate signing request - keytool -certreq -alias $(HOSTNAME) -ext BC=ca:true \ + keytool -certreq -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ -validity 3650 -file "$(HOSTNAME).csr" \ -keystore $(KEYSTORE) -storepass $(PASSWORD) # Generate signed certificate with the certificate authority - keytool -gencert -alias ca \ + keytool -gencert -alias ca -ext san=dns:localhost,ip:127.0.0.1 \ -validity 3650 -sigalg SHA512withRSA \ -infile "$(HOSTNAME).csr" -outfile "$(HOSTNAME).crt" -rfc \ -keystore $(KEYSTORE) -storepass $(PASSWORD) # Import signed certificate into the keystore - keytool -import -trustcacerts -alias $(HOSTNAME) \ + keytool -import -trustcacerts -alias $(HOSTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -file "$(HOSTNAME).crt" \ -keystore $(KEYSTORE) -storepass $(PASSWORD) export-authority: # Export certificate authority - keytool -export -alias ca -file ca.crt -rfc \ + keytool -export -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file ca.crt -rfc \ -keystore $(KEYSTORE) -storepass $(PASSWORD) create-truststore: export-authority # Import certificate authority into a new truststore - keytool -import -trustcacerts -noprompt -alias ca -file ca.crt \ + keytool -import -trustcacerts -noprompt -alias ca -ext san=dns:localhost,ip:127.0.0.1 -file ca.crt \ -keystore $(TRUSTSTORE) -storepass $(PASSWORD) add-client: # Generate client certificate - keytool -genkey -alias $(CLIENTNAME) \ + keytool -genkey -alias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA -keypass $(PASSWORD) \ -validity 3650 -dname $(DNAME_CLIENT) \ -keystore $(TRUSTSTORE) -storepass $(PASSWORD) # Generate a host certificate signing request - keytool -certreq -alias $(CLIENTNAME) -ext BC=ca:true \ + keytool -certreq -alias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 -ext BC=ca:true \ -keyalg RSA -keysize 4096 -sigalg SHA512withRSA \ -validity 3650 -file "$(CLIENTNAME).csr" \ -keystore $(TRUSTSTORE) -storepass $(PASSWORD) # Generate signed certificate with the certificate authority - keytool -gencert -alias ca \ + keytool -gencert -alias ca -ext san=dns:localhost,ip:127.0.0.1 \ -validity 3650 -sigalg SHA512withRSA \ -infile "$(CLIENTNAME).csr" -outfile "$(CLIENTNAME).crt" -rfc \ -keystore $(KEYSTORE) -storepass $(PASSWORD) # Import signed certificate into the truststore - keytool -import -trustcacerts -alias $(CLIENTNAME) \ + keytool -import -trustcacerts -alias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -file "$(CLIENTNAME).crt" \ -keystore $(TRUSTSTORE) -storepass $(PASSWORD) # Export private certificate for importing into a browser - keytool -importkeystore -srcalias $(CLIENTNAME) \ + keytool -importkeystore -srcalias $(CLIENTNAME) -ext san=dns:localhost,ip:127.0.0.1 \ -srckeystore $(TRUSTSTORE) -srcstorepass $(PASSWORD) \ -destkeystore "$(CLIENTNAME).p12" -deststorepass $(PASSWORD) \ -deststoretype PKCS12 From d1b8f9b9b35ee84409571844317474295e7a6b4f Mon Sep 17 00:00:00 2001 From: tritty Date: Wed, 9 May 2018 03:58:04 +0530 Subject: [PATCH 002/429] Bean Object, server side and client side example for event streaming example --- .../controller/StockBrokerController.java | 26 ++++++++++++ .../com/baeldung/reactive/model/Stock.java | 18 ++++++++ .../reactive/webclient/StockClient.java | 42 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockBrokerController.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/webclient/StockClient.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockBrokerController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockBrokerController.java new file mode 100644 index 0000000000..f904943a02 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockBrokerController.java @@ -0,0 +1,26 @@ +package com.baeldung.reactive.controller; + +import java.time.Duration; +import java.util.Date; +import java.util.Random; +import java.util.stream.Stream; + +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.baeldung.reactive.model.Stock; + +import reactor.core.publisher.Flux; + +@RestController +public class StockBrokerController { + + @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE, value = "/getStockPrice") + public Flux getStockUpdates() { + final Flux stockFlux = Flux.fromStream(Stream.generate(() -> new Stock(new Random().nextFloat(), "WebFluxStock", new Date()))); + final Flux intervalFlux = Flux.interval(Duration.ofSeconds(1)); + return Flux.zip(stockFlux, intervalFlux) + .map(t1 -> t1.getT1()); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java new file mode 100644 index 0000000000..959c8de685 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java @@ -0,0 +1,18 @@ +package com.baeldung.reactive.model; + +import java.util.Date; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@AllArgsConstructor +@Data +@NoArgsConstructor +public class Stock { + + private float price; + private String name; + private Date date; + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webclient/StockClient.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webclient/StockClient.java new file mode 100644 index 0000000000..d86660dd90 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/webclient/StockClient.java @@ -0,0 +1,42 @@ +package com.baeldung.reactive.webclient; + +import java.util.Collections; + +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.http.MediaType; +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.reactive.model.Stock; + +@SpringBootApplication +public class StockClient { + + @Bean + WebClient webClient() { + return WebClient.builder() + .baseUrl("http://localhost:8080/getStockPrice") + .build(); + } + + @Bean + CommandLineRunner runner(WebClient webClient) { + return args -> { + webClient.get() + .accept(MediaType.TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(Stock.class) + .log() + .subscribe(System.out::println); + }; + } + + public static void main(String args[]) throws InterruptedException { + new SpringApplicationBuilder(StockClient.class).properties(Collections.singletonMap("server.port", "9090")) + .run(args); + + } + +} From 3623391466fc1999629d1a2edac10025abc909e0 Mon Sep 17 00:00:00 2001 From: tritty Date: Mon, 28 May 2018 00:21:44 +0530 Subject: [PATCH 003/429] BAEL-1628 Access a File from the Classpath in a Spring Application --- .../java/com/baeldung/resource/AppConfig.java | 10 ++ .../resource/ClassPathResourceReader.java | 98 +++++++++++++++++++ .../src/main/resources/data/resource-data.txt | 1 + .../baeldung/resource/SpringResourceTest.java | 57 +++++++++++ .../src/test/resources/data/resource-data.txt | 1 + 5 files changed, 167 insertions(+) create mode 100644 spring-core/src/main/java/com/baeldung/resource/AppConfig.java create mode 100644 spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java create mode 100644 spring-core/src/main/resources/data/resource-data.txt create mode 100644 spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java create mode 100644 spring-core/src/test/resources/data/resource-data.txt diff --git a/spring-core/src/main/java/com/baeldung/resource/AppConfig.java b/spring-core/src/main/java/com/baeldung/resource/AppConfig.java new file mode 100644 index 0000000000..5b266cb5cf --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/resource/AppConfig.java @@ -0,0 +1,10 @@ +package com.baeldung.resource; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan("com.baeldung.resource") +public class AppConfig { + +} diff --git a/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java b/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java new file mode 100644 index 0000000000..f1e88eef04 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java @@ -0,0 +1,98 @@ +package com.baeldung.resource; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.stereotype.Component; +import org.springframework.util.ResourceUtils; + +@Component +public class ClassPathResourceReader { + + @Autowired + ResourceLoader resourceLoader; + + @Autowired + ApplicationContext applicationContext; + + @Value("classpath:data/resource-data.txt") + Resource resourceFile; + + /** + * Constructs Resource object by making use of its built-in implementations. + * + * @return Resource + */ + public Resource constructResourceManually() { + Resource resource = new ClassPathResource("data/resource-data.txt"); + return resource; + } + + /** + * Constructs resource object by making use of ResourceLoader. + * + * @return Resource + */ + public Resource retrieveResourceUsingResourceLoader() { + Resource resource = resourceLoader.getResource("classpath:data/resource-data.txt"); + return resource; + } + + /** + * Constructs Resource instance by making use of ApplicationContext. + * + * @return Resource + */ + public Resource retrieveResourceUsingApplicationContext() { + Resource resource = applicationContext.getResource("classpath:data/resource-data.txt"); + return resource; + } + + /** + * ResourceUtils example for getting file data. + * + * @return + * @throws FileNotFoundException + */ + public File retrieveFileUsingResourceUtils() throws FileNotFoundException { + return ResourceUtils.getFile("classpath:data/resource-data.txt"); + } + + /** + * Utility method to list contents ofa file. + * + * @param fileResource + * @return + * @throws IOException + */ + public String listResourceContentsUsingFile(File fileResource) throws IOException { + FileReader fileReader = new FileReader(fileResource); + BufferedReader bufReader = new BufferedReader(fileReader); + String dataLine = bufReader.readLine(); + StringBuilder fileData = new StringBuilder(); + while (null != dataLine) { + fileData.append(dataLine); + dataLine = bufReader.readLine(); + } + + fileReader.close(); + return fileData.toString(); + } + + public Resource getSampleFile() { + return resourceFile; + } + + public void setSampleFile(Resource sampleFile) { + this.resourceFile = sampleFile; + } +} diff --git a/spring-core/src/main/resources/data/resource-data.txt b/spring-core/src/main/resources/data/resource-data.txt new file mode 100644 index 0000000000..cf3720cd66 --- /dev/null +++ b/spring-core/src/main/resources/data/resource-data.txt @@ -0,0 +1 @@ +This is a sample text to demonstrate usage of Spring Resource. \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java new file mode 100644 index 0000000000..7703a016f4 --- /dev/null +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java @@ -0,0 +1,57 @@ +package com.baeldung.resource; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.Resource; +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, classes = AppConfig.class) +public class SpringResourceTest { + + @Autowired + private ClassPathResourceReader classPathResourceReader; + + static final String testData = "This is a sample text to demonstrate usage of Spring Resource."; + + @Test + public void whenManualInstance_thenReadSuccessful() throws IOException { + Resource resource = classPathResourceReader.constructResourceManually(); + String fileData = classPathResourceReader.listResourceContentsUsingFile(resource.getFile()); + assertEquals(testData, fileData); + } + + @Test + public void whenResourceLoader_thenReadSuccessful() throws IOException { + Resource resource = classPathResourceReader.retrieveResourceUsingResourceLoader(); + String fileData = classPathResourceReader.listResourceContentsUsingFile(resource.getFile()); + assertEquals(testData, fileData); + } + + @Test + public void whenApplicationContext_thenReadSuccessful() throws IOException { + Resource resource = classPathResourceReader.retrieveResourceUsingApplicationContext(); + String fileData = classPathResourceReader.listResourceContentsUsingFile(resource.getFile()); + assertEquals(testData, fileData); + } + + @Test + public void whenAutowired_thenReadSuccessful() throws IOException { + Resource resource = classPathResourceReader.getSampleFile(); + String fileData = classPathResourceReader.listResourceContentsUsingFile(resource.getFile()); + assertEquals(testData, fileData); + } + + @Test + public void whenResourceUtils_thenReadSuccessful() throws IOException { + String fileData = classPathResourceReader.listResourceContentsUsingFile(classPathResourceReader.retrieveFileUsingResourceUtils()); + assertEquals(testData, fileData); + } +} diff --git a/spring-core/src/test/resources/data/resource-data.txt b/spring-core/src/test/resources/data/resource-data.txt new file mode 100644 index 0000000000..cf3720cd66 --- /dev/null +++ b/spring-core/src/test/resources/data/resource-data.txt @@ -0,0 +1 @@ +This is a sample text to demonstrate usage of Spring Resource. \ No newline at end of file From d2301be9661987e0dc70ec47caa601767a7d58f4 Mon Sep 17 00:00:00 2001 From: tritty Date: Mon, 28 May 2018 00:59:22 +0530 Subject: [PATCH 004/429] inputstream retrieval added --- .../resource/ClassPathResourceReader.java | 26 +++++++++++++++++-- .../baeldung/resource/SpringResourceTest.java | 9 ++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java b/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java index f1e88eef04..c4618247e9 100644 --- a/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java +++ b/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java @@ -5,6 +5,9 @@ import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -68,7 +71,7 @@ public class ClassPathResourceReader { } /** - * Utility method to list contents ofa file. + * Utility method to list contents of a file. * * @param fileResource * @return @@ -83,11 +86,30 @@ public class ClassPathResourceReader { fileData.append(dataLine); dataLine = bufReader.readLine(); } - + bufReader.close(); fileReader.close(); return fileData.toString(); } + /** + * Utility method to list contents of a stream + * + * @param ipStream + * @return + * @throws IOException + */ + public String listResourceContentsUsingInputStream(InputStream ipStream) throws IOException { + BufferedReader bufReader = new BufferedReader(new InputStreamReader(ipStream, "UTF-8")); + String dataLine = bufReader.readLine(); + StringBuilder fileData = new StringBuilder(); + while (null != dataLine) { + fileData.append(dataLine); + dataLine = bufReader.readLine(); + } + bufReader.close(); + return fileData.toString(); + } + public Resource getSampleFile() { return resourceFile; } diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java index 7703a016f4..ba1e2c6d37 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java @@ -18,7 +18,7 @@ public class SpringResourceTest { @Autowired private ClassPathResourceReader classPathResourceReader; - + static final String testData = "This is a sample text to demonstrate usage of Spring Resource."; @Test @@ -54,4 +54,11 @@ public class SpringResourceTest { String fileData = classPathResourceReader.listResourceContentsUsingFile(classPathResourceReader.retrieveFileUsingResourceUtils()); assertEquals(testData, fileData); } + + @Test + public void whenResourceAsStream_thenReadSuccessful() throws IOException { + Resource resource = classPathResourceReader.retrieveResourceUsingResourceLoader(); + String fileData = classPathResourceReader.listResourceContentsUsingInputStream(resource.getInputStream()); + assertEquals(testData, fileData); + } } From afababb85d993ceea021cce07c9d80d1ef422542 Mon Sep 17 00:00:00 2001 From: tritty Date: Mon, 28 May 2018 01:15:13 +0530 Subject: [PATCH 005/429] Removed files related to evaluation article --- .../controller/StockBrokerController.java | 26 ------------ .../com/baeldung/reactive/model/Stock.java | 18 -------- .../reactive/webclient/StockClient.java | 42 ------------------- 3 files changed, 86 deletions(-) delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockBrokerController.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/webclient/StockClient.java diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockBrokerController.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockBrokerController.java deleted file mode 100644 index f904943a02..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/StockBrokerController.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.reactive.controller; - -import java.time.Duration; -import java.util.Date; -import java.util.Random; -import java.util.stream.Stream; - -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -import com.baeldung.reactive.model.Stock; - -import reactor.core.publisher.Flux; - -@RestController -public class StockBrokerController { - - @GetMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE, value = "/getStockPrice") - public Flux getStockUpdates() { - final Flux stockFlux = Flux.fromStream(Stream.generate(() -> new Stock(new Random().nextFloat(), "WebFluxStock", new Date()))); - final Flux intervalFlux = Flux.interval(Duration.ofSeconds(1)); - return Flux.zip(stockFlux, intervalFlux) - .map(t1 -> t1.getT1()); - } -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java deleted file mode 100644 index 959c8de685..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/model/Stock.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.reactive.model; - -import java.util.Date; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@AllArgsConstructor -@Data -@NoArgsConstructor -public class Stock { - - private float price; - private String name; - private Date date; - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/webclient/StockClient.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/webclient/StockClient.java deleted file mode 100644 index d86660dd90..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/webclient/StockClient.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.baeldung.reactive.webclient; - -import java.util.Collections; - -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.http.MediaType; -import org.springframework.web.reactive.function.client.WebClient; - -import com.baeldung.reactive.model.Stock; - -@SpringBootApplication -public class StockClient { - - @Bean - WebClient webClient() { - return WebClient.builder() - .baseUrl("http://localhost:8080/getStockPrice") - .build(); - } - - @Bean - CommandLineRunner runner(WebClient webClient) { - return args -> { - webClient.get() - .accept(MediaType.TEXT_EVENT_STREAM) - .retrieve() - .bodyToFlux(Stock.class) - .log() - .subscribe(System.out::println); - }; - } - - public static void main(String args[]) throws InterruptedException { - new SpringApplicationBuilder(StockClient.class).properties(Collections.singletonMap("server.port", "9090")) - .run(args); - - } - -} From 3f75993c4b45e302026c06f2af65eb6e4655dadb Mon Sep 17 00:00:00 2001 From: tritty Date: Fri, 8 Jun 2018 08:19:19 +0530 Subject: [PATCH 006/429] + Aligning code to the article. Removed Utility methods and classes --- .../java/com/baeldung/resource/AppConfig.java | 10 -- .../resource/ClassPathResourceReader.java | 120 ------------------ .../src/main/resources/data/resource-data.txt | 1 - .../baeldung/resource/SpringResourceTest.java | 83 ++++++++---- .../src/test/resources/data/resource-data.txt | 1 - 5 files changed, 60 insertions(+), 155 deletions(-) delete mode 100644 spring-core/src/main/java/com/baeldung/resource/AppConfig.java delete mode 100644 spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java delete mode 100644 spring-core/src/main/resources/data/resource-data.txt delete mode 100644 spring-core/src/test/resources/data/resource-data.txt diff --git a/spring-core/src/main/java/com/baeldung/resource/AppConfig.java b/spring-core/src/main/java/com/baeldung/resource/AppConfig.java deleted file mode 100644 index 5b266cb5cf..0000000000 --- a/spring-core/src/main/java/com/baeldung/resource/AppConfig.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.resource; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; - -@Configuration -@ComponentScan("com.baeldung.resource") -public class AppConfig { - -} diff --git a/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java b/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java deleted file mode 100644 index c4618247e9..0000000000 --- a/spring-core/src/main/java/com/baeldung/resource/ClassPathResourceReader.java +++ /dev/null @@ -1,120 +0,0 @@ -package com.baeldung.resource; - -import java.io.BufferedReader; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.UnsupportedEncodingException; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.ApplicationContext; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; -import org.springframework.stereotype.Component; -import org.springframework.util.ResourceUtils; - -@Component -public class ClassPathResourceReader { - - @Autowired - ResourceLoader resourceLoader; - - @Autowired - ApplicationContext applicationContext; - - @Value("classpath:data/resource-data.txt") - Resource resourceFile; - - /** - * Constructs Resource object by making use of its built-in implementations. - * - * @return Resource - */ - public Resource constructResourceManually() { - Resource resource = new ClassPathResource("data/resource-data.txt"); - return resource; - } - - /** - * Constructs resource object by making use of ResourceLoader. - * - * @return Resource - */ - public Resource retrieveResourceUsingResourceLoader() { - Resource resource = resourceLoader.getResource("classpath:data/resource-data.txt"); - return resource; - } - - /** - * Constructs Resource instance by making use of ApplicationContext. - * - * @return Resource - */ - public Resource retrieveResourceUsingApplicationContext() { - Resource resource = applicationContext.getResource("classpath:data/resource-data.txt"); - return resource; - } - - /** - * ResourceUtils example for getting file data. - * - * @return - * @throws FileNotFoundException - */ - public File retrieveFileUsingResourceUtils() throws FileNotFoundException { - return ResourceUtils.getFile("classpath:data/resource-data.txt"); - } - - /** - * Utility method to list contents of a file. - * - * @param fileResource - * @return - * @throws IOException - */ - public String listResourceContentsUsingFile(File fileResource) throws IOException { - FileReader fileReader = new FileReader(fileResource); - BufferedReader bufReader = new BufferedReader(fileReader); - String dataLine = bufReader.readLine(); - StringBuilder fileData = new StringBuilder(); - while (null != dataLine) { - fileData.append(dataLine); - dataLine = bufReader.readLine(); - } - bufReader.close(); - fileReader.close(); - return fileData.toString(); - } - - /** - * Utility method to list contents of a stream - * - * @param ipStream - * @return - * @throws IOException - */ - public String listResourceContentsUsingInputStream(InputStream ipStream) throws IOException { - BufferedReader bufReader = new BufferedReader(new InputStreamReader(ipStream, "UTF-8")); - String dataLine = bufReader.readLine(); - StringBuilder fileData = new StringBuilder(); - while (null != dataLine) { - fileData.append(dataLine); - dataLine = bufReader.readLine(); - } - bufReader.close(); - return fileData.toString(); - } - - public Resource getSampleFile() { - return resourceFile; - } - - public void setSampleFile(Resource sampleFile) { - this.resourceFile = sampleFile; - } -} diff --git a/spring-core/src/main/resources/data/resource-data.txt b/spring-core/src/main/resources/data/resource-data.txt deleted file mode 100644 index cf3720cd66..0000000000 --- a/spring-core/src/main/resources/data/resource-data.txt +++ /dev/null @@ -1 +0,0 @@ -This is a sample text to demonstrate usage of Spring Resource. \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java index ba1e2c6d37..cd2b9ee7c1 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java @@ -2,63 +2,100 @@ package com.baeldung.resource; import static org.junit.Assert.assertEquals; +import java.io.BufferedReader; +import java.io.File; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.nio.file.Files; +import java.util.stream.Collectors; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; +import org.springframework.util.ResourceUtils; + +/** + * Test class illustrating various methods of accessing a file from the classpath using Resource. + * @author tritty + * + */ @RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader = AnnotationConfigContextLoader.class, classes = AppConfig.class) +@ContextConfiguration(loader = AnnotationConfigContextLoader.class) public class SpringResourceTest { + /** + * Resource loader instance for lazily loading resources. + */ + @Autowired + private ResourceLoader resourceLoader; @Autowired - private ClassPathResourceReader classPathResourceReader; + private ApplicationContext appContext; - static final String testData = "This is a sample text to demonstrate usage of Spring Resource."; + /** + * Injecting resource + */ + @Value("classpath:data/employees.dat") + private Resource resourceFile; - @Test - public void whenManualInstance_thenReadSuccessful() throws IOException { - Resource resource = classPathResourceReader.constructResourceManually(); - String fileData = classPathResourceReader.listResourceContentsUsingFile(resource.getFile()); - assertEquals(testData, fileData); - } + /** + * Data in data/employee.dat + */ + private static final String EMPLOYEES_EXPECTED = "Joe Employee,Jan Employee,James T. Employee"; @Test public void whenResourceLoader_thenReadSuccessful() throws IOException { - Resource resource = classPathResourceReader.retrieveResourceUsingResourceLoader(); - String fileData = classPathResourceReader.listResourceContentsUsingFile(resource.getFile()); - assertEquals(testData, fileData); + final Resource resource = resourceLoader.getResource("classpath:data/employees.dat"); + final String employees = new String(Files.readAllBytes(resource.getFile() + .toPath())); + assertEquals(EMPLOYEES_EXPECTED, employees); } @Test public void whenApplicationContext_thenReadSuccessful() throws IOException { - Resource resource = classPathResourceReader.retrieveResourceUsingApplicationContext(); - String fileData = classPathResourceReader.listResourceContentsUsingFile(resource.getFile()); - assertEquals(testData, fileData); + final Resource resource = appContext.getResource("classpath:data/employees.dat"); + final String employees = new String(Files.readAllBytes(resource.getFile() + .toPath())); + assertEquals(EMPLOYEES_EXPECTED, employees); } @Test public void whenAutowired_thenReadSuccessful() throws IOException { - Resource resource = classPathResourceReader.getSampleFile(); - String fileData = classPathResourceReader.listResourceContentsUsingFile(resource.getFile()); - assertEquals(testData, fileData); + final String employees = new String(Files.readAllBytes(resourceFile.getFile() + .toPath())); + assertEquals(EMPLOYEES_EXPECTED, employees); } @Test public void whenResourceUtils_thenReadSuccessful() throws IOException { - String fileData = classPathResourceReader.listResourceContentsUsingFile(classPathResourceReader.retrieveFileUsingResourceUtils()); - assertEquals(testData, fileData); + final String employees = new String(Files.readAllBytes(ResourceUtils.getFile("classpath:data/employees.dat") + .toPath())); + assertEquals(EMPLOYEES_EXPECTED, employees); } @Test public void whenResourceAsStream_thenReadSuccessful() throws IOException { - Resource resource = classPathResourceReader.retrieveResourceUsingResourceLoader(); - String fileData = classPathResourceReader.listResourceContentsUsingInputStream(resource.getInputStream()); - assertEquals(testData, fileData); + final InputStream resource = new ClassPathResource("data/employees.dat").getInputStream(); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource))) { + final String employees = reader.lines() + .collect(Collectors.joining("\n")); + assertEquals(EMPLOYEES_EXPECTED, employees); + } + } + + @Test + public void whenResourceAsFile_thenReadSuccessful() throws IOException { + final File resource = new ClassPathResource("data/employees.dat").getFile(); + final String employees = new String(Files.readAllBytes(resource.toPath())); + assertEquals(EMPLOYEES_EXPECTED, employees); } } diff --git a/spring-core/src/test/resources/data/resource-data.txt b/spring-core/src/test/resources/data/resource-data.txt deleted file mode 100644 index cf3720cd66..0000000000 --- a/spring-core/src/test/resources/data/resource-data.txt +++ /dev/null @@ -1 +0,0 @@ -This is a sample text to demonstrate usage of Spring Resource. \ No newline at end of file From 00e495c2d5f64a7c768ecbff038c47a797a6c47a Mon Sep 17 00:00:00 2001 From: Tritty Date: Sat, 25 Aug 2018 20:10:17 +0530 Subject: [PATCH 007/429] Precommit fix --- .../SpringResourceIntegrationTest.java | 6 +- .../baeldung/resource/SpringResourceTest.java | 101 ------------------ 2 files changed, 3 insertions(+), 104 deletions(-) delete mode 100644 spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java index 38e8304f0f..cd2b9ee7c1 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java @@ -31,7 +31,7 @@ import org.springframework.util.ResourceUtils; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(loader = AnnotationConfigContextLoader.class) -public class SpringResourceIntegrationTest { +public class SpringResourceTest { /** * Resource loader instance for lazily loading resources. */ @@ -77,8 +77,8 @@ public class SpringResourceIntegrationTest { @Test public void whenResourceUtils_thenReadSuccessful() throws IOException { - final File employeeFile = ResourceUtils.getFile("classpath:data/employees.dat"); - final String employees = new String(Files.readAllBytes(employeeFile.toPath())); + final String employees = new String(Files.readAllBytes(ResourceUtils.getFile("classpath:data/employees.dat") + .toPath())); assertEquals(EMPLOYEES_EXPECTED, employees); } diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java deleted file mode 100644 index cd2b9ee7c1..0000000000 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceTest.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.baeldung.resource; - -import static org.junit.Assert.assertEquals; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.file.Files; -import java.util.stream.Collectors; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.ApplicationContext; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.support.AnnotationConfigContextLoader; -import org.springframework.util.ResourceUtils; - -/** - * Test class illustrating various methods of accessing a file from the classpath using Resource. - * @author tritty - * - */ - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(loader = AnnotationConfigContextLoader.class) -public class SpringResourceTest { - /** - * Resource loader instance for lazily loading resources. - */ - @Autowired - private ResourceLoader resourceLoader; - - @Autowired - private ApplicationContext appContext; - - /** - * Injecting resource - */ - @Value("classpath:data/employees.dat") - private Resource resourceFile; - - /** - * Data in data/employee.dat - */ - private static final String EMPLOYEES_EXPECTED = "Joe Employee,Jan Employee,James T. Employee"; - - @Test - public void whenResourceLoader_thenReadSuccessful() throws IOException { - final Resource resource = resourceLoader.getResource("classpath:data/employees.dat"); - final String employees = new String(Files.readAllBytes(resource.getFile() - .toPath())); - assertEquals(EMPLOYEES_EXPECTED, employees); - } - - @Test - public void whenApplicationContext_thenReadSuccessful() throws IOException { - final Resource resource = appContext.getResource("classpath:data/employees.dat"); - final String employees = new String(Files.readAllBytes(resource.getFile() - .toPath())); - assertEquals(EMPLOYEES_EXPECTED, employees); - } - - @Test - public void whenAutowired_thenReadSuccessful() throws IOException { - final String employees = new String(Files.readAllBytes(resourceFile.getFile() - .toPath())); - assertEquals(EMPLOYEES_EXPECTED, employees); - } - - @Test - public void whenResourceUtils_thenReadSuccessful() throws IOException { - final String employees = new String(Files.readAllBytes(ResourceUtils.getFile("classpath:data/employees.dat") - .toPath())); - assertEquals(EMPLOYEES_EXPECTED, employees); - } - - @Test - public void whenResourceAsStream_thenReadSuccessful() throws IOException { - final InputStream resource = new ClassPathResource("data/employees.dat").getInputStream(); - try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource))) { - final String employees = reader.lines() - .collect(Collectors.joining("\n")); - assertEquals(EMPLOYEES_EXPECTED, employees); - } - } - - @Test - public void whenResourceAsFile_thenReadSuccessful() throws IOException { - final File resource = new ClassPathResource("data/employees.dat").getFile(); - final String employees = new String(Files.readAllBytes(resource.toPath())); - assertEquals(EMPLOYEES_EXPECTED, employees); - } -} From cca20da9e3814955d7a11968b411dd1a6d1181c7 Mon Sep 17 00:00:00 2001 From: Tritty Date: Fri, 8 Jun 2018 10:00:52 +0530 Subject: [PATCH 008/429] PMD fixes --- .../com/baeldung/resource/SpringResourceIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java index cd2b9ee7c1..85cabb55df 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java @@ -31,7 +31,7 @@ import org.springframework.util.ResourceUtils; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(loader = AnnotationConfigContextLoader.class) -public class SpringResourceTest { +public class SpringResourceIntegrationTest { /** * Resource loader instance for lazily loading resources. */ From 52092ffd70a02d5deaf07cb8ca6e705a8758a2f0 Mon Sep 17 00:00:00 2001 From: Tritty Date: Fri, 15 Jun 2018 19:06:40 +0530 Subject: [PATCH 009/429] Code Review changes Refactored : whenResourceUtils_thenReadSuccessful --- .../com/baeldung/resource/SpringResourceIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java index 85cabb55df..38e8304f0f 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java @@ -77,8 +77,8 @@ public class SpringResourceIntegrationTest { @Test public void whenResourceUtils_thenReadSuccessful() throws IOException { - final String employees = new String(Files.readAllBytes(ResourceUtils.getFile("classpath:data/employees.dat") - .toPath())); + final File employeeFile = ResourceUtils.getFile("classpath:data/employees.dat"); + final String employees = new String(Files.readAllBytes(employeeFile.toPath())); assertEquals(EMPLOYEES_EXPECTED, employees); } From 7f9a2ceace7dfccb3e62258d11f8233edd8ea793 Mon Sep 17 00:00:00 2001 From: Tritty Date: Fri, 20 Jul 2018 15:52:18 +0530 Subject: [PATCH 010/429] BAEL-1934 --- .../mimetype/MimeTypeIntegrationTest.java | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeIntegrationTest.java b/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeIntegrationTest.java new file mode 100644 index 0000000000..885579029a --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeIntegrationTest.java @@ -0,0 +1,131 @@ +package com.baeldung.java.mimetype; + +import static org.junit.Assert.assertEquals; + +import java.io.File; +import java.io.IOException; +import java.net.FileNameMap; +import java.net.MalformedURLException; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; + +import javax.activation.MimetypesFileTypeMap; + +import org.apache.tika.Tika; +import org.junit.Test; + +import net.sf.jmimemagic.Magic; +import net.sf.jmimemagic.MagicException; +import net.sf.jmimemagic.MagicMatch; +import net.sf.jmimemagic.MagicMatchNotFoundException; +import net.sf.jmimemagic.MagicParseException; + +/** + * Test class demonstrating various strategies to resolve MIME type of a file. + * @author tritty + * + */ +public class MimeTypeIntegrationTest { + /** + * Expected Ouput. + */ + public static final String PNG_EXT = "image/png"; + + /** + * The location of the file. + */ + public static final String FILE_LOC = "src/test/resources/product.png"; + + /** + * Test method, demonstrating usage in Java 7. + * + * @throws IOException + */ + @Test + public void whenUsingJava7_thenSuccess() throws IOException { + final Path path = new File(FILE_LOC).toPath(); + final String mimeType = Files.probeContentType(path); + assertEquals(mimeType, PNG_EXT); + } + + /** + * Test method demonstrating the usage of URLConnection to resolve MIME type. + * + * @throws MalformedURLException + * @throws IOException + */ + @Test + public void whenUsingGetContentType_thenSuccess() throws MalformedURLException, IOException { + final File file = new File(FILE_LOC); + final URLConnection connection = file.toURL() + .openConnection(); + final String mimeType = connection.getContentType(); + assertEquals(mimeType, PNG_EXT); + } + + /** + * Test method demonstrating the usage of URLConnection to resolve MIME type. + * + */ + @Test + public void whenUsingGuessContentTypeFromName_thenSuccess() { + final File file = new File(FILE_LOC); + final String mimeType = URLConnection.guessContentTypeFromName(file.getName()); + assertEquals(mimeType, PNG_EXT); + } + + /** + * Test method demonstrating the usage of FileNameMap from URLConnection + * to resolve MIME type of a file. + * + */ + @Test + public void whenUsingGetFileNameMap_thenSuccess() { + final File file = new File(FILE_LOC); + final FileNameMap fileNameMap = URLConnection.getFileNameMap(); + final String mimeType = fileNameMap.getContentTypeFor(file.getName()); + assertEquals(mimeType, PNG_EXT); + } + + /** + * Test method demonstrating the usage of MimeTypesFileTypeMap for resolution of + * MIME type. + * + */ + @Test + public void whenUsingMimeTypesFileTypeMap_thenSuccess() { + final File file = new File(FILE_LOC); + final MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); + final String mimeType = fileTypeMap.getContentType(file.getName()); + assertEquals(mimeType, PNG_EXT); + } + + /** + * Test method demonstrating usage of jMimeMagic. + * + * @throws MagicParseException + * @throws MagicMatchNotFoundException + * @throws MagicException + */ + @Test + public void whenUsingJmimeMagic_thenSuccess() throws MagicParseException, MagicMatchNotFoundException, MagicException { + final File file = new File(FILE_LOC); + final Magic magic = new Magic(); + final MagicMatch match = magic.getMagicMatch(file, false); + assertEquals(match.getMimeType(), PNG_EXT); + } + + /** + * Test method demonstrating usage of Apache Tika. + * + * @throws IOException + */ + @Test + public void whenUsingTika_thenSuccess() throws IOException { + final File file = new File(FILE_LOC); + final Tika tika = new Tika(); + final String mimeType = tika.detect(file); + assertEquals(mimeType, PNG_EXT); + } +} From 37101781ae2847818c1efa4a79b9dca8b4735add Mon Sep 17 00:00:00 2001 From: Tritty Date: Sat, 21 Jul 2018 09:06:19 +0530 Subject: [PATCH 011/429] +indentation correction in pom.xml --- .../mimetype/MimeTypeIntegrationTest.java | 131 ------------------ 1 file changed, 131 deletions(-) delete mode 100644 core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeIntegrationTest.java b/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeIntegrationTest.java deleted file mode 100644 index 885579029a..0000000000 --- a/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeIntegrationTest.java +++ /dev/null @@ -1,131 +0,0 @@ -package com.baeldung.java.mimetype; - -import static org.junit.Assert.assertEquals; - -import java.io.File; -import java.io.IOException; -import java.net.FileNameMap; -import java.net.MalformedURLException; -import java.net.URLConnection; -import java.nio.file.Files; -import java.nio.file.Path; - -import javax.activation.MimetypesFileTypeMap; - -import org.apache.tika.Tika; -import org.junit.Test; - -import net.sf.jmimemagic.Magic; -import net.sf.jmimemagic.MagicException; -import net.sf.jmimemagic.MagicMatch; -import net.sf.jmimemagic.MagicMatchNotFoundException; -import net.sf.jmimemagic.MagicParseException; - -/** - * Test class demonstrating various strategies to resolve MIME type of a file. - * @author tritty - * - */ -public class MimeTypeIntegrationTest { - /** - * Expected Ouput. - */ - public static final String PNG_EXT = "image/png"; - - /** - * The location of the file. - */ - public static final String FILE_LOC = "src/test/resources/product.png"; - - /** - * Test method, demonstrating usage in Java 7. - * - * @throws IOException - */ - @Test - public void whenUsingJava7_thenSuccess() throws IOException { - final Path path = new File(FILE_LOC).toPath(); - final String mimeType = Files.probeContentType(path); - assertEquals(mimeType, PNG_EXT); - } - - /** - * Test method demonstrating the usage of URLConnection to resolve MIME type. - * - * @throws MalformedURLException - * @throws IOException - */ - @Test - public void whenUsingGetContentType_thenSuccess() throws MalformedURLException, IOException { - final File file = new File(FILE_LOC); - final URLConnection connection = file.toURL() - .openConnection(); - final String mimeType = connection.getContentType(); - assertEquals(mimeType, PNG_EXT); - } - - /** - * Test method demonstrating the usage of URLConnection to resolve MIME type. - * - */ - @Test - public void whenUsingGuessContentTypeFromName_thenSuccess() { - final File file = new File(FILE_LOC); - final String mimeType = URLConnection.guessContentTypeFromName(file.getName()); - assertEquals(mimeType, PNG_EXT); - } - - /** - * Test method demonstrating the usage of FileNameMap from URLConnection - * to resolve MIME type of a file. - * - */ - @Test - public void whenUsingGetFileNameMap_thenSuccess() { - final File file = new File(FILE_LOC); - final FileNameMap fileNameMap = URLConnection.getFileNameMap(); - final String mimeType = fileNameMap.getContentTypeFor(file.getName()); - assertEquals(mimeType, PNG_EXT); - } - - /** - * Test method demonstrating the usage of MimeTypesFileTypeMap for resolution of - * MIME type. - * - */ - @Test - public void whenUsingMimeTypesFileTypeMap_thenSuccess() { - final File file = new File(FILE_LOC); - final MimetypesFileTypeMap fileTypeMap = new MimetypesFileTypeMap(); - final String mimeType = fileTypeMap.getContentType(file.getName()); - assertEquals(mimeType, PNG_EXT); - } - - /** - * Test method demonstrating usage of jMimeMagic. - * - * @throws MagicParseException - * @throws MagicMatchNotFoundException - * @throws MagicException - */ - @Test - public void whenUsingJmimeMagic_thenSuccess() throws MagicParseException, MagicMatchNotFoundException, MagicException { - final File file = new File(FILE_LOC); - final Magic magic = new Magic(); - final MagicMatch match = magic.getMagicMatch(file, false); - assertEquals(match.getMimeType(), PNG_EXT); - } - - /** - * Test method demonstrating usage of Apache Tika. - * - * @throws IOException - */ - @Test - public void whenUsingTika_thenSuccess() throws IOException { - final File file = new File(FILE_LOC); - final Tika tika = new Tika(); - final String mimeType = tika.detect(file); - assertEquals(mimeType, PNG_EXT); - } -} From 4b4ac40345deea8a5b27d7b800f2f5d444bf4529 Mon Sep 17 00:00:00 2001 From: Tritty Date: Sat, 21 Jul 2018 10:00:45 +0530 Subject: [PATCH 012/429] synced with master --- .../connectionpools/BasicConnectionPool.java | 87 +++++++++++++ .../connectionpools/C3poDataSource.java | 28 +++++ .../connectionpools/ConnectionPool.java | 18 +++ .../connectionpools/DBCPDataSource.java | 25 ++++ .../connectionpools/HikariCPDataSource.java | 28 +++++ .../java/com/baeldung/manifest/MANIFEST.MF | 1 + .../BasicConnectionPoolUnitTest.java | 69 +++++++++++ .../C3poDataSourceUnitTest.java | 14 +++ .../DBCPDataSourceUnitTest.java | 14 +++ .../HikariCPDataSourceUnitTest.java | 14 +++ .../main/java/com/baeldung/jmapper/User.java | 56 +++++++++ .../java/com/baeldung/jmapper/UserDto.java | 69 +++++++++++ .../java/com/baeldung/jmapper/UserDto1.java | 47 ++++++++ .../com/baeldung/jmapper/relational/User.java | 49 ++++++++ .../baeldung/jmapper/relational/UserDto1.java | 44 +++++++ .../baeldung/jmapper/relational/UserDto2.java | 44 +++++++ libraries/src/main/resources/user_jmapper.xml | 10 ++ .../src/main/resources/user_jmapper1.xml | 5 + .../src/main/resources/user_jmapper2.xml | 21 ++++ .../jmapper/JMapperIntegrationTest.java | 114 ++++++++++++++++++ .../JMapperRelationalIntegrationTest.java | 76 ++++++++++++ .../baeldung/reactive/controller/.gitignore | 1 + .../java/com/baeldung/domain/Article.java | 23 ++++ .../repository/ArticleRepository.java | 22 ++++ .../ArticleRepositoryIntegrationTest.java | 66 ++++++++++ .../src/test/resources/application.properties | 2 +- .../src/test/resources/import_articles.sql | 3 + 27 files changed, 949 insertions(+), 1 deletion(-) create mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java create mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java create mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java create mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java create mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java create mode 100644 core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF create mode 100644 core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java create mode 100644 core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java create mode 100644 core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java create mode 100644 core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java create mode 100644 libraries/src/main/java/com/baeldung/jmapper/User.java create mode 100644 libraries/src/main/java/com/baeldung/jmapper/UserDto.java create mode 100644 libraries/src/main/java/com/baeldung/jmapper/UserDto1.java create mode 100644 libraries/src/main/java/com/baeldung/jmapper/relational/User.java create mode 100644 libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java create mode 100644 libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java create mode 100644 libraries/src/main/resources/user_jmapper.xml create mode 100644 libraries/src/main/resources/user_jmapper1.xml create mode 100644 libraries/src/main/resources/user_jmapper2.xml create mode 100644 libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java create mode 100644 libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/controller/.gitignore create mode 100644 spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java create mode 100644 spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java create mode 100644 spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java create mode 100644 spring-boot-persistence/src/test/resources/import_articles.sql diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java new file mode 100644 index 0000000000..243ec88eb5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java @@ -0,0 +1,87 @@ +package com.baeldung.connectionpool.connectionpools; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +public class BasicConnectionPool implements ConnectionPool { + + private final String url; + private final String user; + private final String password; + private final List connectionPool; + private final List usedConnections = new ArrayList<>(); + private static final int INITIAL_POOL_SIZE = 10; + private final int MAX_POOL_SIZE = 20; + + public static BasicConnectionPool create(String url, String user, String password) throws SQLException { + List pool = new ArrayList<>(INITIAL_POOL_SIZE); + for (int i = 0; i < INITIAL_POOL_SIZE; i++) { + pool.add(createConnection(url, user, password)); + } + return new BasicConnectionPool(url, user, password, pool); + } + + private BasicConnectionPool(String url, String user, String password, List connectionPool) { + this.url = url; + this.user = user; + this.password = password; + this.connectionPool = connectionPool; + } + + @Override + public Connection getConnection() throws SQLException { + if (connectionPool.size() == 0) { + if (usedConnections.size() < MAX_POOL_SIZE) { + connectionPool.add(createConnection(url, user, password)); + } else { + throw new RuntimeException("Maximum pool size reached, no available connections!"); + } + } + + Connection connection = connectionPool.remove(connectionPool.size() - 1); + usedConnections.add(connection); + return connection; + } + + @Override + public boolean releaseConnection(Connection connection) { + connectionPool.add(connection); + return usedConnections.remove(connection); + } + + private static Connection createConnection(String url, String user, String password) throws SQLException { + return DriverManager.getConnection(url, user, password); + } + + public int getSize() { + return connectionPool.size() + usedConnections.size(); + } + + @Override + public String getUrl() { + return url; + } + + @Override + public String getUser() { + return user; + } + + @Override + public String getPassword() { + return password; + } + + public void shutdown() throws SQLException { + for (Connection c : usedConnections) { + this.releaseConnection(c); + } + for (Connection c : connectionPool) { + c.close(); + } + connectionPool.clear(); + } +} diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java new file mode 100644 index 0000000000..5b91f707a9 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java @@ -0,0 +1,28 @@ +package com.baeldung.connectionpool.connectionpools; + +import com.mchange.v2.c3p0.ComboPooledDataSource; +import java.beans.PropertyVetoException; +import java.sql.Connection; +import java.sql.SQLException; + +public class C3poDataSource { + + private static final ComboPooledDataSource cpds = new ComboPooledDataSource(); + + static { + try { + cpds.setDriverClass("org.h2.Driver"); + cpds.setJdbcUrl("jdbc:h2:mem:test"); + cpds.setUser("user"); + cpds.setPassword("password"); + } catch (PropertyVetoException e) { + e.printStackTrace(); + } + } + + public static Connection getConnection() throws SQLException { + return cpds.getConnection(); + } + + private C3poDataSource(){} +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java new file mode 100644 index 0000000000..3d5ad06c3d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java @@ -0,0 +1,18 @@ +package com.baeldung.connectionpool.connectionpools; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; + +public interface ConnectionPool { + + Connection getConnection() throws SQLException; + + boolean releaseConnection(Connection connection); + + String getUrl(); + + String getUser(); + + String getPassword(); +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java new file mode 100644 index 0000000000..2f33cde883 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java @@ -0,0 +1,25 @@ +package com.baeldung.connectionpool.connectionpools; + +import java.sql.Connection; +import java.sql.SQLException; +import org.apache.commons.dbcp2.BasicDataSource; + +public class DBCPDataSource { + + private static final BasicDataSource ds = new BasicDataSource(); + + static { + ds.setUrl("jdbc:h2:mem:test"); + ds.setUsername("user"); + ds.setPassword("password"); + ds.setMinIdle(5); + ds.setMaxIdle(10); + ds.setMaxOpenPreparedStatements(100); + } + + public static Connection getConnection() throws SQLException { + return ds.getConnection(); + } + + private DBCPDataSource(){} +} diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java new file mode 100644 index 0000000000..5ed2de181d --- /dev/null +++ b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java @@ -0,0 +1,28 @@ +package com.baeldung.connectionpool.connectionpools; + +import com.zaxxer.hikari.HikariConfig; +import com.zaxxer.hikari.HikariDataSource; +import java.sql.Connection; +import java.sql.SQLException; + +public class HikariCPDataSource { + + private static final HikariConfig config = new HikariConfig(); + private static final HikariDataSource ds; + + static { + config.setJdbcUrl("jdbc:h2:mem:test"); + config.setUsername("user"); + config.setPassword("password"); + config.addDataSourceProperty("cachePrepStmts", "true"); + config.addDataSourceProperty("prepStmtCacheSize", "250"); + config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); + ds = new HikariDataSource(config); + } + + public static Connection getConnection() throws SQLException { + return ds.getConnection(); + } + + private HikariCPDataSource(){} +} diff --git a/core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF b/core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF new file mode 100644 index 0000000000..a363171952 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF @@ -0,0 +1 @@ +Main-Class: com.baeldung.manifest.AppExample diff --git a/core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java new file mode 100644 index 0000000000..5edc6bba94 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.connectionpool; + +import com.baeldung.connectionpool.connectionpools.BasicConnectionPool; +import com.baeldung.connectionpool.connectionpools.ConnectionPool; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +import org.junit.BeforeClass; +import org.junit.Test; + +public class BasicConnectionPoolUnitTest { + + private static ConnectionPool connectionPool; + + @BeforeClass + public static void setUpBasicConnectionPoolInstance() throws SQLException { + connectionPool = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password"); + } + + @Test + public void givenBasicConnectionPoolInstance_whenCalledgetConnection_thenCorrect() throws Exception { + assertTrue(connectionPool.getConnection().isValid(1)); + } + + @Test + public void givenBasicConnectionPoolInstance_whenCalledreleaseConnection_thenCorrect() throws Exception { + Connection connection = connectionPool.getConnection(); + assertThat(connectionPool.releaseConnection(connection)).isTrue(); + } + + @Test + public void givenBasicConnectionPoolInstance_whenCalledgetUrl_thenCorrect() { + assertThat(connectionPool.getUrl()).isEqualTo("jdbc:h2:mem:test"); + } + + @Test + public void givenBasicConnectionPoolInstance_whenCalledgetUser_thenCorrect() { + assertThat(connectionPool.getUser()).isEqualTo("user"); + } + + @Test + public void givenBasicConnectionPoolInstance_whenCalledgetPassword_thenCorrect() { + assertThat(connectionPool.getPassword()).isEqualTo("password"); + } + + @Test(expected = RuntimeException.class) + public void givenBasicConnectionPoolInstance_whenAskedForMoreThanMax_thenError() throws Exception { + // this test needs to be independent so it doesn't share the same connection pool as other tests + ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password"); + final int MAX_POOL_SIZE = 20; + for (int i = 0; i < MAX_POOL_SIZE + 1; i++) { + cp.getConnection(); + } + fail(); + } + + @Test + public void givenBasicConnectionPoolInstance_whenSutdown_thenEmpty() throws Exception { + ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password"); + assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(10); + + ((BasicConnectionPool) cp).shutdown(); + assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(0); + } +} diff --git a/core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java new file mode 100644 index 0000000000..a02daa40f6 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.connectionpool; + +import com.baeldung.connectionpool.connectionpools.C3poDataSource; +import java.sql.SQLException; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class C3poDataSourceUnitTest { + + @Test + public void givenC3poDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException { + assertTrue(C3poDataSource.getConnection().isValid(1)); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java new file mode 100644 index 0000000000..9583eedf4b --- /dev/null +++ b/core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.connectionpool; + +import com.baeldung.connectionpool.connectionpools.DBCPDataSource; +import java.sql.SQLException; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class DBCPDataSourceUnitTest { + + @Test + public void givenDBCPDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException { + assertTrue(DBCPDataSource.getConnection().isValid(1)); + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java new file mode 100644 index 0000000000..6b78815797 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java @@ -0,0 +1,14 @@ +package com.baeldung.connectionpool; + +import com.baeldung.connectionpool.connectionpools.HikariCPDataSource; +import java.sql.SQLException; +import static org.junit.Assert.assertTrue; +import org.junit.Test; + +public class HikariCPDataSourceUnitTest { + + @Test + public void givenHikariDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException { + assertTrue(HikariCPDataSource.getConnection().isValid(1)); + } +} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/jmapper/User.java b/libraries/src/main/java/com/baeldung/jmapper/User.java new file mode 100644 index 0000000000..9f99157183 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmapper/User.java @@ -0,0 +1,56 @@ +package com.baeldung.jmapper; + +import java.time.LocalDate; + + +public class User { + + private long id; + private String email; + private LocalDate birthDate; + + // constructors + + public User() { + super(); + } + + public User(long id, String email, LocalDate birthDate) { + super(); + this.id = id; + this.email = email; + this.birthDate = birthDate; + } + + // getters and setters + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public LocalDate getBirthDate() { + return birthDate; + } + + public void setBirthDate(LocalDate birthDate) { + this.birthDate = birthDate; + } + + @Override + public String toString() { + return "User [id=" + id + ", email=" + email + ", birthDate=" + birthDate + "]"; + } + +} diff --git a/libraries/src/main/java/com/baeldung/jmapper/UserDto.java b/libraries/src/main/java/com/baeldung/jmapper/UserDto.java new file mode 100644 index 0000000000..326e8f3cd5 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmapper/UserDto.java @@ -0,0 +1,69 @@ +package com.baeldung.jmapper; + +import java.time.LocalDate; +import java.time.Period; + +import com.googlecode.jmapper.annotations.JMap; +import com.googlecode.jmapper.annotations.JMapConversion; + +public class UserDto { + + @JMap + private long id; + + @JMap("email") + private String username; + + @JMap("birthDate") + private int age; + + @JMapConversion(from={"birthDate"}, to={"age"}) + public int conversion(LocalDate birthDate){ + return Period.between(birthDate, LocalDate.now()).getYears(); + } + + // constructors + + public UserDto() { + super(); + } + + public UserDto(long id, String username, int age) { + super(); + this.id = id; + this.username = username; + this.age = age; + } + + // getters and setters + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + @Override + public String toString() { + return "UserDto [id=" + id + ", username=" + username + ", age=" + age + "]"; + } + +} diff --git a/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java b/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java new file mode 100644 index 0000000000..99247c56f6 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java @@ -0,0 +1,47 @@ +package com.baeldung.jmapper; + +import com.googlecode.jmapper.annotations.JGlobalMap; + +@JGlobalMap +public class UserDto1 { + + private long id; + private String email; + + + // constructors + + public UserDto1() { + super(); + } + + public UserDto1(long id, String email) { + super(); + this.id = id; + this.email = email; + } + + // getters and setters + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "UserDto [id=" + id + ", email=" + email + "]"; + } + +} diff --git a/libraries/src/main/java/com/baeldung/jmapper/relational/User.java b/libraries/src/main/java/com/baeldung/jmapper/relational/User.java new file mode 100644 index 0000000000..1238a82684 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmapper/relational/User.java @@ -0,0 +1,49 @@ +package com.baeldung.jmapper.relational; + +import com.googlecode.jmapper.annotations.JMap; + + +public class User { + + @JMap(classes = {UserDto1.class, UserDto2.class}) + private long id; + + @JMap(attributes = {"username", "email"}, classes = {UserDto1.class, UserDto2.class}) + private String email; + + // constructors + + public User() { + super(); + } + + public User(long id, String email) { + super(); + this.id = id; + this.email = email; + } + + // getters and setters + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "User [id=" + id + ", email=" + email + "]"; + } + +} diff --git a/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java new file mode 100644 index 0000000000..375fd267a0 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java @@ -0,0 +1,44 @@ +package com.baeldung.jmapper.relational; + + +public class UserDto1 { + + private long id; + private String username; + + // constructors + + public UserDto1() { + super(); + } + + public UserDto1(long id, String username) { + super(); + this.id = id; + this.username = username; + } + + // getters and setters + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + @Override + public String toString() { + return "UserDto [id=" + id + ", username=" + username + "]"; + } + +} diff --git a/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java new file mode 100644 index 0000000000..d0858c7d8e --- /dev/null +++ b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java @@ -0,0 +1,44 @@ +package com.baeldung.jmapper.relational; + + +public class UserDto2 { + + private long id; + private String email; + + // constructors + + public UserDto2() { + super(); + } + + public UserDto2(long id, String email) { + super(); + this.id = id; + this.email = email; + } + + // getters and setters + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + @Override + public String toString() { + return "UserDto2 [id=" + id + ", email=" + email + "]"; + } + +} diff --git a/libraries/src/main/resources/user_jmapper.xml b/libraries/src/main/resources/user_jmapper.xml new file mode 100644 index 0000000000..f007de9f0a --- /dev/null +++ b/libraries/src/main/resources/user_jmapper.xml @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/libraries/src/main/resources/user_jmapper1.xml b/libraries/src/main/resources/user_jmapper1.xml new file mode 100644 index 0000000000..abcfd77e1c --- /dev/null +++ b/libraries/src/main/resources/user_jmapper1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/libraries/src/main/resources/user_jmapper2.xml b/libraries/src/main/resources/user_jmapper2.xml new file mode 100644 index 0000000000..1e708e14bf --- /dev/null +++ b/libraries/src/main/resources/user_jmapper2.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java b/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java new file mode 100644 index 0000000000..96ed090482 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java @@ -0,0 +1,114 @@ +package com.baeldung.jmapper; + +import static com.googlecode.jmapper.api.JMapperAPI.attribute; +import static com.googlecode.jmapper.api.JMapperAPI.global; +import static com.googlecode.jmapper.api.JMapperAPI.mappedClass; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.time.LocalDate; + +import org.junit.Test; + +import com.googlecode.jmapper.JMapper; +import com.googlecode.jmapper.api.JMapperAPI; + +public class JMapperIntegrationTest { + + + @Test + public void givenUser_whenUseAnnotation_thenConverted(){ + JMapper userMapper = new JMapper<>(UserDto.class, User.class); + + User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); + UserDto result = userMapper.getDestination(user); + + System.out.println(result); + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + } + + @Test + public void givenUser_whenUseGlobalMapAnnotation_thenConverted(){ + JMapper userMapper= new JMapper<>(UserDto1.class, User.class); + + User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); + UserDto1 result = userMapper.getDestination(user); + + System.out.println(result); + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getEmail()); + } + + @Test + public void givenUser_whenUseAnnotationExplicitConversion_thenConverted(){ + JMapper userMapper = new JMapper<>(UserDto.class, User.class); + + User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); + UserDto result = userMapper.getDestination(user); + + System.out.println(result); + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + assertTrue(result.getAge() > 0); + } + + //======================= XML + + @Test + public void givenUser_whenUseXml_thenConverted(){ + JMapper userMapper = new JMapper<>(UserDto.class, User.class,"user_jmapper.xml"); + + User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); + UserDto result = userMapper.getDestination(user); + + System.out.println(result); + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + } + + @Test + public void givenUser_whenUseXmlGlobal_thenConverted(){ + JMapper userMapper = new JMapper<>(UserDto1.class, User.class,"user_jmapper1.xml"); + + User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); + UserDto1 result = userMapper.getDestination(user); + + System.out.println(result); + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getEmail()); + } + + // ===== API + + @Test + public void givenUser_whenUseApi_thenConverted(){ + JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class) + .add(attribute("id").value("id")) + .add(attribute("username").value("email")) + ) ; + JMapper userMapper = new JMapper<>(UserDto.class, User.class, jmapperApi); + + User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); + UserDto result = userMapper.getDestination(user); + + System.out.println(result); + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + } + + @Test + public void givenUser_whenUseApiGlobal_thenConverted(){ + JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class) + .add(global()) + ) ; + JMapper userMapper1 = new JMapper<>(UserDto1.class, User.class,jmapperApi); + + User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); + UserDto1 result = userMapper1.getDestination(user); + + System.out.println(result); + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getEmail()); + } +} diff --git a/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java b/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java new file mode 100644 index 0000000000..6af2865159 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java @@ -0,0 +1,76 @@ +package com.baeldung.jmapper; + +import static com.googlecode.jmapper.api.JMapperAPI.attribute; +import static com.googlecode.jmapper.api.JMapperAPI.mappedClass; +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import com.baeldung.jmapper.relational.User; +import com.baeldung.jmapper.relational.UserDto1; +import com.baeldung.jmapper.relational.UserDto2; +import com.googlecode.jmapper.RelationalJMapper; +import com.googlecode.jmapper.api.JMapperAPI; + +public class JMapperRelationalIntegrationTest { + + + @Test + public void givenUser_whenUseAnnotation_thenConverted(){ + RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class); + + User user = new User(1L,"john@test.com"); + UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user); + UserDto2 result2= relationalMapper.oneToMany(UserDto2.class, user); + + System.out.println(result1); + System.out.println(result2); + assertEquals(user.getId(), result1.getId()); + assertEquals(user.getEmail(), result1.getUsername()); + assertEquals(user.getId(), result2.getId()); + assertEquals(user.getEmail(), result2.getEmail()); + } + + //======================= XML + + @Test + public void givenUser_whenUseXml_thenConverted(){ + RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class,"user_jmapper2.xml"); + + User user = new User(1L,"john@test.com"); + UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user); + UserDto2 result2 = relationalMapper.oneToMany(UserDto2.class, user); + + System.out.println(result1); + System.out.println(result2); + assertEquals(user.getId(), result1.getId()); + assertEquals(user.getEmail(), result1.getUsername()); + assertEquals(user.getId(), result2.getId()); + assertEquals(user.getEmail(), result2.getEmail()); + } + + + // ===== API + + @Test + public void givenUser_whenUseApi_thenConverted(){ + JMapperAPI jmapperApi = new JMapperAPI() + .add(mappedClass(User.class) + .add(attribute("id").value("id").targetClasses(UserDto1.class,UserDto2.class)) + .add(attribute("email").targetAttributes("username","email").targetClasses(UserDto1.class,UserDto2.class)) ) + ; + RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class,jmapperApi); + + User user = new User(1L,"john@test.com"); + UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user); + UserDto2 result2 = relationalMapper.oneToMany(UserDto2.class, user); + + System.out.println(result1); + System.out.println(result2); + assertEquals(user.getId(), result1.getId()); + assertEquals(user.getEmail(), result1.getUsername()); + assertEquals(user.getId(), result2.getId()); + assertEquals(user.getEmail(), result2.getEmail()); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/.gitignore b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/.gitignore new file mode 100644 index 0000000000..90b27cf4da --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/.gitignore @@ -0,0 +1 @@ +/FooReactiveController.java diff --git a/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java b/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java new file mode 100644 index 0000000000..3b5a8be088 --- /dev/null +++ b/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java @@ -0,0 +1,23 @@ +package com.baeldung.domain; + +import javax.persistence.*; +import java.util.Date; + +@Entity +public class Article { + + @Id + @GeneratedValue + private Integer id; + @Temporal(TemporalType.DATE) + private Date publicationDate; + @Temporal(TemporalType.TIME) + private Date publicationTime; + @Temporal(TemporalType.TIMESTAMP) + private Date creationDateTime; + + public Integer getId() { + return id; + } + +} diff --git a/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java b/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java new file mode 100644 index 0000000000..4e1b109430 --- /dev/null +++ b/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java @@ -0,0 +1,22 @@ +package com.baeldung.repository; + +import com.baeldung.domain.Article; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.Date; +import java.util.List; + +public interface ArticleRepository extends JpaRepository { + + List
findAllByPublicationDate(Date publicationDate); + + List
findAllByPublicationTimeBetween(Date publicationTimeStart, + Date publicationTimeEnd); + + @Query("select a from Article a where a.creationDateTime <= :creationDateTime") + List
findAllWithCreationDateTimeBefore( + @Param("creationDateTime") Date creationDateTime); + +} diff --git a/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java b/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java new file mode 100644 index 0000000000..7d531d1461 --- /dev/null +++ b/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java @@ -0,0 +1,66 @@ +package com.baeldung.repository; + +import com.baeldung.domain.Article; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +@RunWith(SpringRunner.class) +@DataJpaTest +public class ArticleRepositoryIntegrationTest { + + @Autowired + private ArticleRepository repository; + + @Test + public void givenImportedArticlesWhenFindAllByPublicationDateThenArticles1And2Returned() + throws Exception { + List
result = repository.findAllByPublicationDate( + new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-01") + ); + + assertEquals(2, result.size()); + assertTrue(result.stream() + .map(Article::getId) + .allMatch(id -> Arrays.asList(1, 2).contains(id)) + ); + } + + @Test + public void givenImportedArticlesWhenFindAllByPublicationTimeBetweenThenArticles2And3Returned() + throws Exception { + List
result = repository.findAllByPublicationTimeBetween( + new SimpleDateFormat("HH:mm").parse("15:15"), + new SimpleDateFormat("HH:mm").parse("16:30") + ); + + assertEquals(2, result.size()); + assertTrue(result.stream() + .map(Article::getId) + .allMatch(id -> Arrays.asList(2, 3).contains(id)) + ); + } + + @Test + public void givenImportedArticlesWhenFindAllWithCreationDateTimeBeforeThenArticles2And3Returned() throws Exception { + List
result = repository.findAllWithCreationDateTimeBefore( + new SimpleDateFormat("yyyy-MM-dd HH:mm").parse("2017-12-15 10:00") + ); + + assertEquals(2, result.size()); + assertTrue(result.stream() + .map(Article::getId) + .allMatch(id -> Arrays.asList(2, 3).contains(id)) + ); + } + +} diff --git a/spring-boot-persistence/src/test/resources/application.properties b/spring-boot-persistence/src/test/resources/application.properties index a5c1d983cf..a5d09db840 100644 --- a/spring-boot-persistence/src/test/resources/application.properties +++ b/spring-boot-persistence/src/test/resources/application.properties @@ -13,4 +13,4 @@ hibernate.cache.use_query_cache=true hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory spring.jpa.properties.hibernate.hbm2ddl.import_files=migrated_users.sql -spring.datasource.data=import_*_users.sql \ No newline at end of file +spring.datasource.data=import_*_users.sql,import_articles.sql \ No newline at end of file diff --git a/spring-boot-persistence/src/test/resources/import_articles.sql b/spring-boot-persistence/src/test/resources/import_articles.sql new file mode 100644 index 0000000000..4fe18bf4aa --- /dev/null +++ b/spring-boot-persistence/src/test/resources/import_articles.sql @@ -0,0 +1,3 @@ +insert into Article(id, publication_date, publication_time, creation_date_time) values(1, TO_DATE('01/01/2018', 'DD/MM/YYYY'), TO_DATE('15:00', 'HH24:MI'), TO_DATE('31/12/2017 07:30', 'DD/MM/YYYY HH24:MI')); +insert into Article(id, publication_date, publication_time, creation_date_time) values(2, TO_DATE('01/01/2018', 'DD/MM/YYYY'), TO_DATE('15:30', 'HH24:MI'), TO_DATE('15/12/2017 08:00', 'DD/MM/YYYY HH24:MI')); +insert into Article(id, publication_date, publication_time, creation_date_time) values(3, TO_DATE('15/12/2017', 'DD/MM/YYYY'), TO_DATE('16:00', 'HH24:MI'), TO_DATE('01/12/2017 13:45', 'DD/MM/YYYY HH24:MI')); \ No newline at end of file From fee82e22113cdfedb69a03f0f33734f2f039495e Mon Sep 17 00:00:00 2001 From: Tritty Date: Sat, 25 Aug 2018 20:38:13 +0530 Subject: [PATCH 013/429] Precommit : rebase --- .../connectionpools/BasicConnectionPool.java | 87 ------------- .../connectionpools/C3poDataSource.java | 28 ----- .../connectionpools/ConnectionPool.java | 18 --- .../connectionpools/DBCPDataSource.java | 25 ---- .../connectionpools/HikariCPDataSource.java | 28 ----- .../java/com/baeldung/manifest/MANIFEST.MF | 1 - .../BasicConnectionPoolUnitTest.java | 69 ----------- .../C3poDataSourceUnitTest.java | 14 --- .../DBCPDataSourceUnitTest.java | 14 --- .../HikariCPDataSourceUnitTest.java | 14 --- .../main/java/com/baeldung/jmapper/User.java | 56 --------- .../java/com/baeldung/jmapper/UserDto.java | 69 ----------- .../java/com/baeldung/jmapper/UserDto1.java | 47 -------- .../com/baeldung/jmapper/relational/User.java | 49 -------- .../baeldung/jmapper/relational/UserDto1.java | 44 ------- .../baeldung/jmapper/relational/UserDto2.java | 44 ------- libraries/src/main/resources/user_jmapper.xml | 10 -- .../src/main/resources/user_jmapper1.xml | 5 - .../src/main/resources/user_jmapper2.xml | 21 ---- .../jmapper/JMapperIntegrationTest.java | 114 ------------------ .../JMapperRelationalIntegrationTest.java | 76 ------------ .../baeldung/reactive/controller/.gitignore | 1 - .../java/com/baeldung/domain/Article.java | 23 ---- .../repository/ArticleRepository.java | 22 ---- .../ArticleRepositoryIntegrationTest.java | 66 ---------- .../src/test/resources/application.properties | 2 +- .../src/test/resources/import_articles.sql | 3 - 27 files changed, 1 insertion(+), 949 deletions(-) delete mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java delete mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java delete mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java delete mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java delete mode 100644 core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java delete mode 100644 core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF delete mode 100644 core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java delete mode 100644 core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java delete mode 100644 core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java delete mode 100644 core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java delete mode 100644 libraries/src/main/java/com/baeldung/jmapper/User.java delete mode 100644 libraries/src/main/java/com/baeldung/jmapper/UserDto.java delete mode 100644 libraries/src/main/java/com/baeldung/jmapper/UserDto1.java delete mode 100644 libraries/src/main/java/com/baeldung/jmapper/relational/User.java delete mode 100644 libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java delete mode 100644 libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java delete mode 100644 libraries/src/main/resources/user_jmapper.xml delete mode 100644 libraries/src/main/resources/user_jmapper1.xml delete mode 100644 libraries/src/main/resources/user_jmapper2.xml delete mode 100644 libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java delete mode 100644 libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java delete mode 100644 spring-5-reactive/src/main/java/com/baeldung/reactive/controller/.gitignore delete mode 100644 spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java delete mode 100644 spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java delete mode 100644 spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java delete mode 100644 spring-boot-persistence/src/test/resources/import_articles.sql diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java deleted file mode 100644 index 243ec88eb5..0000000000 --- a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/BasicConnectionPool.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.baeldung.connectionpool.connectionpools; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.List; - -public class BasicConnectionPool implements ConnectionPool { - - private final String url; - private final String user; - private final String password; - private final List connectionPool; - private final List usedConnections = new ArrayList<>(); - private static final int INITIAL_POOL_SIZE = 10; - private final int MAX_POOL_SIZE = 20; - - public static BasicConnectionPool create(String url, String user, String password) throws SQLException { - List pool = new ArrayList<>(INITIAL_POOL_SIZE); - for (int i = 0; i < INITIAL_POOL_SIZE; i++) { - pool.add(createConnection(url, user, password)); - } - return new BasicConnectionPool(url, user, password, pool); - } - - private BasicConnectionPool(String url, String user, String password, List connectionPool) { - this.url = url; - this.user = user; - this.password = password; - this.connectionPool = connectionPool; - } - - @Override - public Connection getConnection() throws SQLException { - if (connectionPool.size() == 0) { - if (usedConnections.size() < MAX_POOL_SIZE) { - connectionPool.add(createConnection(url, user, password)); - } else { - throw new RuntimeException("Maximum pool size reached, no available connections!"); - } - } - - Connection connection = connectionPool.remove(connectionPool.size() - 1); - usedConnections.add(connection); - return connection; - } - - @Override - public boolean releaseConnection(Connection connection) { - connectionPool.add(connection); - return usedConnections.remove(connection); - } - - private static Connection createConnection(String url, String user, String password) throws SQLException { - return DriverManager.getConnection(url, user, password); - } - - public int getSize() { - return connectionPool.size() + usedConnections.size(); - } - - @Override - public String getUrl() { - return url; - } - - @Override - public String getUser() { - return user; - } - - @Override - public String getPassword() { - return password; - } - - public void shutdown() throws SQLException { - for (Connection c : usedConnections) { - this.releaseConnection(c); - } - for (Connection c : connectionPool) { - c.close(); - } - connectionPool.clear(); - } -} diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java deleted file mode 100644 index 5b91f707a9..0000000000 --- a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/C3poDataSource.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.connectionpool.connectionpools; - -import com.mchange.v2.c3p0.ComboPooledDataSource; -import java.beans.PropertyVetoException; -import java.sql.Connection; -import java.sql.SQLException; - -public class C3poDataSource { - - private static final ComboPooledDataSource cpds = new ComboPooledDataSource(); - - static { - try { - cpds.setDriverClass("org.h2.Driver"); - cpds.setJdbcUrl("jdbc:h2:mem:test"); - cpds.setUser("user"); - cpds.setPassword("password"); - } catch (PropertyVetoException e) { - e.printStackTrace(); - } - } - - public static Connection getConnection() throws SQLException { - return cpds.getConnection(); - } - - private C3poDataSource(){} -} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java deleted file mode 100644 index 3d5ad06c3d..0000000000 --- a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/ConnectionPool.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.connectionpool.connectionpools; - -import java.sql.Connection; -import java.sql.SQLException; -import java.util.List; - -public interface ConnectionPool { - - Connection getConnection() throws SQLException; - - boolean releaseConnection(Connection connection); - - String getUrl(); - - String getUser(); - - String getPassword(); -} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java deleted file mode 100644 index 2f33cde883..0000000000 --- a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/DBCPDataSource.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.connectionpool.connectionpools; - -import java.sql.Connection; -import java.sql.SQLException; -import org.apache.commons.dbcp2.BasicDataSource; - -public class DBCPDataSource { - - private static final BasicDataSource ds = new BasicDataSource(); - - static { - ds.setUrl("jdbc:h2:mem:test"); - ds.setUsername("user"); - ds.setPassword("password"); - ds.setMinIdle(5); - ds.setMaxIdle(10); - ds.setMaxOpenPreparedStatements(100); - } - - public static Connection getConnection() throws SQLException { - return ds.getConnection(); - } - - private DBCPDataSource(){} -} diff --git a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java b/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java deleted file mode 100644 index 5ed2de181d..0000000000 --- a/core-java/src/main/java/com/baeldung/connectionpool/connectionpools/HikariCPDataSource.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.baeldung.connectionpool.connectionpools; - -import com.zaxxer.hikari.HikariConfig; -import com.zaxxer.hikari.HikariDataSource; -import java.sql.Connection; -import java.sql.SQLException; - -public class HikariCPDataSource { - - private static final HikariConfig config = new HikariConfig(); - private static final HikariDataSource ds; - - static { - config.setJdbcUrl("jdbc:h2:mem:test"); - config.setUsername("user"); - config.setPassword("password"); - config.addDataSourceProperty("cachePrepStmts", "true"); - config.addDataSourceProperty("prepStmtCacheSize", "250"); - config.addDataSourceProperty("prepStmtCacheSqlLimit", "2048"); - ds = new HikariDataSource(config); - } - - public static Connection getConnection() throws SQLException { - return ds.getConnection(); - } - - private HikariCPDataSource(){} -} diff --git a/core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF b/core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF deleted file mode 100644 index a363171952..0000000000 --- a/core-java/src/main/java/com/baeldung/manifest/MANIFEST.MF +++ /dev/null @@ -1 +0,0 @@ -Main-Class: com.baeldung.manifest.AppExample diff --git a/core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java deleted file mode 100644 index 5edc6bba94..0000000000 --- a/core-java/src/test/java/com/baeldung/connectionpool/BasicConnectionPoolUnitTest.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.connectionpool; - -import com.baeldung.connectionpool.connectionpools.BasicConnectionPool; -import com.baeldung.connectionpool.connectionpools.ConnectionPool; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.List; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import org.junit.BeforeClass; -import org.junit.Test; - -public class BasicConnectionPoolUnitTest { - - private static ConnectionPool connectionPool; - - @BeforeClass - public static void setUpBasicConnectionPoolInstance() throws SQLException { - connectionPool = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password"); - } - - @Test - public void givenBasicConnectionPoolInstance_whenCalledgetConnection_thenCorrect() throws Exception { - assertTrue(connectionPool.getConnection().isValid(1)); - } - - @Test - public void givenBasicConnectionPoolInstance_whenCalledreleaseConnection_thenCorrect() throws Exception { - Connection connection = connectionPool.getConnection(); - assertThat(connectionPool.releaseConnection(connection)).isTrue(); - } - - @Test - public void givenBasicConnectionPoolInstance_whenCalledgetUrl_thenCorrect() { - assertThat(connectionPool.getUrl()).isEqualTo("jdbc:h2:mem:test"); - } - - @Test - public void givenBasicConnectionPoolInstance_whenCalledgetUser_thenCorrect() { - assertThat(connectionPool.getUser()).isEqualTo("user"); - } - - @Test - public void givenBasicConnectionPoolInstance_whenCalledgetPassword_thenCorrect() { - assertThat(connectionPool.getPassword()).isEqualTo("password"); - } - - @Test(expected = RuntimeException.class) - public void givenBasicConnectionPoolInstance_whenAskedForMoreThanMax_thenError() throws Exception { - // this test needs to be independent so it doesn't share the same connection pool as other tests - ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password"); - final int MAX_POOL_SIZE = 20; - for (int i = 0; i < MAX_POOL_SIZE + 1; i++) { - cp.getConnection(); - } - fail(); - } - - @Test - public void givenBasicConnectionPoolInstance_whenSutdown_thenEmpty() throws Exception { - ConnectionPool cp = BasicConnectionPool.create("jdbc:h2:mem:test", "user", "password"); - assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(10); - - ((BasicConnectionPool) cp).shutdown(); - assertThat(((BasicConnectionPool)cp).getSize()).isEqualTo(0); - } -} diff --git a/core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java deleted file mode 100644 index a02daa40f6..0000000000 --- a/core-java/src/test/java/com/baeldung/connectionpool/C3poDataSourceUnitTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.connectionpool; - -import com.baeldung.connectionpool.connectionpools.C3poDataSource; -import java.sql.SQLException; -import static org.junit.Assert.assertTrue; -import org.junit.Test; - -public class C3poDataSourceUnitTest { - - @Test - public void givenC3poDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException { - assertTrue(C3poDataSource.getConnection().isValid(1)); - } -} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java deleted file mode 100644 index 9583eedf4b..0000000000 --- a/core-java/src/test/java/com/baeldung/connectionpool/DBCPDataSourceUnitTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.connectionpool; - -import com.baeldung.connectionpool.connectionpools.DBCPDataSource; -import java.sql.SQLException; -import static org.junit.Assert.assertTrue; -import org.junit.Test; - -public class DBCPDataSourceUnitTest { - - @Test - public void givenDBCPDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException { - assertTrue(DBCPDataSource.getConnection().isValid(1)); - } -} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java b/core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java deleted file mode 100644 index 6b78815797..0000000000 --- a/core-java/src/test/java/com/baeldung/connectionpool/HikariCPDataSourceUnitTest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.baeldung.connectionpool; - -import com.baeldung.connectionpool.connectionpools.HikariCPDataSource; -import java.sql.SQLException; -import static org.junit.Assert.assertTrue; -import org.junit.Test; - -public class HikariCPDataSourceUnitTest { - - @Test - public void givenHikariDataSourceClass_whenCalledgetConnection_thenCorrect() throws SQLException { - assertTrue(HikariCPDataSource.getConnection().isValid(1)); - } -} \ No newline at end of file diff --git a/libraries/src/main/java/com/baeldung/jmapper/User.java b/libraries/src/main/java/com/baeldung/jmapper/User.java deleted file mode 100644 index 9f99157183..0000000000 --- a/libraries/src/main/java/com/baeldung/jmapper/User.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.baeldung.jmapper; - -import java.time.LocalDate; - - -public class User { - - private long id; - private String email; - private LocalDate birthDate; - - // constructors - - public User() { - super(); - } - - public User(long id, String email, LocalDate birthDate) { - super(); - this.id = id; - this.email = email; - this.birthDate = birthDate; - } - - // getters and setters - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - public LocalDate getBirthDate() { - return birthDate; - } - - public void setBirthDate(LocalDate birthDate) { - this.birthDate = birthDate; - } - - @Override - public String toString() { - return "User [id=" + id + ", email=" + email + ", birthDate=" + birthDate + "]"; - } - -} diff --git a/libraries/src/main/java/com/baeldung/jmapper/UserDto.java b/libraries/src/main/java/com/baeldung/jmapper/UserDto.java deleted file mode 100644 index 326e8f3cd5..0000000000 --- a/libraries/src/main/java/com/baeldung/jmapper/UserDto.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.baeldung.jmapper; - -import java.time.LocalDate; -import java.time.Period; - -import com.googlecode.jmapper.annotations.JMap; -import com.googlecode.jmapper.annotations.JMapConversion; - -public class UserDto { - - @JMap - private long id; - - @JMap("email") - private String username; - - @JMap("birthDate") - private int age; - - @JMapConversion(from={"birthDate"}, to={"age"}) - public int conversion(LocalDate birthDate){ - return Period.between(birthDate, LocalDate.now()).getYears(); - } - - // constructors - - public UserDto() { - super(); - } - - public UserDto(long id, String username, int age) { - super(); - this.id = id; - this.username = username; - this.age = age; - } - - // getters and setters - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - @Override - public String toString() { - return "UserDto [id=" + id + ", username=" + username + ", age=" + age + "]"; - } - -} diff --git a/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java b/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java deleted file mode 100644 index 99247c56f6..0000000000 --- a/libraries/src/main/java/com/baeldung/jmapper/UserDto1.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.baeldung.jmapper; - -import com.googlecode.jmapper.annotations.JGlobalMap; - -@JGlobalMap -public class UserDto1 { - - private long id; - private String email; - - - // constructors - - public UserDto1() { - super(); - } - - public UserDto1(long id, String email) { - super(); - this.id = id; - this.email = email; - } - - // getters and setters - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - @Override - public String toString() { - return "UserDto [id=" + id + ", email=" + email + "]"; - } - -} diff --git a/libraries/src/main/java/com/baeldung/jmapper/relational/User.java b/libraries/src/main/java/com/baeldung/jmapper/relational/User.java deleted file mode 100644 index 1238a82684..0000000000 --- a/libraries/src/main/java/com/baeldung/jmapper/relational/User.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.baeldung.jmapper.relational; - -import com.googlecode.jmapper.annotations.JMap; - - -public class User { - - @JMap(classes = {UserDto1.class, UserDto2.class}) - private long id; - - @JMap(attributes = {"username", "email"}, classes = {UserDto1.class, UserDto2.class}) - private String email; - - // constructors - - public User() { - super(); - } - - public User(long id, String email) { - super(); - this.id = id; - this.email = email; - } - - // getters and setters - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - @Override - public String toString() { - return "User [id=" + id + ", email=" + email + "]"; - } - -} diff --git a/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java deleted file mode 100644 index 375fd267a0..0000000000 --- a/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto1.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.jmapper.relational; - - -public class UserDto1 { - - private long id; - private String username; - - // constructors - - public UserDto1() { - super(); - } - - public UserDto1(long id, String username) { - super(); - this.id = id; - this.username = username; - } - - // getters and setters - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - @Override - public String toString() { - return "UserDto [id=" + id + ", username=" + username + "]"; - } - -} diff --git a/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java b/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java deleted file mode 100644 index d0858c7d8e..0000000000 --- a/libraries/src/main/java/com/baeldung/jmapper/relational/UserDto2.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.baeldung.jmapper.relational; - - -public class UserDto2 { - - private long id; - private String email; - - // constructors - - public UserDto2() { - super(); - } - - public UserDto2(long id, String email) { - super(); - this.id = id; - this.email = email; - } - - // getters and setters - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getEmail() { - return email; - } - - public void setEmail(String email) { - this.email = email; - } - - @Override - public String toString() { - return "UserDto2 [id=" + id + ", email=" + email + "]"; - } - -} diff --git a/libraries/src/main/resources/user_jmapper.xml b/libraries/src/main/resources/user_jmapper.xml deleted file mode 100644 index f007de9f0a..0000000000 --- a/libraries/src/main/resources/user_jmapper.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/libraries/src/main/resources/user_jmapper1.xml b/libraries/src/main/resources/user_jmapper1.xml deleted file mode 100644 index abcfd77e1c..0000000000 --- a/libraries/src/main/resources/user_jmapper1.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/libraries/src/main/resources/user_jmapper2.xml b/libraries/src/main/resources/user_jmapper2.xml deleted file mode 100644 index 1e708e14bf..0000000000 --- a/libraries/src/main/resources/user_jmapper2.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java b/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java deleted file mode 100644 index 96ed090482..0000000000 --- a/libraries/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.baeldung.jmapper; - -import static com.googlecode.jmapper.api.JMapperAPI.attribute; -import static com.googlecode.jmapper.api.JMapperAPI.global; -import static com.googlecode.jmapper.api.JMapperAPI.mappedClass; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -import java.time.LocalDate; - -import org.junit.Test; - -import com.googlecode.jmapper.JMapper; -import com.googlecode.jmapper.api.JMapperAPI; - -public class JMapperIntegrationTest { - - - @Test - public void givenUser_whenUseAnnotation_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto.class, User.class); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - } - - @Test - public void givenUser_whenUseGlobalMapAnnotation_thenConverted(){ - JMapper userMapper= new JMapper<>(UserDto1.class, User.class); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto1 result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getEmail()); - } - - @Test - public void givenUser_whenUseAnnotationExplicitConversion_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto.class, User.class); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - assertTrue(result.getAge() > 0); - } - - //======================= XML - - @Test - public void givenUser_whenUseXml_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto.class, User.class,"user_jmapper.xml"); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - } - - @Test - public void givenUser_whenUseXmlGlobal_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto1.class, User.class,"user_jmapper1.xml"); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto1 result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getEmail()); - } - - // ===== API - - @Test - public void givenUser_whenUseApi_thenConverted(){ - JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class) - .add(attribute("id").value("id")) - .add(attribute("username").value("email")) - ) ; - JMapper userMapper = new JMapper<>(UserDto.class, User.class, jmapperApi); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - } - - @Test - public void givenUser_whenUseApiGlobal_thenConverted(){ - JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class) - .add(global()) - ) ; - JMapper userMapper1 = new JMapper<>(UserDto1.class, User.class,jmapperApi); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto1 result = userMapper1.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getEmail()); - } -} diff --git a/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java b/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java deleted file mode 100644 index 6af2865159..0000000000 --- a/libraries/src/test/java/com/baeldung/jmapper/JMapperRelationalIntegrationTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.baeldung.jmapper; - -import static com.googlecode.jmapper.api.JMapperAPI.attribute; -import static com.googlecode.jmapper.api.JMapperAPI.mappedClass; -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -import com.baeldung.jmapper.relational.User; -import com.baeldung.jmapper.relational.UserDto1; -import com.baeldung.jmapper.relational.UserDto2; -import com.googlecode.jmapper.RelationalJMapper; -import com.googlecode.jmapper.api.JMapperAPI; - -public class JMapperRelationalIntegrationTest { - - - @Test - public void givenUser_whenUseAnnotation_thenConverted(){ - RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class); - - User user = new User(1L,"john@test.com"); - UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user); - UserDto2 result2= relationalMapper.oneToMany(UserDto2.class, user); - - System.out.println(result1); - System.out.println(result2); - assertEquals(user.getId(), result1.getId()); - assertEquals(user.getEmail(), result1.getUsername()); - assertEquals(user.getId(), result2.getId()); - assertEquals(user.getEmail(), result2.getEmail()); - } - - //======================= XML - - @Test - public void givenUser_whenUseXml_thenConverted(){ - RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class,"user_jmapper2.xml"); - - User user = new User(1L,"john@test.com"); - UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user); - UserDto2 result2 = relationalMapper.oneToMany(UserDto2.class, user); - - System.out.println(result1); - System.out.println(result2); - assertEquals(user.getId(), result1.getId()); - assertEquals(user.getEmail(), result1.getUsername()); - assertEquals(user.getId(), result2.getId()); - assertEquals(user.getEmail(), result2.getEmail()); - } - - - // ===== API - - @Test - public void givenUser_whenUseApi_thenConverted(){ - JMapperAPI jmapperApi = new JMapperAPI() - .add(mappedClass(User.class) - .add(attribute("id").value("id").targetClasses(UserDto1.class,UserDto2.class)) - .add(attribute("email").targetAttributes("username","email").targetClasses(UserDto1.class,UserDto2.class)) ) - ; - RelationalJMapper relationalMapper = new RelationalJMapper<>(User.class,jmapperApi); - - User user = new User(1L,"john@test.com"); - UserDto1 result1 = relationalMapper.oneToMany(UserDto1.class, user); - UserDto2 result2 = relationalMapper.oneToMany(UserDto2.class, user); - - System.out.println(result1); - System.out.println(result2); - assertEquals(user.getId(), result1.getId()); - assertEquals(user.getEmail(), result1.getUsername()); - assertEquals(user.getId(), result2.getId()); - assertEquals(user.getEmail(), result2.getEmail()); - } - -} diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/.gitignore b/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/.gitignore deleted file mode 100644 index 90b27cf4da..0000000000 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/controller/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/FooReactiveController.java diff --git a/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java b/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java deleted file mode 100644 index 3b5a8be088..0000000000 --- a/spring-boot-persistence/src/main/java/com/baeldung/domain/Article.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.baeldung.domain; - -import javax.persistence.*; -import java.util.Date; - -@Entity -public class Article { - - @Id - @GeneratedValue - private Integer id; - @Temporal(TemporalType.DATE) - private Date publicationDate; - @Temporal(TemporalType.TIME) - private Date publicationTime; - @Temporal(TemporalType.TIMESTAMP) - private Date creationDateTime; - - public Integer getId() { - return id; - } - -} diff --git a/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java b/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java deleted file mode 100644 index 4e1b109430..0000000000 --- a/spring-boot-persistence/src/main/java/com/baeldung/repository/ArticleRepository.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.baeldung.repository; - -import com.baeldung.domain.Article; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; - -import java.util.Date; -import java.util.List; - -public interface ArticleRepository extends JpaRepository { - - List
findAllByPublicationDate(Date publicationDate); - - List
findAllByPublicationTimeBetween(Date publicationTimeStart, - Date publicationTimeEnd); - - @Query("select a from Article a where a.creationDateTime <= :creationDateTime") - List
findAllWithCreationDateTimeBefore( - @Param("creationDateTime") Date creationDateTime); - -} diff --git a/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java b/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java deleted file mode 100644 index 7d531d1461..0000000000 --- a/spring-boot-persistence/src/test/java/com/baeldung/repository/ArticleRepositoryIntegrationTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.baeldung.repository; - -import com.baeldung.domain.Article; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.test.context.junit4.SpringRunner; - -import java.text.SimpleDateFormat; -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; - -@RunWith(SpringRunner.class) -@DataJpaTest -public class ArticleRepositoryIntegrationTest { - - @Autowired - private ArticleRepository repository; - - @Test - public void givenImportedArticlesWhenFindAllByPublicationDateThenArticles1And2Returned() - throws Exception { - List
result = repository.findAllByPublicationDate( - new SimpleDateFormat("yyyy-MM-dd").parse("2018-01-01") - ); - - assertEquals(2, result.size()); - assertTrue(result.stream() - .map(Article::getId) - .allMatch(id -> Arrays.asList(1, 2).contains(id)) - ); - } - - @Test - public void givenImportedArticlesWhenFindAllByPublicationTimeBetweenThenArticles2And3Returned() - throws Exception { - List
result = repository.findAllByPublicationTimeBetween( - new SimpleDateFormat("HH:mm").parse("15:15"), - new SimpleDateFormat("HH:mm").parse("16:30") - ); - - assertEquals(2, result.size()); - assertTrue(result.stream() - .map(Article::getId) - .allMatch(id -> Arrays.asList(2, 3).contains(id)) - ); - } - - @Test - public void givenImportedArticlesWhenFindAllWithCreationDateTimeBeforeThenArticles2And3Returned() throws Exception { - List
result = repository.findAllWithCreationDateTimeBefore( - new SimpleDateFormat("yyyy-MM-dd HH:mm").parse("2017-12-15 10:00") - ); - - assertEquals(2, result.size()); - assertTrue(result.stream() - .map(Article::getId) - .allMatch(id -> Arrays.asList(2, 3).contains(id)) - ); - } - -} diff --git a/spring-boot-persistence/src/test/resources/application.properties b/spring-boot-persistence/src/test/resources/application.properties index a5d09db840..a5c1d983cf 100644 --- a/spring-boot-persistence/src/test/resources/application.properties +++ b/spring-boot-persistence/src/test/resources/application.properties @@ -13,4 +13,4 @@ hibernate.cache.use_query_cache=true hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory spring.jpa.properties.hibernate.hbm2ddl.import_files=migrated_users.sql -spring.datasource.data=import_*_users.sql,import_articles.sql \ No newline at end of file +spring.datasource.data=import_*_users.sql \ No newline at end of file diff --git a/spring-boot-persistence/src/test/resources/import_articles.sql b/spring-boot-persistence/src/test/resources/import_articles.sql deleted file mode 100644 index 4fe18bf4aa..0000000000 --- a/spring-boot-persistence/src/test/resources/import_articles.sql +++ /dev/null @@ -1,3 +0,0 @@ -insert into Article(id, publication_date, publication_time, creation_date_time) values(1, TO_DATE('01/01/2018', 'DD/MM/YYYY'), TO_DATE('15:00', 'HH24:MI'), TO_DATE('31/12/2017 07:30', 'DD/MM/YYYY HH24:MI')); -insert into Article(id, publication_date, publication_time, creation_date_time) values(2, TO_DATE('01/01/2018', 'DD/MM/YYYY'), TO_DATE('15:30', 'HH24:MI'), TO_DATE('15/12/2017 08:00', 'DD/MM/YYYY HH24:MI')); -insert into Article(id, publication_date, publication_time, creation_date_time) values(3, TO_DATE('15/12/2017', 'DD/MM/YYYY'), TO_DATE('16:00', 'HH24:MI'), TO_DATE('01/12/2017 13:45', 'DD/MM/YYYY HH24:MI')); \ No newline at end of file From 1eca2b5c79768b611f37f2c8b8fc1c0bd7f77649 Mon Sep 17 00:00:00 2001 From: Tritty Date: Sat, 25 Aug 2018 20:44:53 +0530 Subject: [PATCH 014/429] BAEL-1782 --- .../event/listener/ContextEventListener.java | 24 +++++++++++++++++++ .../baeldung/event/listener/EventConfig.java | 10 ++++++++ .../baeldung/event/listener/SpringRunner.java | 12 ++++++++++ 3 files changed, 46 insertions(+) create mode 100644 spring-core/src/main/java/com/baeldung/event/listener/ContextEventListener.java create mode 100644 spring-core/src/main/java/com/baeldung/event/listener/EventConfig.java create mode 100644 spring-core/src/main/java/com/baeldung/event/listener/SpringRunner.java diff --git a/spring-core/src/main/java/com/baeldung/event/listener/ContextEventListener.java b/spring-core/src/main/java/com/baeldung/event/listener/ContextEventListener.java new file mode 100644 index 0000000000..a2603bb95c --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/event/listener/ContextEventListener.java @@ -0,0 +1,24 @@ +package com.baeldung.event.listener; + +import org.springframework.context.event.ContextStartedEvent; +import org.springframework.context.event.ContextStoppedEvent; +import org.springframework.context.event.EventListener; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Component +public class ContextEventListener { + + @Order(2) + @EventListener + public void handleContextRefreshEvent(ContextStartedEvent ctxStartEvt) { + System.out.println("Context Start Event received."); + } + + @Order(1) + @EventListener(classes = { ContextStartedEvent.class, ContextStoppedEvent.class }) + public void handleMultipleEvents() { + System.out.println("Multi-event listener invoked"); + } + +} diff --git a/spring-core/src/main/java/com/baeldung/event/listener/EventConfig.java b/spring-core/src/main/java/com/baeldung/event/listener/EventConfig.java new file mode 100644 index 0000000000..f2a3af7640 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/event/listener/EventConfig.java @@ -0,0 +1,10 @@ +package com.baeldung.event.listener; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +@Configuration +@ComponentScan(basePackages = "com.baeldung.event.listener") +public class EventConfig { + +} diff --git a/spring-core/src/main/java/com/baeldung/event/listener/SpringRunner.java b/spring-core/src/main/java/com/baeldung/event/listener/SpringRunner.java new file mode 100644 index 0000000000..bbe4693900 --- /dev/null +++ b/spring-core/src/main/java/com/baeldung/event/listener/SpringRunner.java @@ -0,0 +1,12 @@ +package com.baeldung.event.listener; + +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.annotation.AnnotationConfigApplicationContext; + +public class SpringRunner { + + public static void main(String[] args) { + ConfigurableApplicationContext ctx = new AnnotationConfigApplicationContext(EventConfig.class); + ctx.start(); + } +} From 978591ef59f5df83b8d812d56ca4f4f74abb335f Mon Sep 17 00:00:00 2001 From: "akash.pandey" Date: Wed, 19 Sep 2018 10:19:49 +0530 Subject: [PATCH 015/429] BAEL-2159: Mini Article on "Separate double into integer and decimal parts" --- .../doubles/SplitFloatingPointNumbers.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java diff --git a/core-java/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java b/core-java/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java new file mode 100644 index 0000000000..a28ac3d5a1 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/doubles/SplitFloatingPointNumbers.java @@ -0,0 +1,40 @@ +package com.baeldung.doubles; + +import java.math.BigDecimal; + +public class SplitFloatingPointNumbers { + + public static void main(String[] args) { + + double doubleNumber = 24.04; + splitUsingFloatingTypes(doubleNumber); + splitUsingString(doubleNumber); + splitUsingBigDecimal(doubleNumber); + } + + private static void splitUsingFloatingTypes(double doubleNumber) { + System.out.println("Using Floating Point Arithmetics:"); + int intPart = (int) doubleNumber; + System.out.println("Double Number: "+doubleNumber); + System.out.println("Integer Part: "+ intPart); + System.out.println("Decimal Part: "+ (doubleNumber - intPart)); + } + + private static void splitUsingString(double doubleNumber) { + System.out.println("Using String Operations:"); + String doubleAsString = String.valueOf(doubleNumber); + int indexOfDecimal = doubleAsString.indexOf("."); + System.out.println("Double Number: "+doubleNumber); + System.out.println("Integer Part: "+ doubleAsString.substring(0, indexOfDecimal)); + System.out.println("Decimal Part: "+ doubleAsString.substring(indexOfDecimal)); + } + + private static void splitUsingBigDecimal(double doubleNumber) { + System.out.println("Using BigDecimal Operations:"); + BigDecimal bigDecimal = new BigDecimal(String.valueOf(doubleNumber)); + int intValue = bigDecimal.intValue(); + System.out.println("Double Number: "+bigDecimal.toPlainString()); + System.out.println("Integer Part: "+intValue); + System.out.println("Decimal Part: "+bigDecimal.subtract(new BigDecimal(intValue)).toPlainString()); + } +} From 5fa8e664453a7d1a79f78501f2bcfa12a4583614 Mon Sep 17 00:00:00 2001 From: Tritty Date: Tue, 2 Oct 2018 21:55:25 +0530 Subject: [PATCH 016/429] BAEL - 2166 : Password Generation --- java-strings/pom.xml | 12 +- .../password/StringPasswordUnitTest.java | 198 ++++++++++++++++++ 2 files changed, 209 insertions(+), 1 deletion(-) create mode 100644 java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java diff --git a/java-strings/pom.xml b/java-strings/pom.xml index b1ba49b33a..a43490ce5c 100644 --- a/java-strings/pom.xml +++ b/java-strings/pom.xml @@ -68,7 +68,17 @@ emoji-java 4.0.0 - + + + org.passay + passay + 1.3.1 + + + org.apache.commons + commons-text + 1.4 + diff --git a/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java b/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java new file mode 100644 index 0000000000..ac610aee6f --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java @@ -0,0 +1,198 @@ +package com.baeldung.string.password; + +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.security.SecureRandom; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.text.RandomStringGenerator; +import org.junit.Test; +import org.passay.CharacterData; +import org.passay.CharacterRule; +import org.passay.EnglishCharacterData; +import org.passay.PasswordGenerator; + +/** + * Examples of passwords conforming to various specifications, using different libraries. + * + * + * @author tritty + * + */ +public class StringPasswordUnitTest { + /** + * Special characters allowed in password. + */ + public static final String ALLOWED_SPL_CHARACTERS = "!@#$%^&*()_+"; + + public static final String ERROR_CODE = "ERRONEOUS_SPECIAL_CHARS"; + + Random random = new SecureRandom(); + + /** + * Password generated using Passay with minimum of 2 lowercase, 2 uppercase, 2 numbers and 2 special characters. + * + */ + @Test + public void whenPasswordGeneratedUsingPassay_thenSuccessful() { + PasswordGenerator gen = new PasswordGenerator(); + CharacterData lowerCaseChars = EnglishCharacterData.LowerCase; + CharacterRule lowerCaseRule = new CharacterRule(lowerCaseChars); + lowerCaseRule.setNumberOfCharacters(2); + CharacterData upperCaseChars = EnglishCharacterData.UpperCase; + CharacterRule upperCaseRule = new CharacterRule(upperCaseChars); + upperCaseRule.setNumberOfCharacters(2); + CharacterData digitChars = EnglishCharacterData.Digit; + CharacterRule digitRule = new CharacterRule(digitChars); + digitRule.setNumberOfCharacters(2); + CharacterData specialChars = new CharacterData() { + public String getErrorCode() { + return ERROR_CODE; + } + + public String getCharacters() { + return ALLOWED_SPL_CHARACTERS; + } + }; + CharacterRule splCharRule = new CharacterRule(specialChars); + splCharRule.setNumberOfCharacters(2); + String password = gen.generatePassword(10, splCharRule, lowerCaseRule, upperCaseRule, digitRule); + int specialCharCount = 0; + for (char c : password.toCharArray()) { + if (c >= 33 || c <= 47) { + specialCharCount++; + } + } + assertTrue(specialCharCount > 2); + } + + /** + * + * Password Generated using RandomStringGenerator conforming to the password requirements. + */ + @Test + public void whenPasswordGeneratedUsingCommonsText_thenSuccessful() { + String pwString = generateRandomSpecialCharacters(2).concat(generateRandomNumbers(2)) + .concat(generateRandomAlphabet(2, true)) + .concat(generateRandomAlphabet(2, false)) + .concat(generateRandomCharacters(2)); + List pwChars = pwString.chars() + .mapToObj(data -> (char) data) + .collect(Collectors.toList()); + Collections.shuffle(pwChars); + String password = pwChars.stream() + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString(); + int specialCharCount = 0; + for (char c : password.toCharArray()) { + if (c >= 33 || c <= 47) { + specialCharCount++; + } + } + assertTrue(specialCharCount > 2); + } + + @Test + public void whenPasswordGeneratedUsingCommonsLang3_thenSuccessful() { + String upperCaseLetters = RandomStringUtils.random(2, 65, 90, true, true); + String lowerCaseLetters = RandomStringUtils.random(2, 97, 122, true, true); + String numbers = RandomStringUtils.randomNumeric(2); + String specialChar = RandomStringUtils.random(2, 33, 47, false, false); + String totalChars = RandomStringUtils.randomAlphanumeric(2); + String combinedChars = upperCaseLetters.concat(lowerCaseLetters) + .concat(numbers) + .concat(specialChar) + .concat(totalChars); + List pwdChars = combinedChars.chars() + .mapToObj(c -> (char) c) + .collect(Collectors.toList()); + Collections.shuffle(pwdChars); + String password = pwdChars.stream() + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString(); + int specialCharCount = 0; + for (char c : password.toCharArray()) { + if (c >= 33 || c <= 47) { + specialCharCount++; + } + } + assertTrue(specialCharCount > 2); + } + + @Test + public void whenPasswordGeneratedUsingSecureRandom_thenSuccessful() { + Stream pwdStream = Stream.concat(getRandomNumbers(2), Stream.concat(getRandomSpecialChars(2), Stream.concat(getRandomAlphabets(2, true), getRandomAlphabets(4, false)))); + List charList = pwdStream.collect(Collectors.toList()); + Collections.shuffle(charList); + String password = charList.stream() + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString(); + int specialCharCount = 0; + for (char c : password.toCharArray()) { + if (c >= 33 || c <= 47) { + specialCharCount++; + } + } + assertTrue(specialCharCount > 2); + } + + public String generateRandomSpecialCharacters(int length) { + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(33, 45) + .build(); + return pwdGenerator.generate(length); + } + + public String generateRandomNumbers(int length) { + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57) + .build(); + return pwdGenerator.generate(length); + } + + public String generateRandomCharacters(int length) { + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57) + .build(); + return pwdGenerator.generate(length); + } + + public String generateRandomAlphabet(int length, boolean lowerCase) { + int low; + int hi; + if (lowerCase) { + low = 97; + hi = 122; + } else { + low = 65; + hi = 90; + } + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(low, hi) + .build(); + return pwdGenerator.generate(length); + } + + public Stream getRandomAlphabets(int count, boolean upperCase) { + IntStream characters = null; + if (upperCase) { + characters = random.ints(count, 65, 90); + } else { + characters = random.ints(count, 97, 122); + } + return characters.mapToObj(data -> (char) data); + } + + public Stream getRandomNumbers(int count) { + IntStream numbers = random.ints(count, 48, 57); + return numbers.mapToObj(data -> (char) data); + } + + public Stream getRandomSpecialChars(int count) { + IntStream specialChars = random.ints(count, 33, 45); + return specialChars.mapToObj(data -> (char) data); + } + +} From 30f94c717669cebd05625de3c0e2bb89b27c231b Mon Sep 17 00:00:00 2001 From: Tritty Date: Sun, 7 Oct 2018 20:27:27 +0530 Subject: [PATCH 017/429] Removed unnecessary javaDoc --- .../string/password/StringPasswordUnitTest.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java b/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java index ac610aee6f..7a076b0e3f 100644 --- a/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java @@ -21,9 +21,6 @@ import org.passay.PasswordGenerator; /** * Examples of passwords conforming to various specifications, using different libraries. * - * - * @author tritty - * */ public class StringPasswordUnitTest { /** @@ -35,10 +32,6 @@ public class StringPasswordUnitTest { Random random = new SecureRandom(); - /** - * Password generated using Passay with minimum of 2 lowercase, 2 uppercase, 2 numbers and 2 special characters. - * - */ @Test public void whenPasswordGeneratedUsingPassay_thenSuccessful() { PasswordGenerator gen = new PasswordGenerator(); @@ -72,10 +65,6 @@ public class StringPasswordUnitTest { assertTrue(specialCharCount > 2); } - /** - * - * Password Generated using RandomStringGenerator conforming to the password requirements. - */ @Test public void whenPasswordGeneratedUsingCommonsText_thenSuccessful() { String pwString = generateRandomSpecialCharacters(2).concat(generateRandomNumbers(2)) From e8ea3f1f804f4bf220e4279b3a4f02a59029b7e8 Mon Sep 17 00:00:00 2001 From: Jonathan Paul Cook Date: Sat, 13 Oct 2018 19:39:00 +0200 Subject: [PATCH 018/429] BAEL-2268 - Guide to JerseyTest - second attempt without formatting changes --- .../baeldung/jersey/server/model/Fruit.java | 5 +++ .../jersey/server/rest/FruitResource.java | 12 +++++++ .../GreetingsResourceIntegrationTest.java | 33 +++++++++++++++++++ .../rest/FruitResourceIntegrationTest.java | 27 +++++++++++++++ 4 files changed, 77 insertions(+) create mode 100644 jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java diff --git a/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java b/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java index c55362487b..1a648290a3 100644 --- a/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java +++ b/jersey/src/main/java/com/baeldung/jersey/server/model/Fruit.java @@ -54,4 +54,9 @@ public class Fruit { public void setSerial(String serial) { this.serial = serial; } + + @Override + public String toString() { + return "Fruit [name: " + getName() + " colour: " + getColour() + "]"; + } } diff --git a/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java b/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java index ee34cdd3ca..88692dcc55 100644 --- a/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java +++ b/jersey/src/main/java/com/baeldung/jersey/server/rest/FruitResource.java @@ -16,6 +16,8 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import org.glassfish.jersey.server.mvc.ErrorTemplate; import org.glassfish.jersey.server.mvc.Template; @@ -86,6 +88,16 @@ public class FruitResource { public void createFruit(@Valid Fruit fruit) { SimpleStorageService.storeFruit(fruit); } + + @POST + @Path("/created") + @Consumes(MediaType.APPLICATION_JSON) + public Response createNewFruit(@Valid Fruit fruit) { + String result = "Fruit saved : " + fruit; + return Response.status(Status.CREATED.getStatusCode()) + .entity(result) + .build(); + } @GET @Valid diff --git a/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java new file mode 100644 index 0000000000..c89e2fe23c --- /dev/null +++ b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java @@ -0,0 +1,33 @@ +package com.baeldung.jersey.server; + +import static org.junit.Assert.assertEquals; + +import javax.ws.rs.core.Application; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.test.JerseyTest; +import org.junit.Test; + +public class GreetingsResourceIntegrationTest extends JerseyTest { + + @Override + protected Application configure() { + return new ResourceConfig(Greetings.class); + } + + @Test + public void givenGetHiGreeting_whenCorrectRequest_thenResponseIsOkAndContainsHi() { + Response response = target("/greetings/hi").request() + .get(); + + assertEquals("Http Response should be 200: ", Status.OK.getStatusCode(), response.getStatus()); + assertEquals("Http Content-Type should be: ", MediaType.TEXT_HTML, response.getHeaderString(HttpHeaders.CONTENT_TYPE)); + + String content = response.readEntity(String.class); + assertEquals("Content of ressponse is: ", "hi", content); + } +} \ No newline at end of file diff --git a/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java index 2eeb5710cb..376c8c1e75 100644 --- a/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java +++ b/jersey/src/test/java/com/baeldung/jersey/server/rest/FruitResourceIntegrationTest.java @@ -10,6 +10,7 @@ import javax.ws.rs.core.Application; import javax.ws.rs.core.Form; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import org.glassfish.jersey.test.JerseyTest; import org.glassfish.jersey.test.TestProperties; @@ -63,6 +64,15 @@ public class FruitResourceIntegrationTest extends JerseyTest { assertEquals("Http Response should be 400 ", 400, response.getStatus()); assertThat(response.readEntity(String.class), containsString("Fruit colour must not be null")); } + + @Test + public void givenCreateFruit_whenJsonIsCorrect_thenResponseCodeIsCreated() { + Response response = target("fruit/created").request() + .post(Entity.json("{\"name\":\"strawberry\",\"weight\":20}")); + + assertEquals("Http Response should be 201 ", Status.CREATED.getStatusCode(), response.getStatus()); + assertThat(response.readEntity(String.class), containsString("Fruit saved : Fruit [name: strawberry colour: null]")); + } @Test public void givenUpdateFruit_whenFormContainsBadSerialParam_thenResponseCodeIsBadRequest() { @@ -102,6 +112,23 @@ public class FruitResourceIntegrationTest extends JerseyTest { .get(String.class); assertThat(json, containsString("{\"name\":\"strawberry\",\"weight\":20}")); } + + @Test + public void givenFruitExists_whenSearching_thenResponseContainsFruitEntity() { + Fruit fruit = new Fruit(); + fruit.setName("strawberry"); + fruit.setWeight(20); + Response response = target("fruit/create").request(MediaType.APPLICATION_JSON_TYPE) + .post(Entity.entity(fruit, MediaType.APPLICATION_JSON_TYPE)); + + assertEquals("Http Response should be 204 ", 204, response.getStatus()); + + final Fruit entity = target("fruit/search/strawberry").request() + .get(Fruit.class); + + assertEquals("Fruit name: ", "strawberry", entity.getName()); + assertEquals("Fruit weight: ", Integer.valueOf(20), entity.getWeight()); + } @Test public void givenFruit_whenFruitIsInvalid_thenReponseContainsCustomExceptions() { From 04ed393ba18daa7cd850de10cabd17a935935380 Mon Sep 17 00:00:00 2001 From: Jonathan Paul Cook Date: Sat, 13 Oct 2018 19:42:18 +0200 Subject: [PATCH 019/429] BAEL-2268 - Guide to JerseyTest - Add line break to end of file --- .../jersey/server/GreetingsResourceIntegrationTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java index c89e2fe23c..8953f4161c 100644 --- a/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java +++ b/jersey/src/test/java/com/baeldung/jersey/server/GreetingsResourceIntegrationTest.java @@ -30,4 +30,4 @@ public class GreetingsResourceIntegrationTest extends JerseyTest { String content = response.readEntity(String.class); assertEquals("Content of ressponse is: ", "hi", content); } -} \ No newline at end of file +} From 955c23fc610563ed8fa1b18d73cee476d6fd5ac0 Mon Sep 17 00:00:00 2001 From: Tritty Date: Sun, 14 Oct 2018 23:52:10 +0530 Subject: [PATCH 020/429] Segregated utility method --- .../password/RandomPasswordGenerator.java | 152 +++++++++++++++++ .../password/StringPasswordUnitTest.java | 157 ++---------------- 2 files changed, 169 insertions(+), 140 deletions(-) create mode 100644 java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java diff --git a/java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java b/java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java new file mode 100644 index 0000000000..46af4d7c51 --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/password/RandomPasswordGenerator.java @@ -0,0 +1,152 @@ +package com.baeldung.string.password; + +import java.security.SecureRandom; +import java.util.Collections; +import java.util.List; +import java.util.Random; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; + +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.text.RandomStringGenerator; +import org.passay.CharacterData; +import org.passay.CharacterRule; +import org.passay.EnglishCharacterData; +import org.passay.PasswordGenerator; + +public class RandomPasswordGenerator { + + /** + * Special characters allowed in password. + */ + public static final String ALLOWED_SPL_CHARACTERS = "!@#$%^&*()_+"; + + public static final String ERROR_CODE = "ERRONEOUS_SPECIAL_CHARS"; + + Random random = new SecureRandom(); + + public String generatePassayPassword() { + PasswordGenerator gen = new PasswordGenerator(); + CharacterData lowerCaseChars = EnglishCharacterData.LowerCase; + CharacterRule lowerCaseRule = new CharacterRule(lowerCaseChars); + lowerCaseRule.setNumberOfCharacters(2); + CharacterData upperCaseChars = EnglishCharacterData.UpperCase; + CharacterRule upperCaseRule = new CharacterRule(upperCaseChars); + upperCaseRule.setNumberOfCharacters(2); + CharacterData digitChars = EnglishCharacterData.Digit; + CharacterRule digitRule = new CharacterRule(digitChars); + digitRule.setNumberOfCharacters(2); + CharacterData specialChars = new CharacterData() { + public String getErrorCode() { + return ERROR_CODE; + } + + public String getCharacters() { + return ALLOWED_SPL_CHARACTERS; + } + }; + CharacterRule splCharRule = new CharacterRule(specialChars); + splCharRule.setNumberOfCharacters(2); + String password = gen.generatePassword(10, splCharRule, lowerCaseRule, upperCaseRule, digitRule); + return password; + } + + public String generateCommonTextPassword() { + String pwString = generateRandomSpecialCharacters(2).concat(generateRandomNumbers(2)) + .concat(generateRandomAlphabet(2, true)) + .concat(generateRandomAlphabet(2, false)) + .concat(generateRandomCharacters(2)); + List pwChars = pwString.chars() + .mapToObj(data -> (char) data) + .collect(Collectors.toList()); + Collections.shuffle(pwChars); + String password = pwChars.stream() + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString(); + return password; + } + + public String generateCommonsLang3Password() { + String upperCaseLetters = RandomStringUtils.random(2, 65, 90, true, true); + String lowerCaseLetters = RandomStringUtils.random(2, 97, 122, true, true); + String numbers = RandomStringUtils.randomNumeric(2); + String specialChar = RandomStringUtils.random(2, 33, 47, false, false); + String totalChars = RandomStringUtils.randomAlphanumeric(2); + String combinedChars = upperCaseLetters.concat(lowerCaseLetters) + .concat(numbers) + .concat(specialChar) + .concat(totalChars); + List pwdChars = combinedChars.chars() + .mapToObj(c -> (char) c) + .collect(Collectors.toList()); + Collections.shuffle(pwdChars); + String password = pwdChars.stream() + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString(); + return password; + } + + public String generateSecureRandomPassword() { + Stream pwdStream = Stream.concat(getRandomNumbers(2), Stream.concat(getRandomSpecialChars(2), Stream.concat(getRandomAlphabets(2, true), getRandomAlphabets(4, false)))); + List charList = pwdStream.collect(Collectors.toList()); + Collections.shuffle(charList); + String password = charList.stream() + .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) + .toString(); + return password; + } + + public String generateRandomSpecialCharacters(int length) { + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(33, 45) + .build(); + return pwdGenerator.generate(length); + } + + public String generateRandomNumbers(int length) { + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57) + .build(); + return pwdGenerator.generate(length); + } + + public String generateRandomCharacters(int length) { + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57) + .build(); + return pwdGenerator.generate(length); + } + + public String generateRandomAlphabet(int length, boolean lowerCase) { + int low; + int hi; + if (lowerCase) { + low = 97; + hi = 122; + } else { + low = 65; + hi = 90; + } + RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(low, hi) + .build(); + return pwdGenerator.generate(length); + } + + public Stream getRandomAlphabets(int count, boolean upperCase) { + IntStream characters = null; + if (upperCase) { + characters = random.ints(count, 65, 90); + } else { + characters = random.ints(count, 97, 122); + } + return characters.mapToObj(data -> (char) data); + } + + public Stream getRandomNumbers(int count) { + IntStream numbers = random.ints(count, 48, 57); + return numbers.mapToObj(data -> (char) data); + } + + public Stream getRandomSpecialChars(int count) { + IntStream specialChars = random.ints(count, 33, 45); + return specialChars.mapToObj(data -> (char) data); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java b/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java index 7a076b0e3f..bfd4b0fe8e 100644 --- a/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/password/StringPasswordUnitTest.java @@ -1,187 +1,64 @@ package com.baeldung.string.password; -import static org.junit.jupiter.api.Assertions.assertTrue; +import static org.junit.Assert.assertTrue; -import java.security.SecureRandom; -import java.util.Collections; -import java.util.List; -import java.util.Random; -import java.util.stream.Collectors; -import java.util.stream.IntStream; -import java.util.stream.Stream; - -import org.apache.commons.lang3.RandomStringUtils; -import org.apache.commons.text.RandomStringGenerator; import org.junit.Test; -import org.passay.CharacterData; -import org.passay.CharacterRule; -import org.passay.EnglishCharacterData; -import org.passay.PasswordGenerator; /** * Examples of passwords conforming to various specifications, using different libraries. * */ public class StringPasswordUnitTest { - /** - * Special characters allowed in password. - */ - public static final String ALLOWED_SPL_CHARACTERS = "!@#$%^&*()_+"; - public static final String ERROR_CODE = "ERRONEOUS_SPECIAL_CHARS"; - - Random random = new SecureRandom(); + RandomPasswordGenerator passGen = new RandomPasswordGenerator(); @Test public void whenPasswordGeneratedUsingPassay_thenSuccessful() { - PasswordGenerator gen = new PasswordGenerator(); - CharacterData lowerCaseChars = EnglishCharacterData.LowerCase; - CharacterRule lowerCaseRule = new CharacterRule(lowerCaseChars); - lowerCaseRule.setNumberOfCharacters(2); - CharacterData upperCaseChars = EnglishCharacterData.UpperCase; - CharacterRule upperCaseRule = new CharacterRule(upperCaseChars); - upperCaseRule.setNumberOfCharacters(2); - CharacterData digitChars = EnglishCharacterData.Digit; - CharacterRule digitRule = new CharacterRule(digitChars); - digitRule.setNumberOfCharacters(2); - CharacterData specialChars = new CharacterData() { - public String getErrorCode() { - return ERROR_CODE; - } - - public String getCharacters() { - return ALLOWED_SPL_CHARACTERS; - } - }; - CharacterRule splCharRule = new CharacterRule(specialChars); - splCharRule.setNumberOfCharacters(2); - String password = gen.generatePassword(10, splCharRule, lowerCaseRule, upperCaseRule, digitRule); + String password = passGen.generatePassayPassword(); int specialCharCount = 0; for (char c : password.toCharArray()) { if (c >= 33 || c <= 47) { specialCharCount++; } } - assertTrue(specialCharCount > 2); + assertTrue("Password validation failed in Passay", specialCharCount >= 2); } @Test public void whenPasswordGeneratedUsingCommonsText_thenSuccessful() { - String pwString = generateRandomSpecialCharacters(2).concat(generateRandomNumbers(2)) - .concat(generateRandomAlphabet(2, true)) - .concat(generateRandomAlphabet(2, false)) - .concat(generateRandomCharacters(2)); - List pwChars = pwString.chars() - .mapToObj(data -> (char) data) - .collect(Collectors.toList()); - Collections.shuffle(pwChars); - String password = pwChars.stream() - .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) - .toString(); - int specialCharCount = 0; + RandomPasswordGenerator passGen = new RandomPasswordGenerator(); + String password = passGen.generateCommonTextPassword(); + int lowerCaseCount = 0; for (char c : password.toCharArray()) { - if (c >= 33 || c <= 47) { - specialCharCount++; + if (c >= 97 || c <= 122) { + lowerCaseCount++; } } - assertTrue(specialCharCount > 2); + assertTrue("Password validation failed in commons-text ", lowerCaseCount >= 2); } @Test public void whenPasswordGeneratedUsingCommonsLang3_thenSuccessful() { - String upperCaseLetters = RandomStringUtils.random(2, 65, 90, true, true); - String lowerCaseLetters = RandomStringUtils.random(2, 97, 122, true, true); - String numbers = RandomStringUtils.randomNumeric(2); - String specialChar = RandomStringUtils.random(2, 33, 47, false, false); - String totalChars = RandomStringUtils.randomAlphanumeric(2); - String combinedChars = upperCaseLetters.concat(lowerCaseLetters) - .concat(numbers) - .concat(specialChar) - .concat(totalChars); - List pwdChars = combinedChars.chars() - .mapToObj(c -> (char) c) - .collect(Collectors.toList()); - Collections.shuffle(pwdChars); - String password = pwdChars.stream() - .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) - .toString(); - int specialCharCount = 0; + String password = passGen.generateCommonsLang3Password(); + int numCount = 0; for (char c : password.toCharArray()) { - if (c >= 33 || c <= 47) { - specialCharCount++; + if (c >= 48 || c <= 57) { + numCount++; } } - assertTrue(specialCharCount > 2); + assertTrue("Password validation failed in commons-lang3", numCount >= 2); } @Test public void whenPasswordGeneratedUsingSecureRandom_thenSuccessful() { - Stream pwdStream = Stream.concat(getRandomNumbers(2), Stream.concat(getRandomSpecialChars(2), Stream.concat(getRandomAlphabets(2, true), getRandomAlphabets(4, false)))); - List charList = pwdStream.collect(Collectors.toList()); - Collections.shuffle(charList); - String password = charList.stream() - .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append) - .toString(); + String password = passGen.generateSecureRandomPassword(); int specialCharCount = 0; for (char c : password.toCharArray()) { if (c >= 33 || c <= 47) { specialCharCount++; } } - assertTrue(specialCharCount > 2); - } - - public String generateRandomSpecialCharacters(int length) { - RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(33, 45) - .build(); - return pwdGenerator.generate(length); - } - - public String generateRandomNumbers(int length) { - RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57) - .build(); - return pwdGenerator.generate(length); - } - - public String generateRandomCharacters(int length) { - RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(48, 57) - .build(); - return pwdGenerator.generate(length); - } - - public String generateRandomAlphabet(int length, boolean lowerCase) { - int low; - int hi; - if (lowerCase) { - low = 97; - hi = 122; - } else { - low = 65; - hi = 90; - } - RandomStringGenerator pwdGenerator = new RandomStringGenerator.Builder().withinRange(low, hi) - .build(); - return pwdGenerator.generate(length); - } - - public Stream getRandomAlphabets(int count, boolean upperCase) { - IntStream characters = null; - if (upperCase) { - characters = random.ints(count, 65, 90); - } else { - characters = random.ints(count, 97, 122); - } - return characters.mapToObj(data -> (char) data); - } - - public Stream getRandomNumbers(int count) { - IntStream numbers = random.ints(count, 48, 57); - return numbers.mapToObj(data -> (char) data); - } - - public Stream getRandomSpecialChars(int count) { - IntStream specialChars = random.ints(count, 33, 45); - return specialChars.mapToObj(data -> (char) data); + assertTrue("Password validation failed in Secure Random", specialCharCount >= 2); } } From e2a675b348bcf52f551a83de059613da65a04045 Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Tue, 16 Oct 2018 00:44:02 +0200 Subject: [PATCH 021/429] [BAEL-2255] - Guide to BufferedReader --- .../bufferedreader/BufferedReaderExample.java | 106 ++++++++++++++++ core-java/src/main/resources/input.txt | 45 +++++++ .../BufferedReaderExampleUnitTest.java | 115 ++++++++++++++++++ 3 files changed, 266 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java create mode 100644 core-java/src/main/resources/input.txt create mode 100644 core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java new file mode 100644 index 0000000000..f381ab7c61 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java @@ -0,0 +1,106 @@ +package com.baeldung.bufferedreader; + +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; +import java.util.Arrays; + +public class BufferedReaderExample { + + public String readAllLines(BufferedReader reader) throws IOException { + StringBuilder content = new StringBuilder(); + String line; + + while ((line = reader.readLine()) != null) { + content.append(line); + content.append(System.lineSeparator()); + } + + return content.toString(); + } + + public String readAllLines2(BufferedReader reader) { + StringBuilder content = new StringBuilder(); + reader.lines().forEach(line -> content.append(line).append(System.lineSeparator())); + return content.toString(); + } + + public String readAllCharacters(BufferedReader reader) throws IOException { + StringBuilder content = new StringBuilder(); + + int value; + while ((value = reader.read()) != -1) { + content.append((char) value); + } + + return content.toString(); + } + + public String readAllCharacters2(BufferedReader reader) throws IOException { + StringBuilder content = new StringBuilder(); + + String title = "text: "; + char[] buf = Arrays.copyOf(title.toCharArray(), 512); + int offset = title.length(); + + int charsRead; + + while ((charsRead = reader.read(buf, offset, buf.length - offset)) != -1) { + content.append(buf, 0, offset + charsRead); + content.append(" --- "); + } + + return content.toString(); + } + + public String readWithSkipping(BufferedReader reader) throws IOException { + StringBuilder content = new StringBuilder(); + + int value; + while ((value = reader.read()) != -1) { + content.append((char) value); + reader.skip(4); + } + + return content.toString(); + } + + public void markAndReset(BufferedReader reader) throws IOException { + reader.mark(512); + + for (int i = 0; i < 3; i++) { + System.out.println(reader.readLine()); + reader.reset(); + reader.mark(512); + } + } + + public void readFile() { + BufferedReader reader = null; + try { + reader = new BufferedReader(new FileReader("src/main/resources/input.txt")); + String content = readAllLines(reader); + System.out.println(content); + } catch (IOException e) { + e.printStackTrace(); + } finally { + try { + if (reader != null) { + reader.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public void readFileTryWithResources() { + try(BufferedReader reader = new BufferedReader(new FileReader("src/main/resources/input.txt"))) { + String content = readAllLines(reader); + System.out.println(content); + } catch (IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/core-java/src/main/resources/input.txt b/core-java/src/main/resources/input.txt new file mode 100644 index 0000000000..650da894e8 --- /dev/null +++ b/core-java/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/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java new file mode 100644 index 0000000000..8f70cf1419 --- /dev/null +++ b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java @@ -0,0 +1,115 @@ +package com.baeldung.bufferedreader; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.springframework.util.StringUtils; + +import java.io.*; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BufferedReaderExampleUnitTest { + + public static final String FILE_NAME = "src/main/resources/input.txt"; + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + private final PrintStream originalOut = System.out; + private final PrintStream originalErr = System.err; + + @Before + public void setup() { + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + } + + @After + public void restore() { + System.setOut(originalOut); + System.setErr(originalErr); + } + + @Test + public void givenBufferedReader_whenReadAllLines_thenReturnsContent() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + + BufferedReaderExample bre = new BufferedReaderExample(); + String content = bre.readAllLines(reader); + + assertThat(content).isNotEmpty(); + assertThat(content).contains("Lorem ipsum"); + } + + @Test + public void givenBufferedReader_whenReadAllLines2_thenReturnsContent() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + + BufferedReaderExample bre = new BufferedReaderExample(); + String content = bre.readAllLines2(reader); + + assertThat(content).isNotEmpty(); + assertThat(content).contains("Lorem ipsum"); + } + + @Test + public void whenReadFile_thenOutputsContent() { + BufferedReaderExample bre = new BufferedReaderExample(); + bre.readFile(); + + assertThat(outContent.toString()).contains("Lorem ipsum"); + } + + @Test + public void givenBufferedReader_whenReadAllCharacters_thenReturnsContent() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + + BufferedReaderExample bre = new BufferedReaderExample(); + String content = bre.readAllCharacters(reader); + + assertThat(content).isNotEmpty(); + assertThat(content).contains("Lorem ipsum"); + } + + @Test + public void givenBufferedReader_whenReadAllCharacter2_thenReturnsContent() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + + BufferedReaderExample bre = new BufferedReaderExample(); + String content = bre.readAllCharacters2(reader); + + assertThat(content).isNotEmpty(); + assertThat(content).contains("Lorem ipsum"); + } + + @Test + public void givenBufferedReader_whenReadWithSkipping_thenReturnsScrambledContent() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + + BufferedReaderExample bre = new BufferedReaderExample(); + String content = bre.readWithSkipping(reader); + + assertThat(content).isNotEmpty(); + assertThat(content).contains("L mottneas"); + } + + @Test + public void givenBufferedReader_whenMarkAndReset_thenOutputsRepeatedContent() throws IOException { + BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + + BufferedReaderExample bre = new BufferedReaderExample(); + bre.markAndReset(reader); + + assertThat(outContent.toString()).isNotEmpty(); + assertThat(StringUtils.countOccurrencesOf(outContent.toString(), "Lorem ipsum")).isEqualTo(3); + } + + @Test + public void whenReadFileTryWithResources_thenOutputsContent() { + BufferedReaderExample bre = new BufferedReaderExample(); + bre.readFileTryWithResources(); + + assertThat(outContent.toString()).contains("Lorem ipsum"); + } + +} From dc5640c86ba68c158d9ad6818e62c9772949b8be Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Tue, 16 Oct 2018 01:04:46 +0200 Subject: [PATCH 022/429] [BAEL-2255] - fix formatting --- .../com/baeldung/bufferedreader/BufferedReaderExample.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java index f381ab7c61..1d7a3d8fda 100644 --- a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java +++ b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java @@ -21,7 +21,9 @@ public class BufferedReaderExample { public String readAllLines2(BufferedReader reader) { StringBuilder content = new StringBuilder(); - reader.lines().forEach(line -> content.append(line).append(System.lineSeparator())); + reader.lines() + .forEach(line -> content.append(line) + .append(System.lineSeparator())); return content.toString(); } @@ -95,7 +97,7 @@ public class BufferedReaderExample { } public void readFileTryWithResources() { - try(BufferedReader reader = new BufferedReader(new FileReader("src/main/resources/input.txt"))) { + try (BufferedReader reader = new BufferedReader(new FileReader("src/main/resources/input.txt"))) { String content = readAllLines(reader); System.out.println(content); } catch (IOException e) { From 67cfde81f3a3ad6dd38e91cc775747152c4185dc Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Wed, 17 Oct 2018 20:05:21 +0200 Subject: [PATCH 023/429] [BAEL-2255] - apply requested changes from code review --- .../bufferedreader/BufferedReaderExample.java | 33 ++++++------ .../BufferedReaderExampleUnitTest.java | 51 +++++++------------ 2 files changed, 34 insertions(+), 50 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java index 1d7a3d8fda..2260c5e2bd 100644 --- a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java +++ b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java @@ -3,7 +3,6 @@ package com.baeldung.bufferedreader; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; -import java.util.Arrays; public class BufferedReaderExample { @@ -19,7 +18,7 @@ public class BufferedReaderExample { return content.toString(); } - public String readAllLines2(BufferedReader reader) { + public String readAllLinesWithStream(BufferedReader reader) { StringBuilder content = new StringBuilder(); reader.lines() .forEach(line -> content.append(line) @@ -38,18 +37,14 @@ public class BufferedReaderExample { return content.toString(); } - public String readAllCharacters2(BufferedReader reader) throws IOException { + public String readAllCharactersUsingArray(BufferedReader reader) throws IOException { StringBuilder content = new StringBuilder(); - String title = "text: "; - char[] buf = Arrays.copyOf(title.toCharArray(), 512); - int offset = title.length(); - + char[] buf = new char[512]; int charsRead; - while ((charsRead = reader.read(buf, offset, buf.length - offset)) != -1) { - content.append(buf, 0, offset + charsRead); - content.append(" --- "); + while ((charsRead = reader.read(buf, 0, buf.length)) != -1) { + content.append(buf, 0, charsRead); } return content.toString(); @@ -67,24 +62,29 @@ public class BufferedReaderExample { return content.toString(); } - public void markAndReset(BufferedReader reader) throws IOException { + public String markAndReset(BufferedReader reader) throws IOException { + StringBuilder content = new StringBuilder(); + reader.mark(512); for (int i = 0; i < 3; i++) { - System.out.println(reader.readLine()); + content.append(reader.readLine()); reader.reset(); reader.mark(512); } + + return content.toString(); } - public void readFile() { + public String readFile() { BufferedReader reader = null; try { reader = new BufferedReader(new FileReader("src/main/resources/input.txt")); String content = readAllLines(reader); - System.out.println(content); + return content; } catch (IOException e) { e.printStackTrace(); + return null; } finally { try { if (reader != null) { @@ -96,12 +96,13 @@ public class BufferedReaderExample { } } - public void readFileTryWithResources() { + public String readFileTryWithResources() { try (BufferedReader reader = new BufferedReader(new FileReader("src/main/resources/input.txt"))) { String content = readAllLines(reader); - System.out.println(content); + return content; } catch (IOException e) { e.printStackTrace(); + return null; } } diff --git a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java index 8f70cf1419..b90a4ab6ed 100644 --- a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java +++ b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java @@ -1,11 +1,11 @@ package com.baeldung.bufferedreader; -import org.junit.After; -import org.junit.Before; import org.junit.Test; import org.springframework.util.StringUtils; -import java.io.*; +import java.io.BufferedReader; +import java.io.FileReader; +import java.io.IOException; import static org.assertj.core.api.Assertions.assertThat; @@ -13,23 +13,6 @@ public class BufferedReaderExampleUnitTest { public static final String FILE_NAME = "src/main/resources/input.txt"; - private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); - private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); - private final PrintStream originalOut = System.out; - private final PrintStream originalErr = System.err; - - @Before - public void setup() { - System.setOut(new PrintStream(outContent)); - System.setErr(new PrintStream(errContent)); - } - - @After - public void restore() { - System.setOut(originalOut); - System.setErr(originalErr); - } - @Test public void givenBufferedReader_whenReadAllLines_thenReturnsContent() throws IOException { BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); @@ -42,22 +25,22 @@ public class BufferedReaderExampleUnitTest { } @Test - public void givenBufferedReader_whenReadAllLines2_thenReturnsContent() throws IOException { + public void givenBufferedReader_whenReadAllLinesWithStream_thenReturnsContent() throws IOException { BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); BufferedReaderExample bre = new BufferedReaderExample(); - String content = bre.readAllLines2(reader); + String content = bre.readAllLinesWithStream(reader); assertThat(content).isNotEmpty(); assertThat(content).contains("Lorem ipsum"); } @Test - public void whenReadFile_thenOutputsContent() { + public void whenReadFile_thenReturnsContent() { BufferedReaderExample bre = new BufferedReaderExample(); - bre.readFile(); + String content = bre.readFile(); - assertThat(outContent.toString()).contains("Lorem ipsum"); + assertThat(content.toString()).contains("Lorem ipsum"); } @Test @@ -72,11 +55,11 @@ public class BufferedReaderExampleUnitTest { } @Test - public void givenBufferedReader_whenReadAllCharacter2_thenReturnsContent() throws IOException { + public void givenBufferedReader_whenReadAllCharactersUsingArray_thenReturnsContent() throws IOException { BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); BufferedReaderExample bre = new BufferedReaderExample(); - String content = bre.readAllCharacters2(reader); + String content = bre.readAllCharactersUsingArray(reader); assertThat(content).isNotEmpty(); assertThat(content).contains("Lorem ipsum"); @@ -94,22 +77,22 @@ public class BufferedReaderExampleUnitTest { } @Test - public void givenBufferedReader_whenMarkAndReset_thenOutputsRepeatedContent() throws IOException { + public void givenBufferedReader_whenMarkAndReset_thenReturnsRepeatedContent() throws IOException { BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); BufferedReaderExample bre = new BufferedReaderExample(); - bre.markAndReset(reader); + String content = bre.markAndReset(reader); - assertThat(outContent.toString()).isNotEmpty(); - assertThat(StringUtils.countOccurrencesOf(outContent.toString(), "Lorem ipsum")).isEqualTo(3); + assertThat(content.toString()).isNotEmpty(); + assertThat(StringUtils.countOccurrencesOf(content.toString(), "Lorem ipsum")).isEqualTo(3); } @Test - public void whenReadFileTryWithResources_thenOutputsContent() { + public void whenReadFileTryWithResources_thenReturnsContent() { BufferedReaderExample bre = new BufferedReaderExample(); - bre.readFileTryWithResources(); + String content = bre.readFileTryWithResources(); - assertThat(outContent.toString()).contains("Lorem ipsum"); + assertThat(content.toString()).contains("Lorem ipsum"); } } From e5f43622bec8ee4be55a64f54ff889b24a7f3028 Mon Sep 17 00:00:00 2001 From: RanjeetKaur17 Date: Fri, 19 Oct 2018 19:58:50 +0400 Subject: [PATCH 024/429] Example to demonstrate differences between CyclicBarrier and CountDownLatch. --- .../CountdownLatchCountExample.java | 33 +++++++++++++ .../CountdownLatchResetExample.java | 41 ++++++++++++++++ .../CyclicBarrierCompletionMethodExample.java | 46 ++++++++++++++++++ .../CyclicBarrierCountExample.java | 32 +++++++++++++ .../CyclicBarrierResetExample.java | 47 +++++++++++++++++++ .../CountdownLatchCountExampleUnitTest.java | 15 ++++++ .../CountdownLatchResetExampleUnitTest.java | 17 +++++++ ...arrierCompletionMethodExampleUnitTest.java | 17 +++++++ .../CyclicBarrierCountExampleUnitTest.java | 15 ++++++ .../CyclicBarrierResetExampleUnitTest.java | 17 +++++++ 10 files changed, 280 insertions(+) create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java create mode 100644 core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java create mode 100644 core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java create mode 100644 core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java create mode 100644 core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java create mode 100644 core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java new file mode 100644 index 0000000000..08c7eeec03 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java @@ -0,0 +1,33 @@ +package com.baeldung.concurrent.countdownlatch; + +import java.util.concurrent.CountDownLatch; + +public class CountdownLatchCountExample { + + private int count; + + public CountdownLatchCountExample(int count) { + this.count = count; + } + + public boolean callTwiceInSameThread() { + CountDownLatch countDownLatch = new CountDownLatch(count); + Thread t = new Thread(() -> { + countDownLatch.countDown(); + countDownLatch.countDown(); + }); + t.start(); + + try { + countDownLatch.await(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + return countDownLatch.getCount() == 0; + } + + public static void main(String[] args) { + CountdownLatchCountExample ex = new CountdownLatchCountExample(2); + System.out.println("Is CountDown Completed : " + ex.callTwiceInSameThread()); + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java new file mode 100644 index 0000000000..7effc9e374 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java @@ -0,0 +1,41 @@ +package com.baeldung.concurrent.countdownlatch; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class CountdownLatchResetExample { + + private int count; + private int threadCount; + private final List outputScraper; + + CountdownLatchResetExample(final List outputScraper, int count, int threadCount) { + this.outputScraper = outputScraper; + this.count = count; + this.threadCount = threadCount; + } + + public int countWaits() { + CountDownLatch countDownLatch = new CountDownLatch(count); + ExecutorService es = Executors.newFixedThreadPool(threadCount); + for (int i = 0; i < threadCount; i++) { + es.execute(() -> { + if (countDownLatch.getCount() > 0) { + outputScraper.add("Count Left : " + countDownLatch.getCount()); + } + countDownLatch.countDown(); + }); + } + + es.shutdown(); + return outputScraper.size(); + } + + public static void main(String[] args) { + CountdownLatchResetExample ex = new CountdownLatchResetExample(new ArrayList<>(),5,20); + System.out.println("Count : " + ex.countWaits()); + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java new file mode 100644 index 0000000000..b7a32e2c8d --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java @@ -0,0 +1,46 @@ +package com.baeldung.concurrent.cyclicbarrier; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class CyclicBarrierCompletionMethodExample { + + private int count; + private int threadCount; + private final List outputScraper; + + CyclicBarrierCompletionMethodExample(final List outputScraper, int count, int threadCount) { + this.outputScraper = outputScraper; + this.count = count; + this.threadCount = threadCount; + } + + public int countTrips() { + + CyclicBarrier cyclicBarrier = new CyclicBarrier(count, () -> { + outputScraper.add("Barrier is Tripped"); + }); + + ExecutorService es = Executors.newFixedThreadPool(threadCount); + for (int i = 0; i < threadCount; i++) { + es.execute(() -> { + try { + cyclicBarrier.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } + }); + } + es.shutdown(); + return outputScraper.size(); + } + + public static void main(String[] args) { + CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(new ArrayList(), 5, 20); + System.out.println("Count : " + ex.countTrips()); + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java new file mode 100644 index 0000000000..c7a9b20698 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java @@ -0,0 +1,32 @@ +package com.baeldung.concurrent.cyclicbarrier; + +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; + +public class CyclicBarrierCountExample { + + private int count; + + public CyclicBarrierCountExample(int count) { + this.count = count; + } + + public boolean callTwiceInSameThread() { + CyclicBarrier cyclicBarrier = new CyclicBarrier(count); + Thread t = new Thread(() -> { + try { + cyclicBarrier.await(); + cyclicBarrier.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } + }); + t.start(); + return cyclicBarrier.isBroken(); + } + + public static void main(String[] args) { + CyclicBarrierCountExample ex = new CyclicBarrierCountExample(1); + System.out.println("Count : " + ex.callTwiceInSameThread()); + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java new file mode 100644 index 0000000000..c355b7eead --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java @@ -0,0 +1,47 @@ +package com.baeldung.concurrent.cyclicbarrier; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.BrokenBarrierException; +import java.util.concurrent.CyclicBarrier; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +public class CyclicBarrierResetExample { + + private int count; + private int threadCount; + private final List outputScraper; + + CyclicBarrierResetExample(final List outputScraper, int count, int threadCount) { + this.outputScraper = outputScraper; + this.count = count; + this.threadCount = threadCount; + } + + public int countWaits() { + + CyclicBarrier cyclicBarrier = new CyclicBarrier(count); + + ExecutorService es = Executors.newFixedThreadPool(threadCount); + for (int i = 0; i < threadCount; i++) { + es.execute(() -> { + try { + if (cyclicBarrier.getNumberWaiting() > 0) { + outputScraper.add("Waiting Count : " + cyclicBarrier.getNumberWaiting()); + } + cyclicBarrier.await(); + } catch (InterruptedException | BrokenBarrierException e) { + e.printStackTrace(); + } + }); + } + es.shutdown(); + return outputScraper.size(); + } + + public static void main(String[] args) { + CyclicBarrierResetExample ex = new CyclicBarrierResetExample(new ArrayList(), 5, 20); + System.out.println("Count : " + ex.countWaits()); + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java new file mode 100644 index 0000000000..835efa53f2 --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java @@ -0,0 +1,15 @@ +package com.baeldung.concurrent.countdownlatch; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class CountdownLatchCountExampleUnitTest { + + @Test + public void whenCountDownLatch_completed() { + CountdownLatchCountExample ex = new CountdownLatchCountExample(2); + boolean isCompleted = ex.callTwiceInSameThread(); + assertTrue(isCompleted); + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java new file mode 100644 index 0000000000..2018c9168d --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.concurrent.countdownlatch; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; + +import org.junit.Test; + +public class CountdownLatchResetExampleUnitTest { + + @Test + public void whenCountDownLatch_noReset() { + CountdownLatchResetExample ex = new CountdownLatchResetExample(new ArrayList<>(),5,20); + int lineCount = ex.countWaits(); + assertEquals(5, lineCount); + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java new file mode 100644 index 0000000000..e8db84935a --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.concurrent.cyclicbarrier; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; + +import org.junit.Test; + +public class CyclicBarrierCompletionMethodExampleUnitTest { + + @Test + public void whenCyclicBarrier_countTrips() { + CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(new ArrayList<>(),5,20); + int lineCount = ex.countTrips(); + assertEquals(4, lineCount); + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java new file mode 100644 index 0000000000..9b7f3d9945 --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java @@ -0,0 +1,15 @@ +package com.baeldung.concurrent.cyclicbarrier; + +import static org.junit.Assert.assertFalse; + +import org.junit.Test; + +public class CyclicBarrierCountExampleUnitTest { + + @Test + public void whenCyclicBarrier_notCompleted() { + CyclicBarrierCountExample ex = new CyclicBarrierCountExample(2); + boolean isCompleted = ex.callTwiceInSameThread(); + assertFalse(isCompleted); + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java new file mode 100644 index 0000000000..2871d16348 --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.baeldung.concurrent.cyclicbarrier; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; + +import org.junit.Test; + +public class CyclicBarrierResetExampleUnitTest { + + @Test + public void whenCyclicBarrier_reset() { + CyclicBarrierResetExample ex = new CyclicBarrierResetExample(new ArrayList<>(),5,20); + int lineCount = ex.countWaits(); + assertEquals(16, lineCount); + } +} From 69c160aab9963e0fdd649719a16003c7e16e865a Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sun, 21 Oct 2018 07:27:01 +0530 Subject: [PATCH 025/429] BAEL-2203 - Convert java.time.Instant to java.sql.Timestamp and vice-versa --- .../datetime/ConvertInstantToTimestamp.java | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java diff --git a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java new file mode 100644 index 0000000000..b2f18fd3bf --- /dev/null +++ b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java @@ -0,0 +1,36 @@ +package com.baeldung.datetime; + +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.time.Instant; +import java.time.ZoneId; +import java.util.TimeZone; + +public class ConvertInstantToTimestamp { + + public static void main(String[] args) { + run(); + } + + public static void run() { + Instant instant = Instant.now(); + Timestamp timestamp = Timestamp.from(instant); // same point on the time-line as Instant + + System.out.println("Instant (milliseconds from epoch)" + instant.toEpochMilli()); + System.out.println("Timestamp (milliseconds from epoch): " + timestamp.getTime()); + System.out.print("\n"); + + // Local TimeZone of the machine at the time of running this code is GMT +5:30 a.k.a IST + ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("IST")); + + DateFormat df = DateFormat.getDateTimeInstance(); + df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SS'Z'"); + df.setTimeZone(TimeZone.getTimeZone("UTC")); + + System.out.println("Instant (in UTC): " + instant); + System.out.println("Timestamp (in UTC): " + df.format(timestamp)); + System.out.println("Instant (in GMT +05:30): " + instant.atZone(zoneId)); + System.out.println("Timestamp (in GMT +05:30): " + timestamp); + } +} \ No newline at end of file From 8696022889af03d5af7594e79c3927c840025830 Mon Sep 17 00:00:00 2001 From: Kotharu Date: Sun, 21 Oct 2018 18:19:00 +0530 Subject: [PATCH 026/429] BAEL-1724 Akka HTTP Initial Commit --- akka-http/pom.xml | 48 +++++++++ .../com/baeldung/akkahttp/AkkaHttpServer.java | 39 ++++++++ .../main/java/com/baeldung/akkahttp/User.java | 30 ++++++ .../java/com/baeldung/akkahttp/UserActor.java | 60 ++++++++++++ .../akkahttp/UserRegistryMessages.java | 70 +++++++++++++ .../com/baeldung/akkahttp/UserRoutes.java | 98 +++++++++++++++++++ .../java/com/baeldung/akkahttp/Users.java | 25 +++++ pom.xml | 1 + 8 files changed, 371 insertions(+) create mode 100644 akka-http/pom.xml create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/User.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java create mode 100644 akka-http/src/main/java/com/baeldung/akkahttp/Users.java diff --git a/akka-http/pom.xml b/akka-http/pom.xml new file mode 100644 index 0000000000..05e50d2229 --- /dev/null +++ b/akka-http/pom.xml @@ -0,0 +1,48 @@ + + + + 4.0.0 + akka-http + akka-http + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + com.typesafe.akka + akka-http_2.12 + ${akka.http.version} + + + com.typesafe.akka + akka-stream_2.12 + ${akka.stream.version} + + + com.typesafe.akka + akka-http-jackson_2.12 + ${akka.http.version} + + + com.typesafe.akka + akka-http-testkit_2.12 + ${akka.http.version} + test + + + + + UTF-8 + UTF-8 + 1.8 + 10.0.11 + 2.5.11 + + diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java b/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java new file mode 100644 index 0000000000..03992b6a36 --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java @@ -0,0 +1,39 @@ +package com.baeldung.akkahttp; + +import java.util.concurrent.CompletionStage; + +import akka.NotUsed; +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.http.javadsl.ConnectHttp; +import akka.http.javadsl.Http; +import akka.http.javadsl.ServerBinding; +import akka.http.javadsl.model.HttpRequest; +import akka.http.javadsl.model.HttpResponse; +import akka.http.javadsl.server.AllDirectives; +import akka.stream.ActorMaterializer; +import akka.stream.javadsl.Flow; + +public class AkkaHttpServer extends AllDirectives { + + private final UserRoutes userRoutes; + + public AkkaHttpServer(ActorSystem system, ActorRef userRegistryActor) { + userRoutes = new UserRoutes(system, userRegistryActor); + } + + public static void main(String[] args) throws Exception { + ActorSystem system = ActorSystem.create("helloAkkaHttpServer"); + final ActorMaterializer materializer = ActorMaterializer.create(system); + + ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor"); + + AkkaHttpServer app = new AkkaHttpServer(system, userActorRef); + + final Flow routeFlow = app.userRoutes.routes().flow(system, materializer); + + final CompletionStage binding = Http.get(system).bindAndHandle(routeFlow, + ConnectHttp.toHost("localhost", 8080), materializer); + + System.out.println("Server is online at http://localhost:8080/"); + } \ No newline at end of file diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/User.java b/akka-http/src/main/java/com/baeldung/akkahttp/User.java new file mode 100644 index 0000000000..9b5b95ebc1 --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/User.java @@ -0,0 +1,30 @@ +package com.baeldung.akkahttp; + +/** + * User Entity + * + */ +public class User { + + private final String name; + private final String address; + + public User() { + this.name = ""; + this.address = ""; + } + + public User(String name, String address) { + this.name = name; + this.address = address; + } + + public String getName() { + return name; + } + + public String getAddress() { + return address; + } + +} \ No newline at end of file diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java new file mode 100644 index 0000000000..f6c7015070 --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserActor.java @@ -0,0 +1,60 @@ +package com.baeldung.akkahttp; + +import java.util.ArrayList; +import java.util.List; + +import akka.actor.AbstractActor; +import akka.actor.Props; +import akka.event.Logging; +import akka.event.LoggingAdapter; + +/** + * User Actor + * + */ +public class UserActor extends AbstractActor { + + LoggingAdapter log = Logging.getLogger(getContext().getSystem(), this); + + /** + * In memory List to hold the users added via POST operation. + */ + private final List users = new ArrayList<>(); + + /** + * To define UserActor Props. + * + * @return Props + */ + static Props props() { + return Props.create(UserActor.class); + } + + /** + * createReveive() implementation + */ + @Override + public Receive createReceive() { + return receiveBuilder().match(UserRegistryMessages.GetUsers.class, getUsers -> getSender().tell(new Users(users), getSelf())) + .match(UserRegistryMessages.CreateUser.class, createUser -> { + users.add(createUser.getUser()); + getSender().tell(new UserRegistryMessages.ActionPerformed(String.format("User %s created.", createUser.getUser() + .getName())), getSelf()); + }) + .match(UserRegistryMessages.GetUser.class, getUser -> { + getSender().tell(users.stream() + .filter(user -> user.getName() + .equals(getUser.getName())) + .findFirst(), getSelf()); + }) + .match(UserRegistryMessages.DeleteUser.class, deleteUser -> { + users.removeIf(user -> user.getName() + .equals(deleteUser.getName())); + getSender().tell(new UserRegistryMessages.ActionPerformed(String.format("User %s deleted.", deleteUser.getName())), getSelf()); + + }) + .matchAny(o -> log.info("received unknown message")) + .build(); + } + +} diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java new file mode 100644 index 0000000000..831819849a --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java @@ -0,0 +1,70 @@ +package com.baeldung.akkahttp; + +/** + * Defines all messages related to User Actor + * + */ +public interface UserRegistryMessages { + + class GetUsers implements Serializable { + + private static final long serialVersionUID = 1L; + } + + class ActionPerformed implements Serializable { + + private static final long serialVersionUID = 1L; + + private final String description; + + public ActionPerformed(String description) { + this.description = description; + } + + public String getDescription() { + return description; + } + } + + class CreateUser implements Serializable { + + private static final long serialVersionUID = 1L; + private final User user; + + public CreateUser(User user) { + this.user = user; + } + + public User getUser() { + return user; + } + } + + class GetUser implements Serializable { + + private static final long serialVersionUID = 1L; + private final String name; + + public GetUser(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } + + class DeleteUser implements Serializable { + + private static final long serialVersionUID = 1L; + private final String name; + + public DeleteUser(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } +} diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java new file mode 100644 index 0000000000..aa3c9b612f --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java @@ -0,0 +1,98 @@ +package com.baeldung.akkahttp; + +import java.time.Duration; +import java.util.Optional; +import java.util.concurrent.CompletionStage; +import java.util.concurrent.TimeUnit; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.event.Logging; +import akka.event.LoggingAdapter; +import akka.http.javadsl.marshallers.jackson.Jackson; +import akka.http.javadsl.model.StatusCodes; +import akka.http.javadsl.server.AllDirectives; +import akka.http.javadsl.server.PathMatchers; +import akka.http.javadsl.server.Route; +import akka.pattern.PatternsCS; +import akka.util.Timeout; + +public class UserRoutes extends AllDirectives { + + private final ActorRef userActorRef; + private final LoggingAdapter log; + Timeout timeout = new Timeout(Duration.create(5, TimeUnit.SECONDS)); + + public UserRoutes(ActorSystem system, ActorRef userActorRef) { + this.userActorRef = userActorRef; + log = Logging.getLogger(system, this); + } + + public Route routes() { + return pathPrefix("users", () -> route(getOrPostUsers(), path(PathMatchers.segment(), name -> route(getUser(name), deleteUser(name))))); + } + + /** + * Defines and returns a route to get the user by name + * + * @param name + * @return Route + */ + private Route getUser(String name) { + + Route getRoute = get(() -> { + CompletionStage> user = PatternsCS.ask(userActorRef, new UserRegistryMessages.GetUser(name), timeout) + .thenApply(obj -> (Optional) obj); + + return onSuccess(() -> user, performed -> { + if (performed.isPresent()) + return complete(StatusCodes.OK, performed.get(), Jackson.marshaller()); + else + return complete(StatusCodes.NOT_FOUND); + }); + }); + return getRoute; + } + + /** + * Defines and returns a Route to delete the user by name. + * + * @param name + * @return Route + */ + private Route deleteUser(String name) { + + Route deleteRoute = delete(() -> { + CompletionStage userDeleted = PatternsCS.ask(userActorRef, new UserRegistryMessages.DeleteUser(name), timeout) + .thenApply(obj -> (ActionPerformed) obj); + + return onSuccess(() -> userDeleted, performed -> { + log.info("Deleted user [{}]: {}", name, performed.getDescription()); + return complete(StatusCodes.OK, performed, Jackson.marshaller()); + }); + }); + + return deleteRoute; + } + + /** + * Defines two routes, one to get all users and the other is to post users. + * + * @return + */ + private Route getOrPostUsers() { + return pathEnd(() -> route(get(() -> { + CompletionStage futureUsers = PatternsCS.ask(userActorRef, new UserRegistryMessages.GetUsers(), timeout) + .thenApply(obj -> (Users) obj); + return onSuccess(() -> futureUsers, users -> complete(StatusCodes.OK, users, Jackson.marshaller())); + }), post(() -> entity(Jackson.unmarshaller(User.class), user -> { + CompletionStage userCreated = PatternsCS.ask(userActorRef, new CreateUser(user), timeout) + .thenApply(obj -> (ActionPerformed) obj); + return onSuccess(() -> userCreated, performed -> { + log.info("Created user [{}]: {}", user.getName(), performed.getDescription()); + return complete(StatusCodes.CREATED, performed, Jackson.marshaller()); + }); + })))); + } + +} diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/Users.java b/akka-http/src/main/java/com/baeldung/akkahttp/Users.java new file mode 100644 index 0000000000..e5e6c62c06 --- /dev/null +++ b/akka-http/src/main/java/com/baeldung/akkahttp/Users.java @@ -0,0 +1,25 @@ +package com.baeldung.akkahttp; + +import java.util.ArrayList; +import java.util.List; + +/** + * This class is used to send the response enclosed by Users. + * + */ +public class Users { + + private final List users; + + public Users() { + this.users = new ArrayList<>(); + } + + public Users(List users) { + this.users = users; + } + + public List getUsers() { + return users; + } +} diff --git a/pom.xml b/pom.xml index 302530fd24..d0d0fa7049 100644 --- a/pom.xml +++ b/pom.xml @@ -1254,6 +1254,7 @@ aws aws-lambda akka-streams + akka-http algorithms annotations apache-cxf From 632e46c2a0bcde213e278f738879639752d01f9a Mon Sep 17 00:00:00 2001 From: Kotharu Date: Sun, 21 Oct 2018 18:40:44 +0530 Subject: [PATCH 027/429] Initial Commit --- .../com/baeldung/akkahttp/AkkaHttpServer.java | 20 ++++++++++--------- .../akkahttp/UserRegistryMessages.java | 2 ++ .../com/baeldung/akkahttp/UserRoutes.java | 5 ++++- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java b/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java index 03992b6a36..d4c859891a 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/AkkaHttpServer.java @@ -23,17 +23,19 @@ public class AkkaHttpServer extends AllDirectives { } public static void main(String[] args) throws Exception { - ActorSystem system = ActorSystem.create("helloAkkaHttpServer"); - final ActorMaterializer materializer = ActorMaterializer.create(system); + ActorSystem system = ActorSystem.create("helloAkkaHttpServer"); + final ActorMaterializer materializer = ActorMaterializer.create(system); - ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor"); + ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor"); - AkkaHttpServer app = new AkkaHttpServer(system, userActorRef); + AkkaHttpServer app = new AkkaHttpServer(system, userActorRef); - final Flow routeFlow = app.userRoutes.routes().flow(system, materializer); + final Flow routeFlow = app.userRoutes.routes() + .flow(system, materializer); - final CompletionStage binding = Http.get(system).bindAndHandle(routeFlow, - ConnectHttp.toHost("localhost", 8080), materializer); + final CompletionStage binding = Http.get(system) + .bindAndHandle(routeFlow, ConnectHttp.toHost("localhost", 8080), materializer); - System.out.println("Server is online at http://localhost:8080/"); - } \ No newline at end of file + System.out.println("Server is online at http://localhost:8080/"); + } +} \ No newline at end of file diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java index 831819849a..1f88e5f646 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserRegistryMessages.java @@ -1,5 +1,7 @@ package com.baeldung.akkahttp; +import java.io.Serializable; + /** * Defines all messages related to User Actor * diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java index aa3c9b612f..aeddf9224d 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserRoutes.java @@ -1,10 +1,12 @@ package com.baeldung.akkahttp; -import java.time.Duration; import java.util.Optional; import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; +import com.baeldung.akkahttp.UserRegistryMessages.ActionPerformed; +import com.baeldung.akkahttp.UserRegistryMessages.CreateUser; + import akka.actor.ActorRef; import akka.actor.ActorSystem; import akka.event.Logging; @@ -16,6 +18,7 @@ import akka.http.javadsl.server.PathMatchers; import akka.http.javadsl.server.Route; import akka.pattern.PatternsCS; import akka.util.Timeout; +import scala.concurrent.duration.Duration; public class UserRoutes extends AllDirectives { From 91cc2514b2a1cdf12c9d6747d3dfa16c192d332f Mon Sep 17 00:00:00 2001 From: Kotharu Date: Sun, 21 Oct 2018 19:32:08 +0530 Subject: [PATCH 028/429] Added Route Test --- .../com/baeldung/akkahttp/UserRoutesTest.java | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 akka-http/src/test/java/com/baeldung/akkahttp/UserRoutesTest.java diff --git a/akka-http/src/test/java/com/baeldung/akkahttp/UserRoutesTest.java b/akka-http/src/test/java/com/baeldung/akkahttp/UserRoutesTest.java new file mode 100644 index 0000000000..db749c4f0b --- /dev/null +++ b/akka-http/src/test/java/com/baeldung/akkahttp/UserRoutesTest.java @@ -0,0 +1,48 @@ +package com.baeldung.akkahttp; + +import org.junit.Test; + +import akka.actor.ActorRef; +import akka.actor.ActorSystem; +import akka.http.javadsl.model.ContentType; +import akka.http.javadsl.model.ContentType.NonBinary; +import akka.http.javadsl.model.HttpHeader; +import akka.http.javadsl.model.HttpRequest; +import akka.http.javadsl.model.MediaType; +import akka.http.javadsl.model.MediaTypes; +import akka.http.javadsl.model.StatusCodes; +import akka.http.javadsl.model.headers.RawHeader; +import akka.http.javadsl.testkit.JUnitRouteTest; +import akka.http.javadsl.testkit.TestRoute; + +public class UserRoutesTest extends JUnitRouteTest { + + ActorSystem system = ActorSystem.create("helloAkkaHttpServer"); + ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor"); + + TestRoute appRoute = testRoute(new UserRoutes(system, userActorRef).routes()); + + @Test + public void givenUser_WhenGetOrPostUsers_ThenUserRetrieved() { + + appRoute.run(HttpRequest.GET("/users")) + .assertStatusCode(200) + .assertContentType("application/json") + .assertEntity("{\"users\":[]}"); + + appRoute.run(HttpRequest.GET("/usersw")) + .assertStatusCode(404); + + appRoute.run(HttpRequest.POST("/users")) + .assertStatusCode(400); + + final RawHeader contentTypeHeader = RawHeader.create("Content-Type", "application/json"); + final RawHeader acceptHeader = RawHeader.create("", "application/json"); + + appRoute.run(HttpRequest.POST("/users") + .addHeader(contentTypeHeader) + .addHeader(acceptHeader)) + .assertStatusCode(400); + + } +} From 7fa876cc6cc634234eac49297af0e2c12da496cb Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Sun, 21 Oct 2018 21:56:57 +0200 Subject: [PATCH 029/429] [BAEL-2255] - implement more meaningful unit-test-like code examples for skip, mark and reset methods --- .../bufferedreader/BufferedReaderExample.java | 54 ++++----------- .../BufferedReaderExampleUnitTest.java | 68 +++++++++++-------- 2 files changed, 54 insertions(+), 68 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java index 2260c5e2bd..591122d18f 100644 --- a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java +++ b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java @@ -3,6 +3,7 @@ package com.baeldung.bufferedreader; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; +import java.util.stream.Collectors; public class BufferedReaderExample { @@ -19,14 +20,12 @@ public class BufferedReaderExample { } public String readAllLinesWithStream(BufferedReader reader) { - StringBuilder content = new StringBuilder(); - reader.lines() - .forEach(line -> content.append(line) - .append(System.lineSeparator())); - return content.toString(); + return reader + .lines() + .collect(Collectors.joining(System.lineSeparator())); } - public String readAllCharacters(BufferedReader reader) throws IOException { + public String readAllCharsOneByOne(BufferedReader reader) throws IOException { StringBuilder content = new StringBuilder(); int value; @@ -37,43 +36,18 @@ public class BufferedReaderExample { return content.toString(); } - public String readAllCharactersUsingArray(BufferedReader reader) throws IOException { - StringBuilder content = new StringBuilder(); + public String readMultipleChars(BufferedReader reader) throws IOException { + char[] chars = new char[5]; + int charsRead = reader.read(chars, 0, 5); - char[] buf = new char[512]; - int charsRead; - - while ((charsRead = reader.read(buf, 0, buf.length)) != -1) { - content.append(buf, 0, charsRead); + String result; + if (charsRead != -1) { + result = new String(chars); + } else { + result = ""; } - return content.toString(); - } - - public String readWithSkipping(BufferedReader reader) throws IOException { - StringBuilder content = new StringBuilder(); - - int value; - while ((value = reader.read()) != -1) { - content.append((char) value); - reader.skip(4); - } - - return content.toString(); - } - - public String markAndReset(BufferedReader reader) throws IOException { - StringBuilder content = new StringBuilder(); - - reader.mark(512); - - for (int i = 0; i < 3; i++) { - content.append(reader.readLine()); - reader.reset(); - reader.mark(512); - } - - return content.toString(); + return result; } public String readFile() { diff --git a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java index b90a4ab6ed..f47ba09097 100644 --- a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java +++ b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java @@ -1,13 +1,14 @@ package com.baeldung.bufferedreader; import org.junit.Test; -import org.springframework.util.StringUtils; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; +import java.io.StringReader; import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.Assert.assertEquals; public class BufferedReaderExampleUnitTest { @@ -44,47 +45,25 @@ public class BufferedReaderExampleUnitTest { } @Test - public void givenBufferedReader_whenReadAllCharacters_thenReturnsContent() throws IOException { + public void givenBufferedReader_whenReadAllCharsOneByOne_thenReturnsContent() throws IOException { BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); BufferedReaderExample bre = new BufferedReaderExample(); - String content = bre.readAllCharacters(reader); + String content = bre.readAllCharsOneByOne(reader); assertThat(content).isNotEmpty(); assertThat(content).contains("Lorem ipsum"); } @Test - public void givenBufferedReader_whenReadAllCharactersUsingArray_thenReturnsContent() throws IOException { + public void givenBufferedReader_whenReadMultipleChars_thenReturnsContent() throws IOException { BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); BufferedReaderExample bre = new BufferedReaderExample(); - String content = bre.readAllCharactersUsingArray(reader); + String content = bre.readMultipleChars(reader); assertThat(content).isNotEmpty(); - assertThat(content).contains("Lorem ipsum"); - } - - @Test - public void givenBufferedReader_whenReadWithSkipping_thenReturnsScrambledContent() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); - - BufferedReaderExample bre = new BufferedReaderExample(); - String content = bre.readWithSkipping(reader); - - assertThat(content).isNotEmpty(); - assertThat(content).contains("L mottneas"); - } - - @Test - public void givenBufferedReader_whenMarkAndReset_thenReturnsRepeatedContent() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); - - BufferedReaderExample bre = new BufferedReaderExample(); - String content = bre.markAndReset(reader); - - assertThat(content.toString()).isNotEmpty(); - assertThat(StringUtils.countOccurrencesOf(content.toString(), "Lorem ipsum")).isEqualTo(3); + assertThat(content).contains("Lorem"); } @Test @@ -95,4 +74,37 @@ public class BufferedReaderExampleUnitTest { assertThat(content.toString()).contains("Lorem ipsum"); } + @Test + public void givenBufferedReader_whenSkipUnderscores_thenOk() throws IOException { + StringBuilder result = new StringBuilder(); + + try (BufferedReader reader = new BufferedReader(new StringReader("1__2__3__4__5"))) { + int value; + while((value = reader.read()) != -1) { + result.append((char) value); + reader.skip(2L); + } + } + + assertEquals("12345", result.toString()); + } + + @Test + public void givenBufferedReader_whenSkipsWhitespacesAtBeginning_thenOk() throws IOException { + String result; + + try (BufferedReader reader = new BufferedReader(new StringReader(" Lorem ipsum dolor sit amet."))) { + reader.mark(1); + + while (Character.isWhitespace(reader.read())) { + reader.mark(1); + } + + reader.reset(); + result = reader.readLine(); + } + + assertEquals("Lorem ipsum dolor sit amet.", result); + } + } From 940146e03e33a78f46315d279ee88f444dd18e23 Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Sun, 21 Oct 2018 22:20:56 +0200 Subject: [PATCH 030/429] [BAEL-2255] fix unit test --- .../baeldung/bufferedreader/BufferedReaderExampleUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java index f47ba09097..18b5f47397 100644 --- a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java +++ b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java @@ -63,7 +63,7 @@ public class BufferedReaderExampleUnitTest { String content = bre.readMultipleChars(reader); assertThat(content).isNotEmpty(); - assertThat(content).contains("Lorem"); + assertThat(content).isEqualTo("Lorem"); } @Test From eaadcf96e2b0d2ff4a518d85a7ae78848cf77a4a Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Mon, 22 Oct 2018 16:36:27 +0200 Subject: [PATCH 031/429] BAEL-2292 --- .../com/baeldung/datetime/DateTimeConfig.java | 29 +++++++++++++++++++ .../baeldung/datetime/DateTimeController.java | 29 +++++++++++++++++++ 2 files changed, 58 insertions(+) create mode 100644 spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java create mode 100644 spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java diff --git a/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java b/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java new file mode 100644 index 0000000000..8a5d1c71af --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeConfig.java @@ -0,0 +1,29 @@ +package com.baeldung.datetime; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.format.datetime.standard.DateTimeFormatterRegistrar; +import org.springframework.format.number.NumberFormatAnnotationFormatterFactory; +import org.springframework.format.support.DefaultFormattingConversionService; +import org.springframework.format.support.FormattingConversionService; + +import java.time.format.DateTimeFormatter; + +@Configuration +class DateTimeConfig { + + @Bean + public FormattingConversionService conversionService() { + DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false); + + conversionService.addFormatterForFieldAnnotation(new NumberFormatAnnotationFormatterFactory()); + + DateTimeFormatterRegistrar registrar = new DateTimeFormatterRegistrar(); + registrar.setDateFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy")); + registrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss")); + registrar.registerFormatters(conversionService); + + return conversionService; + } + +} \ No newline at end of file diff --git a/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java b/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java new file mode 100644 index 0000000000..5741b35530 --- /dev/null +++ b/spring-mvc-java/src/main/java/com/baeldung/datetime/DateTimeController.java @@ -0,0 +1,29 @@ +package com.baeldung.datetime; + +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.Date; + +@RestController +public class DateTimeController { + + @PostMapping("/date") + public void date(@RequestParam("date") @DateTimeFormat(pattern = "dd.MM.yyyy") Date date) { + // ... + } + + @PostMapping("/localdate") + public void localDate(@RequestParam("localDate") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate localDate) { + // ... + } + + @PostMapping("/localdatetime") + public void dateTime(@RequestParam("localDateTime") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime localDateTime) { + // ... + } +} \ No newline at end of file From 3b17051337aee90d0f85885263af4840666ab37f Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Wed, 24 Oct 2018 17:55:34 +0530 Subject: [PATCH 032/429] BAEL-2203: Review edits --- .../java/com/baeldung/datetime/ConvertInstantToTimestamp.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java index b2f18fd3bf..e8ce4adaa1 100644 --- a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java +++ b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java @@ -16,8 +16,9 @@ public class ConvertInstantToTimestamp { public static void run() { Instant instant = Instant.now(); Timestamp timestamp = Timestamp.from(instant); // same point on the time-line as Instant + instant = timestamp.toInstant(); - System.out.println("Instant (milliseconds from epoch)" + instant.toEpochMilli()); + System.out.println("Instant (milliseconds from epoch): " + instant.toEpochMilli()); System.out.println("Timestamp (milliseconds from epoch): " + timestamp.getTime()); System.out.print("\n"); From a559137c8c31028fc0b757f86f2656d49122b438 Mon Sep 17 00:00:00 2001 From: RanjeetKaur17 Date: Wed, 24 Oct 2018 23:05:27 +0400 Subject: [PATCH 033/429] Changes as per review comments --- .../countdownlatch/CountdownLatchResetExample.java | 7 ++++--- .../cyclicbarrier/CyclicBarrierCountExample.java | 2 +- .../cyclicbarrier/CyclicBarrierResetExample.java | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java index 7effc9e374..55e509e374 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java @@ -23,10 +23,11 @@ public class CountdownLatchResetExample { ExecutorService es = Executors.newFixedThreadPool(threadCount); for (int i = 0; i < threadCount; i++) { es.execute(() -> { - if (countDownLatch.getCount() > 0) { - outputScraper.add("Count Left : " + countDownLatch.getCount()); - } + long prevValue = countDownLatch.getCount(); countDownLatch.countDown(); + if (countDownLatch.getCount() != prevValue) { + outputScraper.add("Count Updated"); + } }); } diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java index c7a9b20698..9d637b428b 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java @@ -26,7 +26,7 @@ public class CyclicBarrierCountExample { } public static void main(String[] args) { - CyclicBarrierCountExample ex = new CyclicBarrierCountExample(1); + CyclicBarrierCountExample ex = new CyclicBarrierCountExample(7); System.out.println("Count : " + ex.callTwiceInSameThread()); } } diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java index c355b7eead..febeb0978e 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java @@ -28,8 +28,8 @@ public class CyclicBarrierResetExample { es.execute(() -> { try { if (cyclicBarrier.getNumberWaiting() > 0) { - outputScraper.add("Waiting Count : " + cyclicBarrier.getNumberWaiting()); - } + outputScraper.add("Count Updated"); + } cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); @@ -41,7 +41,7 @@ public class CyclicBarrierResetExample { } public static void main(String[] args) { - CyclicBarrierResetExample ex = new CyclicBarrierResetExample(new ArrayList(), 5, 20); + CyclicBarrierResetExample ex = new CyclicBarrierResetExample(new ArrayList(), 7, 20); System.out.println("Count : " + ex.countWaits()); } } From 541fa8d5be14ed66591c1201ae4e010c870693d1 Mon Sep 17 00:00:00 2001 From: RanjeetKaur17 Date: Fri, 26 Oct 2018 20:50:07 +0400 Subject: [PATCH 034/429] Using AtomicInteger to avoid Race conditions --- .../CountdownLatchResetExample.java | 19 +++++++++---------- .../CyclicBarrierCompletionMethodExample.java | 15 +++++++-------- .../CyclicBarrierResetExample.java | 15 +++++++-------- .../CountdownLatchResetExampleUnitTest.java | 2 +- ...arrierCompletionMethodExampleUnitTest.java | 4 +--- .../CyclicBarrierResetExampleUnitTest.java | 4 +--- 6 files changed, 26 insertions(+), 33 deletions(-) diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java index 55e509e374..1828b7f91e 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java @@ -1,23 +1,22 @@ package com.baeldung.concurrent.countdownlatch; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; public class CountdownLatchResetExample { private int count; private int threadCount; - private final List outputScraper; - - CountdownLatchResetExample(final List outputScraper, int count, int threadCount) { - this.outputScraper = outputScraper; + private final AtomicInteger updateCount; + + CountdownLatchResetExample(int count, int threadCount) { + updateCount = new AtomicInteger(0); this.count = count; this.threadCount = threadCount; } - + public int countWaits() { CountDownLatch countDownLatch = new CountDownLatch(count); ExecutorService es = Executors.newFixedThreadPool(threadCount); @@ -26,17 +25,17 @@ public class CountdownLatchResetExample { long prevValue = countDownLatch.getCount(); countDownLatch.countDown(); if (countDownLatch.getCount() != prevValue) { - outputScraper.add("Count Updated"); + updateCount.incrementAndGet(); } }); } es.shutdown(); - return outputScraper.size(); + return updateCount.get(); } public static void main(String[] args) { - CountdownLatchResetExample ex = new CountdownLatchResetExample(new ArrayList<>(),5,20); + CountdownLatchResetExample ex = new CountdownLatchResetExample(5, 20); System.out.println("Count : " + ex.countWaits()); } } diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java index b7a32e2c8d..7c1299da62 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java @@ -1,20 +1,19 @@ package com.baeldung.concurrent.cyclicbarrier; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; public class CyclicBarrierCompletionMethodExample { private int count; private int threadCount; - private final List outputScraper; + private final AtomicInteger updateCount; - CyclicBarrierCompletionMethodExample(final List outputScraper, int count, int threadCount) { - this.outputScraper = outputScraper; + CyclicBarrierCompletionMethodExample(int count, int threadCount) { + updateCount = new AtomicInteger(0); this.count = count; this.threadCount = threadCount; } @@ -22,7 +21,7 @@ public class CyclicBarrierCompletionMethodExample { public int countTrips() { CyclicBarrier cyclicBarrier = new CyclicBarrier(count, () -> { - outputScraper.add("Barrier is Tripped"); + updateCount.incrementAndGet(); }); ExecutorService es = Executors.newFixedThreadPool(threadCount); @@ -36,11 +35,11 @@ public class CyclicBarrierCompletionMethodExample { }); } es.shutdown(); - return outputScraper.size(); + return updateCount.get(); } public static void main(String[] args) { - CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(new ArrayList(), 5, 20); + CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(5, 20); System.out.println("Count : " + ex.countTrips()); } } diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java index febeb0978e..76b6198bc4 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java @@ -1,20 +1,19 @@ package com.baeldung.concurrent.cyclicbarrier; -import java.util.ArrayList; -import java.util.List; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.atomic.AtomicInteger; public class CyclicBarrierResetExample { private int count; private int threadCount; - private final List outputScraper; + private final AtomicInteger updateCount; - CyclicBarrierResetExample(final List outputScraper, int count, int threadCount) { - this.outputScraper = outputScraper; + CyclicBarrierResetExample(int count, int threadCount) { + updateCount = new AtomicInteger(0); this.count = count; this.threadCount = threadCount; } @@ -28,7 +27,7 @@ public class CyclicBarrierResetExample { es.execute(() -> { try { if (cyclicBarrier.getNumberWaiting() > 0) { - outputScraper.add("Count Updated"); + updateCount.incrementAndGet(); } cyclicBarrier.await(); } catch (InterruptedException | BrokenBarrierException e) { @@ -37,11 +36,11 @@ public class CyclicBarrierResetExample { }); } es.shutdown(); - return outputScraper.size(); + return updateCount.get(); } public static void main(String[] args) { - CyclicBarrierResetExample ex = new CyclicBarrierResetExample(new ArrayList(), 7, 20); + CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7, 20); System.out.println("Count : " + ex.countWaits()); } } diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java index 2018c9168d..658ab5301a 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java @@ -10,7 +10,7 @@ public class CountdownLatchResetExampleUnitTest { @Test public void whenCountDownLatch_noReset() { - CountdownLatchResetExample ex = new CountdownLatchResetExample(new ArrayList<>(),5,20); + CountdownLatchResetExample ex = new CountdownLatchResetExample(5,20); int lineCount = ex.countWaits(); assertEquals(5, lineCount); } diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java index e8db84935a..f76b51c100 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java @@ -2,15 +2,13 @@ package com.baeldung.concurrent.cyclicbarrier; import static org.junit.Assert.assertEquals; -import java.util.ArrayList; - import org.junit.Test; public class CyclicBarrierCompletionMethodExampleUnitTest { @Test public void whenCyclicBarrier_countTrips() { - CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(new ArrayList<>(),5,20); + CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(5,20); int lineCount = ex.countTrips(); assertEquals(4, lineCount); } diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java index 2871d16348..413a17e9ff 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java @@ -2,15 +2,13 @@ package com.baeldung.concurrent.cyclicbarrier; import static org.junit.Assert.assertEquals; -import java.util.ArrayList; - import org.junit.Test; public class CyclicBarrierResetExampleUnitTest { @Test public void whenCyclicBarrier_reset() { - CyclicBarrierResetExample ex = new CyclicBarrierResetExample(new ArrayList<>(),5,20); + CyclicBarrierResetExample ex = new CyclicBarrierResetExample(5,20); int lineCount = ex.countWaits(); assertEquals(16, lineCount); } From 6ea369f248a8f0dad11a6efd9b9d30a566f6f4c6 Mon Sep 17 00:00:00 2001 From: RanjeetKaur17 Date: Fri, 26 Oct 2018 20:59:34 +0400 Subject: [PATCH 035/429] Fixing Test Cases --- .../CyclicBarrierCompletionMethodExampleUnitTest.java | 4 ++-- .../cyclicbarrier/CyclicBarrierResetExampleUnitTest.java | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java index f76b51c100..310063c86c 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java @@ -8,8 +8,8 @@ public class CyclicBarrierCompletionMethodExampleUnitTest { @Test public void whenCyclicBarrier_countTrips() { - CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(5,20); + CyclicBarrierCompletionMethodExample ex = new CyclicBarrierCompletionMethodExample(7,20); int lineCount = ex.countTrips(); - assertEquals(4, lineCount); + assertEquals(2, lineCount); } } diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java index 413a17e9ff..7b6306df76 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java @@ -8,8 +8,8 @@ public class CyclicBarrierResetExampleUnitTest { @Test public void whenCyclicBarrier_reset() { - CyclicBarrierResetExample ex = new CyclicBarrierResetExample(5,20); + CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7,20); int lineCount = ex.countWaits(); - assertEquals(16, lineCount); + assertEquals(17, lineCount); } } From 512a6e05a1dd24ec7caa6c0da53e3e278d40e674 Mon Sep 17 00:00:00 2001 From: RanjeetKaur17 Date: Fri, 26 Oct 2018 21:09:58 +0400 Subject: [PATCH 036/429] Fixing Test Cases --- .../cyclicbarrier/CyclicBarrierResetExampleUnitTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java index 7b6306df76..913325f8e2 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java @@ -8,8 +8,8 @@ public class CyclicBarrierResetExampleUnitTest { @Test public void whenCyclicBarrier_reset() { - CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7,20); + CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7,10); int lineCount = ex.countWaits(); - assertEquals(17, lineCount); + assertEquals(8, lineCount); } } From d4db4ced085e064f282554f37d0b118a08fa80c0 Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Sat, 27 Oct 2018 13:05:31 +0200 Subject: [PATCH 037/429] [BAEL-2255] improved a few examples --- .../bufferedreader/BufferedReaderExample.java | 7 +++-- .../BufferedReaderExampleUnitTest.java | 30 +++++++++++++------ 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java index 591122d18f..01a998a0ba 100644 --- a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java +++ b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java @@ -37,12 +37,13 @@ public class BufferedReaderExample { } public String readMultipleChars(BufferedReader reader) throws IOException { - char[] chars = new char[5]; - int charsRead = reader.read(chars, 0, 5); + int length = 5; + char[] chars = new char[length]; + int charsRead = reader.read(chars, 0, length); String result; if (charsRead != -1) { - result = new String(chars); + result = new String(chars, charsRead, 0); } else { result = ""; } diff --git a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java index 18b5f47397..7a831eb380 100644 --- a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java +++ b/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java @@ -6,17 +6,19 @@ import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.io.StringReader; +import java.nio.file.Files; +import java.nio.file.Paths; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.*; public class BufferedReaderExampleUnitTest { - public static final String FILE_NAME = "src/main/resources/input.txt"; + public static final String FILE_PATH = "src/main/resources/input.txt"; @Test public void givenBufferedReader_whenReadAllLines_thenReturnsContent() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH)); BufferedReaderExample bre = new BufferedReaderExample(); String content = bre.readAllLines(reader); @@ -27,7 +29,7 @@ public class BufferedReaderExampleUnitTest { @Test public void givenBufferedReader_whenReadAllLinesWithStream_thenReturnsContent() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH)); BufferedReaderExample bre = new BufferedReaderExample(); String content = bre.readAllLinesWithStream(reader); @@ -46,7 +48,7 @@ public class BufferedReaderExampleUnitTest { @Test public void givenBufferedReader_whenReadAllCharsOneByOne_thenReturnsContent() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH)); BufferedReaderExample bre = new BufferedReaderExample(); String content = bre.readAllCharsOneByOne(reader); @@ -57,7 +59,7 @@ public class BufferedReaderExampleUnitTest { @Test public void givenBufferedReader_whenReadMultipleChars_thenReturnsContent() throws IOException { - BufferedReader reader = new BufferedReader(new FileReader(FILE_NAME)); + BufferedReader reader = new BufferedReader(new FileReader(FILE_PATH)); BufferedReaderExample bre = new BufferedReaderExample(); String content = bre.readMultipleChars(reader); @@ -94,11 +96,11 @@ public class BufferedReaderExampleUnitTest { String result; try (BufferedReader reader = new BufferedReader(new StringReader(" Lorem ipsum dolor sit amet."))) { - reader.mark(1); + assertTrue(reader.markSupported()); - while (Character.isWhitespace(reader.read())) { + do { reader.mark(1); - } + } while(Character.isWhitespace(reader.read())); reader.reset(); result = reader.readLine(); @@ -107,4 +109,14 @@ public class BufferedReaderExampleUnitTest { assertEquals("Lorem ipsum dolor sit amet.", result); } + @Test + public void whenCreatesNewBufferedReader_thenOk() throws IOException { + BufferedReader reader = Files.newBufferedReader(Paths.get(FILE_PATH)); + + assertNotNull(reader); + assertTrue(reader.ready()); + + reader.close(); + } + } From 86e6fad300e9e5187616aade5d6ee22733103e25 Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Sat, 27 Oct 2018 13:36:39 +0200 Subject: [PATCH 038/429] [BAEL-2255] fix example --- .../java/com/baeldung/bufferedreader/BufferedReaderExample.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java index 01a998a0ba..c7f0e878ac 100644 --- a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java +++ b/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java @@ -43,7 +43,7 @@ public class BufferedReaderExample { String result; if (charsRead != -1) { - result = new String(chars, charsRead, 0); + result = new String(chars, 0, charsRead); } else { result = ""; } From 39a828fbc995ee452b363e21432a3c0118bfec98 Mon Sep 17 00:00:00 2001 From: RanjeetKaur17 Date: Sun, 28 Oct 2018 16:45:15 +0400 Subject: [PATCH 039/429] Fixing Test Cases --- .../CountdownLatchResetExampleUnitTest.java | 8 +++----- .../cyclicbarrier/CyclicBarrierResetExampleUnitTest.java | 6 +++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java index 658ab5301a..d2d43f6312 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java @@ -1,8 +1,6 @@ package com.baeldung.concurrent.countdownlatch; -import static org.junit.Assert.assertEquals; - -import java.util.ArrayList; +import static org.junit.Assert.assertTrue; import org.junit.Test; @@ -10,8 +8,8 @@ public class CountdownLatchResetExampleUnitTest { @Test public void whenCountDownLatch_noReset() { - CountdownLatchResetExample ex = new CountdownLatchResetExample(5,20); + CountdownLatchResetExample ex = new CountdownLatchResetExample(7,20); int lineCount = ex.countWaits(); - assertEquals(5, lineCount); + assertTrue(lineCount <= 7); } } diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java index 913325f8e2..8d2b148f06 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java +++ b/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java @@ -1,6 +1,6 @@ package com.baeldung.concurrent.cyclicbarrier; -import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import org.junit.Test; @@ -8,8 +8,8 @@ public class CyclicBarrierResetExampleUnitTest { @Test public void whenCyclicBarrier_reset() { - CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7,10); + CyclicBarrierResetExample ex = new CyclicBarrierResetExample(7,20); int lineCount = ex.countWaits(); - assertEquals(8, lineCount); + assertTrue(lineCount > 7); } } From a79f802038e3be1b59abef89b97a98d2644ee4a0 Mon Sep 17 00:00:00 2001 From: saikat Date: Sun, 28 Oct 2018 23:47:00 +0530 Subject: [PATCH 040/429] Add new module for restx-demo --- pom.xml | 1 + restx-demo/data/credentials.json | 12 ++ restx-demo/data/users.json | 4 + restx-demo/md.restx.json | 38 +++++ restx-demo/pom.xml | 156 ++++++++++++++++++ .../src/main/java/restx/demo/AppModule.java | 74 +++++++++ .../src/main/java/restx/demo/AppServer.java | 32 ++++ .../src/main/java/restx/demo/Roles.java | 10 ++ .../main/java/restx/demo/domain/Message.java | 21 +++ .../java/restx/demo/rest/HelloResource.java | 62 +++++++ restx-demo/src/main/resources/logback.xml | 94 +++++++++++ .../resources/restx/demo/settings.properties | 1 + restx-demo/src/main/webapp/WEB-INF/web.xml | 15 ++ .../demo/rest/HelloResourceSpecTest.java | 23 +++ .../hello/should_admin_say_hello.spec.yaml | 10 ++ .../hello/should_anyone_say_hello.spec.yaml | 8 + ..._value_triggers_validation_error.spec.yaml | 17 ++ .../hello/should_user1_say_hello.spec.yaml | 10 ++ .../should_user2_not_say_hello.spec.yaml | 10 ++ 19 files changed, 598 insertions(+) create mode 100644 restx-demo/data/credentials.json create mode 100644 restx-demo/data/users.json create mode 100644 restx-demo/md.restx.json create mode 100644 restx-demo/pom.xml create mode 100644 restx-demo/src/main/java/restx/demo/AppModule.java create mode 100644 restx-demo/src/main/java/restx/demo/AppServer.java create mode 100644 restx-demo/src/main/java/restx/demo/Roles.java create mode 100644 restx-demo/src/main/java/restx/demo/domain/Message.java create mode 100644 restx-demo/src/main/java/restx/demo/rest/HelloResource.java create mode 100644 restx-demo/src/main/resources/logback.xml create mode 100644 restx-demo/src/main/resources/restx/demo/settings.properties create mode 100644 restx-demo/src/main/webapp/WEB-INF/web.xml create mode 100644 restx-demo/src/test/java/restx/demo/rest/HelloResourceSpecTest.java create mode 100644 restx-demo/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml create mode 100644 restx-demo/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml create mode 100644 restx-demo/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml create mode 100644 restx-demo/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml create mode 100644 restx-demo/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml diff --git a/pom.xml b/pom.xml index 0b5cd16ea0..10e23da0ad 100644 --- a/pom.xml +++ b/pom.xml @@ -1608,6 +1608,7 @@ persistence-modules/spring-data-elasticsearch core-java-concurrency core-java-concurrency-collections + restx-demo diff --git a/restx-demo/data/credentials.json b/restx-demo/data/credentials.json new file mode 100644 index 0000000000..c1a4fcf531 --- /dev/null +++ b/restx-demo/data/credentials.json @@ -0,0 +1,12 @@ +{ + "//": "lines with // keys are just comments (we don't have real comments in json)", + "//": "this file stores password passed through md5+bcrypt hash", + "//": "you can use `restx hash md5+bcrypt {password}` shell command to get hashed passwords to put here", + + "//": "to help startup with restx, there are comments with clear text passwords,", + "//": "which should obviously not be stored here.", + "user1": "$2a$10$iZluFUJShbjb1ue68bLrDuGCeJL9EMLHelVIf8u0SUbCseDOvKnoe", + "//": "user 1 password is 'user1-pwd'", + "user2": "$2a$10$oym3SYMFXf/9gGfDKKHO4eM1vWNqAZMsRZCL.BORCaP4yp5cdiCXu", + "//": "user 2 password is 'user2-pwd'" +} \ No newline at end of file diff --git a/restx-demo/data/users.json b/restx-demo/data/users.json new file mode 100644 index 0000000000..834e03c4b4 --- /dev/null +++ b/restx-demo/data/users.json @@ -0,0 +1,4 @@ +[ + {"name":"user1", "roles": ["hello"]}, + {"name":"user2", "roles": []} +] \ No newline at end of file diff --git a/restx-demo/md.restx.json b/restx-demo/md.restx.json new file mode 100644 index 0000000000..c87244001c --- /dev/null +++ b/restx-demo/md.restx.json @@ -0,0 +1,38 @@ +{ + "module": "restx-demo:restx-demo:0.1-SNAPSHOT", + "packaging": "war", + + "properties": { + "java.version": "1.8", + "restx.version": "0.35-rc4" + }, + "fragments": { + "maven": [ + "classpath:///restx/build/fragments/maven/javadoc-apidoclet.xml" ] + }, + "dependencies": { + "compile": [ + "io.restx:restx-core:${restx.version}", + "io.restx:restx-security-basic:${restx.version}", + "io.restx:restx-core-annotation-processor:${restx.version}", + "io.restx:restx-factory:${restx.version}", + "io.restx:restx-factory-admin:${restx.version}", + "io.restx:restx-validation:${restx.version}", + "io.restx:restx-monitor-codahale:${restx.version}", + "io.restx:restx-monitor-admin:${restx.version}", + "io.restx:restx-log-admin:${restx.version}", + "io.restx:restx-i18n-admin:${restx.version}", + "io.restx:restx-stats-admin:${restx.version}", + "io.restx:restx-servlet:${restx.version}", + "io.restx:restx-server-jetty8:${restx.version}!optional", + "io.restx:restx-apidocs:${restx.version}", + "io.restx:restx-specs-admin:${restx.version}", + "io.restx:restx-admin:${restx.version}", + "ch.qos.logback:logback-classic:1.0.13" + ], + "test": [ + "io.restx:restx-specs-tests:${restx.version}", + "junit:junit:4.11" + ] + } +} diff --git a/restx-demo/pom.xml b/restx-demo/pom.xml new file mode 100644 index 0000000000..da106b8191 --- /dev/null +++ b/restx-demo/pom.xml @@ -0,0 +1,156 @@ + + + 4.0.0 + + restx-demo + restx-demo + 0.1-SNAPSHOT + war + restx-demo + + + 1.8 + 1.8 + 0.35-rc4 + + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + io.restx + restx-core + ${restx.version} + + + io.restx + restx-security-basic + ${restx.version} + + + io.restx + restx-core-annotation-processor + ${restx.version} + + + io.restx + restx-factory + ${restx.version} + + + io.restx + restx-factory-admin + ${restx.version} + + + io.restx + restx-validation + ${restx.version} + + + io.restx + restx-monitor-codahale + ${restx.version} + + + io.restx + restx-monitor-admin + ${restx.version} + + + io.restx + restx-log-admin + ${restx.version} + + + io.restx + restx-i18n-admin + ${restx.version} + + + io.restx + restx-stats-admin + ${restx.version} + + + io.restx + restx-servlet + ${restx.version} + + + io.restx + restx-server-jetty8 + ${restx.version} + true + + + io.restx + restx-apidocs + ${restx.version} + + + io.restx + restx-specs-admin + ${restx.version} + + + io.restx + restx-admin + ${restx.version} + + + ch.qos.logback + logback-classic + 1.0.13 + + + io.restx + restx-specs-tests + ${restx.version} + test + + + junit + junit + 4.11 + test + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + + attach-docs + + prepare-package + + jar + + + + + ${maven.compiler.source} + restx.apidocs.doclet.ApidocsDoclet + + io.restx + restx-apidocs-doclet + ${restx.version} + + -restx-target-dir ${project.basedir}/target/classes + + + + + diff --git a/restx-demo/src/main/java/restx/demo/AppModule.java b/restx-demo/src/main/java/restx/demo/AppModule.java new file mode 100644 index 0000000000..26bc681481 --- /dev/null +++ b/restx-demo/src/main/java/restx/demo/AppModule.java @@ -0,0 +1,74 @@ +package restx.demo; + +import restx.config.ConfigLoader; +import restx.config.ConfigSupplier; +import restx.factory.Provides; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.common.base.Charsets; +import com.google.common.collect.ImmutableSet; +import restx.security.*; +import restx.factory.Module; +import restx.factory.Provides; +import javax.inject.Named; + +import java.nio.file.Paths; + +@Module +public class AppModule { + @Provides + public SignatureKey signatureKey() { + return new SignatureKey("restx-demo -447494532235718370 restx-demo 801c9eaf-4116-48f2-906b-e979fba72757".getBytes(Charsets.UTF_8)); + } + + @Provides + @Named("restx.admin.password") + public String restxAdminPassword() { + return "4780"; + } + + @Provides + public ConfigSupplier appConfigSupplier(ConfigLoader configLoader) { + // Load settings.properties in restx.demo package as a set of config entries + return configLoader.fromResource("restx/demo/settings"); + } + + @Provides + public CredentialsStrategy credentialsStrategy() { + return new BCryptCredentialsStrategy(); + } + + @Provides + public BasicPrincipalAuthenticator basicPrincipalAuthenticator( + SecuritySettings securitySettings, CredentialsStrategy credentialsStrategy, + @Named("restx.admin.passwordHash") String defaultAdminPasswordHash, ObjectMapper mapper) { + return new StdBasicPrincipalAuthenticator(new StdUserService<>( + // use file based users repository. + // Developer's note: prefer another storage mechanism for your users if you need real user management + // and better perf + new FileBasedUserRepository<>( + StdUser.class, // this is the class for the User objects, that you can get in your app code + // with RestxSession.current().getPrincipal().get() + // it can be a custom user class, it just need to be json deserializable + mapper, + + // this is the default restx admin, useful to access the restx admin console. + // if one user with restx-admin role is defined in the repository, this default user won't be + // available anymore + new StdUser("admin", ImmutableSet.of("*")), + + // the path where users are stored + Paths.get("data/users.json"), + + // the path where credentials are stored. isolating both is a good practice in terms of security + // it is strongly recommended to follow this approach even if you use your own repository + Paths.get("data/credentials.json"), + + // tells that we want to reload the files dynamically if they are touched. + // this has a performance impact, if you know your users / credentials never change without a + // restart you can disable this to get better perfs + true), + credentialsStrategy, defaultAdminPasswordHash), + securitySettings); + } +} diff --git a/restx-demo/src/main/java/restx/demo/AppServer.java b/restx-demo/src/main/java/restx/demo/AppServer.java new file mode 100644 index 0000000000..d66aadac68 --- /dev/null +++ b/restx-demo/src/main/java/restx/demo/AppServer.java @@ -0,0 +1,32 @@ +package restx.demo; + +import com.google.common.base.Optional; +import restx.server.WebServer; +import restx.server.Jetty8WebServer; + +/** + * This class can be used to run the app. + * + * Alternatively, you can deploy the app as a war in a regular container like tomcat or jetty. + * + * Reading the port from system env PORT makes it compatible with heroku. + */ +public class AppServer { + public static final String WEB_INF_LOCATION = "src/main/webapp/WEB-INF/web.xml"; + public static final String WEB_APP_LOCATION = "src/main/webapp"; + + public static void main(String[] args) throws Exception { + int port = Integer.valueOf(Optional.fromNullable(System.getenv("PORT")).or("8080")); + WebServer server = new Jetty8WebServer(WEB_INF_LOCATION, WEB_APP_LOCATION, port, "0.0.0.0"); + + /* + * load mode from system property if defined, or default to dev + * be careful with that setting, if you use this class to launch your server in production, make sure to launch + * it with -Drestx.mode=prod or change the default here + */ + System.setProperty("restx.mode", System.getProperty("restx.mode", "dev")); + System.setProperty("restx.app.package", "restx.demo"); + + server.startAndAwait(); + } +} diff --git a/restx-demo/src/main/java/restx/demo/Roles.java b/restx-demo/src/main/java/restx/demo/Roles.java new file mode 100644 index 0000000000..1240da70d1 --- /dev/null +++ b/restx-demo/src/main/java/restx/demo/Roles.java @@ -0,0 +1,10 @@ +package restx.demo; + +/** + * A list of roles for the application. + * + * We don't use an enum here because it must be used inside an annotation. + */ +public final class Roles { + public static final String HELLO_ROLE = "hello"; +} diff --git a/restx-demo/src/main/java/restx/demo/domain/Message.java b/restx-demo/src/main/java/restx/demo/domain/Message.java new file mode 100644 index 0000000000..733c00deff --- /dev/null +++ b/restx-demo/src/main/java/restx/demo/domain/Message.java @@ -0,0 +1,21 @@ +package restx.demo.domain; + +public class Message { + private String message; + + public String getMessage() { + return message; + } + + public Message setMessage(final String message) { + this.message = message; + return this; + } + + @Override + public String toString() { + return "Message{" + + "message='" + message + '\'' + + '}'; + } +} diff --git a/restx-demo/src/main/java/restx/demo/rest/HelloResource.java b/restx-demo/src/main/java/restx/demo/rest/HelloResource.java new file mode 100644 index 0000000000..5cb2c2a5e6 --- /dev/null +++ b/restx-demo/src/main/java/restx/demo/rest/HelloResource.java @@ -0,0 +1,62 @@ +package restx.demo.rest; + +import restx.demo.domain.Message; +import restx.demo.Roles; +import org.joda.time.DateTime; +import restx.annotations.GET; +import restx.annotations.POST; +import restx.annotations.RestxResource; +import restx.factory.Component; +import restx.security.PermitAll; +import restx.security.RolesAllowed; +import restx.security.RestxSession; + +import javax.validation.constraints.NotNull; + +@Component @RestxResource +public class HelloResource { + + /** + * Say hello to currently logged in user. + * + * Authorized only for principals with Roles.HELLO_ROLE role. + * + * @return a Message to say hello + */ + @GET("/message") + @RolesAllowed(Roles.HELLO_ROLE) + public Message sayHello() { + return new Message().setMessage(String.format( + "hello %s, it's %s", + RestxSession.current().getPrincipal().get().getName(), + DateTime.now().toString("HH:mm:ss"))); + } + + /** + * Say hello to anybody. + * + * Does not require authentication. + * + * @return a Message to say hello + */ + @GET("/hello") + @PermitAll + public Message helloPublic(String who) { + return new Message().setMessage(String.format( + "hello %s, it's %s", + who, DateTime.now().toString("HH:mm:ss"))); + } + + public static class MyPOJO { + @NotNull + String value; + public String getValue(){ return value; } + public void setValue(String value){ this.value = value; } + } + @POST("/mypojo") + @PermitAll + public MyPOJO helloPojo(MyPOJO pojo){ + pojo.setValue("hello "+pojo.getValue()); + return pojo; + } +} diff --git a/restx-demo/src/main/resources/logback.xml b/restx-demo/src/main/resources/logback.xml new file mode 100644 index 0000000000..524bca6b1f --- /dev/null +++ b/restx-demo/src/main/resources/logback.xml @@ -0,0 +1,94 @@ + + + true + + + + + ${LOGS_FOLDER}/errors.log + + ERROR + + + %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n + + + ${LOGS_FOLDER}/errors.%d.log + 30 + + + + + + + + ${LOGS_FOLDER}/app.log + + INFO + + + %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n + + + ${LOGS_FOLDER}/app.%d.log + 10 + + + + ${LOGS_FOLDER}/debug.log + + %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n + + + ${LOGS_FOLDER}/debug.%i.log.zip + 1 + 3 + + + + 50MB + + + + + + + + + + + + %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n + + + + ${LOGS_FOLDER}/app.log + + %d [%-16thread] [%-10X{principal}] %-5level %logger{36} - %msg%n + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/restx-demo/src/main/resources/restx/demo/settings.properties b/restx-demo/src/main/resources/restx/demo/settings.properties new file mode 100644 index 0000000000..a03c2eea97 --- /dev/null +++ b/restx-demo/src/main/resources/restx/demo/settings.properties @@ -0,0 +1 @@ +app.name=restx-demo \ No newline at end of file diff --git a/restx-demo/src/main/webapp/WEB-INF/web.xml b/restx-demo/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000..c651794526 --- /dev/null +++ b/restx-demo/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,15 @@ + + + + restx + restx.servlet.RestxMainRouterServlet + 1 + + + restx + /api/* + + diff --git a/restx-demo/src/test/java/restx/demo/rest/HelloResourceSpecTest.java b/restx-demo/src/test/java/restx/demo/rest/HelloResourceSpecTest.java new file mode 100644 index 0000000000..138a22d074 --- /dev/null +++ b/restx-demo/src/test/java/restx/demo/rest/HelloResourceSpecTest.java @@ -0,0 +1,23 @@ +package restx.demo.rest; + +import restx.demo.AppServer; +import org.junit.runner.RunWith; +import restx.tests.RestxSpecTestsRunner; +import restx.tests.FindSpecsIn; + +@RunWith(RestxSpecTestsRunner.class) +@FindSpecsIn("specs/hello") +public class HelloResourceSpecTest { + + /** + * Useless, thanks to both @RunWith(RestxSpecTestsRunner.class) & @FindSpecsIn() + * + * @Rule + * public RestxSpecRule rule = new RestxSpecRule(); + * + * @Test + * public void test_spec() throws Exception { + * rule.runTest(specTestPath); + * } + */ +} diff --git a/restx-demo/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml b/restx-demo/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml new file mode 100644 index 0000000000..1b7b8f0f90 --- /dev/null +++ b/restx-demo/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml @@ -0,0 +1,10 @@ +title: should admin say hello +given: + - time: 2013-08-28T01:18:00.822+02:00 + - uuids: [ "e2b4430f-9541-4602-9a3a-413d17c56a6b" ] +wts: + - when: | + GET message + $RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"admin","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"} + then: | + {"message":"hello admin, it's 01:18:00"} diff --git a/restx-demo/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml b/restx-demo/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml new file mode 100644 index 0000000000..29b6faca34 --- /dev/null +++ b/restx-demo/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml @@ -0,0 +1,8 @@ +title: should admin say hello +given: + - time: 2013-08-28T01:18:00.822+02:00 +wts: + - when: | + GET hello?who=xavier + then: | + {"message":"hello xavier, it's 01:18:00"} diff --git a/restx-demo/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml b/restx-demo/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml new file mode 100644 index 0000000000..d0c6323caf --- /dev/null +++ b/restx-demo/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml @@ -0,0 +1,17 @@ +title: should missing post value triggers a validation error +given: + - time: 2013-08-28T01:18:00.822+02:00 + - uuids: [ "e2b4430f-9541-4602-9a3a-413d17c56a6b" ] +wts: + - when: | + POST mypojo + $RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"user1","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"} + {} + then: | + 400 + - when: | + POST mypojo + $RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"user1","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"} + {"value":"world"} + then: | + {"value":"hello world"} diff --git a/restx-demo/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml b/restx-demo/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml new file mode 100644 index 0000000000..791a3a2776 --- /dev/null +++ b/restx-demo/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml @@ -0,0 +1,10 @@ +title: should user1 say hello +given: + - time: 2013-08-28T01:18:00.822+02:00 + - uuids: [ "e2b4430f-9541-4602-9a3a-413d17c56a6b" ] +wts: + - when: | + GET message + $RestxSession: {"_expires":"2013-09-27T01:18:00.822+02:00","principal":"user1","sessionKey":"e2b4430f-9541-4602-9a3a-413d17c56a6b"} + then: | + {"message":"hello user1, it's 01:18:00"} diff --git a/restx-demo/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml b/restx-demo/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml new file mode 100644 index 0000000000..ead5af8d0c --- /dev/null +++ b/restx-demo/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml @@ -0,0 +1,10 @@ +title: should user2 not say hello +given: + - time: 2013-08-28T01:19:44.770+02:00 + - uuids: [ "56f71fcc-42d3-422f-9458-8ad37fc4a0b5" ] +wts: + - when: | + GET message + $RestxSession: {"_expires":"2013-09-27T01:19:44.770+02:00","principal":"user2","sessionKey":"56f71fcc-42d3-422f-9458-8ad37fc4a0b5"} + then: | + 403 From 8037776d9d73e54a3ee0254ffeb20689b56a5a55 Mon Sep 17 00:00:00 2001 From: Markus Gulden Date: Sun, 28 Oct 2018 20:53:10 +0100 Subject: [PATCH 041/429] BAEL-1658 --- .../connect-file-sink.properties | 20 +++++ .../connect-file-source.properties | 20 +++++ .../connect-standalone.properties | 44 ++++++++++ .../connect-distributed.properties | 88 +++++++++++++++++++ .../02_Distributed/connect-file-sink.json | 9 ++ .../02_Distributed/connect-file-source.json | 9 ++ .../connect-distributed.properties | 88 +++++++++++++++++++ .../connect-file-source-transform.json | 15 ++++ .../04_Custom/connect-distributed.properties | 88 +++++++++++++++++++ .../04_Custom/connect-mongodb-sink.json | 22 +++++ .../04_Custom/connect-mqtt-source.json | 11 +++ 11 files changed, 414 insertions(+) create mode 100644 libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-sink.properties create mode 100644 libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-source.properties create mode 100644 libraries-data/src/main/kafka-connect/01_Quick_Start/connect-standalone.properties create mode 100644 libraries-data/src/main/kafka-connect/02_Distributed/connect-distributed.properties create mode 100644 libraries-data/src/main/kafka-connect/02_Distributed/connect-file-sink.json create mode 100644 libraries-data/src/main/kafka-connect/02_Distributed/connect-file-source.json create mode 100644 libraries-data/src/main/kafka-connect/03_Transform/connect-distributed.properties create mode 100644 libraries-data/src/main/kafka-connect/03_Transform/connect-file-source-transform.json create mode 100644 libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties create mode 100644 libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json create mode 100644 libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json diff --git a/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-sink.properties b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-sink.properties new file mode 100644 index 0000000000..594ccc6e95 --- /dev/null +++ b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-sink.properties @@ -0,0 +1,20 @@ +# 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 +# +# 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. + +name=local-file-sink +connector.class=FileStreamSink +tasks.max=1 +file=test.sink.txt +topics=connect-test \ No newline at end of file diff --git a/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-source.properties b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-source.properties new file mode 100644 index 0000000000..599cf4cb2a --- /dev/null +++ b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-file-source.properties @@ -0,0 +1,20 @@ +# 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 +# +# 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. + +name=local-file-source +connector.class=FileStreamSource +tasks.max=1 +file=test.txt +topic=connect-test \ No newline at end of file diff --git a/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-standalone.properties b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-standalone.properties new file mode 100644 index 0000000000..a2369fa144 --- /dev/null +++ b/libraries-data/src/main/kafka-connect/01_Quick_Start/connect-standalone.properties @@ -0,0 +1,44 @@ +# 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 +# +# 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. + +# These are defaults. This file just demonstrates how to override some settings. +bootstrap.servers=localhost:9092 + +# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will +# need to configure these based on the format they want their data in when loaded from or stored into Kafka +key.converter=org.apache.kafka.connect.json.JsonConverter +value.converter=org.apache.kafka.connect.json.JsonConverter +# Converter-specific settings can be passed in by prefixing the Converter's setting with the converter we want to apply +# it to +key.converter.schemas.enable=false +value.converter.schemas.enable=false + +offset.storage.file.filename=/tmp/connect.offsets +# Flush much faster than normal, which is useful for testing/debugging +offset.flush.interval.ms=10000 + +# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins +# (connectors, converters, transformations). The list should consist of top level directories that include +# any combination of: +# a) directories immediately containing jars with plugins and their dependencies +# b) uber-jars with plugins and their dependencies +# c) directories immediately containing the package directory structure of classes of plugins and their dependencies +# Note: symlinks will be followed to discover dependencies or plugins. +# Examples: +# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors, +# Replace the relative path below with an absolute path if you are planning to start Kafka Connect from within a +# directory other than the home directory of Confluent Platform. +plugin.path=C:\Software\confluent-5.0.0\share\java +#plugin.path=./share/java diff --git a/libraries-data/src/main/kafka-connect/02_Distributed/connect-distributed.properties b/libraries-data/src/main/kafka-connect/02_Distributed/connect-distributed.properties new file mode 100644 index 0000000000..5b91baddbd --- /dev/null +++ b/libraries-data/src/main/kafka-connect/02_Distributed/connect-distributed.properties @@ -0,0 +1,88 @@ +## +# 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 +# +# 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. +## + +# This file contains some of the configurations for the Kafka Connect distributed worker. This file is intended +# to be used with the examples, and some settings may differ from those used in a production system, especially +# the `bootstrap.servers` and those specifying replication factors. + +# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster. +bootstrap.servers=localhost:9092 + +# unique name for the cluster, used in forming the Connect cluster group. Note that this must not conflict with consumer group IDs +group.id=connect-cluster + +# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will +# need to configure these based on the format they want their data in when loaded from or stored into Kafka +key.converter=org.apache.kafka.connect.json.JsonConverter +value.converter=org.apache.kafka.connect.json.JsonConverter +# Converter-specific settings can be passed in by prefixing the Converter's setting with the converter we want to apply +# it to +key.converter.schemas.enable=true +value.converter.schemas.enable=true + +# Topic to use for storing offsets. This topic should have many partitions and be replicated and compacted. +# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create +# the topic before starting Kafka Connect if a specific topic configuration is needed. +# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. +# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able +# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. +offset.storage.topic=connect-offsets +offset.storage.replication.factor=1 +#offset.storage.partitions=25 + +# Topic to use for storing connector and task configurations; note that this should be a single partition, highly replicated, +# and compacted topic. Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create +# the topic before starting Kafka Connect if a specific topic configuration is needed. +# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. +# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able +# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. +config.storage.topic=connect-configs +config.storage.replication.factor=1 + +# Topic to use for storing statuses. This topic can have multiple partitions and should be replicated and compacted. +# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create +# the topic before starting Kafka Connect if a specific topic configuration is needed. +# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. +# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able +# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. +status.storage.topic=connect-status +status.storage.replication.factor=1 +#status.storage.partitions=5 + +# Flush much faster than normal, which is useful for testing/debugging +offset.flush.interval.ms=10000 + +# These are provided to inform the user about the presence of the REST host and port configs +# Hostname & Port for the REST API to listen on. If this is set, it will bind to the interface used to listen to requests. +#rest.host.name= +#rest.port=8083 + +# The Hostname & Port that will be given out to other workers to connect to i.e. URLs that are routable from other servers. +#rest.advertised.host.name= +#rest.advertised.port= + +# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins +# (connectors, converters, transformations). The list should consist of top level directories that include +# any combination of: +# a) directories immediately containing jars with plugins and their dependencies +# b) uber-jars with plugins and their dependencies +# c) directories immediately containing the package directory structure of classes of plugins and their dependencies +# Examples: +# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors, +# Replace the relative path below with an absolute path if you are planning to start Kafka Connect from within a +# directory other than the home directory of Confluent Platform. +plugin.path=./share/java diff --git a/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-sink.json b/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-sink.json new file mode 100644 index 0000000000..8902ecce52 --- /dev/null +++ b/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-sink.json @@ -0,0 +1,9 @@ +{ + "name": "local-file-sink", + "config": { + "connector.class": "FileStreamSink", + "tasks.max": 1, + "file": "test-distributed.sink.txt", + "topics": "connect-distributed" + } +} diff --git a/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-source.json b/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-source.json new file mode 100644 index 0000000000..77e949c91b --- /dev/null +++ b/libraries-data/src/main/kafka-connect/02_Distributed/connect-file-source.json @@ -0,0 +1,9 @@ +{ + "name": "local-file-source", + "config": { + "connector.class": "FileStreamSource", + "tasks.max": 1, + "file": "test-distributed.txt", + "topic": "connect-distributed" + } +} diff --git a/libraries-data/src/main/kafka-connect/03_Transform/connect-distributed.properties b/libraries-data/src/main/kafka-connect/03_Transform/connect-distributed.properties new file mode 100644 index 0000000000..fa63be24b8 --- /dev/null +++ b/libraries-data/src/main/kafka-connect/03_Transform/connect-distributed.properties @@ -0,0 +1,88 @@ +## +# 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 +# +# 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. +## + +# This file contains some of the configurations for the Kafka Connect distributed worker. This file is intended +# to be used with the examples, and some settings may differ from those used in a production system, especially +# the `bootstrap.servers` and those specifying replication factors. + +# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster. +bootstrap.servers=localhost:9092 + +# unique name for the cluster, used in forming the Connect cluster group. Note that this must not conflict with consumer group IDs +group.id=connect-cluster + +# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will +# need to configure these based on the format they want their data in when loaded from or stored into Kafka +key.converter=org.apache.kafka.connect.json.JsonConverter +value.converter=org.apache.kafka.connect.json.JsonConverter +# Converter-specific settings can be passed in by prefixing the Converter's setting with the converter we want to apply +# it to +key.converter.schemas.enable=false +value.converter.schemas.enable=false + +# Topic to use for storing offsets. This topic should have many partitions and be replicated and compacted. +# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create +# the topic before starting Kafka Connect if a specific topic configuration is needed. +# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. +# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able +# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. +offset.storage.topic=connect-offsets +offset.storage.replication.factor=1 +#offset.storage.partitions=25 + +# Topic to use for storing connector and task configurations; note that this should be a single partition, highly replicated, +# and compacted topic. Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create +# the topic before starting Kafka Connect if a specific topic configuration is needed. +# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. +# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able +# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. +config.storage.topic=connect-configs +config.storage.replication.factor=1 + +# Topic to use for storing statuses. This topic can have multiple partitions and should be replicated and compacted. +# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create +# the topic before starting Kafka Connect if a specific topic configuration is needed. +# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. +# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able +# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. +status.storage.topic=connect-status +status.storage.replication.factor=1 +#status.storage.partitions=5 + +# Flush much faster than normal, which is useful for testing/debugging +offset.flush.interval.ms=10000 + +# These are provided to inform the user about the presence of the REST host and port configs +# Hostname & Port for the REST API to listen on. If this is set, it will bind to the interface used to listen to requests. +#rest.host.name= +#rest.port=8083 + +# The Hostname & Port that will be given out to other workers to connect to i.e. URLs that are routable from other servers. +#rest.advertised.host.name= +#rest.advertised.port= + +# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins +# (connectors, converters, transformations). The list should consist of top level directories that include +# any combination of: +# a) directories immediately containing jars with plugins and their dependencies +# b) uber-jars with plugins and their dependencies +# c) directories immediately containing the package directory structure of classes of plugins and their dependencies +# Examples: +# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors, +# Replace the relative path below with an absolute path if you are planning to start Kafka Connect from within a +# directory other than the home directory of Confluent Platform. +plugin.path=./share/java diff --git a/libraries-data/src/main/kafka-connect/03_Transform/connect-file-source-transform.json b/libraries-data/src/main/kafka-connect/03_Transform/connect-file-source-transform.json new file mode 100644 index 0000000000..e5e21a0608 --- /dev/null +++ b/libraries-data/src/main/kafka-connect/03_Transform/connect-file-source-transform.json @@ -0,0 +1,15 @@ +{ + "name": "local-file-source", + "config": { + "connector.class": "FileStreamSource", + "tasks.max": 1, + "file": "transformation.txt", + "topic": "connect-transformation", + "transforms": "MakeMap,InsertSource", + "transforms.MakeMap.type": "org.apache.kafka.connect.transforms.HoistField$Value", + "transforms.MakeMap.field": "line", + "transforms.InsertSource.type": "org.apache.kafka.connect.transforms.InsertField$Value", + "transforms.InsertSource.static.field": "data_source", + "transforms.InsertSource.static.value": "test-file-source" + } +} diff --git a/libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties b/libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties new file mode 100644 index 0000000000..5b91baddbd --- /dev/null +++ b/libraries-data/src/main/kafka-connect/04_Custom/connect-distributed.properties @@ -0,0 +1,88 @@ +## +# 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 +# +# 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. +## + +# This file contains some of the configurations for the Kafka Connect distributed worker. This file is intended +# to be used with the examples, and some settings may differ from those used in a production system, especially +# the `bootstrap.servers` and those specifying replication factors. + +# A list of host/port pairs to use for establishing the initial connection to the Kafka cluster. +bootstrap.servers=localhost:9092 + +# unique name for the cluster, used in forming the Connect cluster group. Note that this must not conflict with consumer group IDs +group.id=connect-cluster + +# The converters specify the format of data in Kafka and how to translate it into Connect data. Every Connect user will +# need to configure these based on the format they want their data in when loaded from or stored into Kafka +key.converter=org.apache.kafka.connect.json.JsonConverter +value.converter=org.apache.kafka.connect.json.JsonConverter +# Converter-specific settings can be passed in by prefixing the Converter's setting with the converter we want to apply +# it to +key.converter.schemas.enable=true +value.converter.schemas.enable=true + +# Topic to use for storing offsets. This topic should have many partitions and be replicated and compacted. +# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create +# the topic before starting Kafka Connect if a specific topic configuration is needed. +# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. +# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able +# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. +offset.storage.topic=connect-offsets +offset.storage.replication.factor=1 +#offset.storage.partitions=25 + +# Topic to use for storing connector and task configurations; note that this should be a single partition, highly replicated, +# and compacted topic. Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create +# the topic before starting Kafka Connect if a specific topic configuration is needed. +# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. +# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able +# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. +config.storage.topic=connect-configs +config.storage.replication.factor=1 + +# Topic to use for storing statuses. This topic can have multiple partitions and should be replicated and compacted. +# Kafka Connect will attempt to create the topic automatically when needed, but you can always manually create +# the topic before starting Kafka Connect if a specific topic configuration is needed. +# Most users will want to use the built-in default replication factor of 3 or in some cases even specify a larger value. +# Since this means there must be at least as many brokers as the maximum replication factor used, we'd like to be able +# to run this example on a single-broker cluster and so here we instead set the replication factor to 1. +status.storage.topic=connect-status +status.storage.replication.factor=1 +#status.storage.partitions=5 + +# Flush much faster than normal, which is useful for testing/debugging +offset.flush.interval.ms=10000 + +# These are provided to inform the user about the presence of the REST host and port configs +# Hostname & Port for the REST API to listen on. If this is set, it will bind to the interface used to listen to requests. +#rest.host.name= +#rest.port=8083 + +# The Hostname & Port that will be given out to other workers to connect to i.e. URLs that are routable from other servers. +#rest.advertised.host.name= +#rest.advertised.port= + +# Set to a list of filesystem paths separated by commas (,) to enable class loading isolation for plugins +# (connectors, converters, transformations). The list should consist of top level directories that include +# any combination of: +# a) directories immediately containing jars with plugins and their dependencies +# b) uber-jars with plugins and their dependencies +# c) directories immediately containing the package directory structure of classes of plugins and their dependencies +# Examples: +# plugin.path=/usr/local/share/java,/usr/local/share/kafka/plugins,/opt/connectors, +# Replace the relative path below with an absolute path if you are planning to start Kafka Connect from within a +# directory other than the home directory of Confluent Platform. +plugin.path=./share/java diff --git a/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json b/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json new file mode 100644 index 0000000000..333768e4b7 --- /dev/null +++ b/libraries-data/src/main/kafka-connect/04_Custom/connect-mongodb-sink.json @@ -0,0 +1,22 @@ +{ + "firstName": "John", + "lastName": "Smith", + "age": 25, + "address": { + "streetAddress": "21 2nd Street", + "city": "New York", + "state": "NY", + "postalCode": "10021" + }, + "phoneNumber": [{ + "type": "home", + "number": "212 555-1234" + }, { + "type": "fax", + "number": "646 555-4567" + } + ], + "gender": { + "type": "male" + } +} diff --git a/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json b/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json new file mode 100644 index 0000000000..02d87c5ad7 --- /dev/null +++ b/libraries-data/src/main/kafka-connect/04_Custom/connect-mqtt-source.json @@ -0,0 +1,11 @@ +{ + "name": "mqtt-source", + "config": { + "connector.class": "io.confluent.connect.mqtt.MqttSourceConnector", + "tasks.max": 1, + "mqtt.server.uri": "ws://broker.hivemq.com:8000/mqtt", + "mqtt.topics": "baeldung", + "kafka.topic": "connect-custom", + "value.converter": "org.apache.kafka.connect.converters.ByteArrayConverter" + } +} From 1da262956246d688a5d996760cac5ad2f9cc42ef Mon Sep 17 00:00:00 2001 From: Jonathan Paul Cook Date: Mon, 29 Oct 2018 19:51:15 +0100 Subject: [PATCH 042/429] BAEL-2193 - Merge 2 java.util.Properties objects --- .../properties/MergePropertiesUnitTest.java | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java b/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java new file mode 100644 index 0000000000..2318104b8d --- /dev/null +++ b/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java @@ -0,0 +1,84 @@ +package com.baeldung.properties; + +import static org.hamcrest.CoreMatchers.equalTo; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertThat; + +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.stream.Stream; + +import org.junit.Test; + +public class MergePropertiesUnitTest { + + @Test + public void givenTwoProperties_whenMergedUsingIteration_thenAllPropertiesInResult() throws Exception { + Properties globalProperties = mergePropertiesByIteratingKeySet(propertiesA(), propertiesB()); + + testMergedProperties(globalProperties); + } + + @Test + public void givenTwoProperties_whenMergedUsingPutAll_thenAllPropertiesInResult() throws Exception { + Properties globalProperties = mergePropertiesByUsingPutAll(propertiesA(), propertiesB()); + + testMergedProperties(globalProperties); + } + + @Test + public void givenTwoProperties_whenMergedUsingStreamAPI_thenAllPropertiesInResult() throws Exception { + Properties globalProperties = mergePropertiesByUsingStreamApi(propertiesB(), propertiesA()); + + testMergedProperties(globalProperties); + } + + private Properties mergePropertiesByIteratingKeySet(Properties... properties) { + Properties mergedProperties = new Properties(); + for (Properties property : properties) { + Set propertyNames = property.stringPropertyNames(); + for (String name : propertyNames) { + String propertyValue = property.getProperty(name); + mergedProperties.setProperty(name, propertyValue); + } + } + return mergedProperties; + } + + private Properties mergePropertiesByUsingPutAll(Properties... properties) { + Properties mergedProperties = new Properties(); + for (Properties property : properties) { + mergedProperties.putAll(property); + } + return mergedProperties; + } + + private Properties mergePropertiesByUsingStreamApi(Properties... properties) { + return Stream.of(properties) + .collect(Properties::new, Map::putAll, Map::putAll); + } + + private Properties propertiesA() { + Properties properties = new Properties(); + properties.setProperty("application.name", "my-app"); + properties.setProperty("application.version", "1.0"); + return properties; + } + + private Properties propertiesB() { + Properties properties = new Properties(); + properties.setProperty("property-1", "sample property"); + properties.setProperty("property-2", "another sample property"); + return properties; + } + + private void testMergedProperties(Properties globalProperties) { + assertThat("There should be 4 properties", globalProperties.size(), equalTo(4)); + assertEquals("Property should be", globalProperties.getProperty("application.name"), "my-app"); + assertEquals("Property should be", globalProperties.getProperty("application.version"), "1.0"); + assertEquals("Property should be", globalProperties.getProperty("property-1"), "sample property"); + assertEquals("Property should be", globalProperties.getProperty("property-2"), "another sample property"); + } + +} From 5930d0d363c144e7a74c9fe09580b7e4d69a09ea Mon Sep 17 00:00:00 2001 From: Jonathan Paul Cook Date: Tue, 30 Oct 2018 08:39:11 +0100 Subject: [PATCH 043/429] BAEL-2193 - Merge 2 java.util.Properties object --- .../com/baeldung/properties/MergePropertiesUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java b/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java index 2318104b8d..8720aff36b 100644 --- a/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java +++ b/core-java/src/test/java/com/baeldung/properties/MergePropertiesUnitTest.java @@ -14,21 +14,21 @@ import org.junit.Test; public class MergePropertiesUnitTest { @Test - public void givenTwoProperties_whenMergedUsingIteration_thenAllPropertiesInResult() throws Exception { + public void givenTwoProperties_whenMergedUsingIteration_thenAllPropertiesInResult() { Properties globalProperties = mergePropertiesByIteratingKeySet(propertiesA(), propertiesB()); testMergedProperties(globalProperties); } @Test - public void givenTwoProperties_whenMergedUsingPutAll_thenAllPropertiesInResult() throws Exception { + public void givenTwoProperties_whenMergedUsingPutAll_thenAllPropertiesInResult() { Properties globalProperties = mergePropertiesByUsingPutAll(propertiesA(), propertiesB()); testMergedProperties(globalProperties); } @Test - public void givenTwoProperties_whenMergedUsingStreamAPI_thenAllPropertiesInResult() throws Exception { + public void givenTwoProperties_whenMergedUsingStreamAPI_thenAllPropertiesInResult() { Properties globalProperties = mergePropertiesByUsingStreamApi(propertiesB(), propertiesA()); testMergedProperties(globalProperties); From aedf3b5cb570d0aba8cad215f4a40da9ba956623 Mon Sep 17 00:00:00 2001 From: Simon Massey Date: Tue, 30 Oct 2018 22:47:38 +0000 Subject: [PATCH 044/429] removed race condition between different requests --- .../thymeleaf/controller/BookController.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java index b8132cddc8..12e8e8bc41 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java @@ -2,6 +2,7 @@ package com.baeldung.thymeleaf.controller; import java.util.List; import java.util.Optional; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -21,18 +22,18 @@ import com.baeldung.thymeleaf.service.BookService; @Controller public class BookController { - private static int currentPage = 1; - private static int pageSize = 5; @Autowired private BookService bookService; - + @RequestMapping(value = "/listBooks", method = RequestMethod.GET) public String listBooks(Model model, @RequestParam("page") Optional page, @RequestParam("size") Optional size) { - page.ifPresent(p -> currentPage = p); - size.ifPresent(s -> pageSize = s); + AtomicInteger currentPage = new AtomicInteger(1); + AtomicInteger pageSize = new AtomicInteger(5); + page.ifPresent(p -> currentPage.set(p)); + size.ifPresent(s -> pageSize.set(s)); - Page bookPage = bookService.findPaginated(PageRequest.of(currentPage - 1, pageSize)); + Page bookPage = bookService.findPaginated(PageRequest.of(currentPage.get() - 1, pageSize.get())); model.addAttribute("bookPage", bookPage); From e3fc47dd53de5cd1f8c6e5175aaff175daa9e974 Mon Sep 17 00:00:00 2001 From: Simon Massey Date: Tue, 30 Oct 2018 22:57:04 +0000 Subject: [PATCH 045/429] use of atomics way too verbose --- .../baeldung/thymeleaf/controller/BookController.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java index 12e8e8bc41..7ede80b01d 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java @@ -2,7 +2,6 @@ package com.baeldung.thymeleaf.controller; import java.util.List; import java.util.Optional; -import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -22,18 +21,15 @@ import com.baeldung.thymeleaf.service.BookService; @Controller public class BookController { - @Autowired private BookService bookService; @RequestMapping(value = "/listBooks", method = RequestMethod.GET) public String listBooks(Model model, @RequestParam("page") Optional page, @RequestParam("size") Optional size) { - AtomicInteger currentPage = new AtomicInteger(1); - AtomicInteger pageSize = new AtomicInteger(5); - page.ifPresent(p -> currentPage.set(p)); - size.ifPresent(s -> pageSize.set(s)); + int currentPage = page.isPresent()?page.get():5; + int pageSize = size.isPresent()?size.get():1; - Page bookPage = bookService.findPaginated(PageRequest.of(currentPage.get() - 1, pageSize.get())); + Page bookPage = bookService.findPaginated(PageRequest.of(currentPage - 1, pageSize)); model.addAttribute("bookPage", bookPage); From 9663cc09a1d32ec338044c3d61ecd3a7289608d1 Mon Sep 17 00:00:00 2001 From: Simon Massey Date: Tue, 30 Oct 2018 23:03:08 +0000 Subject: [PATCH 046/429] orElse is cleaner --- .../com/baeldung/thymeleaf/controller/BookController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java index 7ede80b01d..f30ae6e049 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java @@ -26,8 +26,8 @@ public class BookController { @RequestMapping(value = "/listBooks", method = RequestMethod.GET) public String listBooks(Model model, @RequestParam("page") Optional page, @RequestParam("size") Optional size) { - int currentPage = page.isPresent()?page.get():5; - int pageSize = size.isPresent()?size.get():1; + int currentPage = page.orElse(1); + int pageSize = size.orElse(5); Page bookPage = bookService.findPaginated(PageRequest.of(currentPage - 1, pageSize)); From 5d4d8ff977bf16874e475f9b7dc537140391a23f Mon Sep 17 00:00:00 2001 From: Simon Massey Date: Tue, 30 Oct 2018 23:06:12 +0000 Subject: [PATCH 047/429] may as well use final --- .../com/baeldung/thymeleaf/controller/BookController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java index f30ae6e049..d10caee9e7 100644 --- a/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java +++ b/spring-thymeleaf/src/main/java/com/baeldung/thymeleaf/controller/BookController.java @@ -26,8 +26,8 @@ public class BookController { @RequestMapping(value = "/listBooks", method = RequestMethod.GET) public String listBooks(Model model, @RequestParam("page") Optional page, @RequestParam("size") Optional size) { - int currentPage = page.orElse(1); - int pageSize = size.orElse(5); + final int currentPage = page.orElse(1); + final int pageSize = size.orElse(5); Page bookPage = bookService.findPaginated(PageRequest.of(currentPage - 1, pageSize)); From f1a98f97282b9bba4fbe7528172b374e0bce7a2e Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Wed, 31 Oct 2018 15:56:41 +0100 Subject: [PATCH 048/429] [BAEL-2255] applied requested changes --- .../bufferedreader/BufferedReaderExample.java | 0 .../src/main/resources/input.txt | 0 .../BufferedReaderExampleUnitTest.java | 49 +--------------- .../BufferedReaderUnitTest.java | 58 +++++++++++++++++++ 4 files changed, 59 insertions(+), 48 deletions(-) rename {core-java => core-java-io}/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java (100%) rename {core-java => core-java-io}/src/main/resources/input.txt (100%) rename {core-java => core-java-io}/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java (62%) create mode 100644 core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java b/core-java-io/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java similarity index 100% rename from core-java/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java rename to core-java-io/src/main/java/com/baeldung/bufferedreader/BufferedReaderExample.java diff --git a/core-java/src/main/resources/input.txt b/core-java-io/src/main/resources/input.txt similarity index 100% rename from core-java/src/main/resources/input.txt rename to core-java-io/src/main/resources/input.txt diff --git a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java b/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java similarity index 62% rename from core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java rename to core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java index 7a831eb380..9af00c086a 100644 --- a/core-java/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java +++ b/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderExampleUnitTest.java @@ -5,16 +5,12 @@ import org.junit.Test; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; -import java.io.StringReader; -import java.nio.file.Files; -import java.nio.file.Paths; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.*; public class BufferedReaderExampleUnitTest { - public static final String FILE_PATH = "src/main/resources/input.txt"; + private static final String FILE_PATH = "src/main/resources/input.txt"; @Test public void givenBufferedReader_whenReadAllLines_thenReturnsContent() throws IOException { @@ -76,47 +72,4 @@ public class BufferedReaderExampleUnitTest { assertThat(content.toString()).contains("Lorem ipsum"); } - @Test - public void givenBufferedReader_whenSkipUnderscores_thenOk() throws IOException { - StringBuilder result = new StringBuilder(); - - try (BufferedReader reader = new BufferedReader(new StringReader("1__2__3__4__5"))) { - int value; - while((value = reader.read()) != -1) { - result.append((char) value); - reader.skip(2L); - } - } - - assertEquals("12345", result.toString()); - } - - @Test - public void givenBufferedReader_whenSkipsWhitespacesAtBeginning_thenOk() throws IOException { - String result; - - try (BufferedReader reader = new BufferedReader(new StringReader(" Lorem ipsum dolor sit amet."))) { - assertTrue(reader.markSupported()); - - do { - reader.mark(1); - } while(Character.isWhitespace(reader.read())); - - reader.reset(); - result = reader.readLine(); - } - - assertEquals("Lorem ipsum dolor sit amet.", result); - } - - @Test - public void whenCreatesNewBufferedReader_thenOk() throws IOException { - BufferedReader reader = Files.newBufferedReader(Paths.get(FILE_PATH)); - - assertNotNull(reader); - assertTrue(reader.ready()); - - reader.close(); - } - } diff --git a/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderUnitTest.java b/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderUnitTest.java new file mode 100644 index 0000000000..985eb05aec --- /dev/null +++ b/core-java-io/src/test/java/com/baeldung/bufferedreader/BufferedReaderUnitTest.java @@ -0,0 +1,58 @@ +package com.baeldung.bufferedreader; + +import org.junit.Test; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.StringReader; +import java.nio.file.Files; +import java.nio.file.Paths; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; + +public class BufferedReaderUnitTest { + + private static final String FILE_PATH = "src/main/resources/input.txt"; + + @Test + public void givenBufferedReader_whenSkipUnderscores_thenOk() throws IOException { + StringBuilder result = new StringBuilder(); + + try (BufferedReader reader = new BufferedReader(new StringReader("1__2__3__4__5"))) { + int value; + while((value = reader.read()) != -1) { + result.append((char) value); + reader.skip(2L); + } + } + + assertEquals("12345", result.toString()); + } + + @Test + public void givenBufferedReader_whenSkipsWhitespacesAtBeginning_thenOk() throws IOException { + String result; + + try (BufferedReader reader = new BufferedReader(new StringReader(" Lorem ipsum dolor sit amet."))) { + do { + reader.mark(1); + } while(Character.isWhitespace(reader.read())); + + reader.reset(); + result = reader.readLine(); + } + + assertEquals("Lorem ipsum dolor sit amet.", result); + } + + @Test + public void whenCreatesNewBufferedReader_thenOk() throws IOException { + try(BufferedReader reader = Files.newBufferedReader(Paths.get(FILE_PATH))) { + assertNotNull(reader); + assertTrue(reader.ready()); + } + } + +} From 7064a7e30960c51b7ed2b8aebee6465d6d4c3cb2 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sat, 3 Nov 2018 01:01:07 +0530 Subject: [PATCH 049/429] Removed ZoneId code --- .../datetime/ConvertInstantToTimestamp.java | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java index e8ce4adaa1..53618b3c31 100644 --- a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java +++ b/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java @@ -1,5 +1,7 @@ package com.baeldung.datetime; +import static org.junit.Assert.assertEquals; + import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -16,22 +18,15 @@ public class ConvertInstantToTimestamp { public static void run() { Instant instant = Instant.now(); Timestamp timestamp = Timestamp.from(instant); // same point on the time-line as Instant + assertEquals(instant.toEpochMilli(), timestamp.getTime()); + instant = timestamp.toInstant(); - - System.out.println("Instant (milliseconds from epoch): " + instant.toEpochMilli()); - System.out.println("Timestamp (milliseconds from epoch): " + timestamp.getTime()); - System.out.print("\n"); - - // Local TimeZone of the machine at the time of running this code is GMT +5:30 a.k.a IST - ZoneId zoneId = ZoneId.of(ZoneId.SHORT_IDS.get("IST")); + assertEquals(instant.toEpochMilli(), timestamp.getTime()); DateFormat df = DateFormat.getDateTimeInstance(); - df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss:SS'Z'"); + df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'"); df.setTimeZone(TimeZone.getTimeZone("UTC")); - System.out.println("Instant (in UTC): " + instant); - System.out.println("Timestamp (in UTC): " + df.format(timestamp)); - System.out.println("Instant (in GMT +05:30): " + instant.atZone(zoneId)); - System.out.println("Timestamp (in GMT +05:30): " + timestamp); + assertEquals(instant.toString(), df.format(timestamp).toString()); } -} \ No newline at end of file +} From 5e1fc54ec2cfc589988af9f2b8cd4a3bf1ac7290 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sat, 3 Nov 2018 15:59:05 +0530 Subject: [PATCH 050/429] Converted class to JUnit Test --- .../ConvertInstantToTimestampTest.java} | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) rename java-dates/src/{main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java => test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java} (55%) diff --git a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java b/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java similarity index 55% rename from java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java rename to java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java index 53618b3c31..bfbd911e95 100644 --- a/java-dates/src/main/java/com/baeldung/datetime/ConvertInstantToTimestamp.java +++ b/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java @@ -1,6 +1,6 @@ package com.baeldung.datetime; -import static org.junit.Assert.assertEquals; +import static org.assertj.core.api.Assertions.assertThat; import java.sql.Timestamp; import java.text.DateFormat; @@ -9,24 +9,22 @@ import java.time.Instant; import java.time.ZoneId; import java.util.TimeZone; -public class ConvertInstantToTimestamp { +import org.junit.Test; - public static void main(String[] args) { - run(); - } +public class ConvertInstantToTimestampTest { - public static void run() { + @Test + public void givenInstant_whenConvertedToTimestamp_thenGetTimestampWithSamePointOnTimeline() { Instant instant = Instant.now(); Timestamp timestamp = Timestamp.from(instant); // same point on the time-line as Instant - assertEquals(instant.toEpochMilli(), timestamp.getTime()); + assertThat(instant.toEpochMilli()).isEqualTo(timestamp.getTime()); instant = timestamp.toInstant(); - assertEquals(instant.toEpochMilli(), timestamp.getTime()); + assertThat(instant.toEpochMilli()).isEqualTo(timestamp.getTime()); DateFormat df = DateFormat.getDateTimeInstance(); df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SS'Z'"); df.setTimeZone(TimeZone.getTimeZone("UTC")); - - assertEquals(instant.toString(), df.format(timestamp).toString()); + assertThat(instant.toString()).isEqualTo(df.format(timestamp).toString()); } } From ce76dcde0d3594abb32b8b369d57baefaad786d1 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 3 Nov 2018 20:41:53 +0200 Subject: [PATCH 051/429] Update and rename ConvertInstantToTimestampTest.java to ConvertInstantToTimestampUnitTest.java --- ...imestampTest.java => ConvertInstantToTimestampUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename java-dates/src/test/java/com/baeldung/datetime/{ConvertInstantToTimestampTest.java => ConvertInstantToTimestampUnitTest.java} (95%) diff --git a/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java b/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java similarity index 95% rename from java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java rename to java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java index bfbd911e95..3ba01a591a 100644 --- a/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampTest.java +++ b/java-dates/src/test/java/com/baeldung/datetime/ConvertInstantToTimestampUnitTest.java @@ -11,7 +11,7 @@ import java.util.TimeZone; import org.junit.Test; -public class ConvertInstantToTimestampTest { +public class ConvertInstantToTimestampUnitTest { @Test public void givenInstant_whenConvertedToTimestamp_thenGetTimestampWithSamePointOnTimeline() { From 192c9443bd5ae800288a7dfaddae4e489fae471f Mon Sep 17 00:00:00 2001 From: Kevin Gilmore Date: Sun, 4 Nov 2018 13:04:05 -0600 Subject: [PATCH 052/429] BAEL-2015: add link back to article --- core-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java/README.md b/core-java/README.md index ce2d5b3e64..35fdcd9132 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -156,3 +156,4 @@ - [The Modulo Operator in Java](https://www.baeldung.com/modulo-java) - [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) +- [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks) From 770b28f2418e9e875252f7a30213803faa1a9e08 Mon Sep 17 00:00:00 2001 From: Holger Ludvigsen Date: Mon, 5 Nov 2018 15:39:11 +0100 Subject: [PATCH 053/429] FileOutputStream is never closed The output file stream is not closed, so it is still in use by the Java process after the code runs. I noticed this when trying to delete the output files right afterwards. --- .../src/main/java/com/baeldung/download/FileDownload.java | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-io/src/main/java/com/baeldung/download/FileDownload.java b/core-java-io/src/main/java/com/baeldung/download/FileDownload.java index c7dd154023..a099406d4c 100644 --- a/core-java-io/src/main/java/com/baeldung/download/FileDownload.java +++ b/core-java-io/src/main/java/com/baeldung/download/FileDownload.java @@ -45,6 +45,7 @@ public class FileDownload { FileOutputStream fileOutputStream = new FileOutputStream(localFilename); FileChannel fileChannel = fileOutputStream.getChannel()) { fileChannel.transferFrom(readableByteChannel, 0, Long.MAX_VALUE); + fileOutputStream.close(); } } From be17633174947ac55865dcc357bf615a7448470c Mon Sep 17 00:00:00 2001 From: chandra Date: Fri, 9 Nov 2018 21:08:02 -0500 Subject: [PATCH 054/429] BAEL-2313 Convert String to Byte Array and Reverse in Java --- .../conversion/ByteArrayToStringUnitTest.java | 91 ++++++++++++++ .../conversion/StringToByteArrayUnitTest.java | 119 ++++++++++++++++++ 2 files changed, 210 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java create mode 100644 java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java new file mode 100644 index 0000000000..cb18d04cc3 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java @@ -0,0 +1,91 @@ +package com.baeldung.string.conversion; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetDecoder; +import java.nio.charset.CodingErrorAction; +import java.nio.charset.StandardCharsets; + +import org.junit.Test; + +public class ByteArrayToStringUnitTest { + + @Test + public void whenStringConstructorWithDefaultCharset_thenOK() { + final byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33 }; + String string = new String(byteArrray); + System.out.println(string); + + assertNotNull(string); + } + + @Test + public void whenStringConstructorWithNamedCharset_thenOK() + throws UnsupportedEncodingException { + final String charsetName = "IBM01140"; + final byte[] byteArrray = { -56, -123, -109, -109, -106, 64, -26, -106, + -103, -109, -124, 90 }; + + String string = new String(byteArrray, charsetName); + + assertEquals("Hello World!", string); + } + + @Test + public void whenStringConstructorWithCharSet_thenOK() { + final Charset charset = Charset.forName("UTF-8"); + final byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33 }; + + String string = new String(byteArrray, charset); + + assertEquals("Hello World!", string); + } + + @Test + public void whenStringConstructorWithStandardCharSet_thenOK() { + final Charset charset = StandardCharsets.UTF_16; + + final byte[] byteArrray = { -2, -1, 0, 72, 0, 101, 0, 108, 0, 108, 0, + 111, 0, 32, 0, 87, 0, 111, 0, 114, 0, 108, 0, 100, 0, 33 }; + + String string = new String(byteArrray, charset); + + assertEquals("Hello World!", string); + } + + @Test + public void whenDecodeWithCharset_thenOK() { + byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, + 100, 33 }; + final Charset charset = StandardCharsets.UTF_8; + + String string = charset.decode(ByteBuffer.wrap(byteArrray)).toString(); + System.out.println(string); + + assertEquals("Hello World!", string); + } + + @Test + public void whenUsingCharsetDecoder_thenOK() + throws CharacterCodingException { + byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, + 100, 33 }; + CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); + + decoder.onMalformedInput(CodingErrorAction.IGNORE) + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .replaceWith("?"); + + String string = decoder.decode(ByteBuffer.wrap(byteArrray)).toString(); + + assertEquals("Hello World!", string); + } + +} diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java b/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java new file mode 100644 index 0000000000..6086e2f60b --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java @@ -0,0 +1,119 @@ +package com.baeldung.string.conversion; + +import static org.junit.jupiter.api.Assertions.assertArrayEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +import java.io.UnsupportedEncodingException; +import java.nio.CharBuffer; +import java.nio.charset.CharacterCodingException; +import java.nio.charset.Charset; +import java.nio.charset.CharsetEncoder; +import java.nio.charset.CodingErrorAction; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; + +import org.junit.Test; + +public class StringToByteArrayUnitTest { + + @Test + public void whenGetBytesWithDefaultCharset_thenOK() { + final String inputString = "Hello World!"; + final String defaultCharSet = Charset.defaultCharset().displayName(); + + byte[] byteArrray = inputString.getBytes(); + + System.out.printf( + "Using default charset:%s, Input String:%s, Output byte array:%s\n", + defaultCharSet, inputString, Arrays.toString(byteArrray)); + + assertNotNull(byteArrray); + assert (byteArrray.length >= inputString.length()); + } + + @Test + public void whenGetBytesWithNamedCharset_thenOK() + throws UnsupportedEncodingException { + final String inputString = "Hello World!"; + final String charsetName = "IBM01140"; + + byte[] byteArrray = inputString.getBytes("IBM01140"); + + System.out.printf( + "Using named charset:%s, Input String:%s, Output byte array:%s\n", + charsetName, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { -56, -123, -109, -109, -106, 64, -26, + -106, -103, -109, -124, 90 }, + byteArrray); + } + + @Test + public void whenGetBytesWithCharset_thenOK() { + final String inputString = "Hello World!"; + final Charset charset = Charset.forName("UTF-8"); + + byte[] byteArrray = inputString.getBytes(charset); + + System.out.printf( + "Using Charset:%s, Input String:%s, Output byte array:%s\n", + charset, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33 }, + byteArrray); + } + + @Test + public void whenGetBytesWithStandardCharset_thenOK() { + final String inputString = "Hello World!"; + final Charset charset = StandardCharsets.UTF_16; + + byte[] byteArrray = inputString.getBytes(charset); + + System.out.printf( + "Using Standard Charset:%s, Input String:%s, Output byte array:%s\n", + charset, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { -2, -1, 0, 72, 0, 101, 0, 108, 0, 108, 0, + 111, 0, 32, 0, 87, 0, 111, 0, 114, 0, 108, 0, 100, 0, 33 }, + byteArrray); + } + + @Test + public void whenEncodeWithCharset_thenOK() { + final String inputString = "Hello World!"; + final Charset charset = StandardCharsets.UTF_8; + + byte[] byteArrray = charset.encode(inputString).array(); + + System.out.printf( + "Using encode with Charset:%s, Input String:%s, Output byte array:%s\n", + charset, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33, 0 }, + byteArrray); + } + + @Test + public void whenUsingCharsetEncoder_thenOK() + throws CharacterCodingException { + final String inputString = "Hello World!"; + CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder(); + encoder.onMalformedInput(CodingErrorAction.IGNORE) + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .replaceWith(new byte[] { 0 }); + + byte[] byteArrray = encoder.encode(CharBuffer.wrap(inputString)).array(); + + System.out.printf( + "Using encode with CharsetEncoder:%s, Input String:%s, Output byte array:%s\n", + encoder, inputString, Arrays.toString(byteArrray)); + + assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, + 108, 100, 33, 0 }, + byteArrray); + } + +} From 243323c55f2b879b37bab9817cb9f08f9e63958e Mon Sep 17 00:00:00 2001 From: chandra Date: Mon, 12 Nov 2018 21:36:21 -0500 Subject: [PATCH 055/429] Modified sample inputs to make the tests more meaningful. --- .../conversion/ByteArrayToStringUnitTest.java | 17 +++++----- .../conversion/StringToByteArrayUnitTest.java | 33 ++++++++++--------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java index cb18d04cc3..a9f8a04c8d 100644 --- a/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/conversion/ByteArrayToStringUnitTest.java @@ -62,30 +62,29 @@ public class ByteArrayToStringUnitTest { @Test public void whenDecodeWithCharset_thenOK() { - byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, - 100, 33 }; - final Charset charset = StandardCharsets.UTF_8; + byte[] byteArrray = { 72, 101, 108, 108, 111, 32, -10, 111, 114, 108, -63, 33 }; + final Charset charset = StandardCharsets.US_ASCII; String string = charset.decode(ByteBuffer.wrap(byteArrray)).toString(); System.out.println(string); - assertEquals("Hello World!", string); + assertEquals("Hello �orl�!", string); } @Test public void whenUsingCharsetDecoder_thenOK() throws CharacterCodingException { - byte[] byteArrray = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, - 100, 33 }; - CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder(); + byte[] byteArrray = { 72, 101, 108, 108, 111, 32, -10, 111, 114, 108, -63, 33}; + CharsetDecoder decoder = StandardCharsets.US_ASCII.newDecoder(); - decoder.onMalformedInput(CodingErrorAction.IGNORE) + decoder.onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE) .replaceWith("?"); String string = decoder.decode(ByteBuffer.wrap(byteArrray)).toString(); - assertEquals("Hello World!", string); + assertEquals("Hello ?orl?!", string); } + } diff --git a/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java b/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java index 6086e2f60b..5377b4b28d 100644 --- a/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/conversion/StringToByteArrayUnitTest.java @@ -19,7 +19,8 @@ public class StringToByteArrayUnitTest { @Test public void whenGetBytesWithDefaultCharset_thenOK() { final String inputString = "Hello World!"; - final String defaultCharSet = Charset.defaultCharset().displayName(); + final String defaultCharSet = Charset.defaultCharset() + .displayName(); byte[] byteArrray = inputString.getBytes(); @@ -50,8 +51,8 @@ public class StringToByteArrayUnitTest { @Test public void whenGetBytesWithCharset_thenOK() { - final String inputString = "Hello World!"; - final Charset charset = Charset.forName("UTF-8"); + final String inputString = "Hello ਸੰਸਾਰ!"; + final Charset charset = Charset.forName("ASCII"); byte[] byteArrray = inputString.getBytes(charset); @@ -59,8 +60,8 @@ public class StringToByteArrayUnitTest { "Using Charset:%s, Input String:%s, Output byte array:%s\n", charset, inputString, Arrays.toString(byteArrray)); - assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, - 108, 100, 33 }, + assertArrayEquals( + new byte[] { 72, 101, 108, 108, 111, 32, 63, 63, 63, 63, 63, 33 }, byteArrray); } @@ -82,37 +83,39 @@ public class StringToByteArrayUnitTest { @Test public void whenEncodeWithCharset_thenOK() { - final String inputString = "Hello World!"; - final Charset charset = StandardCharsets.UTF_8; + final String inputString = "Hello ਸੰਸਾਰ!"; + final Charset charset = StandardCharsets.US_ASCII; - byte[] byteArrray = charset.encode(inputString).array(); + byte[] byteArrray = charset.encode(inputString) + .array(); System.out.printf( "Using encode with Charset:%s, Input String:%s, Output byte array:%s\n", charset, inputString, Arrays.toString(byteArrray)); - assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, - 108, 100, 33, 0 }, + assertArrayEquals( + new byte[] { 72, 101, 108, 108, 111, 32, 63, 63, 63, 63, 63, 33 }, byteArrray); } @Test public void whenUsingCharsetEncoder_thenOK() throws CharacterCodingException { - final String inputString = "Hello World!"; - CharsetEncoder encoder = Charset.forName("UTF-8").newEncoder(); + final String inputString = "Hello ਸੰਸਾਰ!"; + CharsetEncoder encoder = StandardCharsets.US_ASCII.newEncoder(); encoder.onMalformedInput(CodingErrorAction.IGNORE) .onUnmappableCharacter(CodingErrorAction.REPLACE) .replaceWith(new byte[] { 0 }); - byte[] byteArrray = encoder.encode(CharBuffer.wrap(inputString)).array(); + byte[] byteArrray = encoder.encode(CharBuffer.wrap(inputString)) + .array(); System.out.printf( "Using encode with CharsetEncoder:%s, Input String:%s, Output byte array:%s\n", encoder, inputString, Arrays.toString(byteArrray)); - assertArrayEquals(new byte[] { 72, 101, 108, 108, 111, 32, 87, 111, 114, - 108, 100, 33, 0 }, + assertArrayEquals( + new byte[] { 72, 101, 108, 108, 111, 32, 0, 0, 0, 0, 0, 33 }, byteArrray); } From 9a6688f638db1d94de0447ea15e5215f4e654330 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Fri, 16 Nov 2018 14:45:51 -0500 Subject: [PATCH 056/429] initial code for implementation code --- hexagonal-architecture/.gitignore | 1 + hexagonal-architecture/pom.xml | 14 ++++ .../com/baeldung/hexagonal/Application.java | 27 +++++++ .../baeldung/hexagonal/domain/Employee.java | 70 +++++++++++++++++++ .../hexagonal/domain/EmployeeService.java | 26 +++++++ .../hexagonal/output/EmployeeCsvWriter.java | 64 +++++++++++++++++ .../hexagonal/output/EmployeeLogger.java | 17 +++++ .../hexagonal/output/EmployeeOutput.java | 9 +++ .../hexagonal/storage/EmployeeRepository.java | 11 +++ .../storage/InMemoryEmployeeRepository.java | 31 ++++++++ .../ui/EmployeeConsoleInputImpl.java | 53 ++++++++++++++ .../baeldung/hexagonal/ui/EmployeeInput.java | 7 ++ 12 files changed, 330 insertions(+) create mode 100644 hexagonal-architecture/.gitignore create mode 100644 hexagonal-architecture/pom.xml create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java create mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java diff --git a/hexagonal-architecture/.gitignore b/hexagonal-architecture/.gitignore new file mode 100644 index 0000000000..ae3c172604 --- /dev/null +++ b/hexagonal-architecture/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/hexagonal-architecture/pom.xml b/hexagonal-architecture/pom.xml new file mode 100644 index 0000000000..c8eceae21a --- /dev/null +++ b/hexagonal-architecture/pom.xml @@ -0,0 +1,14 @@ + + 4.0.0 + com.baeldung.hexagonal + hexagonal-architecture + jar + hexagonal-architecture + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + \ No newline at end of file diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java new file mode 100644 index 0000000000..4691d498f4 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java @@ -0,0 +1,27 @@ +package com.baeldung.hexagonal; + +import java.io.File; + +import com.baeldung.hexagonal.domain.EmployeeService; +import com.baeldung.hexagonal.output.EmployeeCsvWriter; +import com.baeldung.hexagonal.output.EmployeeLogger; +import com.baeldung.hexagonal.output.EmployeeOutput; +import com.baeldung.hexagonal.storage.EmployeeRepository; +import com.baeldung.hexagonal.storage.InMemoryEmployeeRepository; +import com.baeldung.hexagonal.ui.EmployeeConsoleInputImpl; +import com.baeldung.hexagonal.ui.EmployeeInput; + +public class Application { + + public static void main(String[] args) { + EmployeeRepository repository = new InMemoryEmployeeRepository(); + EmployeeOutput output = new EmployeeLogger(); + EmployeeOutput csvOutput = new EmployeeCsvWriter(new File(".").getAbsolutePath(), "output.csv"); + EmployeeService service = new EmployeeService(repository, csvOutput); + EmployeeInput ui = new EmployeeConsoleInputImpl(); + ui.collectData(service); + service.generateOutput(); + + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java new file mode 100644 index 0000000000..91b22d0d11 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java @@ -0,0 +1,70 @@ +package com.baeldung.hexagonal.domain; + +import java.math.BigDecimal; + +public class Employee { + private Long id; + private String firstName; + private String lastName; + private String employeeId; + private BigDecimal salary; + + public Employee( + Long id, + String firstName, + String lastName, + String employeeId, + BigDecimal salary) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + this.employeeId = employeeId; + this.salary = salary; + } + + 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; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getEmployeeId() { + return employeeId; + } + + public void setEmployeeId(String employeeId) { + this.employeeId = employeeId; + } + + public BigDecimal getSalary() { + return salary; + } + + public void setSalary(BigDecimal salary) { + this.salary = salary; + } + + @Override + public String toString() { + return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", employeeId=" + employeeId + ", salary=" + salary + "]"; + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java new file mode 100644 index 0000000000..12b2028035 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java @@ -0,0 +1,26 @@ +package com.baeldung.hexagonal.domain; + + +import java.util.List; + +import com.baeldung.hexagonal.output.EmployeeOutput; +import com.baeldung.hexagonal.storage.EmployeeRepository; + +public class EmployeeService { + private EmployeeRepository employeeRepository; + private EmployeeOutput employeeOutput; + + public EmployeeService(EmployeeRepository employeeRepository, EmployeeOutput employeeOutput) { + this.employeeRepository = employeeRepository; + this.employeeOutput = employeeOutput; + } + + public Long add(Employee employee) { + return employeeRepository.save(employee); + } + + public void generateOutput() { + List employees = employeeRepository.findAll(); + employeeOutput.writeAll(employees); + } +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java new file mode 100644 index 0000000000..c434d19525 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java @@ -0,0 +1,64 @@ +package com.baeldung.hexagonal.output; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Iterator; +import java.util.List; + +import com.baeldung.hexagonal.domain.Employee; + +public class EmployeeCsvWriter implements EmployeeOutput { + private File outputFile; + + public EmployeeCsvWriter(String path, String fileName) throws IllegalArgumentException { + if (fileName == null || path == null || fileName.length() == 0 || path.length() == 0) { + throw new IllegalArgumentException("Path and FileName are required"); + } else if (!fileName.endsWith(".csv")) { + throw new IllegalArgumentException("File name must be a .csv file"); + } + + System.out.println(path); + if (!path.endsWith("/")) path += "/"; + + outputFile = new File(path, fileName); + } + + @Override + public void writeAll(List employees) { + BufferedWriter writer = null; + + try { + writer = new BufferedWriter(new FileWriter(outputFile)); + for (Iterator it = employees.iterator(); it.hasNext();) { + Employee emp = it.next(); + StringBuffer empLine = new StringBuffer(); + empLine.append(emp.getId()); + empLine.append(","); + empLine.append(emp.getFirstName()); + empLine.append(","); + empLine.append(emp.getLastName()); + empLine.append(","); + empLine.append(emp.getEmployeeId()); + empLine.append(","); + empLine.append(emp.getSalary()); + writer.write(empLine.toString()); + writer.newLine(); + } + writer.flush(); + } catch (IOException ioe) { + //handle the exception + } finally { + if (writer != null) { + try { + writer.close(); + } catch (IOException e) { + //handle the exception + } + } + } + + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java new file mode 100644 index 0000000000..681e631012 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java @@ -0,0 +1,17 @@ +package com.baeldung.hexagonal.output; + +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.hexagonal.domain.Employee; + +public class EmployeeLogger implements EmployeeOutput { + private static final Logger LOG = LoggerFactory.getLogger(EmployeeLogger.class); + + @Override + public void writeAll(List employees) { + employees.forEach(employee -> LOG.info(employee.toString())); + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java new file mode 100644 index 0000000000..979c06e1f4 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java @@ -0,0 +1,9 @@ +package com.baeldung.hexagonal.output; + +import java.util.List; + +import com.baeldung.hexagonal.domain.Employee; + +public interface EmployeeOutput { + public void writeAll(List employees); +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java new file mode 100644 index 0000000000..f12584f8e1 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.hexagonal.storage; + +import java.util.List; + +import com.baeldung.hexagonal.domain.Employee; + +public interface EmployeeRepository { + public Long save(Employee employee); + public Employee findById(Long id); + public List findAll(); +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java new file mode 100644 index 0000000000..e860c16462 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java @@ -0,0 +1,31 @@ +package com.baeldung.hexagonal.storage; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.baeldung.hexagonal.domain.Employee; + +public class InMemoryEmployeeRepository implements EmployeeRepository { + private static Map employees = new HashMap<>(); + + @Override + public Long save(Employee employee) { + Long id = employee.getId(); + employees.put(id, employee); + return id; + } + + @Override + public Employee findById(Long id) { + return employees.get(id); + } + + @Override + public List findAll() { + List all = new ArrayList(employees.values()); + return all; + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java new file mode 100644 index 0000000000..5f613f7bf9 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java @@ -0,0 +1,53 @@ +package com.baeldung.hexagonal.ui; + +import java.math.BigDecimal; +import java.util.Scanner; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.hexagonal.domain.Employee; +import com.baeldung.hexagonal.domain.EmployeeService; + +public class EmployeeConsoleInputImpl implements EmployeeInput { + private static final Logger LOG = LoggerFactory.getLogger(EmployeeConsoleInputImpl.class); + + public void enterEmployee(EmployeeService service, Scanner scanner) { + + LOG.info("ID: "); + System.out.print("> "); + Long id = scanner.nextLong(); + LOG.info("First Name: "); + System.out.print("> "); + String firstName = scanner.next(); + LOG.info("Last Name: "); + System.out.print("> "); + String lastName = scanner.next(); + LOG.info("Employee ID: "); + System.out.print("> "); + String employeeId = scanner.next(); + LOG.info("Salary: " ); + System.out.print("> "); + BigDecimal salary = scanner.nextBigDecimal(); + + Employee employee = new Employee(id, firstName, lastName, employeeId, salary); + service.add(employee); + + } + + @Override + public void collectData(EmployeeService service) { + try (final Scanner scanner = new Scanner(System.in)) { + String keepGoing = "Y"; + do { + LOG.info("Enter information for an employee"); + enterEmployee(service, scanner); + LOG.info("Do you want to enter another employee? (Y/N)"); + System.out.print("> "); + keepGoing = scanner.next(); + if (keepGoing.length() > 1) keepGoing = keepGoing.substring(0, 1); + } while (keepGoing.equalsIgnoreCase("Y")); + } + } + +} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java new file mode 100644 index 0000000000..62156fc6d9 --- /dev/null +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java @@ -0,0 +1,7 @@ +package com.baeldung.hexagonal.ui; + +import com.baeldung.hexagonal.domain.EmployeeService; + +public interface EmployeeInput { + void collectData(EmployeeService service); +} From 35db28ccfb884d8f277c6bdb3adc4e5fa5f0bb1c Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Fri, 16 Nov 2018 16:40:46 -0500 Subject: [PATCH 057/429] formatting changes --- .../com/baeldung/hexagonal/Application.java | 1 - .../baeldung/hexagonal/domain/Employee.java | 2 +- .../hexagonal/domain/EmployeeService.java | 33 +++++++------- .../hexagonal/output/EmployeeCsvWriter.java | 16 ++++--- .../hexagonal/output/EmployeeLogger.java | 2 +- .../hexagonal/storage/EmployeeRepository.java | 8 ++-- .../ui/EmployeeConsoleInputImpl.java | 43 ++++++++++--------- .../baeldung/hexagonal/ui/EmployeeInput.java | 2 +- 8 files changed, 55 insertions(+), 52 deletions(-) diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java index 4691d498f4..237b664708 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java @@ -21,7 +21,6 @@ public class Application { EmployeeInput ui = new EmployeeConsoleInputImpl(); ui.collectData(service); service.generateOutput(); - } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java index 91b22d0d11..b785da1494 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java @@ -8,7 +8,7 @@ public class Employee { private String lastName; private String employeeId; private BigDecimal salary; - + public Employee( Long id, String firstName, diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java index 12b2028035..2ab3ce9712 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java @@ -1,26 +1,25 @@ package com.baeldung.hexagonal.domain; - import java.util.List; import com.baeldung.hexagonal.output.EmployeeOutput; import com.baeldung.hexagonal.storage.EmployeeRepository; public class EmployeeService { - private EmployeeRepository employeeRepository; - private EmployeeOutput employeeOutput; - - public EmployeeService(EmployeeRepository employeeRepository, EmployeeOutput employeeOutput) { - this.employeeRepository = employeeRepository; - this.employeeOutput = employeeOutput; - } - - public Long add(Employee employee) { - return employeeRepository.save(employee); - } - - public void generateOutput() { - List employees = employeeRepository.findAll(); - employeeOutput.writeAll(employees); - } + private EmployeeRepository employeeRepository; + private EmployeeOutput employeeOutput; + + public EmployeeService(EmployeeRepository employeeRepository, EmployeeOutput employeeOutput) { + this.employeeRepository = employeeRepository; + this.employeeOutput = employeeOutput; + } + + public Long add(Employee employee) { + return employeeRepository.save(employee); + } + + public void generateOutput() { + List employees = employeeRepository.findAll(); + employeeOutput.writeAll(employees); + } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java index c434d19525..6d364dd11b 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java @@ -11,24 +11,26 @@ import com.baeldung.hexagonal.domain.Employee; public class EmployeeCsvWriter implements EmployeeOutput { private File outputFile; - + public EmployeeCsvWriter(String path, String fileName) throws IllegalArgumentException { if (fileName == null || path == null || fileName.length() == 0 || path.length() == 0) { throw new IllegalArgumentException("Path and FileName are required"); } else if (!fileName.endsWith(".csv")) { throw new IllegalArgumentException("File name must be a .csv file"); } - + System.out.println(path); - if (!path.endsWith("/")) path += "/"; - + if (!path.endsWith("/")) { + path += "/"; + } + outputFile = new File(path, fileName); } @Override public void writeAll(List employees) { BufferedWriter writer = null; - + try { writer = new BufferedWriter(new FileWriter(outputFile)); for (Iterator it = employees.iterator(); it.hasNext();) { @@ -48,13 +50,13 @@ public class EmployeeCsvWriter implements EmployeeOutput { } writer.flush(); } catch (IOException ioe) { - //handle the exception + // handle the exception } finally { if (writer != null) { try { writer.close(); } catch (IOException e) { - //handle the exception + // handle the exception } } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java index 681e631012..5272d18961 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java @@ -11,7 +11,7 @@ public class EmployeeLogger implements EmployeeOutput { @Override public void writeAll(List employees) { - employees.forEach(employee -> LOG.info(employee.toString())); + employees.forEach(employee -> LOG.info(employee.toString())); } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java index f12584f8e1..2787601998 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java @@ -5,7 +5,9 @@ import java.util.List; import com.baeldung.hexagonal.domain.Employee; public interface EmployeeRepository { - public Long save(Employee employee); - public Employee findById(Long id); - public List findAll(); + public Long save(Employee employee); + + public Employee findById(Long id); + + public List findAll(); } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java index 5f613f7bf9..4960dfd254 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java @@ -13,26 +13,26 @@ public class EmployeeConsoleInputImpl implements EmployeeInput { private static final Logger LOG = LoggerFactory.getLogger(EmployeeConsoleInputImpl.class); public void enterEmployee(EmployeeService service, Scanner scanner) { - - LOG.info("ID: "); - System.out.print("> "); - Long id = scanner.nextLong(); - LOG.info("First Name: "); - System.out.print("> "); - String firstName = scanner.next(); - LOG.info("Last Name: "); - System.out.print("> "); - String lastName = scanner.next(); - LOG.info("Employee ID: "); - System.out.print("> "); - String employeeId = scanner.next(); - LOG.info("Salary: " ); - System.out.print("> "); - BigDecimal salary = scanner.nextBigDecimal(); - - Employee employee = new Employee(id, firstName, lastName, employeeId, salary); - service.add(employee); - + + LOG.info("ID: "); + System.out.print("> "); + Long id = scanner.nextLong(); + LOG.info("First Name: "); + System.out.print("> "); + String firstName = scanner.next(); + LOG.info("Last Name: "); + System.out.print("> "); + String lastName = scanner.next(); + LOG.info("Employee ID: "); + System.out.print("> "); + String employeeId = scanner.next(); + LOG.info("Salary: "); + System.out.print("> "); + BigDecimal salary = scanner.nextBigDecimal(); + + Employee employee = new Employee(id, firstName, lastName, employeeId, salary); + service.add(employee); + } @Override @@ -45,7 +45,8 @@ public class EmployeeConsoleInputImpl implements EmployeeInput { LOG.info("Do you want to enter another employee? (Y/N)"); System.out.print("> "); keepGoing = scanner.next(); - if (keepGoing.length() > 1) keepGoing = keepGoing.substring(0, 1); + if (keepGoing.length() > 1) + keepGoing = keepGoing.substring(0, 1); } while (keepGoing.equalsIgnoreCase("Y")); } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java index 62156fc6d9..adec2852cd 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java @@ -3,5 +3,5 @@ package com.baeldung.hexagonal.ui; import com.baeldung.hexagonal.domain.EmployeeService; public interface EmployeeInput { - void collectData(EmployeeService service); + void collectData(EmployeeService service); } From f1c3029c59c71eabfcd302956b4f93069d3cea02 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Sun, 18 Nov 2018 09:57:39 -0500 Subject: [PATCH 058/429] trim down Exmployee fields --- .../baeldung/hexagonal/domain/Employee.java | 80 ++++++++----------- .../hexagonal/output/EmployeeCsvWriter.java | 9 +-- .../ui/EmployeeConsoleInputImpl.java | 21 ++--- 3 files changed, 41 insertions(+), 69 deletions(-) diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java index b785da1494..0d883995b6 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java @@ -1,25 +1,12 @@ package com.baeldung.hexagonal.domain; -import java.math.BigDecimal; - public class Employee { private Long id; - private String firstName; - private String lastName; - private String employeeId; - private BigDecimal salary; + private String name; - public Employee( - Long id, - String firstName, - String lastName, - String employeeId, - BigDecimal salary) { + public Employee(Long id, String name) { this.id = id; - this.firstName = firstName; - this.lastName = lastName; - this.employeeId = employeeId; - this.salary = salary; + this.name = name; } public Long getId() { @@ -30,41 +17,44 @@ public class Employee { this.id = id; } - public String getFirstName() { - return firstName; + public String getName() { + return name; } - public void setFirstName(String firstName) { - this.firstName = firstName; - } - - public String getLastName() { - return lastName; - } - - public void setLastName(String lastName) { - this.lastName = lastName; - } - - public String getEmployeeId() { - return employeeId; - } - - public void setEmployeeId(String employeeId) { - this.employeeId = employeeId; - } - - public BigDecimal getSalary() { - return salary; - } - - public void setSalary(BigDecimal salary) { - this.salary = salary; + public void setName(String name) { + this.name = name; } @Override public String toString() { - return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", employeeId=" + employeeId + ", salary=" + salary + "]"; + return "Employee [id=" + id + ", name=" + name + "]"; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((id == null) ? 0 : id.hashCode()); + result = prime * result + ((name == null) ? 0 : name.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Employee other = (Employee) obj; + if (id == null) { + if (other.id != null) { + return false; + } + } else if (!id.equals(other.id)) { + return false; + } + + return true; } } diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java index 6d364dd11b..799fbc28ba 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java @@ -38,14 +38,7 @@ public class EmployeeCsvWriter implements EmployeeOutput { StringBuffer empLine = new StringBuffer(); empLine.append(emp.getId()); empLine.append(","); - empLine.append(emp.getFirstName()); - empLine.append(","); - empLine.append(emp.getLastName()); - empLine.append(","); - empLine.append(emp.getEmployeeId()); - empLine.append(","); - empLine.append(emp.getSalary()); - writer.write(empLine.toString()); + empLine.append(emp.getName()); writer.newLine(); } writer.flush(); diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java index 4960dfd254..77453da48f 100644 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java +++ b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java @@ -1,6 +1,5 @@ package com.baeldung.hexagonal.ui; -import java.math.BigDecimal; import java.util.Scanner; import org.slf4j.Logger; @@ -13,26 +12,15 @@ public class EmployeeConsoleInputImpl implements EmployeeInput { private static final Logger LOG = LoggerFactory.getLogger(EmployeeConsoleInputImpl.class); public void enterEmployee(EmployeeService service, Scanner scanner) { - LOG.info("ID: "); System.out.print("> "); Long id = scanner.nextLong(); - LOG.info("First Name: "); + LOG.info("Name: "); System.out.print("> "); - String firstName = scanner.next(); - LOG.info("Last Name: "); - System.out.print("> "); - String lastName = scanner.next(); - LOG.info("Employee ID: "); - System.out.print("> "); - String employeeId = scanner.next(); - LOG.info("Salary: "); - System.out.print("> "); - BigDecimal salary = scanner.nextBigDecimal(); + String name = scanner.next(); - Employee employee = new Employee(id, firstName, lastName, employeeId, salary); + Employee employee = new Employee(id, name); service.add(employee); - } @Override @@ -45,8 +33,9 @@ public class EmployeeConsoleInputImpl implements EmployeeInput { LOG.info("Do you want to enter another employee? (Y/N)"); System.out.print("> "); keepGoing = scanner.next(); - if (keepGoing.length() > 1) + if (keepGoing.length() > 1) { keepGoing = keepGoing.substring(0, 1); + } } while (keepGoing.equalsIgnoreCase("Y")); } } From 09e7119f89208eb42e535b3b4e1c9c85aa4cf108 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Sun, 18 Nov 2018 10:07:05 -0500 Subject: [PATCH 059/429] add new line to pom.xml --- hexagonal-architecture/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hexagonal-architecture/pom.xml b/hexagonal-architecture/pom.xml index c8eceae21a..d184576705 100644 --- a/hexagonal-architecture/pom.xml +++ b/hexagonal-architecture/pom.xml @@ -11,4 +11,4 @@ 0.0.1-SNAPSHOT ../parent-java - \ No newline at end of file + From 96d121bcae0f7925c6077c2299473a03ae6b8514 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Mon, 19 Nov 2018 00:04:52 +0530 Subject: [PATCH 060/429] [BAEL-9712] - Created spring-5-security-oauth module --- pom.xml | 4 ++ spring-5-security-oauth/README.md | 3 + spring-5-security-oauth/pom.xml | 68 +++++++++++++++++++ .../com/baeldung/oauth2/LoginController.java | 0 .../java/com/baeldung/oauth2/MvcConfig.java | 0 .../com/baeldung/oauth2/SecurityConfig.java | 4 +- .../oauth2/SpringOAuthApplication.java | 0 .../ExtractorsApplication.java | 0 .../configuration/SecurityConfig.java | 0 .../custom/BaeldungAuthoritiesExtractor.java | 0 .../custom/BaeldungPrincipalExtractor.java | 0 .../github/GithubAuthoritiesExtractor.java | 0 .../github/GithubPrincipalExtractor.java | 0 ...tion-oauth2-extractors-baeldung.properties | 0 ...cation-oauth2-extractors-github.properties | 0 .../resources/application-oauth2.properties | 0 .../src/main/resources/application.properties | 5 ++ .../src/main/resources/logback.xml | 13 ++++ .../src/main/resources/static/css/main.css | 8 +++ .../src/main/resources/templates/index.html | 11 +++ .../resources/templates/loginFailure.html | 0 .../resources/templates/loginSuccess.html | 0 .../templates/oauth2_extractors.html | 0 .../main/resources/templates/oauth_login.html | 0 .../main/resources/templates/securedPage.html | 0 .../oauth2extractors/ExtractorsUnitTest.java | 0 spring-5-security/README.md | 1 - spring-5-security/pom.xml | 15 ---- 28 files changed, 114 insertions(+), 18 deletions(-) create mode 100644 spring-5-security-oauth/README.md create mode 100644 spring-5-security-oauth/pom.xml rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2/LoginController.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2/MvcConfig.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2/SecurityConfig.java (95%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/resources/application-oauth2-extractors-baeldung.properties (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/resources/application-oauth2-extractors-github.properties (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/resources/application-oauth2.properties (100%) create mode 100644 spring-5-security-oauth/src/main/resources/application.properties create mode 100644 spring-5-security-oauth/src/main/resources/logback.xml create mode 100644 spring-5-security-oauth/src/main/resources/static/css/main.css create mode 100644 spring-5-security-oauth/src/main/resources/templates/index.html rename {spring-5-security => spring-5-security-oauth}/src/main/resources/templates/loginFailure.html (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/resources/templates/loginSuccess.html (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/resources/templates/oauth2_extractors.html (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/resources/templates/oauth_login.html (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/resources/templates/securedPage.html (100%) rename {spring-5-security => spring-5-security-oauth}/src/test/java/com/baeldung/oauth2extractors/ExtractorsUnitTest.java (100%) diff --git a/pom.xml b/pom.xml index 5ebf7ba4f3..0997d7ce88 100644 --- a/pom.xml +++ b/pom.xml @@ -466,6 +466,7 @@ spring-5-reactive-client spring-5-mvc spring-5-security + spring-5-security-oauth spring-5-reactive-oauth spring-activiti spring-akka @@ -768,6 +769,7 @@ spring-5-reactive-client spring-5-reactive-security spring-5-security + spring-5-security-oauth spring-activiti spring-akka spring-all @@ -994,6 +996,7 @@ spring-5-reactive-client spring-5-mvc spring-5-security + spring-5-security-oauth spring-activiti spring-akka spring-amqp @@ -1385,6 +1388,7 @@ spring-5-reactive-client spring-5-mvc spring-5-security + spring-5-security-oauth spring-activiti spring-akka spring-amqp diff --git a/spring-5-security-oauth/README.md b/spring-5-security-oauth/README.md new file mode 100644 index 0000000000..81d95c07d7 --- /dev/null +++ b/spring-5-security-oauth/README.md @@ -0,0 +1,3 @@ +## Relevant articles: + +- [Spring Security 5 -OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login) \ No newline at end of file diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml new file mode 100644 index 0000000000..a741daaa18 --- /dev/null +++ b/spring-5-security-oauth/pom.xml @@ -0,0 +1,68 @@ + + 4.0.0 + com.baeldung + spring-5-security-oauth + 0.0.1-SNAPSHOT + jar + spring-5-security-oauth + spring 5 security oauth sample project + + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../parent-boot-2 + + + + + + org.springframework.boot + spring-boot-starter-security + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity5 + + + + + org.springframework.security.oauth.boot + spring-security-oauth2-autoconfigure + ${oauth-auto.version} + + + org.springframework.security + spring-security-oauth2-client + + + org.springframework.security + spring-security-oauth2-jose + + + + org.springframework + spring-test + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.security + spring-security-test + test + + + + diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/LoginController.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LoginController.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2/LoginController.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LoginController.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/MvcConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/MvcConfig.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2/MvcConfig.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/MvcConfig.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java similarity index 95% rename from spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java index b45f325767..e08057d92f 100644 --- a/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java @@ -12,7 +12,7 @@ import org.springframework.core.env.Environment; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.oauth2.client.CommonOAuth2Provider; -import org.springframework.security.oauth2.client.endpoint.NimbusAuthorizationCodeTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient; import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; import org.springframework.security.oauth2.client.registration.ClientRegistration; @@ -54,7 +54,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public OAuth2AccessTokenResponseClient accessTokenResponseClient() { - return new NimbusAuthorizationCodeTokenResponseClient(); + return new DefaultAuthorizationCodeTokenResponseClient(); } diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SpringOAuthApplication.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/ExtractorsApplication.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/configuration/SecurityConfig.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungAuthoritiesExtractor.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/custom/BaeldungPrincipalExtractor.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubAuthoritiesExtractor.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2extractors/extractor/github/GithubPrincipalExtractor.java diff --git a/spring-5-security/src/main/resources/application-oauth2-extractors-baeldung.properties b/spring-5-security-oauth/src/main/resources/application-oauth2-extractors-baeldung.properties similarity index 100% rename from spring-5-security/src/main/resources/application-oauth2-extractors-baeldung.properties rename to spring-5-security-oauth/src/main/resources/application-oauth2-extractors-baeldung.properties diff --git a/spring-5-security/src/main/resources/application-oauth2-extractors-github.properties b/spring-5-security-oauth/src/main/resources/application-oauth2-extractors-github.properties similarity index 100% rename from spring-5-security/src/main/resources/application-oauth2-extractors-github.properties rename to spring-5-security-oauth/src/main/resources/application-oauth2-extractors-github.properties diff --git a/spring-5-security/src/main/resources/application-oauth2.properties b/spring-5-security-oauth/src/main/resources/application-oauth2.properties similarity index 100% rename from spring-5-security/src/main/resources/application-oauth2.properties rename to spring-5-security-oauth/src/main/resources/application-oauth2.properties diff --git a/spring-5-security-oauth/src/main/resources/application.properties b/spring-5-security-oauth/src/main/resources/application.properties new file mode 100644 index 0000000000..5912b0f755 --- /dev/null +++ b/spring-5-security-oauth/src/main/resources/application.properties @@ -0,0 +1,5 @@ +server.port=8081 + +logging.level.root=INFO + +logging.level.com.baeldung.dsl.ClientErrorLoggingFilter=DEBUG \ No newline at end of file diff --git a/spring-5-security-oauth/src/main/resources/logback.xml b/spring-5-security-oauth/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-5-security-oauth/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-5-security-oauth/src/main/resources/static/css/main.css b/spring-5-security-oauth/src/main/resources/static/css/main.css new file mode 100644 index 0000000000..febc353af7 --- /dev/null +++ b/spring-5-security-oauth/src/main/resources/static/css/main.css @@ -0,0 +1,8 @@ +p.error { + font-weight: bold; + color: red; +} + +div.logout { + margin-right: 2em;; +} diff --git a/spring-5-security-oauth/src/main/resources/templates/index.html b/spring-5-security-oauth/src/main/resources/templates/index.html new file mode 100644 index 0000000000..4216d74037 --- /dev/null +++ b/spring-5-security-oauth/src/main/resources/templates/index.html @@ -0,0 +1,11 @@ + + + + Home + + + + Home + Welcome! + + \ No newline at end of file diff --git a/spring-5-security/src/main/resources/templates/loginFailure.html b/spring-5-security-oauth/src/main/resources/templates/loginFailure.html similarity index 100% rename from spring-5-security/src/main/resources/templates/loginFailure.html rename to spring-5-security-oauth/src/main/resources/templates/loginFailure.html diff --git a/spring-5-security/src/main/resources/templates/loginSuccess.html b/spring-5-security-oauth/src/main/resources/templates/loginSuccess.html similarity index 100% rename from spring-5-security/src/main/resources/templates/loginSuccess.html rename to spring-5-security-oauth/src/main/resources/templates/loginSuccess.html diff --git a/spring-5-security/src/main/resources/templates/oauth2_extractors.html b/spring-5-security-oauth/src/main/resources/templates/oauth2_extractors.html similarity index 100% rename from spring-5-security/src/main/resources/templates/oauth2_extractors.html rename to spring-5-security-oauth/src/main/resources/templates/oauth2_extractors.html diff --git a/spring-5-security/src/main/resources/templates/oauth_login.html b/spring-5-security-oauth/src/main/resources/templates/oauth_login.html similarity index 100% rename from spring-5-security/src/main/resources/templates/oauth_login.html rename to spring-5-security-oauth/src/main/resources/templates/oauth_login.html diff --git a/spring-5-security/src/main/resources/templates/securedPage.html b/spring-5-security-oauth/src/main/resources/templates/securedPage.html similarity index 100% rename from spring-5-security/src/main/resources/templates/securedPage.html rename to spring-5-security-oauth/src/main/resources/templates/securedPage.html diff --git a/spring-5-security/src/test/java/com/baeldung/oauth2extractors/ExtractorsUnitTest.java b/spring-5-security-oauth/src/test/java/com/baeldung/oauth2extractors/ExtractorsUnitTest.java similarity index 100% rename from spring-5-security/src/test/java/com/baeldung/oauth2extractors/ExtractorsUnitTest.java rename to spring-5-security-oauth/src/test/java/com/baeldung/oauth2extractors/ExtractorsUnitTest.java diff --git a/spring-5-security/README.md b/spring-5-security/README.md index 55fa7ab042..6e094e928f 100644 --- a/spring-5-security/README.md +++ b/spring-5-security/README.md @@ -1,6 +1,5 @@ ## Relevant articles: -- [Spring Security 5 -OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login) - [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) diff --git a/spring-5-security/pom.xml b/spring-5-security/pom.xml index da62f39fa9..51ce822dc4 100644 --- a/spring-5-security/pom.xml +++ b/spring-5-security/pom.xml @@ -34,21 +34,6 @@ thymeleaf-extras-springsecurity5 - - - org.springframework.security.oauth.boot - spring-security-oauth2-autoconfigure - ${oauth-auto.version} - - - org.springframework.security - spring-security-oauth2-client - - - org.springframework.security - spring-security-oauth2-jose - - org.springframework spring-test From a32cb1a48968e1a33fa0fa161b2c9d12a2eaf132 Mon Sep 17 00:00:00 2001 From: TINO Date: Sun, 18 Nov 2018 21:53:48 +0300 Subject: [PATCH 061/429] BAEL - 1511 --- rxjava-2/pom.xml | 8 ++ ...yncAndSyncToObservableIntegrationTest.java | 103 ++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 rxjava-2/src/test/java/com/baeldung/rxjava/AsyncAndSyncToObservableIntegrationTest.java diff --git a/rxjava-2/pom.xml b/rxjava-2/pom.xml index a18b096b6d..f437a6005b 100644 --- a/rxjava-2/pom.xml +++ b/rxjava-2/pom.xml @@ -34,6 +34,13 @@ rxrelay ${rxrelay.version} + + + com.github.akarnokd + rxjava2-extensions + ${rxjava2.ext.version} + + @@ -41,5 +48,6 @@ 2.2.2 1.7.0 2.0.0 + 0.20.4 \ No newline at end of file diff --git a/rxjava-2/src/test/java/com/baeldung/rxjava/AsyncAndSyncToObservableIntegrationTest.java b/rxjava-2/src/test/java/com/baeldung/rxjava/AsyncAndSyncToObservableIntegrationTest.java new file mode 100644 index 0000000000..a646b453ff --- /dev/null +++ b/rxjava-2/src/test/java/com/baeldung/rxjava/AsyncAndSyncToObservableIntegrationTest.java @@ -0,0 +1,103 @@ +package com.baeldung.rxjava; + +import static org.junit.Assert.assertEquals; + +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicInteger; + +import org.junit.Test; + +import hu.akarnokd.rxjava2.async.AsyncObservable; +import io.reactivex.Observable; + +public class AsyncAndSyncToObservableIntegrationTest { + + AtomicInteger counter = new AtomicInteger(); + Callable callable = () -> counter.incrementAndGet(); + + @Test + public void givenSyncMethod_whenConvertedWithFromCallable_thenReturnObservable() {// method will execute every time it gets subscribed + + Observable source = Observable.fromCallable(callable); + + for (int i = 1; i < 5; i++) { + source.test() + .awaitDone(5, TimeUnit.SECONDS) + .assertResult(i); + + assertEquals(i, counter.get()); + } + } + + @Test + public void givenSyncMethod_whenConvertedWithStart_thenReturnObservable() {// method will execute only once and cache its result. + + Observable source = AsyncObservable.start(callable); + + for (int i = 1; i < 5; i++) { + source.test() + .awaitDone(5, TimeUnit.SECONDS) + .assertResult(1); + + assertEquals(1, counter.get()); + } + } + + @Test + public void givenAsyncMethod_whenConvertedWithFromFuture_thenRetrunObservble() { // method will execute only once and cache its result. + + ExecutorService executor = Executors.newSingleThreadExecutor(); + Future future = executor.submit(callable); + Observable source = Observable.fromFuture(future); + + for (int i = 1; i < 5; i++) { + source.test() + .awaitDone(5, TimeUnit.SECONDS) + .assertResult(1); + + assertEquals(1, counter.get()); + } + + executor.shutdown(); + } + + @Test + public void givenAsyncMethod_whenConvertedWithStartFuture_thenRetrunObservble() {// method will execute every time it gets subscribed + + ExecutorService executor = Executors.newSingleThreadExecutor(); + Observable source = AsyncObservable.startFuture(() -> executor.submit(callable)); + + for (int i = 1; i < 5; i++) { + source.test() + .awaitDone(5, TimeUnit.SECONDS) + .assertResult(i); + + assertEquals(i, counter.get()); + } + + executor.shutdown(); + } + + @Test + public void givenAsyncMethod_whenConvertedWithDeferFuture_thenRetrunObservble() { // method will execute only once and cache its result. + + List list = Arrays.asList(new Integer[] { counter.incrementAndGet(), counter.incrementAndGet(), counter.incrementAndGet() }); + ExecutorService exec = Executors.newSingleThreadExecutor(); + Callable> callable = () -> Observable.fromIterable(list); + Observable source = AsyncObservable.deferFuture(() -> exec.submit(callable)); + for (int i = 1; i < 4; i++) { + source.test() + .awaitDone(5, TimeUnit.SECONDS) + .assertResult(1, 2, 3); + } + + exec.shutdown(); + } + +} From ef541ac96a93f4d9b6236ee0393ecfa9f8faf165 Mon Sep 17 00:00:00 2001 From: Kevin Gilmore Date: Sun, 18 Nov 2018 22:46:55 -0600 Subject: [PATCH 062/429] BAEL-2166 BAEL-2302 add links back to articles --- java-strings/README.md | 1 + spring-data-rest/README.md | 1 + 2 files changed, 2 insertions(+) diff --git a/java-strings/README.md b/java-strings/README.md index 1b24a2b821..2847a0d0a8 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -36,3 +36,4 @@ - [String Performance Hints](https://www.baeldung.com/java-string-performance) - [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences) - [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) diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md index 09f8391406..db94a86a6f 100644 --- a/spring-data-rest/README.md +++ b/spring-data-rest/README.md @@ -20,3 +20,4 @@ To view the running application, visit [http://localhost:8080](http://localhost: - [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 456f4b0f5a5a6a6ab0f6685c7cb84107728f320b Mon Sep 17 00:00:00 2001 From: cror Date: Mon, 19 Nov 2018 16:41:11 +0100 Subject: [PATCH 063/429] BAEL-2388: examples for equals and hashCode --- java-collections-maps/pom.xml | 6 +++ .../java/com/baeldung/map/hashCode/Money.java | 32 +++++++++++++ .../java/com/baeldung/map/hashCode/Team.java | 39 ++++++++++++++++ .../com/baeldung/map/hashCode/Voucher.java | 31 +++++++++++++ .../com/baeldung/map/hashCode/WrongTeam.java | 24 ++++++++++ .../baeldung/map/hashCode/WrongVoucher.java | 33 +++++++++++++ .../map/hashCode/equalsverifier_notes.txt | 1 + .../baeldung/map/hashCode/MoneyUnitTest.java | 27 +++++++++++ .../baeldung/map/hashCode/TeamUnitTest.java | 46 +++++++++++++++++++ 9 files changed, 239 insertions(+) create mode 100644 java-collections-maps/src/main/java/com/baeldung/map/hashCode/Money.java create mode 100644 java-collections-maps/src/main/java/com/baeldung/map/hashCode/Team.java create mode 100644 java-collections-maps/src/main/java/com/baeldung/map/hashCode/Voucher.java create mode 100644 java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongTeam.java create mode 100644 java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongVoucher.java create mode 100644 java-collections-maps/src/main/java/com/baeldung/map/hashCode/equalsverifier_notes.txt create mode 100644 java-collections-maps/src/test/java/com/baeldung/map/hashCode/MoneyUnitTest.java create mode 100644 java-collections-maps/src/test/java/com/baeldung/map/hashCode/TeamUnitTest.java diff --git a/java-collections-maps/pom.xml b/java-collections-maps/pom.xml index 0803866c51..6af8f7a5c6 100644 --- a/java-collections-maps/pom.xml +++ b/java-collections-maps/pom.xml @@ -41,6 +41,12 @@ streamex 0.6.5 + + nl.jqno.equalsverifier + equalsverifier + 3.0.3 + test + diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Money.java b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Money.java new file mode 100644 index 0000000000..0ba494d944 --- /dev/null +++ b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Money.java @@ -0,0 +1,32 @@ +package com.baeldung.map.hashcode; + +class Money { + + int amount; + String currencyCode; + + Money(int amount, String currencyCode) { + this.amount = amount; + this.currencyCode = currencyCode; + } + + @Override + public boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof Money)) + return false; + Money other = (Money)o; + return this.amount == other.amount + && this.currencyCode == other.currencyCode; + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + amount; + result = 31 * result + currencyCode.hashCode(); + return result; + } + +} diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Team.java b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Team.java new file mode 100644 index 0000000000..6c1473b8e9 --- /dev/null +++ b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Team.java @@ -0,0 +1,39 @@ +package com.baeldung.map.hashcode; + +class Team { + + final String city; + final String department; + + Team(String city, String department) { + this.city = city; + this.department = department; + } + + @Override + public final boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof Team)) + return false; + Team otherTeam = (Team)o; + boolean cityEquals = (this.city == null && otherTeam.city == null) + || this.city != null && this.city.equals(otherTeam.city); + boolean departmentEquals = (this.department == null && otherTeam.department == null) + || this.department != null && this.department.equals(otherTeam.department); + return cityEquals && departmentEquals; + } + + @Override + public final int hashCode() { + int result = 17; + if (city != null) { + result = 31 * result + city.hashCode(); + } + if (department != null) { + result = 31 * result + department.hashCode(); + } + return result; + } + +} diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Voucher.java b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Voucher.java new file mode 100644 index 0000000000..b4536b38ea --- /dev/null +++ b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Voucher.java @@ -0,0 +1,31 @@ +package com.baeldung.map.hashcode; + +class Voucher { + + private Money value; + private String store; + + Voucher(int amount, String currencyCode, String store) { + this.value = new Money(amount, currencyCode); + this.store = store; + } + + @Override + public boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof Voucher)) + return false; + Voucher other = (Voucher)o; + return this.value == other.value + && this.store == other.store; + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + value.hashCode(); + result = 31 * result + store.hashCode(); + return result; + } +} \ No newline at end of file diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongTeam.java b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongTeam.java new file mode 100644 index 0000000000..57fb218ce0 --- /dev/null +++ b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongTeam.java @@ -0,0 +1,24 @@ +package com.baeldung.map.hashcode; + +class WrongTeam { + + String city; + String department; + + WrongTeam(String city, String department) { + this.city = city; + this.department = department; + } + + @Override + public boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof WrongTeam)) + return false; + WrongTeam otherTeam = (WrongTeam)o; + return this.city == otherTeam.city + && this.department == otherTeam.department; + } + +} diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongVoucher.java b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongVoucher.java new file mode 100644 index 0000000000..03122c7cc8 --- /dev/null +++ b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongVoucher.java @@ -0,0 +1,33 @@ +package com.baeldung.map.hashcode; + +class WrongVoucher extends Money { + + private String store; + + WrongVoucher(int amount, String currencyCode, String store) { + super(amount, currencyCode); + + this.store = store; + } + + @Override + public boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof WrongVoucher)) + return false; + WrongVoucher other = (WrongVoucher)o; + return this.amount == other.amount + && this.currencyCode == other.currencyCode + && this.store == other.store; + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + amount; + result = 31 * result + currencyCode.hashCode(); + result = 31 * result + store.hashCode(); + return result; + } +} \ No newline at end of file diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/equalsverifier_notes.txt b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/equalsverifier_notes.txt new file mode 100644 index 0000000000..adc14f393a --- /dev/null +++ b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/equalsverifier_notes.txt @@ -0,0 +1 @@ + Non-nullity: hashCode throws NullPointerException on field city. diff --git a/java-collections-maps/src/test/java/com/baeldung/map/hashCode/MoneyUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/hashCode/MoneyUnitTest.java new file mode 100644 index 0000000000..f4cba4d114 --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/map/hashCode/MoneyUnitTest.java @@ -0,0 +1,27 @@ +package com.baeldung.map.hashcode; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertFalse; + +import org.junit.Test; + +public class MoneyUnitTest { + + @Test + public void givenMoneyInstancesWithSameAmountAndCurrency_whenEquals_thenReturnsTrue() { + Money income = new Money(55, "USD"); + Money expenses = new Money(55, "USD"); + + assertTrue(income.equals(expenses)); + } + + @Test + public void givenMoneyAndVoucherInstances_whenEquals_thenReturnValuesArentSymmetric() { + Money cash = new Money(42, "USD"); + WrongVoucher voucher = new WrongVoucher(42, "USD", "Amazon"); + + assertFalse(voucher.equals(cash)); + assertTrue(cash.equals(voucher)); + } + +} diff --git a/java-collections-maps/src/test/java/com/baeldung/map/hashCode/TeamUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/map/hashCode/TeamUnitTest.java new file mode 100644 index 0000000000..89a7462438 --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/map/hashCode/TeamUnitTest.java @@ -0,0 +1,46 @@ +package com.baeldung.map.hashcode; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +import java.util.HashMap; +import java.util.Map; + +import org.junit.Test; + +import nl.jqno.equalsverifier.EqualsVerifier; + +public class TeamUnitTest { + + @Test + public void givenMapKeyWithHashCode_whenSearched_thenReturnsCorrectValue() { + Map leaders = new HashMap<>(); + leaders.put(new Team("New York", "development"), "Anne"); + leaders.put(new Team("Boston", "development"), "Brian"); + leaders.put(new Team("Boston", "marketing"), "Charlie"); + + Team myTeam = new Team("New York", "development"); + String myTeamleader = leaders.get(myTeam); + + assertEquals("Anne", myTeamleader); + } + + @Test + public void givenMapKeyWithoutHashCode_whenSearched_thenReturnsWrongValue() { + Map leaders = new HashMap<>(); + leaders.put(new WrongTeam("New York", "development"), "Anne"); + leaders.put(new WrongTeam("Boston", "development"), "Brian"); + leaders.put(new WrongTeam("Boston", "marketing"), "Charlie"); + + WrongTeam myTeam = new WrongTeam("New York", "development"); + String myTeamleader = leaders.get(myTeam); + + assertFalse("Anne".equals(myTeamleader)); + } + + @Test + public void equalsContract() { + EqualsVerifier.forClass(Team.class).verify(); + } + +} From cd8a9fd89a059beb8d709e5eebb04479ccb0d897 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Mon, 19 Nov 2018 22:57:27 +0200 Subject: [PATCH 064/429] Update spring.factories --- .../src/main/resources/META-INF/spring.factories | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/spring-boot-autoconfiguration/src/main/resources/META-INF/spring.factories b/spring-boot-autoconfiguration/src/main/resources/META-INF/spring.factories index 5f55544eff..11c775fc6c 100644 --- a/spring-boot-autoconfiguration/src/main/resources/META-INF/spring.factories +++ b/spring-boot-autoconfiguration/src/main/resources/META-INF/spring.factories @@ -1,3 +1 @@ -org.springframework.boot.diagnostics.FailureAnalyzer=com.baeldung.failureanalyzer.MyBeanNotOfRequiredTypeFailureAnalyzer - -org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfiguration.MySQLAutoconfiguration \ No newline at end of file +org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.baeldung.autoconfiguration.MySQLAutoconfiguration From a67c10eec7ff0d733c1ed86f6f590147c4bb7140 Mon Sep 17 00:00:00 2001 From: cror Date: Tue, 20 Nov 2018 13:01:06 +0100 Subject: [PATCH 065/429] BAEL-2388: moved examples java-collections-maps -> core-java-long. Fixing String comparisons --- core-java-lang/pom.xml | 7 +++ .../com/baeldung/equalshashcode}/Money.java | 10 ++-- .../com/baeldung/equalshashcode}/Team.java | 2 +- .../com/baeldung/equalshashcode/Voucher.java | 38 +++++++++++++++ .../baeldung/equalshashcode}/WrongTeam.java | 8 +++- .../baeldung/equalshashcode/WrongVoucher.java | 47 +++++++++++++++++++ .../equalshashcode}/MoneyUnitTest.java | 2 +- .../equalshashcode}/TeamUnitTest.java | 2 +- java-collections-maps/pom.xml | 6 --- .../com/baeldung/map/hashCode/Voucher.java | 31 ------------ .../baeldung/map/hashCode/WrongVoucher.java | 33 ------------- .../map/hashCode/equalsverifier_notes.txt | 1 - 12 files changed, 109 insertions(+), 78 deletions(-) rename {java-collections-maps/src/main/java/com/baeldung/map/hashCode => core-java-lang/src/main/java/com/baeldung/equalshashcode}/Money.java (60%) rename {java-collections-maps/src/main/java/com/baeldung/map/hashCode => core-java-lang/src/main/java/com/baeldung/equalshashcode}/Team.java (96%) create mode 100644 core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java rename {java-collections-maps/src/main/java/com/baeldung/map/hashCode => core-java-lang/src/main/java/com/baeldung/equalshashcode}/WrongTeam.java (67%) create mode 100644 core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java rename {java-collections-maps/src/test/java/com/baeldung/map/hashCode => core-java-lang/src/test/java/com/baeldung/equalshashcode}/MoneyUnitTest.java (94%) rename {java-collections-maps/src/test/java/com/baeldung/map/hashCode => core-java-lang/src/test/java/com/baeldung/equalshashcode}/TeamUnitTest.java (97%) delete mode 100644 java-collections-maps/src/main/java/com/baeldung/map/hashCode/Voucher.java delete mode 100644 java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongVoucher.java delete mode 100644 java-collections-maps/src/main/java/com/baeldung/map/hashCode/equalsverifier_notes.txt diff --git a/core-java-lang/pom.xml b/core-java-lang/pom.xml index ace39de274..2f307859f1 100644 --- a/core-java-lang/pom.xml +++ b/core-java-lang/pom.xml @@ -66,6 +66,12 @@ mail ${javax.mail.version} + + nl.jqno.equalsverifier + equalsverifier + ${equalsverifier.version} + test + @@ -424,6 +430,7 @@ 3.1.1 2.0.3.RELEASE 1.6.0 + 3.0.3 diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Money.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java similarity index 60% rename from java-collections-maps/src/main/java/com/baeldung/map/hashCode/Money.java rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java index 0ba494d944..60c043545d 100644 --- a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Money.java +++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java @@ -1,4 +1,4 @@ -package com.baeldung.map.hashcode; +package com.baeldung.equalshashcode; class Money { @@ -17,15 +17,19 @@ class Money { if (!(o instanceof Money)) return false; Money other = (Money)o; + boolean currencyCodeEquals = (this.currencyCode == null && other.currencyCode == null) + || (this.currencyCode != null && this.currencyCode.equals(other.currencyCode)); return this.amount == other.amount - && this.currencyCode == other.currencyCode; + && currencyCodeEquals; } @Override public int hashCode() { int result = 17; result = 31 * result + amount; - result = 31 * result + currencyCode.hashCode(); + if (currencyCode != null) { + result = 31 * result + currencyCode.hashCode(); + } return result; } diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Team.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java similarity index 96% rename from java-collections-maps/src/main/java/com/baeldung/map/hashCode/Team.java rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java index 6c1473b8e9..c2dee1de6b 100644 --- a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Team.java +++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java @@ -1,4 +1,4 @@ -package com.baeldung.map.hashcode; +package com.baeldung.equalshashcode; class Team { diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java new file mode 100644 index 0000000000..19f46e0358 --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java @@ -0,0 +1,38 @@ +package com.baeldung.equalshashcode; + +class Voucher { + + private Money value; + private String store; + + Voucher(int amount, String currencyCode, String store) { + this.value = new Money(amount, currencyCode); + this.store = store; + } + + @Override + public boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof Voucher)) + return false; + Voucher other = (Voucher)o; + boolean valueEquals = (this.value == null && other.value == null) + || (this.value != null && this.value.equals(other.value)); + boolean storeEquals = (this.store == null && other.store == null) + || (this.store != null && this.store.equals(other.store)); + return valueEquals && storeEquals; + } + + @Override + public int hashCode() { + int result = 17; + if (this.value != null) { + result = 31 * result + value.hashCode(); + } + if (this.store != null) { + result = 31 * result + store.hashCode(); + } + return result; + } +} \ No newline at end of file diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongTeam.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java similarity index 67% rename from java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongTeam.java rename to core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java index 57fb218ce0..c4477aa790 100644 --- a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongTeam.java +++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java @@ -1,5 +1,11 @@ -package com.baeldung.map.hashcode; +package com.baeldung.equalshashcode; +/* (non-Javadoc) +* This class overrides equals, but it doesn't override hashCode. +* +* To see which problems this leads to: +* TeamUnitTest.givenMapKeyWithoutHashCode_whenSearched_thenReturnsWrongValue +*/ class WrongTeam { String city; diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java new file mode 100644 index 0000000000..97935bf8de --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java @@ -0,0 +1,47 @@ +package com.baeldung.equalshashcode; + +/* (non-Javadoc) +* This class extends the Money class that has overridden the equals method and once again overrides the equals method. +* +* To see which problems this leads to: +* MoneyUnitTest.givenMoneyAndVoucherInstances_whenEquals_thenReturnValuesArentSymmetric +*/ +class WrongVoucher extends Money { + + private String store; + + WrongVoucher(int amount, String currencyCode, String store) { + super(amount, currencyCode); + + this.store = store; + } + + @Override + public boolean equals(Object o) { + if (o == this) + return true; + if (!(o instanceof WrongVoucher)) + return false; + WrongVoucher other = (WrongVoucher)o; + boolean currencyCodeEquals = (this.currencyCode == null && other.currencyCode == null) + || (this.currencyCode != null && this.currencyCode.equals(other.currencyCode)); + boolean storeEquals = (this.store == null && other.store == null) + || (this.store != null && this.store.equals(other.store)); + return this.amount == other.amount + && currencyCodeEquals + && storeEquals; + } + + @Override + public int hashCode() { + int result = 17; + result = 31 * result + amount; + if (this.currencyCode != null) { + result = 31 * result + currencyCode.hashCode(); + } + if (this.store != null) { + result = 31 * result + store.hashCode(); + } + return result; + } +} \ No newline at end of file diff --git a/java-collections-maps/src/test/java/com/baeldung/map/hashCode/MoneyUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java similarity index 94% rename from java-collections-maps/src/test/java/com/baeldung/map/hashCode/MoneyUnitTest.java rename to core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java index f4cba4d114..60584fdb53 100644 --- a/java-collections-maps/src/test/java/com/baeldung/map/hashCode/MoneyUnitTest.java +++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.map.hashcode; +package com.baeldung.equalshashcode; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertFalse; diff --git a/java-collections-maps/src/test/java/com/baeldung/map/hashCode/TeamUnitTest.java b/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java similarity index 97% rename from java-collections-maps/src/test/java/com/baeldung/map/hashCode/TeamUnitTest.java rename to core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java index 89a7462438..a2de408796 100644 --- a/java-collections-maps/src/test/java/com/baeldung/map/hashCode/TeamUnitTest.java +++ b/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.map.hashcode; +package com.baeldung.equalshashcode; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; diff --git a/java-collections-maps/pom.xml b/java-collections-maps/pom.xml index 6af8f7a5c6..0803866c51 100644 --- a/java-collections-maps/pom.xml +++ b/java-collections-maps/pom.xml @@ -41,12 +41,6 @@ streamex 0.6.5 - - nl.jqno.equalsverifier - equalsverifier - 3.0.3 - test - diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Voucher.java b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Voucher.java deleted file mode 100644 index b4536b38ea..0000000000 --- a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/Voucher.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.map.hashcode; - -class Voucher { - - private Money value; - private String store; - - Voucher(int amount, String currencyCode, String store) { - this.value = new Money(amount, currencyCode); - this.store = store; - } - - @Override - public boolean equals(Object o) { - if (o == this) - return true; - if (!(o instanceof Voucher)) - return false; - Voucher other = (Voucher)o; - return this.value == other.value - && this.store == other.store; - } - - @Override - public int hashCode() { - int result = 17; - result = 31 * result + value.hashCode(); - result = 31 * result + store.hashCode(); - return result; - } -} \ No newline at end of file diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongVoucher.java b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongVoucher.java deleted file mode 100644 index 03122c7cc8..0000000000 --- a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/WrongVoucher.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.baeldung.map.hashcode; - -class WrongVoucher extends Money { - - private String store; - - WrongVoucher(int amount, String currencyCode, String store) { - super(amount, currencyCode); - - this.store = store; - } - - @Override - public boolean equals(Object o) { - if (o == this) - return true; - if (!(o instanceof WrongVoucher)) - return false; - WrongVoucher other = (WrongVoucher)o; - return this.amount == other.amount - && this.currencyCode == other.currencyCode - && this.store == other.store; - } - - @Override - public int hashCode() { - int result = 17; - result = 31 * result + amount; - result = 31 * result + currencyCode.hashCode(); - result = 31 * result + store.hashCode(); - return result; - } -} \ No newline at end of file diff --git a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/equalsverifier_notes.txt b/java-collections-maps/src/main/java/com/baeldung/map/hashCode/equalsverifier_notes.txt deleted file mode 100644 index adc14f393a..0000000000 --- a/java-collections-maps/src/main/java/com/baeldung/map/hashCode/equalsverifier_notes.txt +++ /dev/null @@ -1 +0,0 @@ - Non-nullity: hashCode throws NullPointerException on field city. From b0ea0e56483771e87333c6ddaec6ab7b48997bb6 Mon Sep 17 00:00:00 2001 From: Kevin Gilmore Date: Tue, 20 Nov 2018 21:28:01 -0600 Subject: [PATCH 066/429] BAEL-2312: add link back to article --- core-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java/README.md b/core-java/README.md index 11d9fd2ee0..7617897e95 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -85,3 +85,4 @@ - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) - [Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree) +- [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) From cf602faff9a5d2971f28c853374cb90066108831 Mon Sep 17 00:00:00 2001 From: Loredana Date: Thu, 22 Nov 2018 00:37:23 +0200 Subject: [PATCH 067/429] revert boot 2.1 upgrade --- parent-boot-2/pom.xml | 5 +++-- .../security/SpringSecurity5Application.java | 11 ++++++----- .../Spring5ReactiveServerClientIntegrationTest.java | 13 +++++++------ spring-5-security/pom.xml | 4 ++-- spring-data-rest/pom.xml | 4 ++++ spring-security-mvc-boot/pom.xml | 2 +- spring-security-sso/pom.xml | 4 +++- .../spring-security-sso-auth-server/pom.xml | 8 ++++---- .../spring-security-sso-ui-2/pom.xml | 4 ++-- spring-security-sso/spring-security-sso-ui/pom.xml | 4 ++-- spring-security-thymeleaf/pom.xml | 2 +- 11 files changed, 35 insertions(+), 26 deletions(-) diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index bb89cb2729..67837e1a4e 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -77,7 +77,8 @@ 3.1.0 1.0.11.RELEASE - 2.1.0.RELEASE - 2.1.0.RELEASE + 2.0.5.RELEASE + + diff --git a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java index ba913bc2d7..f2963c4fa5 100644 --- a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java +++ b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java @@ -8,8 +8,8 @@ import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; import org.springframework.web.reactive.config.EnableWebFlux; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; -import reactor.netty.DisposableServer; -import reactor.netty.http.server.HttpServer; +import reactor.ipc.netty.NettyContext; +import reactor.ipc.netty.http.server.HttpServer; @ComponentScan(basePackages = {"com.baeldung.reactive.security"}) @EnableWebFlux @@ -18,16 +18,17 @@ public class SpringSecurity5Application { public static void main(String[] args) { try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringSecurity5Application.class)) { - context.getBean(DisposableServer.class).onDispose().block(); + context.getBean(NettyContext.class).onClose().block(); } } @Bean - public DisposableServer nettyContext(ApplicationContext context) { + public NettyContext nettyContext(ApplicationContext context) { HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context) .build(); ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler); - return HttpServer.create().host("localhost").port(8080).handle(adapter).bind().block(); + HttpServer httpServer = HttpServer.create("localhost", 8080); + return httpServer.newHandler(adapter).block(); } } diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java index 384600994e..5ebfa39358 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java @@ -10,8 +10,8 @@ import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import reactor.netty.DisposableServer; -import reactor.netty.http.server.HttpServer; +import reactor.ipc.netty.NettyContext; +import reactor.ipc.netty.http.server.HttpServer; import java.time.Duration; @@ -19,11 +19,11 @@ import static org.springframework.web.reactive.function.server.RequestPredicates import static org.springframework.web.reactive.function.server.RequestPredicates.POST; public class Spring5ReactiveServerClientIntegrationTest { - private static DisposableServer nettyServer; + private static NettyContext nettyContext; @BeforeAll public static void setUp() throws Exception { - HttpServer server = HttpServer.create().host("localhost").port(8080); + HttpServer server = HttpServer.create("localhost", 8080); RouterFunction route = RouterFunctions.route(POST("/task/process"), request -> ServerResponse.ok() .body(request.bodyToFlux(Task.class) .map(ll -> new Task("TaskName", 1)), Task.class)) @@ -31,12 +31,13 @@ public class Spring5ReactiveServerClientIntegrationTest { .body(Mono.just("server is alive"), String.class))); HttpHandler httpHandler = RouterFunctions.toHttpHandler(route); ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler); - nettyServer = server.handle(adapter).bind().block(); + nettyContext = server.newHandler(adapter) + .block(); } @AfterAll public static void shutDown() { - nettyServer.dispose(); + nettyContext.dispose(); } // @Test diff --git a/spring-5-security/pom.xml b/spring-5-security/pom.xml index da62f39fa9..f5fb359896 100644 --- a/spring-5-security/pom.xml +++ b/spring-5-security/pom.xml @@ -31,14 +31,14 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity5 + thymeleaf-extras-springsecurity4 org.springframework.security.oauth.boot spring-security-oauth2-autoconfigure - ${oauth-auto.version} + 2.0.1.RELEASE org.springframework.security diff --git a/spring-data-rest/pom.xml b/spring-data-rest/pom.xml index a756ef0497..a6f12e1904 100644 --- a/spring-data-rest/pom.xml +++ b/spring-data-rest/pom.xml @@ -42,4 +42,8 @@ ${project.artifactId} + + 2.1.0.RELEASE + + diff --git a/spring-security-mvc-boot/pom.xml b/spring-security-mvc-boot/pom.xml index 0a40b0b324..2427d0de1a 100644 --- a/spring-security-mvc-boot/pom.xml +++ b/spring-security-mvc-boot/pom.xml @@ -36,7 +36,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity5 + thymeleaf-extras-springsecurity4 org.springframework.boot diff --git a/spring-security-sso/pom.xml b/spring-security-sso/pom.xml index 7761919ca7..6e61da1519 100644 --- a/spring-security-sso/pom.xml +++ b/spring-security-sso/pom.xml @@ -23,6 +23,8 @@ 3.1.0 + 2.3.3.RELEASE + 2.0.1.RELEASE - \ No newline at end of file + diff --git a/spring-security-sso/spring-security-sso-auth-server/pom.xml b/spring-security-sso/spring-security-sso-auth-server/pom.xml index c0ad6dee2e..ff76f377c6 100644 --- a/spring-security-sso/spring-security-sso-auth-server/pom.xml +++ b/spring-security-sso/spring-security-sso-auth-server/pom.xml @@ -20,10 +20,10 @@ - org.springframework.security.oauth.boot - spring-security-oauth2-autoconfigure - ${oauth-auto.version} + org.springframework.security.oauth + spring-security-oauth2 + ${oauth.version} - \ No newline at end of file + diff --git a/spring-security-sso/spring-security-sso-ui-2/pom.xml b/spring-security-sso/spring-security-sso-ui-2/pom.xml index 5881409c3a..1f9a5754ae 100644 --- a/spring-security-sso/spring-security-sso-ui-2/pom.xml +++ b/spring-security-sso/spring-security-sso-ui-2/pom.xml @@ -37,9 +37,9 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity5 + thymeleaf-extras-springsecurity4 - \ No newline at end of file + diff --git a/spring-security-sso/spring-security-sso-ui/pom.xml b/spring-security-sso/spring-security-sso-ui/pom.xml index 3e85eb4737..56131749ba 100644 --- a/spring-security-sso/spring-security-sso-ui/pom.xml +++ b/spring-security-sso/spring-security-sso-ui/pom.xml @@ -38,9 +38,9 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity5 + thymeleaf-extras-springsecurity4 - \ No newline at end of file + diff --git a/spring-security-thymeleaf/pom.xml b/spring-security-thymeleaf/pom.xml index d8b476683a..5b7715bdeb 100644 --- a/spring-security-thymeleaf/pom.xml +++ b/spring-security-thymeleaf/pom.xml @@ -43,7 +43,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity5 + thymeleaf-extras-springsecurity4 From 6b7dfe79ba37a7dfacad60a7b9d26cfb7343b1b8 Mon Sep 17 00:00:00 2001 From: Chandra Prakash Date: Wed, 21 Nov 2018 20:31:03 -0500 Subject: [PATCH 068/429] Update README.md --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index a653087401..a5db51c6a5 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -35,3 +35,4 @@ - [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty) - [String Performance Hints](https://www.baeldung.com/java-string-performance) - [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences) +- [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array) From 9726c99c31a163f0d34f88c409d621286e57ae64 Mon Sep 17 00:00:00 2001 From: Kuba Date: Thu, 22 Nov 2018 03:28:17 +0100 Subject: [PATCH 069/429] BAEL-2279 - Logging reactive sequence (#5667) * BAEL-2279 - Logging reactive sequence * BAEL-2279 - Logging reactive sequence * Format fix. * Add all examples. Fix formatting. * BAEL 2279 - rename file, formatting fixes, update deps. --- logging-modules/log4j/pom.xml | 10 ++++++++- .../webFluxLogging/WebFluxLoggingExample.java | 21 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) create mode 100644 logging-modules/log4j/src/main/java/com/baeldung/webFluxLogging/WebFluxLoggingExample.java diff --git a/logging-modules/log4j/pom.xml b/logging-modules/log4j/pom.xml index 432295fc62..1b27e03445 100644 --- a/logging-modules/log4j/pom.xml +++ b/logging-modules/log4j/pom.xml @@ -1,5 +1,6 @@ - 4.0.0 com.baeldung @@ -43,6 +44,12 @@ disruptor ${disruptor.version} + + + org.springframework.boot + spring-boot-starter-webflux + ${spring-boot.version} + @@ -50,6 +57,7 @@ 2.7 2.7 3.3.6 + 2.1.0.RELEASE \ No newline at end of file diff --git a/logging-modules/log4j/src/main/java/com/baeldung/webFluxLogging/WebFluxLoggingExample.java b/logging-modules/log4j/src/main/java/com/baeldung/webFluxLogging/WebFluxLoggingExample.java new file mode 100644 index 0000000000..f429fd57f3 --- /dev/null +++ b/logging-modules/log4j/src/main/java/com/baeldung/webFluxLogging/WebFluxLoggingExample.java @@ -0,0 +1,21 @@ +package com.baeldung.webFluxLogging; + +import reactor.core.publisher.Flux; + +public class WebFluxLoggingExample { + + public static void main(String[] args) { + Flux reactiveStream = Flux.range(1, 5).log(); + + reactiveStream.subscribe(); + + reactiveStream = Flux.range(1, 5).log().take(3); + + reactiveStream.subscribe(); + + reactiveStream = Flux.range(1, 5).take(3).log(); + + reactiveStream.subscribe(); + } + +} From 31858afca7598cf4c5b8e305f7fa4cb113d340d5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 22 Nov 2018 12:49:54 +0800 Subject: [PATCH 070/429] Bi-monthly test failure - fix (BAEL-10330) (#5736) * 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 --- algorithms-miscellaneous-2/README.md | 1 + core-java-10/README.md | 1 + core-java-8/README.md | 1 + core-java-collections/README.md | 1 + core-java-io/README.md | 1 + core-java/README.md | 2 ++ java-dates/README.md | 1 + persistence-modules/spring-boot-persistence/README.MD | 1 + persistence-modules/spring-data-jpa/README.md | 1 + persistence-modules/spring-data-mongodb/README.md | 1 + spring-5-reactive-oauth/README.md | 3 +++ spring-all/README.md | 1 + spring-cloud/README.md | 1 + spring-rest-template/README.md | 1 + spring-rest/README.md | 1 + 15 files changed, 18 insertions(+) create mode 100644 spring-5-reactive-oauth/README.md diff --git a/algorithms-miscellaneous-2/README.md b/algorithms-miscellaneous-2/README.md index 6772a94a8d..d693a44f66 100644 --- a/algorithms-miscellaneous-2/README.md +++ b/algorithms-miscellaneous-2/README.md @@ -17,3 +17,4 @@ - [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) diff --git a/core-java-10/README.md b/core-java-10/README.md index 84fa381a26..f0a25712a7 100644 --- a/core-java-10/README.md +++ b/core-java-10/README.md @@ -4,3 +4,4 @@ - [Java 10 LocalVariable Type-Inference](http://www.baeldung.com/java-10-local-variable-type-inference) - [Guide to Java 10](http://www.baeldung.com/java-10-overview) - [Copy a List to Another List in Java](http://www.baeldung.com/java-copy-list-to-another) +- [Deep Dive Into the New Java JIT Compiler – Graal](https://www.baeldung.com/graal-java-jit-compiler) diff --git a/core-java-8/README.md b/core-java-8/README.md index ffd629a170..6786b29120 100644 --- a/core-java-8/README.md +++ b/core-java-8/README.md @@ -33,3 +33,4 @@ - [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) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 0fcf7367c7..858dbef0b3 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -50,3 +50,4 @@ - [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) - [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) - [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist) +- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) diff --git a/core-java-io/README.md b/core-java-io/README.md index c81e466b57..3d028783ed 100644 --- a/core-java-io/README.md +++ b/core-java-io/README.md @@ -34,3 +34,4 @@ - [Read a File into an ArrayList](https://www.baeldung.com/java-file-to-arraylist) - [Guide to Java OutputStream](https://www.baeldung.com/java-outputstream) - [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array) +- [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader) diff --git a/core-java/README.md b/core-java/README.md index 7617897e95..e8923e9a2f 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -85,4 +85,6 @@ - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) - [Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree) +- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) +- [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) diff --git a/java-dates/README.md b/java-dates/README.md index 66046b16a6..3f6d7998b8 100644 --- a/java-dates/README.md +++ b/java-dates/README.md @@ -24,3 +24,4 @@ - [Add Hours To a Date In Java](http://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](Convert Between java.time.Instant and java.sql.Timestamp) diff --git a/persistence-modules/spring-boot-persistence/README.MD b/persistence-modules/spring-boot-persistence/README.MD index 6cf172426a..8988fb4ebd 100644 --- a/persistence-modules/spring-boot-persistence/README.MD +++ b/persistence-modules/spring-boot-persistence/README.MD @@ -4,3 +4,4 @@ - [Configuring Separate Spring DataSource for Tests](http://www.baeldung.com/spring-testing-separate-data-source) - [Quick Guide on data.sql and schema.sql Files in Spring Boot](http://www.baeldung.com/spring-boot-data-sql-and-schema-sql) - [Configuring a Tomcat Connection Pool in Spring Boot](https://www.baeldung.com/spring-boot-tomcat-connection-pool) +- [Hibernate Field Naming with Spring Boot](https://www.baeldung.com/hibernate-field-naming-spring-boot) diff --git a/persistence-modules/spring-data-jpa/README.md b/persistence-modules/spring-data-jpa/README.md index 44ce240da3..a65b744944 100644 --- a/persistence-modules/spring-data-jpa/README.md +++ b/persistence-modules/spring-data-jpa/README.md @@ -15,6 +15,7 @@ - [Query Entities by Dates and Times with Spring Data JPA](https://www.baeldung.com/spring-data-jpa-query-by-date) - [DDD Aggregates and @DomainEvents](https://www.baeldung.com/spring-data-ddd) - [Spring Data – CrudRepository save() Method](https://www.baeldung.com/spring-data-crud-repository-save) +- [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/persistence-modules/spring-data-mongodb/README.md b/persistence-modules/spring-data-mongodb/README.md index c7bc7584be..c4f21dffc0 100644 --- a/persistence-modules/spring-data-mongodb/README.md +++ b/persistence-modules/spring-data-mongodb/README.md @@ -12,3 +12,4 @@ - [Spring Data MongoDB: Projections and Aggregations](http://www.baeldung.com/spring-data-mongodb-projections-aggregations) - [Spring Data Annotations](http://www.baeldung.com/spring-data-annotations) - [Spring Data MongoDB Transactions](https://www.baeldung.com/spring-data-mongodb-transactions ) +- [ZonedDateTime with Spring Data MongoDB](https://www.baeldung.com/spring-data-mongodb-zoneddatetime) diff --git a/spring-5-reactive-oauth/README.md b/spring-5-reactive-oauth/README.md new file mode 100644 index 0000000000..0f27cf5d20 --- /dev/null +++ b/spring-5-reactive-oauth/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: + +- [Spring Security OAuth Login with WebFlux](https://www.baeldung.com/spring-oauth-login-webflux) diff --git a/spring-all/README.md b/spring-all/README.md index 34e5c3435e..0d78efdcf2 100644 --- a/spring-all/README.md +++ b/spring-all/README.md @@ -33,3 +33,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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-cloud/README.md b/spring-cloud/README.md index 16bc2d110a..dc43bd1a66 100644 --- a/spring-cloud/README.md +++ b/spring-cloud/README.md @@ -30,3 +30,4 @@ - [Introduction to Netflix Archaius with Spring Cloud](https://www.baeldung.com/netflix-archaius-spring-cloud-integration) - [An Intro to Spring Cloud Vault](https://www.baeldung.com/spring-cloud-vault) - [Netflix Archaius with Various Database Configurations](https://www.baeldung.com/netflix-archaius-database-configurations) +- [Rate Limiting in Spring Cloud Netflix Zuul](https://www.baeldung.com/spring-cloud-zuul-rate-limit) diff --git a/spring-rest-template/README.md b/spring-rest-template/README.md index d69d5c01c7..2c31796080 100644 --- a/spring-rest-template/README.md +++ b/spring-rest-template/README.md @@ -5,3 +5,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: - [Uploading MultipartFile with Spring RestTemplate](http://www.baeldung.com/spring-rest-template-multipart-upload) +- [Mocking a RestTemplate in Spring](https://www.baeldung.com/spring-mock-rest-template) diff --git a/spring-rest/README.md b/spring-rest/README.md index d449a4d92a..5b8a35a4a5 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -23,3 +23,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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) +- [Spring’s RequestBody and ResponseBody Annotations](https://www.baeldung.com/spring-request-response-body) From 4d3b4ca3f0f11cd6cfb06c57abe4f006c7db6ba4 Mon Sep 17 00:00:00 2001 From: Seun Matt Date: Thu, 22 Nov 2018 08:02:44 +0100 Subject: [PATCH 071/429] Moved example code for BAEL-2366 (#5752) * added example code for BAEL-2366 * moved example code for BAEL-2366 --- .../StringReplaceAndRemoveUnitTest.java | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java b/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java new file mode 100644 index 0000000000..d952d2383b --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.string; + + +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +public class StringReplaceAndRemoveUnitTest { + + + @Test + public void givenTestStrings_whenReplace_thenProcessedString() { + + String master = "Hello World Baeldung!"; + String target = "Baeldung"; + String replacement = "Java"; + String processed = master.replace(target, replacement); + assertTrue(processed.contains(replacement)); + assertFalse(processed.contains(target)); + + } + + @Test + public void givenTestStrings_whenReplaceAll_thenProcessedString() { + + String master2 = "Welcome to Baeldung, Hello World Baeldung"; + String regexTarget= "(Baeldung)$"; + String replacement = "Java"; + String processed2 = master2.replaceAll(regexTarget, replacement); + assertTrue(processed2.endsWith("Java")); + + } + + @Test + public void givenTestStrings_whenStringBuilderMethods_thenProcessedString() { + + String master = "Hello World Baeldung!"; + String target = "Baeldung"; + String replacement = "Java"; + + int startIndex = master.indexOf(target); + int stopIndex = startIndex + target.length(); + + StringBuilder builder = new StringBuilder(master); + + + builder.delete(startIndex, stopIndex); + assertFalse(builder.toString().contains(target)); + + + builder.replace(startIndex, stopIndex, replacement); + assertTrue(builder.toString().contains(replacement)); + + + } + + + @Test + public void givenTestStrings_whenStringUtilsMethods_thenProcessedStrings() { + + String master = "Hello World Baeldung!"; + String target = "Baeldung"; + String replacement = "Java"; + + String processed = StringUtils.replace(master, target, replacement); + assertTrue(processed.contains(replacement)); + + String master2 = "Hello World Baeldung!"; + String target2 = "baeldung"; + String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement); + assertFalse(processed2.contains(target)); + + } + + + + + + + +} From 56ab8e2049028b784ac2a769a86171cd5a59a852 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Thu, 22 Nov 2018 15:29:58 +0530 Subject: [PATCH 072/429] BAEL-2334: Adding file for the tutorial on Graph in Java --- .../main/java/com/baeldung/graph/Graph.java | 112 ++++++++++++++++++ .../com/baeldung/graph/GraphTraversal.java | 44 +++++++ .../graph/GraphTraversalUnitTest.java | 36 ++++++ 3 files changed, 192 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/graph/Graph.java create mode 100644 core-java/src/main/java/com/baeldung/graph/GraphTraversal.java create mode 100644 core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/graph/Graph.java b/core-java/src/main/java/com/baeldung/graph/Graph.java new file mode 100644 index 0000000000..7095f64709 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/graph/Graph.java @@ -0,0 +1,112 @@ +package com.baeldung.graph; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; + +public class Graph { + private Set vertices; + private Set edges; + private Map> adjVertices; + + Graph() { + this.vertices = new HashSet(); + this.edges = new HashSet(); + this.adjVertices = new HashMap>(); + } + + boolean addVertex(String label) { + return vertices.add(new Vertex(label)); + } + + boolean removeVertex(String label) { + return vertices.remove(new Vertex(label)); + } + + boolean addEdge(String label1, String label2) { + Vertex v1 = new Vertex(label1); + Vertex v2 = new Vertex(label2); + Edge e = new Edge(v1, v2); + if (this.edges.add(e)) { + adjVertices.putIfAbsent(v1, new HashSet<>()); + adjVertices.putIfAbsent(v2, new HashSet<>()); + adjVertices.get(v1) + .add(e); + adjVertices.get(v2) + .add(e); + } + return true; + } + + boolean removeEdge(String label1, String label2) { + Vertex v1 = new Vertex(label1); + Vertex v2 = new Vertex(label2); + Edge e = new Edge(v1, v2); + if (this.edges.remove(e)) { + Set eV1 = adjVertices.get(v1); + Set eV2 = adjVertices.get(v2); + + if (eV1 != null) + eV1.remove(e); + if (eV2 != null) + eV2.remove(e); + } + return true; + } + + Set getAdjVertices(String label) { + Vertex v = new Vertex(label); + return adjVertices.get(v) + .stream() + .map(e -> e.v1.equals(v) ? e.v2 : e.v1) + .collect(Collectors.toSet()); + } + + class Vertex { + String label; + Vertex(String label) { + this.label = label; + } + @Override + public boolean equals(Object obj) { + Vertex vertex = (Vertex) obj; + return vertex.label == label; + } + @Override + public int hashCode() { + return label.hashCode(); + } + @Override + public String toString() { + return label; + } + } + + class Edge { + Vertex v1; + Vertex v2; + Edge(String label1, String label2) { + this.v1 = new Vertex(label1); + this.v2 = new Vertex(label2); + } + Edge(Vertex vertex1, Vertex vertex2) { + this.v1 = vertex1; + this.v2 = vertex2; + } + @Override + public boolean equals(Object obj) { + Edge edge = (Edge) obj; + return edge.v1.equals(v1) && edge.v2.equals(v2); + } + @Override + public int hashCode() { + return v1.hashCode() + v2.hashCode(); + } + @Override + public String toString() { + return v1.label + "-" + v2.label; + } + } +} \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/graph/GraphTraversal.java b/core-java/src/main/java/com/baeldung/graph/GraphTraversal.java new file mode 100644 index 0000000000..479e653a5c --- /dev/null +++ b/core-java/src/main/java/com/baeldung/graph/GraphTraversal.java @@ -0,0 +1,44 @@ +package com.baeldung.graph; + +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.Queue; +import java.util.Set; +import java.util.Stack; + +import com.baeldung.graph.Graph.Vertex; + +public class GraphTraversal { + static Set depthFirstTraversal(Graph graph, String root) { + Set visited = new LinkedHashSet(); + Stack stack = new Stack(); + stack.push(root); + while (!stack.isEmpty()) { + String vertex = stack.pop(); + if (!visited.contains(vertex)) { + visited.add(vertex); + for (Vertex v : graph.getAdjVertices(vertex)) { + stack.push(v.label); + } + } + } + return visited; + } + + static Set breadthFirstTraversal(Graph graph, String root) { + Set visited = new LinkedHashSet(); + Queue queue = new LinkedList(); + queue.add(root); + visited.add(root); + while (!queue.isEmpty()) { + String vertex = queue.poll(); + for (Vertex v : graph.getAdjVertices(vertex)) { + if (!visited.contains(v.label)) { + visited.add(v.label); + queue.add(v.label); + } + } + } + return visited; + } +} \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java b/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java new file mode 100644 index 0000000000..84611a580a --- /dev/null +++ b/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.graph; + +import org.junit.Assert; +import org.junit.Test; + +public class GraphTraversalUnitTest { + @Test + public void givenAGraph_whenTraversingDepthFirst_thenExpectedResult() { + Graph graph = createGraph(); + Assert.assertEquals("[A, D, E, B, C]", + GraphTraversal.depthFirstTraversal(graph, "A").toString()); + } + + @Test + public void givenAGraph_whenTraversingBreadthFirst_thenExpectedResult() { + Graph graph = createGraph(); + Assert.assertEquals("[A, B, D, C, E]", + GraphTraversal.breadthFirstTraversal(graph, "A").toString()); + } + + Graph createGraph() { + Graph graph = new Graph(); + graph.addVertex("A"); + graph.addVertex("B"); + graph.addVertex("C"); + graph.addVertex("D"); + graph.addVertex("E"); + graph.addEdge("A", "B"); + graph.addEdge("A", "D"); + graph.addEdge("B", "C"); + graph.addEdge("D", "C"); + graph.addEdge("B", "E"); + graph.addEdge("D", "E"); + return graph; + } +} \ No newline at end of file From 3928c8955934209ae00de8656c6065de1f5a565c Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Thu, 22 Nov 2018 16:19:26 +0200 Subject: [PATCH 073/429] the third profile --- pom.xml | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/pom.xml b/pom.xml index 5ebf7ba4f3..2fed100fc6 100644 --- a/pom.xml +++ b/pom.xml @@ -738,6 +738,46 @@ helidon + + + + default-third + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + 3 + true + + **/*IntegrationTest.java + **/*IntTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/*JdbcTest.java + **/*LiveTest.java + + + + + + + + + parent-boot-1 + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin + + testing-modules/gatling + geotools + + From af3e0e9b063b71b6109be70b2b5c8b1a1e3db728 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Thu, 22 Nov 2018 17:38:17 +0200 Subject: [PATCH 074/429] splitting the integration-lite profile --- pom.xml | 72 ++++++++++++++++++++++++++++----------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/pom.xml b/pom.xml index 2fed100fc6..d72fcc9f26 100644 --- a/pom.xml +++ b/pom.xml @@ -1238,43 +1238,8 @@ - - integration-lite-test - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*ManualTest.java - **/*LiveTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin - - spring-4 - - - - - integration-lite + integration-lite-first @@ -1302,6 +1267,7 @@ parent-spring-5 parent-java parent-kotlin + asm atomix persistence-modules/apache-cayenne @@ -1449,7 +1415,41 @@ spring-cucumber spring-ejb spring-aop + + + + + + integration-lite-second + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*ManualTest.java + **/*LiveTest.java + + + **/*IntegrationTest.java + **/*IntTest.java + + + + + + + + parent-boot-1 + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin + persistence-modules/spring-data-dynamodb persistence-modules/spring-data-keyvalue persistence-modules/spring-data-mongodb From 608fe77823aa77578393678afed1f7709c67562a Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 22 Nov 2018 17:53:33 +0200 Subject: [PATCH 075/429] disable gib default (#5726) * disable gib default * Update .travis.yml --- .travis.yml | 2 +- pom.xml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 683422dc97..5e86714a89 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ 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 +script: travis_wait 60 mvn -q install -Pdefault-first,default-second -Dgib.enabled=true sudo: required diff --git a/pom.xml b/pom.xml index d72fcc9f26..00d5af8214 100644 --- a/pom.xml +++ b/pom.xml @@ -1575,7 +1575,6 @@ + false 4.12 1.3 From 076de3f006be1687b600bbb9ca86a9e1ebebdd36 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fran=C3=A7ois=20Dupire?= Date: Thu, 22 Nov 2018 17:22:47 +0100 Subject: [PATCH 076/429] BAEL-2309 Retrieving a Class Name in Java (#5716) * [BAEL-2309] SomeClass and its test * [BAEL-2309] Fixing test naming * [BAEL-2309] Changed name for RetrievingClassName * [BAEL-2309] Updating package name * [BAEL-2309] Fix comment mistake * [BAEL-2309] Fixing test class name --- .../className/RetrievingClassName.java | 9 + .../RetrievingClassNameUnitTest.java | 156 ++++++++++++++++++ 2 files changed, 165 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/className/RetrievingClassName.java create mode 100644 core-java/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java diff --git a/core-java/src/main/java/com/baeldung/className/RetrievingClassName.java b/core-java/src/main/java/com/baeldung/className/RetrievingClassName.java new file mode 100644 index 0000000000..ab6c8a51ff --- /dev/null +++ b/core-java/src/main/java/com/baeldung/className/RetrievingClassName.java @@ -0,0 +1,9 @@ +package com.baeldung.className; + +public class RetrievingClassName { + + public class InnerClass { + + } + +} diff --git a/core-java/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java b/core-java/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java new file mode 100644 index 0000000000..f9dbf91d2c --- /dev/null +++ b/core-java/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java @@ -0,0 +1,156 @@ +package com.baeldung.className; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + +public class RetrievingClassNameUnitTest { + + // Retrieving Simple Name + @Test + public void givenRetrievingClassName_whenGetSimpleName_thenRetrievingClassName() { + assertEquals("RetrievingClassName", RetrievingClassName.class.getSimpleName()); + } + + @Test + public void givenPrimitiveInt_whenGetSimpleName_thenInt() { + assertEquals("int", int.class.getSimpleName()); + } + + @Test + public void givenRetrievingClassNameArray_whenGetSimpleName_thenRetrievingClassNameWithBrackets() { + assertEquals("RetrievingClassName[]", RetrievingClassName[].class.getSimpleName()); + assertEquals("RetrievingClassName[][]", RetrievingClassName[][].class.getSimpleName()); + } + + @Test + public void givenAnonymousClass_whenGetSimpleName_thenEmptyString() { + assertEquals("", new RetrievingClassName() {}.getClass().getSimpleName()); + } + + // Retrieving Other Names + // - Primitive Types + @Test + public void givenPrimitiveInt_whenGetName_thenInt() { + assertEquals("int", int.class.getName()); + } + + @Test + public void givenPrimitiveInt_whenGetTypeName_thenInt() { + assertEquals("int", int.class.getTypeName()); + } + + @Test + public void givenPrimitiveInt_whenGetCanonicalName_thenInt() { + assertEquals("int", int.class.getCanonicalName()); + } + + // - Object Types + @Test + public void givenRetrievingClassName_whenGetName_thenCanonicalName() { + assertEquals("com.baeldung.className.RetrievingClassName", RetrievingClassName.class.getName()); + } + + @Test + public void givenRetrievingClassName_whenGetTypeName_thenCanonicalName() { + assertEquals("com.baeldung.className.RetrievingClassName", RetrievingClassName.class.getTypeName()); + } + + @Test + public void givenRetrievingClassName_whenGetCanonicalName_thenCanonicalName() { + assertEquals("com.baeldung.className.RetrievingClassName", RetrievingClassName.class.getCanonicalName()); + } + + // - Inner Classes + @Test + public void givenRetrievingClassNameInnerClass_whenGetName_thenCanonicalNameWithDollarSeparator() { + assertEquals("com.baeldung.className.RetrievingClassName$InnerClass", RetrievingClassName.InnerClass.class.getName()); + } + + @Test + public void givenRetrievingClassNameInnerClass_whenGetTypeName_thenCanonicalNameWithDollarSeparator() { + assertEquals("com.baeldung.className.RetrievingClassName$InnerClass", RetrievingClassName.InnerClass.class.getTypeName()); + } + + @Test + public void givenRetrievingClassNameInnerClass_whenGetCanonicalName_thenCanonicalName() { + assertEquals("com.baeldung.className.RetrievingClassName.InnerClass", RetrievingClassName.InnerClass.class.getCanonicalName()); + } + + // - Anonymous Classes + @Test + public void givenAnonymousClass_whenGetName_thenCallingClassCanonicalNameWithDollarSeparatorAndCountNumber() { + // These are the second and third appearences of an anonymous class in RetrievingClassNameUnitTest, hence $2 and $3 expectations + assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$2", new RetrievingClassName() {}.getClass().getName()); + assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$3", new RetrievingClassName() {}.getClass().getName()); + } + + @Test + public void givenAnonymousClass_whenGetTypeName_thenCallingClassCanonicalNameWithDollarSeparatorAndCountNumber() { + // These are the fourth and fifth appearences of an anonymous class in RetrievingClassNameUnitTest, hence $4 and $5 expectations + assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$4", new RetrievingClassName() {}.getClass().getTypeName()); + assertEquals("com.baeldung.className.RetrievingClassNameUnitTest$5", new RetrievingClassName() {}.getClass().getTypeName()); + } + + @Test + public void givenAnonymousClass_whenGetCanonicalName_thenNull() { + assertNull(new RetrievingClassName() {}.getClass().getCanonicalName()); + } + + // - Arrays + @Test + public void givenPrimitiveIntArray_whenGetName_thenOpeningBracketsAndPrimitiveIntLetter() { + assertEquals("[I", int[].class.getName()); + assertEquals("[[I", int[][].class.getName()); + } + + @Test + public void givenRetrievingClassNameArray_whenGetName_thenOpeningBracketsLetterLAndRetrievingClassNameGetName() { + assertEquals("[Lcom.baeldung.className.RetrievingClassName;", RetrievingClassName[].class.getName()); + assertEquals("[[Lcom.baeldung.className.RetrievingClassName;", RetrievingClassName[][].class.getName()); + } + + @Test + public void givenRetrievingClassNameInnerClassArray_whenGetName_thenOpeningBracketsLetterLAndRetrievingClassNameInnerClassGetName() { + assertEquals("[Lcom.baeldung.className.RetrievingClassName$InnerClass;", RetrievingClassName.InnerClass[].class.getName()); + assertEquals("[[Lcom.baeldung.className.RetrievingClassName$InnerClass;", RetrievingClassName.InnerClass[][].class.getName()); + } + + @Test + public void givenPrimitiveIntArray_whenGetTypeName_thenPrimitiveIntGetTypeNameWithBrackets() { + assertEquals("int[]", int[].class.getTypeName()); + assertEquals("int[][]", int[][].class.getTypeName()); + } + + @Test + public void givenRetrievingClassNameArray_whenGetTypeName_thenRetrievingClassNameGetTypeNameWithBrackets() { + assertEquals("com.baeldung.className.RetrievingClassName[]", RetrievingClassName[].class.getTypeName()); + assertEquals("com.baeldung.className.RetrievingClassName[][]", RetrievingClassName[][].class.getTypeName()); + } + + @Test + public void givenRetrievingClassNameInnerClassArray_whenGetTypeName_thenRetrievingClassNameInnerClassGetTypeNameWithBrackets() { + assertEquals("com.baeldung.className.RetrievingClassName$InnerClass[]", RetrievingClassName.InnerClass[].class.getTypeName()); + assertEquals("com.baeldung.className.RetrievingClassName$InnerClass[][]", RetrievingClassName.InnerClass[][].class.getTypeName()); + } + + @Test + public void givenPrimitiveIntArray_whenGetCanonicalName_thenPrimitiveIntGetCanonicalNameWithBrackets() { + assertEquals("int[]", int[].class.getCanonicalName()); + assertEquals("int[][]", int[][].class.getCanonicalName()); + } + + @Test + public void givenRetrievingClassNameArray_whenGetCanonicalName_thenRetrievingClassNameGetCanonicalNameWithBrackets() { + assertEquals("com.baeldung.className.RetrievingClassName[]", RetrievingClassName[].class.getCanonicalName()); + assertEquals("com.baeldung.className.RetrievingClassName[][]", RetrievingClassName[][].class.getCanonicalName()); + } + + @Test + public void givenRetrievingClassNameInnerClassArray_whenGetCanonicalName_thenRetrievingClassNameInnerClassGetCanonicalNameWithBrackets() { + assertEquals("com.baeldung.className.RetrievingClassName.InnerClass[]", RetrievingClassName.InnerClass[].class.getCanonicalName()); + assertEquals("com.baeldung.className.RetrievingClassName.InnerClass[][]", RetrievingClassName.InnerClass[][].class.getCanonicalName()); + } + +} \ No newline at end of file From e24d89199b668199a35b445fd4fc417ac9a1dc4e Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Thu, 22 Nov 2018 19:52:02 +0200 Subject: [PATCH 077/429] profile work --- pom.xml | 96 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 65 insertions(+), 31 deletions(-) diff --git a/pom.xml b/pom.xml index 00d5af8214..f94574a801 100644 --- a/pom.xml +++ b/pom.xml @@ -1384,37 +1384,6 @@ testing-modules/selenium-junit-testng persistence-modules/solr spark-java - spring-4 - spring-5-data-reactive - spring-5-reactive - spring-5-reactive-security - spring-5-reactive-client - spring-5-mvc - spring-5-security - spring-activiti - spring-akka - spring-amqp - spring-all - spring-amqp-simple - spring-apache-camel - spring-batch - spring-bom - spring-boot-keycloak - spring-boot-bootstrap - spring-boot-admin - spring-boot-camel - persistence-modules/spring-boot-persistence - spring-boot-security - spring-boot-mvc - spring-boot-logging-log4j2 - spring-boot-disable-console-logging - spring-cloud-data-flow - spring-cloud - spring-cloud-bus - spring-core - spring-cucumber - spring-ejb - spring-aop @@ -1450,6 +1419,38 @@ parent-java parent-kotlin + spring-4 + spring-5-data-reactive + spring-5-reactive + spring-5-reactive-security + spring-5-reactive-client + spring-5-mvc + spring-5-security + spring-activiti + spring-akka + spring-amqp + spring-all + spring-amqp-simple + spring-apache-camel + spring-batch + spring-bom + spring-boot-keycloak + spring-boot-bootstrap + spring-boot-admin + spring-boot-camel + persistence-modules/spring-boot-persistence + spring-boot-security + spring-boot-mvc + spring-boot-logging-log4j2 + spring-boot-disable-console-logging + spring-cloud-data-flow + spring-cloud + spring-cloud-bus + spring-core + spring-cucumber + spring-ejb + spring-aop + persistence-modules/spring-data-dynamodb persistence-modules/spring-data-keyvalue persistence-modules/spring-data-mongodb @@ -1531,6 +1532,39 @@ testing-modules/testing testing-modules/testng video-tutorials + + + + + + integration-lite-third + + + + + org.apache.maven.plugins + maven-surefire-plugin + + + **/*ManualTest.java + **/*LiveTest.java + + + **/*IntegrationTest.java + **/*IntTest.java + + + + + + + + parent-boot-1 + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin xmlunit-2 struts-2 From 5ad9f285e14451760cb24c189276ad76cce5fcc7 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Thu, 22 Nov 2018 20:37:50 +0200 Subject: [PATCH 078/429] profile work --- pom.xml | 783 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 400 insertions(+), 383 deletions(-) diff --git a/pom.xml b/pom.xml index f94574a801..e36a972611 100644 --- a/pom.xml +++ b/pom.xml @@ -934,310 +934,6 @@ - - integration - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*ManualTest.java - **/*LiveTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin - - - - - - - - - - testing-modules/mockito - testing-modules/mockito-2 - testing-modules/mocks - mustache - mvn-wrapper - noexception - persistence-modules/orientdb - osgi - orika - patterns - pdf - protobuffer - persistence-modules/querydsl - reactor-core - persistence-modules/redis - testing-modules/rest-assured - testing-modules/rest-testing - resteasy - rxjava - rxjava-2 - spring-swagger-codegen - testing-modules/selenium-junit-testng - persistence-modules/solr - spark-java - spring-4 - spring-5 - spring-5-data-reactive - spring-5-reactive - spring-5-reactive-security - spring-5-reactive-client - spring-5-mvc - spring-5-security - spring-activiti - spring-akka - spring-amqp - spring-all - spring-amqp-simple - spring-apache-camel - spring-batch - jmh - - - - - - spring-bom - spring-boot - spring-boot-client - spring-boot-keycloak - spring-boot-bootstrap - spring-boot-admin - spring-boot-camel - spring-boot-ops - persistence-modules/spring-boot-persistence - spring-boot-security - spring-boot-mvc - spring-boot-logging-log4j2 - spring-boot-disable-console-logging - spring-cloud-data-flow - spring-cloud - spring-cloud-bus - spring-core - spring-cucumber - spring-ejb - spring-aop - persistence-modules/spring-data-cassandra - persistence-modules/spring-data-couchbase-2 - persistence-modules/spring-data-dynamodb - persistence-modules/spring-data-elasticsearch - persistence-modules/spring-data-keyvalue - persistence-modules/spring-data-mongodb - persistence-modules/spring-data-jpa - persistence-modules/spring-data-neo4j - persistence-modules/spring-data-redis - spring-data-rest - - - - - - - persistence-modules/spring-data-solr - spring-dispatcher-servlet - spring-exceptions - spring-freemarker - persistence-modules/spring-hibernate-3 - persistence-modules/spring-hibernate4 - persistence-modules/spring-hibernate-5 - persistence-modules/spring-data-eclipselink - spring-integration - spring-jenkins-pipeline - spring-jersey - spring-jms - spring-jooq - persistence-modules/spring-jpa - spring-kafka - spring-katharsis - spring-ldap - spring-mockito - spring-mvc-forms-jsp - spring-mvc-forms-thymeleaf - spring-mvc-java - spring-mvc-velocity - spring-mvc-webflow - spring-mvc-xml - spring-mvc-kotlin - spring-protobuf - spring-quartz - spring-rest-angular - spring-rest-full - spring-rest-query-language - spring-rest - spring-resttemplate - spring-rest-simple - spring-reactive-kotlin - - - - - - - - - - - - - - - - java-websocket - persistence-modules/activejdbc - animal-sniffer-mvn-plugin - apache-avro - apache-bval - apache-shiro - apache-spark - asciidoctor - checker-plugin - - - core-java-sun - custom-pmd - dagger - data-structures - dubbo - persistence-modules/flyway - - - jni - jooby - - - - ratpack - rest-with-spark-java - spring-boot-autoconfiguration - spring-boot-custom-starter - spring-boot-jasypt - spring-data-rest-querydsl - spring-groovy - spring-mobile - spring-mustache - spring-mvc-simple - spring-mybatis - spring-rest-hal-browser - spring-rest-shell - spring-rest-template - spring-roo - spring-security-stormpath - sse-jaxrs - static-analysis - stripe - - - wicket - xstream - cas/cas-secured-app - - - - - - - - - - - - - - jenkins/hello-world - - - - spring-boot-custom-starter/greeter - persistence-modules/spring-boot-h2/spring-boot-h2-database - - - - - - - - integration-lite-first @@ -1270,7 +966,6 @@ asm atomix - persistence-modules/apache-cayenne aws aws-lambda akka-streams @@ -1290,25 +985,30 @@ autovalue axon azure + apache-velocity + apache-solrj + apache-meecrowave + antlr + bootique + cdi - java-strings - core-java-collections - java-collections-conversions - java-collections-maps core-java-io core-java-8 - java-streams core-groovy - couchbase - persistence-modules/deltaspike + dozer + disruptor + drools + deeplearning4j + ethereum + feign flips - testing-modules/groovy-spock + google-cloud gson guava @@ -1317,17 +1017,20 @@ guava-modules/guava-19 guava-modules/guava-21 guice - disruptor - spring-static-resources + hazelcast - persistence-modules/hbase - hystrix + httpclient + image-processing immutables - persistence-modules/influxdb + jackson - vavr + java-strings + + java-collections-conversions + java-collections-maps + java-streams java-lite java-numbers java-rmi @@ -1345,45 +1048,68 @@ json jsoup jta - testing-modules/junit-5 - testing-modules/junit5-migration jws + jersey + java-spi + java-ee-8-security-api + libraries-data linkrest logging-modules/log-mdc logging-modules/log4j - logging-modules/logback lombok + lucene + mapstruct - maven mesos-marathon msf4j - testing-modules/mockito - testing-modules/mockito-2 - testing-modules/mocks mustache mvn-wrapper + mybatis + metrics + maven-archetype + noexception - persistence-modules/orientdb + osgi orika + patterns pdf protobuffer - persistence-modules/querydsl - reactor-core + performance-tests + + persistence-modules/java-jdbi persistence-modules/redis - testing-modules/rest-assured - testing-modules/rest-testing + persistence-modules/orientdb + persistence-modules/querydsl + persistence-modules/apache-cayenne + persistence-modules/solr + persistence-modules/spring-data-dynamodb + persistence-modules/spring-data-keyvalue + persistence-modules/spring-data-mongodb + persistence-modules/spring-data-neo4j + persistence-modules/spring-data-solr + persistence-modules/spring-hibernate-5 + persistence-modules/spring-data-eclipselink + persistence-modules/spring-jpa + persistence-modules/spring-hibernate-3 + persistence-modules/spring-data-gemfire + persistence-modules/spring-boot-persistence + persistence-modules/liquibase + persistence-modules/java-cockroachdb + persistence-modules/deltaspike + persistence-modules/hbase + persistence-modules/influxdb + persistence-modules/spring-hibernate4 + + reactor-core resteasy rxjava rxjava-2 - spring-swagger-codegen - testing-modules/selenium-junit-testng - persistence-modules/solr - spark-java + rabbitmq @@ -1434,15 +1160,16 @@ spring-apache-camel spring-batch spring-bom + spring-boot-keycloak spring-boot-bootstrap spring-boot-admin spring-boot-camel - persistence-modules/spring-boot-persistence spring-boot-security spring-boot-mvc spring-boot-logging-log4j2 spring-boot-disable-console-logging + spring-cloud-data-flow spring-cloud spring-cloud-bus @@ -1451,27 +1178,17 @@ spring-ejb spring-aop - persistence-modules/spring-data-dynamodb - persistence-modules/spring-data-keyvalue - persistence-modules/spring-data-mongodb - persistence-modules/spring-data-neo4j - spring-data-rest - persistence-modules/spring-data-solr spring-dispatcher-servlet spring-exceptions spring-freemarker - persistence-modules/spring-hibernate-3 - persistence-modules/spring-hibernate-5 - persistence-modules/spring-data-eclipselink spring-integration spring-jenkins-pipeline spring-jersey spring-jms spring-jooq - persistence-modules/spring-jpa spring-kafka spring-katharsis spring-ldap @@ -1529,9 +1246,15 @@ spring-vault spring-jinq spring-rest-embedded-tomcat - testing-modules/testing - testing-modules/testng - video-tutorials + + spring-static-resources + spring-swagger-codegen + spring-drools + spring-boot-property-exp + spring-security-thymeleaf + spring-boot-ctx-fluent + spring-webflux-amqp + @@ -1565,48 +1288,38 @@ parent-spring-5 parent-java parent-kotlin - - xmlunit-2 + + spark-java + saas struts-2 - apache-velocity - apache-solrj - rabbitmq - - persistence-modules/spring-data-gemfire - mybatis - spring-drools - drools - persistence-modules/liquibase - spring-boot-property-exp + + testing-modules/selenium-junit-testng + testing-modules/groovy-spock + testing-modules/mockito + testing-modules/mockito-2 + testing-modules/mocks + testing-modules/rest-assured + testing-modules/rest-testing + testing-modules/junit-5 + testing-modules/junit5-migration + testing-modules/testing + testing-modules/testng testing-modules/mockserver testing-modules/test-containers + twilio + undertow + + video-tutorials vaadin vertx-and-rxjava - saas - deeplearning4j - lucene vraptor - persistence-modules/java-cockroachdb - spring-security-thymeleaf - persistence-modules/java-jdbi - jersey - java-spi - performance-tests - twilio - spring-boot-ctx-fluent - java-ee-8-security-api - spring-webflux-amqp - antlr - maven-archetype - apache-meecrowave - - persistence-modules/spring-hibernate4 - xml vertx - metrics - httpclient - + vavr + + xmlunit-2 + xml + + + + + + + + + + testing-modules/mockito + testing-modules/mockito-2 + testing-modules/mocks + mustache + mvn-wrapper + noexception + persistence-modules/orientdb + osgi + orika + patterns + pdf + protobuffer + persistence-modules/querydsl + reactor-core + persistence-modules/redis + testing-modules/rest-assured + testing-modules/rest-testing + resteasy + rxjava + rxjava-2 + spring-swagger-codegen + testing-modules/selenium-junit-testng + persistence-modules/solr + spark-java + spring-4 + spring-5 + spring-5-data-reactive + spring-5-reactive + spring-5-reactive-security + spring-5-reactive-client + spring-5-mvc + spring-5-security + spring-activiti + spring-akka + spring-amqp + spring-all + spring-amqp-simple + spring-apache-camel + spring-batch + jmh + + + + + + spring-bom + spring-boot + spring-boot-client + spring-boot-keycloak + spring-boot-bootstrap + spring-boot-admin + spring-boot-camel + spring-boot-ops + persistence-modules/spring-boot-persistence + spring-boot-security + spring-boot-mvc + spring-boot-logging-log4j2 + spring-boot-disable-console-logging + spring-cloud-data-flow + spring-cloud + spring-cloud-bus + spring-core + spring-cucumber + spring-ejb + spring-aop + persistence-modules/spring-data-cassandra + persistence-modules/spring-data-couchbase-2 + persistence-modules/spring-data-dynamodb + persistence-modules/spring-data-elasticsearch + persistence-modules/spring-data-keyvalue + persistence-modules/spring-data-mongodb + persistence-modules/spring-data-jpa + persistence-modules/spring-data-neo4j + persistence-modules/spring-data-redis + spring-data-rest + + + + + + + persistence-modules/spring-data-solr + spring-dispatcher-servlet + spring-exceptions + spring-freemarker + persistence-modules/spring-hibernate-3 + persistence-modules/spring-hibernate4 + persistence-modules/spring-hibernate-5 + persistence-modules/spring-data-eclipselink + spring-integration + spring-jenkins-pipeline + spring-jersey + spring-jms + spring-jooq + persistence-modules/spring-jpa + spring-kafka + spring-katharsis + spring-ldap + spring-mockito + spring-mvc-forms-jsp + spring-mvc-forms-thymeleaf + spring-mvc-java + spring-mvc-velocity + spring-mvc-webflow + spring-mvc-xml + spring-mvc-kotlin + spring-protobuf + spring-quartz + spring-rest-angular + spring-rest-full + spring-rest-query-language + spring-rest + spring-resttemplate + spring-rest-simple + spring-reactive-kotlin + + + + + + + + + + + + + + + + java-websocket + persistence-modules/activejdbc + animal-sniffer-mvn-plugin + apache-avro + apache-bval + apache-shiro + apache-spark + asciidoctor + checker-plugin + + + core-java-sun + custom-pmd + dagger + data-structures + dubbo + persistence-modules/flyway + + + jni + jooby + + + + ratpack + rest-with-spark-java + spring-boot-autoconfiguration + spring-boot-custom-starter + spring-boot-jasypt + spring-data-rest-querydsl + spring-groovy + spring-mobile + spring-mustache + spring-mvc-simple + spring-mybatis + spring-rest-hal-browser + spring-rest-shell + spring-rest-template + spring-roo + spring-security-stormpath + sse-jaxrs + static-analysis + stripe + + + wicket + xstream + cas/cas-secured-app + + + + + + + + + + + + + + jenkins/hello-world + + + + spring-boot-custom-starter/greeter + persistence-modules/spring-boot-h2/spring-boot-h2-database + + + + + + + + integration-heavy From bb00c371513bb44812bda03d120ee9a389a0f74d Mon Sep 17 00:00:00 2001 From: smokeyrobot Date: Thu, 22 Nov 2018 15:13:14 -0500 Subject: [PATCH 079/429] Gatling vs JMeter vs The Grinder Issue: BAEL-46 --- .../load-testing-comparison/pom.xml | 148 +++++++++ .../com/baeldung/loadtesting/Application.java | 12 + .../loadtesting/RewardsController.java | 51 +++ .../loadtesting/TransactionController.java | 26 ++ .../model/CustomerRewardsAccount.java | 22 ++ .../loadtesting/model/Transaction.java | 30 ++ .../repository/CustomerRewardsRepository.java | 11 + .../repository/TransactionRepository.java | 11 + .../scripts/Gatling/GatlingScenario.scala | 52 ++++ .../resources/scripts/JMeter/Test Plan.jmx | 293 ++++++++++++++++++ .../scripts/The Grinder/grinder.properties | 5 + .../resources/scripts/The Grinder/grinder.py | 40 +++ 12 files changed, 701 insertions(+) create mode 100644 testing-modules/load-testing-comparison/pom.xml create mode 100644 testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java create mode 100644 testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java create mode 100644 testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java create mode 100644 testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java create mode 100644 testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java create mode 100644 testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java create mode 100644 testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java create mode 100644 testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala create mode 100644 testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx create mode 100644 testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties create mode 100644 testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py diff --git a/testing-modules/load-testing-comparison/pom.xml b/testing-modules/load-testing-comparison/pom.xml new file mode 100644 index 0000000000..869eda1bb5 --- /dev/null +++ b/testing-modules/load-testing-comparison/pom.xml @@ -0,0 +1,148 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + ../../pom.xml + + 4.0.0 + + load-testing-bakeoff + + + 1.8 + 1.8 + UTF-8 + 2.11.12 + 2.2.5 + 3.2.2 + 2.2.1 + 5.0 + 3.11 + 2.0.5.RELEASE + + + + + 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} + + + + + + + + com.fasterxml.jackson.core + jackson-databind + 2.9.4 + + + org.springframework.boot + spring-boot-starter + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-data-jpa + ${spring.boot.version} + + + org.springframework.boot + spring-boot-starter-test + ${spring.boot.version} + test + + + com.h2database + h2 + 1.4.197 + + + org.projectlombok + lombok + 1.18.2 + compile + + + + + + + + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + 2.0.5.RELEASE + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/testing-modules/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 new file mode 100644 index 0000000000..6647bcb640 --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.loadtesting; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/testing-modules/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 new file mode 100644 index 0000000000..50cc6fb7ab --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/RewardsController.java @@ -0,0 +1,51 @@ +package com.baeldung.loadtesting; + +import com.baeldung.loadtesting.model.CustomerRewardsAccount; +import com.baeldung.loadtesting.model.Transaction; +import com.baeldung.loadtesting.repository.CustomerRewardsRepository; +import com.baeldung.loadtesting.repository.TransactionRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.Calendar; +import java.util.List; +import java.util.Optional; + +@RestController +public class RewardsController { + + @Autowired + private CustomerRewardsRepository customerRewardsRepository; + + @Autowired + private TransactionRepository transactionRepository; + + @PostMapping(path="/transactions/add") + public @ResponseBody Transaction saveTransactions(@RequestBody Transaction trnsctn){ + trnsctn.setTransactionDate(Calendar.getInstance().getTime()); + Transaction result = transactionRepository.save(trnsctn); + return result; + } + + @GetMapping(path="/transactions/findAll/{rewardId}") + public @ResponseBody Iterable getTransactions(@PathVariable Integer rewardId){ + return transactionRepository.findByCustomerRewardsId(rewardId); + } + + @PostMapping(path="/rewards/add") + public @ResponseBody CustomerRewardsAccount addRewardsAcount(@RequestBody CustomerRewardsAccount body) { + Optional acct = customerRewardsRepository.findByCustomerId(body.getCustomerId()); + return !acct.isPresent() ? customerRewardsRepository.save(body) : acct.get(); + } + + @GetMapping(path="/rewards/find/{customerId}") + public @ResponseBody + Optional find(@PathVariable Integer customerId) { + return customerRewardsRepository.findByCustomerId(customerId); + } + + @GetMapping(path="/rewards/all") + public @ResponseBody List findAll() { + return customerRewardsRepository.findAll(); + } +} diff --git a/testing-modules/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 new file mode 100644 index 0000000000..2ea2c06a41 --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/TransactionController.java @@ -0,0 +1,26 @@ +package com.baeldung.loadtesting; + +import com.baeldung.loadtesting.model.Transaction; +import com.baeldung.loadtesting.repository.TransactionRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +@RestController +@Deprecated +public class TransactionController { + + @Autowired + private TransactionRepository transactionRepository; + + @PostMapping(path="/addTransaction") + public @ResponseBody + String saveTransactions(@RequestBody Transaction trnsctn){ + transactionRepository.save(trnsctn); + return "Saved Transaction."; + } + + @GetMapping(path="/findAll/{rewardId}") + public @ResponseBody Iterable getTransactions(@RequestParam Integer id){ + return transactionRepository.findByCustomerRewardsId(id); + } +} diff --git a/testing-modules/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 new file mode 100644 index 0000000000..2c6742fbaf --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/CustomerRewardsAccount.java @@ -0,0 +1,22 @@ +package com.baeldung.loadtesting.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +import lombok.Data; + +@Entity +@Data +public class CustomerRewardsAccount { + + @Id + @GeneratedValue(strategy= GenerationType.AUTO) + private Integer id; + private Integer customerId; + + public Integer getCustomerId(){ + return this.customerId; + } +} diff --git a/testing-modules/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 new file mode 100644 index 0000000000..312f52f4ab --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/model/Transaction.java @@ -0,0 +1,30 @@ +package com.baeldung.loadtesting.model; + +import lombok.Data; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import java.util.Date; +import java.util.Calendar; + +@Entity +@Data +public class Transaction { + + @Id + @GeneratedValue(strategy= GenerationType.AUTO) + private Integer id; + private Integer customerRewardsId; + private Integer customerId; + private Date transactionDate; + + public Transaction(){ + transactionDate = Calendar.getInstance().getTime(); + } + + public void setTransactionDate(Date transactionDate){ + this.transactionDate = transactionDate; + } +} diff --git a/testing-modules/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 new file mode 100644 index 0000000000..f945359eb8 --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/CustomerRewardsRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.loadtesting.repository; + +import com.baeldung.loadtesting.model.CustomerRewardsAccount; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface CustomerRewardsRepository extends JpaRepository { + + Optional findByCustomerId(Integer customerId); +} diff --git a/testing-modules/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 new file mode 100644 index 0000000000..af0b343c10 --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/java/com/baeldung/loadtesting/repository/TransactionRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.loadtesting.repository; + +import com.baeldung.loadtesting.model.Transaction; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface TransactionRepository extends JpaRepository { + + List findByCustomerRewardsId(Integer rewardsId); +} diff --git a/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala new file mode 100644 index 0000000000..f9b3837759 --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/Gatling/GatlingScenario.scala @@ -0,0 +1,52 @@ +package com.baeldung + +import scala.util._ +import io.gatling.core.Predef._ +import io.gatling.http.Predef._ +import scala.concurrent.duration._ + +class RewardsScenario extends Simulation { + + def randCustId() = Random.nextInt(99) + + val httpProtocol = http.baseUrl("http://localhost:8080") + .acceptHeader("text/html,application/json;q=0.9,*/*;q=0.8") + .doNotTrackHeader("1") + .acceptLanguageHeader("en-US,en;q=0.5") + .acceptEncodingHeader("gzip, deflate") + .userAgentHeader("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0") + + val scn = scenario("RewardsScenario") + .repeat(10){ + exec(http("transactions_add") + .post("/transactions/add/") + .body(StringBody("""{ "customerRewardsId":null,"customerId":""""+ randCustId() + """","transactionDate":null }""")).asJson + .check(jsonPath("$.id").saveAs("txnId")) + .check(jsonPath("$.transactionDate").saveAs("txtDate")) + .check(jsonPath("$.customerId").saveAs("custId"))) + .pause(1) + + .exec(http("get_reward") + .get("/rewards/find/${custId}") + .check(jsonPath("$.id").saveAs("rwdId"))) + .pause(1) + + .doIf("${rwdId.isUndefined()}"){ + exec(http("rewards_add") + .post("/rewards/add") + .body(StringBody("""{ "customerId": "${custId}" }""")).asJson + .check(jsonPath("$.id").saveAs("rwdId"))) + } + + .exec(http("transactions_add") + .post("/transactions/add/") + .body(StringBody("""{ "customerRewardsId":"${rwdId}","customerId":"${custId}","transactionDate":"${txtDate}" }""")).asJson) + .pause(1) + + .exec(http("get_reward") + .get("/transactions/findAll/${rwdId}")) + } + setUp( + scn.inject(atOnceUsers(100)) + ).protocols(httpProtocol) +} \ No newline at end of file diff --git a/testing-modules/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 new file mode 100644 index 0000000000..da32a13a22 --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/JMeter/Test Plan.jmx @@ -0,0 +1,293 @@ + + + + + + false + true + false + + + + + + + + continue + + false + 10 + + 100 + 0 + false + + + + + + true + 1 + + + + + + Content-Type + application/json + + + + + + true + + + + false + {"customerRewardsId":null,"customerId":${random},"transactionDate":null} + = + + + + localhost + 8080 + http + + /transactions/add + POST + true + false + true + false + + + + + + + txnId + $.id + 1 + all + foo + + + + txnDate + $.transactionDate + 1 + Never + + + + custId + $.customerId + 1 + all + bob + + + + + + + + localhost + 8080 + + + /rewards/find/${custId} + GET + true + false + true + false + + + + + + + rwdId + $.id + 1 + 0 + all + + + + + ${rwdId} == 0 + true + + + + true + + + + false + {"customerId":${custId}} + = + + + + localhost + 8080 + + + /rewards/add + POST + true + false + true + false + + + + + + + rwdId + $.id + 1 + bar + all + + + + + + true + + + + false + {"id":${txnId},"customerRewardsId":${rwdId},"customerId":${custId},"transactionDate":"${txnDate}"} + = + + + + localhost + 8080 + + + /transactions/add + POST + true + false + true + false + + + + + + + + + + localhost + 8080 + + + /transactions/findAll/${rwdId} + GET + true + false + true + false + + + + + + + + 10000 + 1 + + false + 67 + random + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + false + + saveConfig + + + true + true + true + + true + true + true + true + false + true + true + false + false + false + true + false + false + false + true + 0 + true + true + true + true + true + true + + + + + + + + + diff --git a/testing-modules/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 new file mode 100644 index 0000000000..68adf90856 --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.properties @@ -0,0 +1,5 @@ +grinder.script = grinder.py +grinder.threads = 100 +grinder.processes = 1 +grinder.runs = 10 +grinder.logDirectory = /logs diff --git a/testing-modules/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 new file mode 100644 index 0000000000..025f90d38b --- /dev/null +++ b/testing-modules/load-testing-comparison/src/main/resources/scripts/The Grinder/grinder.py @@ -0,0 +1,40 @@ +import java.util.Random +from net.grinder.script import Test +from net.grinder.script.Grinder import grinder +from net.grinder.plugin.http import HTTPRequest, HTTPPluginControl, HTTPUtilities +from HTTPClient import NVPair + +def parseJsonString(json, element): + for x in json.split(","): + pc = x.replace('"','').split(":") + if pc[0].replace("{","") == element: + ele = pc[1].replace("}","") + return ele + else: + return "" + +test1 = Test(1, "Request resource") +request1 = HTTPRequest() +headers = \ +( NVPair('Content-Type', 'application/json'), ) +request1.setHeaders(headers) +utilities = HTTPPluginControl.getHTTPUtilities() +test1.record(request1) +random=java.util.Random() + +class TestRunner: + def __call__(self): + customerId = str(random.nextInt()); + + result = request1.POST("http://localhost:8080/transactions/add", "{"'"customerRewardsId"'":null,"'"customerId"'":"+ customerId + ","'"transactionDate"'":null}") + txnId = parseJsonString(result.getText(), "id") + + result = request1.GET("http://localhost:8080/rewards/find/"+ customerId) + rwdId = parseJsonString(result.getText(), "id") + + if rwdId == "": + result = request1.POST("http://localhost:8080/rewards/add", "{"'"customerId"'":"+ customerId + "}") + rwdId = parseJsonString(result.getText(), "id") + + result = request1.POST("http://localhost:8080/transactions/add", "{"'"id"'":" + txnId + ","'"customerRewardsId"'":" + rwdId + ","'"customerId"'":"+ customerId + ","'"transactionDate"'":null}") + result = request1.GET("http://localhost:8080/transactions/findAll/" + rwdId) \ No newline at end of file From 668aa4a583105f6598bb861a63cd5ade1a72f854 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Thu, 22 Nov 2018 22:42:18 +0200 Subject: [PATCH 080/429] profiles work --- pom.xml | 14 +++++++++++--- spring-amqp-simple/pom.xml | 1 - 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index e36a972611..bc0c63213f 100644 --- a/pom.xml +++ b/pom.xml @@ -1089,7 +1089,6 @@ persistence-modules/solr persistence-modules/spring-data-dynamodb persistence-modules/spring-data-keyvalue - persistence-modules/spring-data-mongodb persistence-modules/spring-data-neo4j persistence-modules/spring-data-solr persistence-modules/spring-hibernate-5 @@ -1111,6 +1110,11 @@ rxjava-2 rabbitmq + + + @@ -1146,7 +1150,6 @@ parent-kotlin spring-4 - spring-5-data-reactive spring-5-reactive spring-5-reactive-security spring-5-reactive-client @@ -1156,7 +1159,6 @@ spring-akka spring-amqp spring-all - spring-amqp-simple spring-apache-camel spring-batch spring-bom @@ -1255,6 +1257,12 @@ spring-boot-ctx-fluent spring-webflux-amqp + + + diff --git a/spring-amqp-simple/pom.xml b/spring-amqp-simple/pom.xml index 3d9ea55cfa..ea9c227d8c 100644 --- a/spring-amqp-simple/pom.xml +++ b/spring-amqp-simple/pom.xml @@ -5,7 +5,6 @@ com.baeldung spring-amqp-simple 1.0.0-SNAPSHOT - Spring AMQP Simple App parent-boot-1 From 4c1f773d07d65bf3716e0d4089aebfbaf39bb04a Mon Sep 17 00:00:00 2001 From: Loredana Date: Thu, 22 Nov 2018 22:59:37 +0200 Subject: [PATCH 081/429] move constructors to java lang module --- core-java-lang/README.md | 1 + .../src/main/java/com/baeldung/constructors/BankAccount.java | 0 .../src/main/java/com/baeldung/constructors/Transaction.java | 0 .../test/java/com/baeldung/constructors/ConstructorUnitTest.java | 0 4 files changed, 1 insertion(+) rename {core-java => core-java-lang}/src/main/java/com/baeldung/constructors/BankAccount.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/constructors/Transaction.java (100%) rename {core-java => core-java-lang}/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java (100%) diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 85312cba68..62af72818f 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -56,4 +56,5 @@ - [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) - [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/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java similarity index 100% rename from core-java/src/main/java/com/baeldung/constructors/BankAccount.java rename to core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java diff --git a/core-java/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java similarity index 100% rename from core-java/src/main/java/com/baeldung/constructors/Transaction.java rename to core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java diff --git a/core-java/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java rename to core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java From bf184639e7f96754af246b9b78eef4a54b85b573 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 22 Nov 2018 23:36:10 +0200 Subject: [PATCH 082/429] Update README.md --- patterns/design-patterns/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/patterns/design-patterns/README.md b/patterns/design-patterns/README.md index 75f7cec73a..ae372bd460 100644 --- a/patterns/design-patterns/README.md +++ b/patterns/design-patterns/README.md @@ -12,3 +12,4 @@ - [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) From d988b1280a2c7d2d31029f3f4f1734dbd78ff511 Mon Sep 17 00:00:00 2001 From: Loredana Date: Thu, 22 Nov 2018 23:59:22 +0200 Subject: [PATCH 083/429] fix test --- .../org/baeldung/client/TestRestTemplateBasicLiveTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java b/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java index 03a76aca74..e303c75a28 100644 --- a/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java +++ b/spring-resttemplate/src/test/java/org/baeldung/client/TestRestTemplateBasicLiveTest.java @@ -58,9 +58,9 @@ public class TestRestTemplateBasicLiveTest { @Test public void givenRestTemplateWrapperWithCredentials_whenSendGetForEntity_thenStatusOk() { - RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder().basicAuthentication("user", "passwd"); + RestTemplateBuilder restTemplateBuilder = new RestTemplateBuilder(); restTemplateBuilder.configure(restTemplate); - TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder); + TestRestTemplate testRestTemplate = new TestRestTemplate(restTemplateBuilder, "user", "passwd"); ResponseEntity response = testRestTemplate.getForEntity(URL_SECURED_BY_AUTHENTICATION, String.class); assertThat(response.getStatusCode(), equalTo(HttpStatus.OK)); From 58a536c3953e8a3e71dd256d11a67d8bdf49b7c9 Mon Sep 17 00:00:00 2001 From: kyleandari <44148335+kyleandari@users.noreply.github.com> Date: Fri, 23 Nov 2018 10:46:20 -0500 Subject: [PATCH 084/429] BAEL 2330 * Implementing Hexagonal Architecture in java * Removing duplicates from a string * Fix for the code review feedback - removing the hexagonal architecture code - removing the methods removeDuplicatesUsingCharArray - adding some meaningful sentences to test * Fix for the code review feedback - fix for removeDuplicatesUsingCharArray - adding unit testing - adding brackets around for loops * Fix for the code review feedback * Adding remove duplicates using java 8 distinct adding assets to the unittests to test for empty strings * Checking for empty strings in unit tests Adding an if statement to check whether an empty string is passed to removeDuplicatesUsingSorting method --- .../RemoveDuplicateFromString.java | 25 ++++++++++++------- .../RemoveDuplicateFromStringUnitTest.java | 24 ++++++++++++++++++ 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java b/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java index eeba81f334..d8fd9c4b14 100644 --- a/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java +++ b/java-strings/src/main/java/com/baeldung/stringduplicates/RemoveDuplicateFromString.java @@ -44,16 +44,16 @@ public class RemoveDuplicateFromString { } String removeDuplicatesUsingSorting(String str) { - - char[] chars = str.toCharArray(); - - Arrays.sort(chars); - StringBuilder sb = new StringBuilder(); - sb.append(chars[0]); - for (int i = 1; i < chars.length; i++) { - if (chars[i] != chars[i - 1]) { - sb.append(chars[i]); + if(!str.isEmpty()) { + char[] chars = str.toCharArray(); + Arrays.sort(chars); + + sb.append(chars[0]); + for (int i = 1; i < chars.length; i++) { + if (chars[i] != chars[i - 1]) { + sb.append(chars[i]); + } } } @@ -90,6 +90,13 @@ public class RemoveDuplicateFromString { return sb.toString(); } + + String removeDuplicatesUsingDistinct(String str) { + StringBuilder sb = new StringBuilder(); + str.chars().distinct().forEach(c -> sb.append((char) c)); + return sb.toString(); + } + } diff --git a/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java b/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java index cf7819ced3..895ecc4a3b 100644 --- a/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/stringduplicates/RemoveDuplicateFromStringUnitTest.java @@ -8,6 +8,8 @@ public class RemoveDuplicateFromStringUnitTest { private final static String STR1 = "racecar"; private final static String STR2 = "J2ee programming"; + private final static String STR_EMPTY = ""; + private RemoveDuplicateFromString removeDuplicateFromString; @Before @@ -20,6 +22,8 @@ public class RemoveDuplicateFromStringUnitTest { public void whenUsingCharArray_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() { String str1 = removeDuplicateFromString.removeDuplicatesUsingCharArray(STR1); String str2 = removeDuplicateFromString.removeDuplicatesUsingCharArray(STR2); + String strEmpty = removeDuplicateFromString.removeDuplicatesUsingCharArray(STR_EMPTY); + Assert.assertEquals("", strEmpty); Assert.assertEquals("ecar", str1); Assert.assertEquals("J2e poraming", str2); } @@ -28,6 +32,9 @@ public class RemoveDuplicateFromStringUnitTest { public void whenUsingLinkedHashSet_DuplicatesShouldBeRemovedAndItKeepStringOrder() { String str1 = removeDuplicateFromString.removeDuplicatesUsinglinkedHashSet(STR1); String str2 = removeDuplicateFromString.removeDuplicatesUsinglinkedHashSet(STR2); + + String strEmpty = removeDuplicateFromString.removeDuplicatesUsinglinkedHashSet(STR_EMPTY); + Assert.assertEquals("", strEmpty); Assert.assertEquals("race", str1); Assert.assertEquals("J2e progamin", str2); } @@ -36,6 +43,9 @@ public class RemoveDuplicateFromStringUnitTest { public void whenUsingSorting_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() { String str1 = removeDuplicateFromString.removeDuplicatesUsingSorting(STR1); String str2 = removeDuplicateFromString.removeDuplicatesUsingSorting(STR2); + + String strEmpty = removeDuplicateFromString.removeDuplicatesUsingSorting(STR_EMPTY); + Assert.assertEquals("", strEmpty); Assert.assertEquals("acer", str1); Assert.assertEquals(" 2Jaegimnopr", str2); } @@ -44,6 +54,8 @@ public class RemoveDuplicateFromStringUnitTest { public void whenUsingHashSet_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() { String str1 = removeDuplicateFromString.removeDuplicatesUsingHashSet(STR1); String str2 = removeDuplicateFromString.removeDuplicatesUsingHashSet(STR2); + String strEmpty = removeDuplicateFromString.removeDuplicatesUsingHashSet(STR_EMPTY); + Assert.assertEquals("", strEmpty); Assert.assertEquals("arce", str1); Assert.assertEquals(" pa2regiJmno", str2); } @@ -52,7 +64,19 @@ public class RemoveDuplicateFromStringUnitTest { public void whenUsingIndexOf_DuplicatesShouldBeRemovedWithoutKeepingStringOrder() { String str1 = removeDuplicateFromString.removeDuplicatesUsingIndexOf(STR1); String str2 = removeDuplicateFromString.removeDuplicatesUsingIndexOf(STR2); + String strEmpty = removeDuplicateFromString.removeDuplicatesUsingIndexOf(STR_EMPTY); + Assert.assertEquals("", strEmpty); Assert.assertEquals("ecar", str1); Assert.assertEquals("J2e poraming", str2); } + + @Test + public void whenUsingJava8_DuplicatesShouldBeRemovedAndItKeepStringOrder() { + String str1 = removeDuplicateFromString.removeDuplicatesUsingDistinct(STR1); + String str2 = removeDuplicateFromString.removeDuplicatesUsingDistinct(STR2); + String strEmpty = removeDuplicateFromString.removeDuplicatesUsingDistinct(STR_EMPTY); + Assert.assertEquals("", strEmpty); + Assert.assertEquals("race", str1); + Assert.assertEquals("J2e progamin", str2); + } } From cfd9a97bd48769f4bbf937e0b71be49177ad1e02 Mon Sep 17 00:00:00 2001 From: Eugen Date: Fri, 23 Nov 2018 17:57:50 +0200 Subject: [PATCH 085/429] Delete README.md --- parent-boot-1/README.md | 1 - 1 file changed, 1 deletion(-) delete mode 100644 parent-boot-1/README.md diff --git a/parent-boot-1/README.md b/parent-boot-1/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/parent-boot-1/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: From 64bc8a412d2a40d82fde575c6b542c5e18106f34 Mon Sep 17 00:00:00 2001 From: eelhazati Date: Fri, 23 Nov 2018 17:00:08 +0100 Subject: [PATCH 086/429] JPA Entity Graph. --- .../com/baeldung/jpa/entitygraph/MainApp.java | 26 ++++++ .../jpa/entitygraph/model/Comment.java | 63 +++++++++++++ .../baeldung/jpa/entitygraph/model/Post.java | 86 +++++++++++++++++ .../baeldung/jpa/entitygraph/model/User.java | 48 ++++++++++ .../jpa/entitygraph/repo/PostRepository.java | 93 +++++++++++++++++++ .../main/resources/META-INF/persistence.xml | 55 +++++++---- .../java-jpa/src/main/resources/data-init.sql | 8 ++ .../entitygraph/repo/PostRepositoryTest.java | 68 ++++++++++++++ 8 files changed, 428 insertions(+), 19 deletions(-) create mode 100644 persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/MainApp.java create mode 100644 persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Comment.java create mode 100644 persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Post.java create mode 100644 persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/User.java create mode 100644 persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/repo/PostRepository.java create mode 100644 persistence-modules/java-jpa/src/main/resources/data-init.sql create mode 100644 persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryTest.java diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/MainApp.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/MainApp.java new file mode 100644 index 0000000000..88aa4389e9 --- /dev/null +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/MainApp.java @@ -0,0 +1,26 @@ +package com.baeldung.jpa.entitygraph; + +import com.baeldung.jpa.entitygraph.model.Post; +import com.baeldung.jpa.entitygraph.repo.PostRepository; + +public class MainApp { + + public static void main(String... args) { + Long postId = 1L; + Post post = null; + PostRepository postRepository = new PostRepository(); + + //Using EntityManager.find(). + post = postRepository.find(postId); + post = postRepository.findWithEntityGraph(postId); + post = postRepository.findWithEntityGraph2(postId); + + //Using JPQL: Query and TypedQuery + post = postRepository.findUsingJpql(postId); + + //Using Criteria API + post = postRepository.findUsingCriteria(postId); + + postRepository.clean(); + } +} \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Comment.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Comment.java new file mode 100644 index 0000000000..40ecd3262b --- /dev/null +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Comment.java @@ -0,0 +1,63 @@ +package com.baeldung.jpa.entitygraph.model; + +import javax.persistence.*; + +@Entity +public class Comment { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String reply; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn + private Post post; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn + private User user; + //... + + public Comment() { + } + + public Comment(String reply, Post post, User user) { + this.reply = reply; + this.post = post; + this.user = user; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getReply() { + return reply; + } + + public void setReply(String reply) { + this.reply = reply; + } + + public Post getPost() { + return post; + } + + public void setPost(Post post) { + this.post = post; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Post.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Post.java new file mode 100644 index 0000000000..59f17ae0c5 --- /dev/null +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/Post.java @@ -0,0 +1,86 @@ +package com.baeldung.jpa.entitygraph.model; + +import javax.persistence.*; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@NamedEntityGraph( + name = "post-entity-graph", + attributeNodes = { + @NamedAttributeNode("subject"), + @NamedAttributeNode("user"), + @NamedAttributeNode("comments"), + } +) +@NamedEntityGraph( + name = "post-entity-graph-with-comment-users", + attributeNodes = { + @NamedAttributeNode("subject"), + @NamedAttributeNode("user"), + @NamedAttributeNode(value = "comments", subgraph = "comments-subgraph"), + }, + subgraphs = { + @NamedSubgraph( + name = "comments-subgraph", + attributeNodes = { + @NamedAttributeNode("user") + } + ) + } +) +@Entity +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String subject; + @OneToMany(mappedBy = "post") + private List comments = new ArrayList<>(); + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn + private User user; + //... + + public Post() { + } + + public Post(String subject, User user) { + this.subject = subject; + this.user = user; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public List getComments() { + return comments; + } + + public void setComments(List comments) { + this.comments = comments; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/User.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/User.java new file mode 100644 index 0000000000..b712100d4e --- /dev/null +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/model/User.java @@ -0,0 +1,48 @@ +package com.baeldung.jpa.entitygraph.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class User { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + private String name; + private String email; + + //... + + public User() { + } + + public User(String email) { + this.email = email; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/repo/PostRepository.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/repo/PostRepository.java new file mode 100644 index 0000000000..28f1e1b93c --- /dev/null +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/entitygraph/repo/PostRepository.java @@ -0,0 +1,93 @@ +package com.baeldung.jpa.entitygraph.repo; + +import com.baeldung.jpa.entitygraph.model.Post; + +import javax.persistence.*; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.util.HashMap; +import java.util.Map; + +public class PostRepository { + private EntityManagerFactory emf = null; + + + public PostRepository() { + Map properties = new HashMap(); + properties.put("hibernate.show_sql", "true"); + properties.put("hibernate.format_sql", "true"); + emf = Persistence.createEntityManagerFactory("entity-graph-pu", properties); + } + + public Post find(Long id) { + EntityManager entityManager = emf.createEntityManager(); + + Post post = entityManager.find(Post.class, id); + + entityManager.close(); + return post; + } + + public Post findWithEntityGraph(Long id) { + EntityManager entityManager = emf.createEntityManager(); + + EntityGraph entityGraph = entityManager.getEntityGraph("post-entity-graph"); + Map properties = new HashMap<>(); + properties.put("javax.persistence.fetchgraph", entityGraph); + Post post = entityManager.find(Post.class, id, properties); + + entityManager.close(); + return post; + } + + public Post findWithEntityGraph2(Long id) { + EntityManager entityManager = emf.createEntityManager(); + + EntityGraph entityGraph = entityManager.createEntityGraph(Post.class); + entityGraph.addAttributeNodes("subject"); + entityGraph.addAttributeNodes("user"); + entityGraph.addSubgraph("comments") + .addAttributeNodes("user"); + + Map properties = new HashMap<>(); + properties.put("javax.persistence.fetchgraph", entityGraph); + Post post = entityManager.find(Post.class, id, properties); + + entityManager.close(); + return post; + } + + public Post findUsingJpql(Long id) { + EntityManager entityManager = emf.createEntityManager(); + + EntityGraph entityGraph = entityManager.getEntityGraph("post-entity-graph-with-comment-users"); + Post post = entityManager.createQuery("Select p from Post p where p.id=:id", Post.class) + .setParameter("id", id) + .setHint("javax.persistence.fetchgraph", entityGraph) + .getSingleResult(); + + entityManager.close(); + return post; + } + + public Post findUsingCriteria(Long id) { + EntityManager entityManager = emf.createEntityManager(); + + EntityGraph entityGraph = entityManager.getEntityGraph("post-entity-graph-with-comment-users"); + CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Post.class); + Root root = criteriaQuery.from(Post.class); + criteriaQuery.where(criteriaBuilder.equal(root.get("id"), id)); + TypedQuery typedQuery = entityManager.createQuery(criteriaQuery); + typedQuery.setHint("javax.persistence.loadgraph", entityGraph); + Post post = typedQuery.getSingleResult(); + + entityManager.close(); + return post; + } + + public void clean() { + emf.close(); + } +} 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 3fdc8ce27c..433d456cc9 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 @@ -9,12 +9,12 @@ org.hibernate.jpa.HibernatePersistenceProvider com.baeldung.sqlresultsetmapping.ScheduledDay - + - - - + value="jdbc:h2:mem:test;INIT=RUNSCRIPT FROM 'classpath:database.sql'"/> + + + @@ -25,28 +25,45 @@ org.hibernate.jpa.HibernatePersistenceProvider com.baeldung.jpa.stringcast.Message - - - - - - + + + + + + - + org.hibernate.jpa.HibernatePersistenceProvider com.baeldung.jpa.model.Car - - - - - - + + + + + + - + + + com.baeldung.jpa.entitygraph.model.Post + com.baeldung.jpa.entitygraph.model.User + com.baeldung.jpa.entitygraph.model.Comment + true + + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/java-jpa/src/main/resources/data-init.sql b/persistence-modules/java-jpa/src/main/resources/data-init.sql new file mode 100644 index 0000000000..86c3f2a651 --- /dev/null +++ b/persistence-modules/java-jpa/src/main/resources/data-init.sql @@ -0,0 +1,8 @@ +INSERT INTO `USER` (`ID`,`NAME`,`EMAIL`) VALUES (1,'user1','user1@test.com'); +INSERT INTO `USER` (`ID`,`NAME`,`EMAIL`) VALUES (2,'user2','user2@test.com'); +INSERT INTO `USER` (`ID`,`NAME`,`EMAIL`) VALUES (3,'user3','user3@test.com'); + +INSERT INTO `POST` (`ID`,`SUBJECT`,`USER_ID`) VALUES (1,'JPA Entity Graph In Action',1); + +INSERT INTO `COMMENT` (`ID`,`REPLY`,`POST_ID`,`USER_ID`) VALUES (1,'Nice !!',1,2); +INSERT INTO `COMMENT` (`ID`,`REPLY`,`POST_ID`,`USER_ID`) VALUES (2,'Cool !!',1,3); diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryTest.java new file mode 100644 index 0000000000..382742f223 --- /dev/null +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryTest.java @@ -0,0 +1,68 @@ +package com.baeldung.jpa.entitygraph.repo; + +import com.baeldung.jpa.entitygraph.model.Comment; +import com.baeldung.jpa.entitygraph.model.Post; +import com.baeldung.jpa.entitygraph.model.User; +import org.hibernate.LazyInitializationException; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; + +import static org.junit.Assert.*; + +public class PostRepositoryTest { + + private static PostRepository postRepository = null; + + @BeforeClass + public static void once() { + postRepository = new PostRepository(); + } + + @Test(expected = LazyInitializationException.class) + public void find() { + Post post = postRepository.find(1L); + assertNotNull(post.getUser()); + String email = post.getUser().getEmail(); + assertNull(email); + } + + @Test + public void findWithEntityGraph() { + Post post = postRepository.findWithEntityGraph(1L); + assertNotNull(post.getUser()); + String email = post.getUser().getEmail(); + assertNotNull(email); + } + + @Test(expected = LazyInitializationException.class) + public void findWithEntityGraph_Comment_Without_User() { + Post post = postRepository.findWithEntityGraph(1L); + assertNotNull(post.getUser()); + String email = post.getUser().getEmail(); + assertNotNull(email); + assertNotNull(post.getComments()); + assertEquals(post.getComments().size(), 2); + Comment comment = post.getComments().get(0); + assertNotNull(comment); + User user = comment.getUser(); + user.getEmail(); + } + + @Test + public void findWithEntityGraph2_Comment_With_User() { + Post post = postRepository.findWithEntityGraph2(1L); + assertNotNull(post.getComments()); + assertEquals(post.getComments().size(), 2); + Comment comment = post.getComments().get(0); + assertNotNull(comment); + User user = comment.getUser(); + assertNotNull(user); + assertEquals(user.getEmail(), "user2@test.com"); + } + + @AfterClass + public static void destroy() { + postRepository.clean(); + } +} \ No newline at end of file From 3d945c079a8b4daabc3a1cd0c15155f7aec2579f Mon Sep 17 00:00:00 2001 From: eric-martin Date: Fri, 23 Nov 2018 23:41:00 -0600 Subject: [PATCH 087/429] Added @DirtiesContext to SpringContextIntegrationTest --- .../test/java/org/baeldung/SpringContextIntegrationTest.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spring-jenkins-pipeline/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-jenkins-pipeline/src/test/java/org/baeldung/SpringContextIntegrationTest.java index 8eb1589de7..0354f7211c 100644 --- a/spring-jenkins-pipeline/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-jenkins-pipeline/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -3,12 +3,14 @@ package org.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.SpringJenkinsPipelineApplication; @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringJenkinsPipelineApplication.class) +@DirtiesContext public class SpringContextIntegrationTest { @Test From 6e3245a0f142d7dc2c836c1f6d67e013a27424a9 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 24 Nov 2018 12:17:39 +0200 Subject: [PATCH 088/429] profile work --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index bc0c63213f..ae5897b6f3 100644 --- a/pom.xml +++ b/pom.xml @@ -775,7 +775,7 @@ parent-kotlin testing-modules/gatling - geotools + From 0d6007309574c5e29c255fc910aedf9dfc8934a4 Mon Sep 17 00:00:00 2001 From: DOHA Date: Sat, 24 Nov 2018 13:36:14 +0200 Subject: [PATCH 089/429] customise oauth2 requests --- .../CustomAuthorizationRequestResolver.java | 50 ++++++++++++++ .../oauth2/CustomRequestEntityConverter.java | 26 +++++++ .../oauth2/CustomTokenResponseConverter.java | 67 +++++++++++++++++++ .../com/baeldung/oauth2/SecurityConfig.java | 18 ++++- 4 files changed, 159 insertions(+), 2 deletions(-) create mode 100644 spring-5-security/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java create mode 100644 spring-5-security/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java create mode 100644 spring-5-security/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java b/spring-5-security/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java new file mode 100644 index 0000000000..025064423d --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java @@ -0,0 +1,50 @@ +package com.baeldung.oauth2; + +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizationRequestResolver; +import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver; +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; + +public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRequestResolver { + + private OAuth2AuthorizationRequestResolver defaultResolver; + + public CustomAuthorizationRequestResolver(ClientRegistrationRepository repo, String authorizationRequestBaseUri){ + defaultResolver = new DefaultOAuth2AuthorizationRequestResolver(repo, authorizationRequestBaseUri); + } + + @Override + public OAuth2AuthorizationRequest resolve(HttpServletRequest request) { + OAuth2AuthorizationRequest req = defaultResolver.resolve(request); + if(req != null){ + req = customizeAuthorizationRequest(req); + } + return req; + } + + @Override + public OAuth2AuthorizationRequest resolve(HttpServletRequest request, String clientRegistrationId) { + OAuth2AuthorizationRequest req = defaultResolver.resolve(request, clientRegistrationId); + if(req != null){ + req = customizeAuthorizationRequest(req); + } + return req; + } + + private OAuth2AuthorizationRequest customizeAuthorizationRequest(OAuth2AuthorizationRequest req) { + Map extraParams = new HashMap(); + extraParams.putAll(req.getAdditionalParameters()); //VIP note + extraParams.put("test", "extra"); + System.out.println("here ====================="); + return OAuth2AuthorizationRequest.from(req).additionalParameters(extraParams).build(); + } + + private OAuth2AuthorizationRequest customizeAuthorizationRequest1(OAuth2AuthorizationRequest req) { + return OAuth2AuthorizationRequest.from(req).state("xyz").build(); + } +} diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java b/spring-5-security/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java new file mode 100644 index 0000000000..8884065769 --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java @@ -0,0 +1,26 @@ +package com.baeldung.oauth2; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.http.RequestEntity; +import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; +import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequestEntityConverter; +import org.springframework.util.MultiValueMap; + +public class CustomRequestEntityConverter implements Converter> { + + private OAuth2AuthorizationCodeGrantRequestEntityConverter defaultConverter; + + public CustomRequestEntityConverter() { + defaultConverter = new OAuth2AuthorizationCodeGrantRequestEntityConverter(); + } + + @Override + public RequestEntity convert(OAuth2AuthorizationCodeGrantRequest req) { + RequestEntity entity = defaultConverter.convert(req); + MultiValueMap params = (MultiValueMap) entity.getBody(); + params.add("test2", "extra2"); + System.out.println(params.entrySet()); + return new RequestEntity<>(params, entity.getHeaders(), entity.getMethod(), entity.getUrl()); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java b/spring-5-security/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java new file mode 100644 index 0000000000..741f44871a --- /dev/null +++ b/spring-5-security/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java @@ -0,0 +1,67 @@ +package com.baeldung.oauth2; + +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; +import org.springframework.util.StringUtils; + +public class CustomTokenResponseConverter implements Converter, OAuth2AccessTokenResponse> { + private static final Set TOKEN_RESPONSE_PARAMETER_NAMES = Stream.of( + OAuth2ParameterNames.ACCESS_TOKEN, + OAuth2ParameterNames.TOKEN_TYPE, + OAuth2ParameterNames.EXPIRES_IN, + OAuth2ParameterNames.REFRESH_TOKEN, + OAuth2ParameterNames.SCOPE) .collect(Collectors.toSet()); + + @Override + public OAuth2AccessTokenResponse convert(Map tokenResponseParameters) { + String accessToken = tokenResponseParameters.get(OAuth2ParameterNames.ACCESS_TOKEN); + + OAuth2AccessToken.TokenType accessTokenType = null; + if (OAuth2AccessToken.TokenType.BEARER.getValue() + .equalsIgnoreCase(tokenResponseParameters.get(OAuth2ParameterNames.TOKEN_TYPE))) { + accessTokenType = OAuth2AccessToken.TokenType.BEARER; + } + + long expiresIn = 0; + if (tokenResponseParameters.containsKey(OAuth2ParameterNames.EXPIRES_IN)) { + try { + expiresIn = Long.valueOf(tokenResponseParameters.get(OAuth2ParameterNames.EXPIRES_IN)); + } catch (NumberFormatException ex) { + } + } + + Set scopes = Collections.emptySet(); + if (tokenResponseParameters.containsKey(OAuth2ParameterNames.SCOPE)) { + String scope = tokenResponseParameters.get(OAuth2ParameterNames.SCOPE); + scopes = Arrays.stream(StringUtils.delimitedListToStringArray(scope, " ")) + .collect(Collectors.toSet()); + } + + String refreshToken = tokenResponseParameters.get(OAuth2ParameterNames.REFRESH_TOKEN); + + Map additionalParameters = new LinkedHashMap<>(); + tokenResponseParameters.entrySet() + .stream() + .filter(e -> !TOKEN_RESPONSE_PARAMETER_NAMES.contains(e.getKey())) + .forEach(e -> additionalParameters.put(e.getKey(), e.getValue())); + + return OAuth2AccessTokenResponse.withToken(accessToken) + .tokenType(accessTokenType) + .expiresIn(expiresIn) + .scopes(scopes) + .refreshToken(refreshToken) + .additionalParameters(additionalParameters) + .build(); + } + +} diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java b/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java index b45f325767..cf27b01a75 100644 --- a/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java +++ b/spring-5-security/src/main/java/com/baeldung/oauth2/SecurityConfig.java @@ -9,18 +9,22 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; +import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.oauth2.client.CommonOAuth2Provider; -import org.springframework.security.oauth2.client.endpoint.NimbusAuthorizationCodeTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient; import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; +import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository; import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; +import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; +import org.springframework.web.client.RestTemplate; @Configuration @PropertySource("application-oauth2.properties") @@ -37,6 +41,8 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .oauth2Login() .loginPage("/oauth_login") .authorizationEndpoint() + .authorizationRequestResolver( new CustomAuthorizationRequestResolver(clientRegistrationRepository(),"/oauth2/authorize-client")) + .baseUri("/oauth2/authorize-client") .authorizationRequestRepository(authorizationRequestRepository()) .and() @@ -54,7 +60,15 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public OAuth2AccessTokenResponseClient accessTokenResponseClient() { - return new NimbusAuthorizationCodeTokenResponseClient(); + DefaultAuthorizationCodeTokenResponseClient accessTokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient(); + accessTokenResponseClient.setRequestEntityConverter(new CustomRequestEntityConverter()); + + OAuth2AccessTokenResponseHttpMessageConverter tokenResponseHttpMessageConverter = new OAuth2AccessTokenResponseHttpMessageConverter(); + tokenResponseHttpMessageConverter.setTokenResponseConverter(new CustomTokenResponseConverter()); + RestTemplate restTemplate = new RestTemplate(Arrays.asList(new FormHttpMessageConverter(), tokenResponseHttpMessageConverter)); + restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler()); + accessTokenResponseClient.setRestOperations(restTemplate); + return accessTokenResponseClient; } From a6c9c5840f9942c89a7318c6ea7cced0de058345 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 24 Nov 2018 13:36:27 +0200 Subject: [PATCH 090/429] disabling unnecessary repo --- libraries/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/pom.xml b/libraries/pom.xml index 8ffd33272d..936e86873d 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -720,11 +720,11 @@ - + false From 991436fa16b659cbe79a053f8ed4781f0662d284 Mon Sep 17 00:00:00 2001 From: saikat Date: Sat, 24 Nov 2018 18:58:48 +0530 Subject: [PATCH 091/429] Rename project module --- pom.xml | 2 +- {restx-demo => restx}/data/credentials.json | 0 {restx-demo => restx}/data/users.json | 0 {restx-demo => restx}/md.restx.json | 0 {restx-demo => restx}/pom.xml | 3 +-- {restx-demo => restx}/src/main/java/restx/demo/AppModule.java | 0 {restx-demo => restx}/src/main/java/restx/demo/AppServer.java | 0 {restx-demo => restx}/src/main/java/restx/demo/Roles.java | 0 .../src/main/java/restx/demo/domain/Message.java | 0 .../src/main/java/restx/demo/rest/HelloResource.java | 0 {restx-demo => restx}/src/main/resources/logback.xml | 0 .../src/main/resources/restx/demo/settings.properties | 0 {restx-demo => restx}/src/main/webapp/WEB-INF/web.xml | 0 .../test/java/restx/demo/rest/HelloResourceSpecUnitTest.java | 0 .../resources/specs/hello/should_admin_say_hello.spec.yaml | 0 .../resources/specs/hello/should_anyone_say_hello.spec.yaml | 0 .../should_missing_value_triggers_validation_error.spec.yaml | 0 .../resources/specs/hello/should_user1_say_hello.spec.yaml | 0 .../resources/specs/hello/should_user2_not_say_hello.spec.yaml | 0 19 files changed, 2 insertions(+), 3 deletions(-) rename {restx-demo => restx}/data/credentials.json (100%) rename {restx-demo => restx}/data/users.json (100%) rename {restx-demo => restx}/md.restx.json (100%) rename {restx-demo => restx}/pom.xml (98%) rename {restx-demo => restx}/src/main/java/restx/demo/AppModule.java (100%) rename {restx-demo => restx}/src/main/java/restx/demo/AppServer.java (100%) rename {restx-demo => restx}/src/main/java/restx/demo/Roles.java (100%) rename {restx-demo => restx}/src/main/java/restx/demo/domain/Message.java (100%) rename {restx-demo => restx}/src/main/java/restx/demo/rest/HelloResource.java (100%) rename {restx-demo => restx}/src/main/resources/logback.xml (100%) rename {restx-demo => restx}/src/main/resources/restx/demo/settings.properties (100%) rename {restx-demo => restx}/src/main/webapp/WEB-INF/web.xml (100%) rename restx-demo/src/test/java/restx/demo/rest/HelloResourceSpecTest.java => restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java (100%) rename {restx-demo => restx}/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml (100%) rename {restx-demo => restx}/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml (100%) rename {restx-demo => restx}/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml (100%) rename {restx-demo => restx}/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml (100%) rename {restx-demo => restx}/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml (100%) diff --git a/pom.xml b/pom.xml index 10e23da0ad..77c666b3ab 100644 --- a/pom.xml +++ b/pom.xml @@ -1608,7 +1608,7 @@ persistence-modules/spring-data-elasticsearch core-java-concurrency core-java-concurrency-collections - restx-demo + restx diff --git a/restx-demo/data/credentials.json b/restx/data/credentials.json similarity index 100% rename from restx-demo/data/credentials.json rename to restx/data/credentials.json diff --git a/restx-demo/data/users.json b/restx/data/users.json similarity index 100% rename from restx-demo/data/users.json rename to restx/data/users.json diff --git a/restx-demo/md.restx.json b/restx/md.restx.json similarity index 100% rename from restx-demo/md.restx.json rename to restx/md.restx.json diff --git a/restx-demo/pom.xml b/restx/pom.xml similarity index 98% rename from restx-demo/pom.xml rename to restx/pom.xml index da106b8191..c6233b968c 100644 --- a/restx-demo/pom.xml +++ b/restx/pom.xml @@ -4,8 +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 - restx-demo - restx-demo + restx 0.1-SNAPSHOT war restx-demo diff --git a/restx-demo/src/main/java/restx/demo/AppModule.java b/restx/src/main/java/restx/demo/AppModule.java similarity index 100% rename from restx-demo/src/main/java/restx/demo/AppModule.java rename to restx/src/main/java/restx/demo/AppModule.java diff --git a/restx-demo/src/main/java/restx/demo/AppServer.java b/restx/src/main/java/restx/demo/AppServer.java similarity index 100% rename from restx-demo/src/main/java/restx/demo/AppServer.java rename to restx/src/main/java/restx/demo/AppServer.java diff --git a/restx-demo/src/main/java/restx/demo/Roles.java b/restx/src/main/java/restx/demo/Roles.java similarity index 100% rename from restx-demo/src/main/java/restx/demo/Roles.java rename to restx/src/main/java/restx/demo/Roles.java diff --git a/restx-demo/src/main/java/restx/demo/domain/Message.java b/restx/src/main/java/restx/demo/domain/Message.java similarity index 100% rename from restx-demo/src/main/java/restx/demo/domain/Message.java rename to restx/src/main/java/restx/demo/domain/Message.java diff --git a/restx-demo/src/main/java/restx/demo/rest/HelloResource.java b/restx/src/main/java/restx/demo/rest/HelloResource.java similarity index 100% rename from restx-demo/src/main/java/restx/demo/rest/HelloResource.java rename to restx/src/main/java/restx/demo/rest/HelloResource.java diff --git a/restx-demo/src/main/resources/logback.xml b/restx/src/main/resources/logback.xml similarity index 100% rename from restx-demo/src/main/resources/logback.xml rename to restx/src/main/resources/logback.xml diff --git a/restx-demo/src/main/resources/restx/demo/settings.properties b/restx/src/main/resources/restx/demo/settings.properties similarity index 100% rename from restx-demo/src/main/resources/restx/demo/settings.properties rename to restx/src/main/resources/restx/demo/settings.properties diff --git a/restx-demo/src/main/webapp/WEB-INF/web.xml b/restx/src/main/webapp/WEB-INF/web.xml similarity index 100% rename from restx-demo/src/main/webapp/WEB-INF/web.xml rename to restx/src/main/webapp/WEB-INF/web.xml diff --git a/restx-demo/src/test/java/restx/demo/rest/HelloResourceSpecTest.java b/restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java similarity index 100% rename from restx-demo/src/test/java/restx/demo/rest/HelloResourceSpecTest.java rename to restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java diff --git a/restx-demo/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml similarity index 100% rename from restx-demo/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml rename to restx/src/test/resources/specs/hello/should_admin_say_hello.spec.yaml diff --git a/restx-demo/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml similarity index 100% rename from restx-demo/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml rename to restx/src/test/resources/specs/hello/should_anyone_say_hello.spec.yaml diff --git a/restx-demo/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml b/restx/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml similarity index 100% rename from restx-demo/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml rename to restx/src/test/resources/specs/hello/should_missing_value_triggers_validation_error.spec.yaml diff --git a/restx-demo/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml similarity index 100% rename from restx-demo/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml rename to restx/src/test/resources/specs/hello/should_user1_say_hello.spec.yaml diff --git a/restx-demo/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml b/restx/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml similarity index 100% rename from restx-demo/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml rename to restx/src/test/resources/specs/hello/should_user2_not_say_hello.spec.yaml From 9ba79376452c320ebb8b9b6cca7a61920a0f9767 Mon Sep 17 00:00:00 2001 From: saikat Date: Sat, 24 Nov 2018 19:00:09 +0530 Subject: [PATCH 092/429] Rename unit test to fix PMD failure --- .../java/restx/demo/rest/HelloResourceSpecUnitTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java b/restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java index 138a22d074..f67e4565b3 100644 --- a/restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java +++ b/restx/src/test/java/restx/demo/rest/HelloResourceSpecUnitTest.java @@ -1,13 +1,13 @@ package restx.demo.rest; -import restx.demo.AppServer; import org.junit.runner.RunWith; -import restx.tests.RestxSpecTestsRunner; + import restx.tests.FindSpecsIn; +import restx.tests.RestxSpecTestsRunner; @RunWith(RestxSpecTestsRunner.class) @FindSpecsIn("specs/hello") -public class HelloResourceSpecTest { +public class HelloResourceSpecUnitTest { /** * Useless, thanks to both @RunWith(RestxSpecTestsRunner.class) & @FindSpecsIn() From 8d393165c4ce7a372b0ff5a595d9351b8a4afa48 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 24 Nov 2018 18:35:05 +0200 Subject: [PATCH 093/429] Update and rename PostRepositoryTest.java to PostRepositoryIntegrationTest.java --- ...RepositoryTest.java => PostRepositoryIntegrationTest.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/{PostRepositoryTest.java => PostRepositoryIntegrationTest.java} (94%) diff --git a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryTest.java b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryIntegrationTest.java similarity index 94% rename from persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryTest.java rename to persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryIntegrationTest.java index 382742f223..4724bb41ad 100644 --- a/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryTest.java +++ b/persistence-modules/java-jpa/src/test/java/com/baeldung/jpa/entitygraph/repo/PostRepositoryIntegrationTest.java @@ -10,7 +10,7 @@ import org.junit.Test; import static org.junit.Assert.*; -public class PostRepositoryTest { +public class PostRepositoryIntegrationTest { private static PostRepository postRepository = null; @@ -65,4 +65,4 @@ public class PostRepositoryTest { public static void destroy() { postRepository.clean(); } -} \ No newline at end of file +} From 27ec13ea96cf876ba159babd9ec4e4a67c0877ca Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 25 Nov 2018 00:23:51 +0530 Subject: [PATCH 094/429] [BAEL-9712] - Modifed oauth version --- spring-5-security-oauth/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml index 13359ae84a..33a0677724 100644 --- a/spring-5-security-oauth/pom.xml +++ b/spring-5-security-oauth/pom.xml @@ -66,7 +66,7 @@ - 2.0.5.RELEASE + 2.0.1.RELEASE From 4e4da4eb7739315bd797491938998723f850174e Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 24 Nov 2018 21:50:20 +0200 Subject: [PATCH 095/429] fix start, edit readme --- spring-5-security-oauth/README.md | 3 ++- spring-5-security-oauth/pom.xml | 1 + spring-5-security/README.md | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/spring-5-security-oauth/README.md b/spring-5-security-oauth/README.md index 81d95c07d7..f13925992b 100644 --- a/spring-5-security-oauth/README.md +++ b/spring-5-security-oauth/README.md @@ -1,3 +1,4 @@ ## Relevant articles: -- [Spring Security 5 -OAuth2 Login](http://www.baeldung.com/spring-security-5-oauth2-login) \ No newline at end of file +- [Spring Security 5 -OAuth2 Login](http://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) diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml index 33a0677724..f200052adf 100644 --- a/spring-5-security-oauth/pom.xml +++ b/spring-5-security-oauth/pom.xml @@ -67,6 +67,7 @@ 2.0.1.RELEASE + com.baeldung.oauth2.SpringOAuthApplication diff --git a/spring-5-security/README.md b/spring-5-security/README.md index 6e094e928f..37dc8b0f28 100644 --- a/spring-5-security/README.md +++ b/spring-5-security/README.md @@ -4,4 +4,4 @@ - [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) - [Default Password Encoder in Spring Security 5](https://www.baeldung.com/spring-security-5-default-password-encoder) -- [Extracting Principal and Authorities using Spring Security OAuth](https://www.baeldung.com/spring-security-oauth-principal-authorities-extractor) + From bff2c6f5b06ded73a09fce5ef6bc78cfc5645621 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 25 Nov 2018 01:25:41 +0530 Subject: [PATCH 096/429] [BAEL-10780] - Added code for the checking string input article --- .../string/checkinputs/CheckIntegerInput.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java diff --git a/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java b/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java new file mode 100644 index 0000000000..9462244bbb --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/checkinputs/CheckIntegerInput.java @@ -0,0 +1,19 @@ +package com.baeldung.string.checkinputs; + +import java.util.Scanner; + +public class CheckIntegerInput { + + public static void main(String[] args) { + + try (Scanner scanner = new Scanner(System.in)) { + System.out.println("Enter an integer : "); + + if (scanner.hasNextInt()) { + System.out.println("You entered : " + scanner.nextInt()); + } else { + System.out.println("The input is not an integer"); + } + } + } +} \ No newline at end of file From 3c3d484eeb6a5676e3055cfa2d4b43c369b8a30b Mon Sep 17 00:00:00 2001 From: Alejandro Gervasio Date: Sat, 24 Nov 2018 18:02:25 -0300 Subject: [PATCH 097/429] BAEL-2354 - An Introduction to the Event Notification Model in CDI 2.0 (#5685) * Initial Commit * Update pom.xml * Update pom.xml * Update LowercaseTextServiceUnitTest.java * Update UppercaseTextServiceUnitTest.java * Delete TextApplication.java * Update source files * Update BootstrappingApplication.java * Add AnotherSimpleEventObserver class * Rename event classes * Update ExampleEventSource.java * Update UppercaseTextService.java * Delete TextService.java * Delete LowercaseTextService.java * Delete LowercaseTextServiceUnitTest.java * Delete UppercaseTextServiceUnitTest.java * Fixed text service unit test * Update TextService.java --- cdi/pom.xml | 25 +++++++++++-------- .../application/BootstrappingApplication.java | 15 +++++++++++ .../cdi2observers/events/ExampleEvent.java | 14 +++++++++++ .../events/ExampleEventSource.java | 14 +++++++++++ .../AnotherExampleEventObserver.java | 12 +++++++++ .../observers/ExampleEventObserver.java | 13 ++++++++++ .../cdi2observers/services/TextService.java | 8 ++++++ .../tests/TextServiceUnitTest.java | 14 +++++++++++ 8 files changed, 105 insertions(+), 10 deletions(-) create mode 100644 cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java create mode 100644 cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java create mode 100644 cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java create mode 100644 cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java create mode 100644 cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java create mode 100644 cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java create mode 100644 cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java diff --git a/cdi/pom.xml b/cdi/pom.xml index 2c719c1d7f..0b735e0ca5 100644 --- a/cdi/pom.xml +++ b/cdi/pom.xml @@ -5,7 +5,7 @@ com.baeldung cdi 1.0-SNAPSHOT - + com.baeldung parent-spring-4 @@ -14,6 +14,16 @@ + + javax.enterprise + cdi-api + ${cdi-api.version} + + + org.jboss.weld.se + weld-se-core + ${weld-se-core.version} + org.hamcrest hamcrest-core @@ -42,11 +52,6 @@ aspectjweaver ${aspectjweaver.version} - - org.jboss.weld.se - weld-se-core - ${weld-se-core.version} - org.springframework spring-test @@ -54,13 +59,13 @@ test - - 1.8.9 - 2.4.1.Final + 2.0.SP1 + 3.0.5.Final + 1.9.2 1.3 3.10.0 4.12 + 5.1.2.RELEASE - diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java new file mode 100644 index 0000000000..4896408502 --- /dev/null +++ b/cdi/src/main/java/com/baeldung/cdi2observers/application/BootstrappingApplication.java @@ -0,0 +1,15 @@ +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!")); + } + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java new file mode 100644 index 0000000000..a2329d2ef1 --- /dev/null +++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEvent.java @@ -0,0 +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; + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java new file mode 100644 index 0000000000..f37030778a --- /dev/null +++ b/cdi/src/main/java/com/baeldung/cdi2observers/events/ExampleEventSource.java @@ -0,0 +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!")); + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java new file mode 100644 index 0000000000..34520c2b3d --- /dev/null +++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/AnotherExampleEventObserver.java @@ -0,0 +1,12 @@ +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(); + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java new file mode 100644 index 0000000000..b3522b2ad0 --- /dev/null +++ b/cdi/src/main/java/com/baeldung/cdi2observers/observers/ExampleEventObserver.java @@ -0,0 +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()); + } +} diff --git a/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java new file mode 100644 index 0000000000..47788a0657 --- /dev/null +++ b/cdi/src/main/java/com/baeldung/cdi2observers/services/TextService.java @@ -0,0 +1,8 @@ +package com.baeldung.cdi.cdi2observers.services; + +public class TextService { + + public String parseText(String text) { + return text.toUpperCase(); + } +} 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 new file mode 100644 index 0000000000..deecf13f9a --- /dev/null +++ b/cdi/src/test/java/com/baeldung/test/cdi2observers/tests/TextServiceUnitTest.java @@ -0,0 +1,14 @@ +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"); + } +} From 0d5d3039cfe0c0685bca8877078c46da1a0fc618 Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Sun, 25 Nov 2018 13:53:48 +0800 Subject: [PATCH 098/429] BAEL-2373 Kotlin Contracts * upgraded kotlin version to 1.3.10 * added contract examples --- .../baeldung/contract/CallsInPlaceEffect.kt | 23 ++++++++++ .../com/baeldung/contract/ReturnsEffect.kt | 43 +++++++++++++++++++ parent-kotlin/pom.xml | 2 +- 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/contract/CallsInPlaceEffect.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/contract/ReturnsEffect.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/contract/CallsInPlaceEffect.kt b/core-kotlin/src/main/kotlin/com/baeldung/contract/CallsInPlaceEffect.kt new file mode 100644 index 0000000000..ca0b13cdc7 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/contract/CallsInPlaceEffect.kt @@ -0,0 +1,23 @@ +package com.baeldung.contract + +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.InvocationKind +import kotlin.contracts.contract + +@ExperimentalContracts +inline fun myRun(block: () -> R): R { + contract { + callsInPlace(block, InvocationKind.EXACTLY_ONCE) + } + return block() +} + +@ExperimentalContracts +fun callsInPlace() { + val i: Int + myRun { + i = 1 // Without contract initialization is forbidden due to possible re-assignment + } + println(i) // Without contract variable might be uninitialized +} + diff --git a/core-kotlin/src/main/kotlin/com/baeldung/contract/ReturnsEffect.kt b/core-kotlin/src/main/kotlin/com/baeldung/contract/ReturnsEffect.kt new file mode 100644 index 0000000000..56f667af82 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/contract/ReturnsEffect.kt @@ -0,0 +1,43 @@ +package com.baeldung.contract + +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract + +data class Request(val arg: String) + +class Service { + + @ExperimentalContracts + fun process(request: Request?) { + validate(request) + println(request.arg) + } + +} + +@ExperimentalContracts +private fun validate(request: Request?) { + contract { + returns() implies (request != null) + } + if (request == null) { + throw IllegalArgumentException("Undefined request") + } +} + +data class MyEvent(val message: String) + +@ExperimentalContracts +fun processEvent(event: Any?) { + if (isInterested(event)) { + println(event.message) // Compiler makes smart cast here with the help of contract + } +} + +@ExperimentalContracts +fun isInterested(event: Any?): Boolean { + contract { + returns(true) implies (event is MyEvent) + } + return event is MyEvent +} \ No newline at end of file diff --git a/parent-kotlin/pom.xml b/parent-kotlin/pom.xml index f8283bd920..73c98e1a80 100644 --- a/parent-kotlin/pom.xml +++ b/parent-kotlin/pom.xml @@ -202,7 +202,7 @@ - 1.3.0 + 1.3.10 1.0.0 0.9.5 3.11.0 From f784c3bb793b6de50323700e771a5e001f3e4850 Mon Sep 17 00:00:00 2001 From: Amitabh Mandal Date: Sun, 25 Nov 2018 15:31:22 +0530 Subject: [PATCH 099/429] BAEL-2168 Java EE 7 Batch Processing (#5645) * jberet batch * Batch Understanding * partition * exception * some more changes --- jee-7/pom.xml | 935 ++++++++++-------- .../ChunkExceptionSkipReadListener.java | 11 + .../batch/understanding/CustomCheckPoint.java | 12 + .../understanding/DeciderJobSequence.java | 14 + .../understanding/InjectSimpleBatchLet.java | 20 + .../batch/understanding/SimpleBatchLet.java | 13 + .../SimpleChunkItemProcessor.java | 12 + .../understanding/SimpleChunkItemReader.java | 27 + .../SimpleChunkItemReaderError.java | 31 + .../understanding/SimpleChunkWriter.java | 13 + .../exception/MyInputRecord.java | 41 + .../exception/MyItemProcessor.java | 15 + .../understanding/exception/MyItemReader.java | 42 + .../understanding/exception/MyItemWriter.java | 19 + .../exception/MyOutputRecord.java | 39 + .../exception/MyRetryProcessorListener.java | 11 + .../exception/MyRetryReadListener.java | 11 + .../exception/MyRetryWriteListener.java | 12 + .../exception/MySkipProcessorListener.java | 11 + .../exception/MySkipReadListener.java | 11 + .../exception/MySkipWriteListener.java | 13 + .../META-INF/batch-jobs/customCheckPoint.xml | 12 + .../META-INF/batch-jobs/decideJobSequence.xml | 18 + .../META-INF/batch-jobs/flowJobSequence.xml | 21 + .../batch-jobs/injectionSimpleBatchLet.xml | 13 + .../batch-jobs/partitionSimpleBatchLet.xml | 24 + .../META-INF/batch-jobs/simpleBatchLet.xml | 9 + .../META-INF/batch-jobs/simpleChunk.xml | 11 + .../META-INF/batch-jobs/simpleErrorChunk.xml | 24 + .../batch-jobs/simpleErrorSkipChunk.xml | 26 + .../META-INF/batch-jobs/simpleJobSequence.xml | 17 + .../META-INF/batch-jobs/splitJobSequence.xml | 22 + jee-7/src/main/resources/META-INF/beans.xml | 8 + .../batch/understanding/BatchTestHelper.java | 79 ++ .../CustomCheckPointUnitTest.java | 33 + .../understanding/JobSequenceUnitTest.java | 74 ++ .../understanding/SimpleBatchLetUnitTest.java | 68 ++ .../understanding/SimpleChunkUnitTest.java | 67 ++ .../SimpleErrorChunkUnitTest.java | 48 + 39 files changed, 1473 insertions(+), 414 deletions(-) create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/ChunkExceptionSkipReadListener.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/DeciderJobSequence.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/SimpleBatchLet.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemProcessor.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyInputRecord.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemProcessor.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemReader.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemWriter.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyOutputRecord.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryProcessorListener.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryReadListener.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryWriteListener.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipProcessorListener.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipReadListener.java create mode 100644 jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipWriteListener.java create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/customCheckPoint.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/decideJobSequence.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/flowJobSequence.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/simpleBatchLet.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/simpleChunk.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/simpleErrorChunk.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/simpleErrorSkipChunk.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/simpleJobSequence.xml create mode 100644 jee-7/src/main/resources/META-INF/batch-jobs/splitJobSequence.xml create mode 100644 jee-7/src/main/resources/META-INF/beans.xml create mode 100644 jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java create mode 100644 jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java create mode 100644 jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java create mode 100644 jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java create mode 100644 jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java create mode 100644 jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java diff --git a/jee-7/pom.xml b/jee-7/pom.xml index 4f6e6a20fb..9011648d17 100644 --- a/jee-7/pom.xml +++ b/jee-7/pom.xml @@ -1,430 +1,537 @@ - - 4.0.0 - jee-7 - 1.0-SNAPSHOT - war - JavaEE 7 Arquillian Archetype Sample + + 4.0.0 + jee-7 + 1.0-SNAPSHOT + war + JavaEE 7 Arquillian Archetype Sample - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + - - - javax - javaee-api - ${javaee_api.version} - provided - + + + javax + javaee-api + ${javaee_api.version} + provided + - - org.jboss.arquillian.junit - arquillian-junit-container - test - - - org.jboss.arquillian.graphene - graphene-webdriver - ${graphene-webdriver.version} - pom - test - - - com.jayway.awaitility - awaitility - ${awaitility.version} - test - + + org.jboss.arquillian.junit + arquillian-junit-container + test + + + org.jboss.arquillian.graphene + graphene-webdriver + ${graphene-webdriver.version} + pom + test + + + com.jayway.awaitility + awaitility + ${awaitility.version} + test + - - org.jboss.shrinkwrap.resolver - shrinkwrap-resolver-impl-maven - test - jar - + + org.jboss.shrinkwrap.resolver + shrinkwrap-resolver-impl-maven + test + jar + - - org.jboss.shrinkwrap.resolver - shrinkwrap-resolver-impl-maven-archive - test - - - org.apache.httpcomponents - httpclient - ${httpclient.version} - - - commons-io - commons-io - ${commons-io.version} - - - com.sun.faces - jsf-api - ${com.sun.faces.jsf.version} - - - com.sun.faces - jsf-impl - ${com.sun.faces.jsf.version} - - - javax.servlet - jstl - ${jstl.version} - - - javax.servlet - javax.servlet-api - ${javax.servlet-api.version} - - - javax.servlet.jsp - jsp-api - ${jsp-api.version} - provided - - - taglibs - standard - ${taglibs.standard.version} - + + org.jboss.shrinkwrap.resolver + shrinkwrap-resolver-impl-maven-archive + test + + + org.apache.httpcomponents + httpclient + ${httpclient.version} + + + commons-io + commons-io + ${commons-io.version} + + + com.sun.faces + jsf-api + ${com.sun.faces.jsf.version} + + + com.sun.faces + jsf-impl + ${com.sun.faces.jsf.version} + + + javax.servlet + jstl + ${jstl.version} + + + javax.servlet + javax.servlet-api + ${javax.servlet-api.version} + + + javax.servlet.jsp + jsp-api + ${jsp-api.version} + provided + + + taglibs + standard + ${taglibs.standard.version} + - - javax.mvc - javax.mvc-api - 20160715 - - - org.glassfish.ozark - ozark - ${ozark.version} - + + javax.mvc + javax.mvc-api + 20160715 + + + org.glassfish.ozark + ozark + ${ozark.version} + - - org.springframework.security - spring-security-web - ${org.springframework.security.version} - + + org.springframework.security + spring-security-web + ${org.springframework.security.version} + - - org.springframework.security - spring-security-config - ${org.springframework.security.version} - - - org.springframework.security - spring-security-taglibs - ${org.springframework.security.version} - - + + org.springframework.security + spring-security-config + ${org.springframework.security.version} + + + org.springframework.security + spring-security-taglibs + ${org.springframework.security.version} + + - - - - org.apache.maven.plugins - maven-war-plugin - ${maven-war-plugin.version} - - src/main/webapp - false - - - - + + org.jboss.spec.javax.batch + jboss-batch-api_1.0_spec + 1.0.0.Final + + + org.jberet + jberet-core + 1.0.2.Final + + + org.jberet + jberet-support + 1.0.2.Final + + + org.jboss.spec.javax.transaction + jboss-transaction-api_1.2_spec + 1.0.0.Final + + + org.jboss.marshalling + jboss-marshalling + 1.4.2.Final + + + org.jboss.weld + weld-core + 2.1.1.Final + + + org.jboss.weld.se + weld-se + 2.1.1.Final + + + org.jberet + jberet-se + 1.0.2.Final + + + com.h2database + h2 + 1.4.178 + + + org.glassfish.jersey.containers + jersey-container-jetty-servlet + 2.22.1 + + - - - - org.jboss.arquillian - arquillian-bom - ${arquillian_core.version} - import - pom - - - org.jboss.arquillian.extension - arquillian-drone-bom - ${arquillian-drone-bom.version} - pom - import - - - + + + + org.apache.maven.plugins + maven-war-plugin + ${maven-war-plugin.version} + + src/main/webapp + false + + + + + + + + org.eclipse.m2e + lifecycle-mapping + 1.0.0 + + + + + + + org.apache.maven.plugins + + + maven-pmd-plugin + + + [3.8,) + + + check + + + + + + + + + + + + + - - - wildfly-managed-arquillian - - true - - - standalone-full.xml - ${project.build.directory}/wildfly-${version.wildfly} - - - - io.undertow - undertow-websockets-jsr - ${undertow-websockets-jsr.version} - test - - - org.jboss.resteasy - resteasy-client - ${resteasy.version} - test - - - org.jboss.resteasy - resteasy-jaxb-provider - ${resteasy.version} - test - - - org.jboss.resteasy - resteasy-json-p-provider - ${resteasy.version} - test - - - org.wildfly - wildfly-arquillian-container-managed - ${wildfly.version} - test - - + + + + org.jboss.arquillian + arquillian-bom + ${arquillian_core.version} + import + pom + + + org.jboss.arquillian.extension + arquillian-drone-bom + ${arquillian-drone-bom.version} + pom + import + + + - - - - - maven-dependency-plugin - ${maven-dependency-plugin.version} - - ${maven.test.skip} - - - - unpack - process-test-classes - - unpack - - - - - org.wildfly - wildfly-dist - ${wildfly.version} - zip - false - ${project.build.directory} - - - - - - - - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - ${project.build.directory}/wildfly-${wildfly.version} - - - - - - - - - wildfly-remote-arquillian - - - io.undertow - undertow-websockets-jsr - ${undertow-websockets-jsr.version} - test - - - org.jboss.resteasy - resteasy-client - ${resteasy.version} - test - - - org.jboss.resteasy - resteasy-jaxb-provider - ${resteasy.version} - test - - - org.jboss.resteasy - resteasy-json-p-provider - ${resteasy.version} - test - - - org.wildfly - wildfly-arquillian-container-remote - ${wildfly.version} - test - - - - - glassfish-embedded-arquillian - - - org.glassfish.main.extras - glassfish-embedded-all - ${glassfish-embedded-all.version} - test - - - org.glassfish - javax.json - ${javax.json.version} - test - - - org.glassfish.tyrus - tyrus-client - ${tyrus.version} - test - - - org.glassfish.tyrus - tyrus-container-grizzly-client - ${tyrus.version} - test - - - org.glassfish.jersey.core - jersey-client - ${jersey.version} - test - - - org.jboss.arquillian.container - arquillian-glassfish-embedded-3.1 - ${arquillian-glassfish.version} - test - - - - - glassfish-remote-arquillian - - - org.glassfish - javax.json - ${javax.json.version} - test - - - org.glassfish.tyrus - tyrus-client - ${tyrus.version} - test - - - org.glassfish.tyrus - tyrus-container-grizzly-client - ${tyrus.version} - test - - - org.glassfish.jersey.core - jersey-client - ${jersey.version} - test - - - org.glassfish.jersey.media - jersey-media-json-jackson - ${jersey.version} - test - - - org.glassfish.jersey.media - jersey-media-json-processing - ${jersey.version} - test - - - org.jboss.arquillian.container - arquillian-glassfish-remote-3.1 - ${arquillian-glassfish.version} - test - - - - - webdriver-chrome - - true - - - chrome - - - - webdriver-firefox - - firefox - - - + + + wildfly-managed-arquillian + + true + + + standalone-full.xml + ${project.build.directory}/wildfly-${version.wildfly} + + + + io.undertow + undertow-websockets-jsr + ${undertow-websockets-jsr.version} + test + + + org.jboss.resteasy + resteasy-client + ${resteasy.version} + test + + + org.jboss.resteasy + resteasy-jaxb-provider + ${resteasy.version} + test + + + org.jboss.resteasy + resteasy-json-p-provider + ${resteasy.version} + test + + + org.wildfly + wildfly-arquillian-container-managed + ${wildfly.version} + test + + + sun.jdk + jconsole + + + + - - - bintray-mvc-spec-maven - bintray - http://dl.bintray.com/mvc-spec/maven - - true - - - false - - - + + + + + maven-dependency-plugin + ${maven-dependency-plugin.version} + + ${maven.test.skip} + + + + unpack + process-test-classes + + unpack + + + + + org.wildfly + wildfly-dist + ${wildfly.version} + zip + false + ${project.build.directory} + + + sun.jdk + jconsole + + + + + + + + + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + ${project.build.directory}/wildfly-${wildfly.version} + + + + + + + + + wildfly-remote-arquillian + + + io.undertow + undertow-websockets-jsr + ${undertow-websockets-jsr.version} + test + + + org.jboss.resteasy + resteasy-client + ${resteasy.version} + test + + + org.jboss.resteasy + resteasy-jaxb-provider + ${resteasy.version} + test + + + org.jboss.resteasy + resteasy-json-p-provider + ${resteasy.version} + test + + + org.wildfly + wildfly-arquillian-container-remote + ${wildfly.version} + test + + + sun.jdk + jconsole + + + + + + + glassfish-embedded-arquillian + + + org.glassfish.main.extras + glassfish-embedded-all + ${glassfish-embedded-all.version} + test + + + org.glassfish + javax.json + ${javax.json.version} + test + + + org.glassfish.tyrus + tyrus-client + ${tyrus.version} + test + + + org.glassfish.tyrus + tyrus-container-grizzly-client + ${tyrus.version} + test + + + org.glassfish.jersey.core + jersey-client + ${jersey.version} + test + + + org.jboss.arquillian.container + arquillian-glassfish-embedded-3.1 + ${arquillian-glassfish.version} + test + + + + + glassfish-remote-arquillian + + + org.glassfish + javax.json + ${javax.json.version} + test + + + org.glassfish.tyrus + tyrus-client + ${tyrus.version} + test + + + org.glassfish.tyrus + tyrus-container-grizzly-client + ${tyrus.version} + test + + + org.glassfish.jersey.core + jersey-client + ${jersey.version} + test + + + org.glassfish.jersey.media + jersey-media-json-jackson + ${jersey.version} + test + + + org.glassfish.jersey.media + jersey-media-json-processing + ${jersey.version} + test + + + org.jboss.arquillian.container + arquillian-glassfish-remote-3.1 + ${arquillian-glassfish.version} + test + + + + + webdriver-chrome + + true + + + chrome + + + + webdriver-firefox + + firefox + + + - - 1.8 - 3.0.0 - 7.0 - 1.1.11.Final - 8.2.1.Final - 1.7.0 - 1.4.6.Final - 3.0.19.Final - 4.1.1 - 1.0.4 - 1.13 - 2.25 - 1.0.0.Final - 2.6 - 4.2.3.RELEASE - 2.21.0 - 1.1.2 - 2.4 - 2.2.14 - 4.5 - 2.0.1.Final - 3.1.0 - 2.1.0.Final - 2.8 - 1.2 - 2.2 - 20160715 - + + + bintray-mvc-spec-maven + bintray + http://dl.bintray.com/mvc-spec/maven + + true + + + false + + + - + + 1.8 + 3.0.0 + 7.0 + 1.1.11.Final + 8.2.1.Final + 1.7.0 + 1.4.6.Final + 3.0.19.Final + 4.1.1 + 1.0.4 + 1.13 + 2.25 + 1.0.0.Final + 2.6 + 4.2.3.RELEASE + 2.21.0 + 1.1.2 + 2.4 + 2.2.14 + 4.5 + 2.0.1.Final + 3.1.0 + 2.1.0.Final + 2.8 + 1.2 + 2.2 + 20160715 + + + \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/ChunkExceptionSkipReadListener.java b/jee-7/src/main/java/com/baeldung/batch/understanding/ChunkExceptionSkipReadListener.java new file mode 100644 index 0000000000..ce47de66af --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/ChunkExceptionSkipReadListener.java @@ -0,0 +1,11 @@ +package com.baeldung.batch.understanding; + +import javax.batch.api.chunk.listener.SkipReadListener; +import javax.inject.Named; + +@Named +public class ChunkExceptionSkipReadListener implements SkipReadListener { + @Override + public void onSkipReadItem(Exception e) throws Exception { + } +} \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java new file mode 100644 index 0000000000..fe6759b365 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java @@ -0,0 +1,12 @@ +package com.baeldung.batch.understanding; + +import javax.batch.api.chunk.AbstractCheckpointAlgorithm; +import javax.inject.Named; + +@Named +public class CustomCheckPoint extends AbstractCheckpointAlgorithm { + @Override + public boolean isReadyToCheckpoint() throws Exception { + return SimpleChunkItemReader.COUNT % 5 == 0; + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/DeciderJobSequence.java b/jee-7/src/main/java/com/baeldung/batch/understanding/DeciderJobSequence.java new file mode 100644 index 0000000000..6cc2012f23 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/DeciderJobSequence.java @@ -0,0 +1,14 @@ +package com.baeldung.batch.understanding; + +import javax.batch.api.Decider; +import javax.batch.runtime.StepExecution; +import javax.inject.Named; + +@Named +public class DeciderJobSequence implements Decider { + @Override + public String decide(StepExecution[] ses) throws Exception { + return "nothing"; + } + +} \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java new file mode 100644 index 0000000000..93eb20708d --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java @@ -0,0 +1,20 @@ +package com.baeldung.batch.understanding; + +import javax.batch.api.AbstractBatchlet; +import javax.batch.api.BatchProperty; +import javax.batch.runtime.BatchStatus; +import javax.inject.Inject; +import javax.inject.Named; + +@Named +public class InjectSimpleBatchLet extends AbstractBatchlet { + @Inject + @BatchProperty(name = "name") + private String nameString; + + @Override + public String process() throws Exception { + System.out.println("Value passed in = " + nameString); + return BatchStatus.COMPLETED.toString(); + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleBatchLet.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleBatchLet.java new file mode 100644 index 0000000000..6a367b064b --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleBatchLet.java @@ -0,0 +1,13 @@ +package com.baeldung.batch.understanding; + +import javax.batch.api.AbstractBatchlet; +import javax.batch.runtime.BatchStatus; +import javax.inject.Named; + +@Named +public class SimpleBatchLet extends AbstractBatchlet { + @Override + public String process() throws Exception { + return BatchStatus.FAILED.toString(); + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemProcessor.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemProcessor.java new file mode 100644 index 0000000000..3f8166b6d8 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemProcessor.java @@ -0,0 +1,12 @@ +package com.baeldung.batch.understanding; + +import javax.batch.api.chunk.ItemProcessor; +import javax.inject.Named; + +@Named +public class SimpleChunkItemProcessor implements ItemProcessor { + @Override + public Integer processItem(Object t) { + return ((Integer) t).intValue() % 2 == 0 ? null : ((Integer) t).intValue(); + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java new file mode 100644 index 0000000000..10f81d95d0 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java @@ -0,0 +1,27 @@ +package com.baeldung.batch.understanding; + +import java.io.Serializable; +import java.util.StringTokenizer; +import javax.batch.api.chunk.AbstractItemReader; +import javax.inject.Named; + +@Named +public class SimpleChunkItemReader extends AbstractItemReader { + private StringTokenizer tokens; + public static int COUNT = 0; + + @Override + public Integer readItem() throws Exception { + if (tokens.hasMoreTokens()) { + COUNT++; + String tempTokenize = tokens.nextToken(); + return Integer.valueOf(tempTokenize); + } + return null; + } + + @Override + public void open(Serializable checkpoint) throws Exception { + tokens = new StringTokenizer("1,2,3,4,5,6,7,8,9,10", ","); + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java new file mode 100644 index 0000000000..92096d0571 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java @@ -0,0 +1,31 @@ +package com.baeldung.batch.understanding; + +import java.io.Serializable; +import java.util.StringTokenizer; + +import javax.batch.api.chunk.AbstractItemReader; +import javax.inject.Named; + +@Named +public class SimpleChunkItemReaderError extends AbstractItemReader { + private StringTokenizer tokens; + public static int COUNT = 0; + + @Override + public Integer readItem() throws Exception { + if (tokens.hasMoreTokens()) { + COUNT++; + int token = Integer.valueOf(tokens.nextToken()); + if (token == 3) { + throw new RuntimeException("Something happened"); + } + return Integer.valueOf(token); + } + return null; + } + + @Override + public void open(Serializable checkpoint) throws Exception { + tokens = new StringTokenizer("1,2,3,4,5,6,7,8,9,10", ","); + } +} \ No newline at end of file diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java new file mode 100644 index 0000000000..909596766d --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java @@ -0,0 +1,13 @@ +package com.baeldung.batch.understanding; + +import java.util.List; + +import javax.batch.api.chunk.AbstractItemWriter; +import javax.inject.Named; + +@Named +public class SimpleChunkWriter extends AbstractItemWriter { + @Override + public void writeItems(List items) throws Exception { + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyInputRecord.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyInputRecord.java new file mode 100644 index 0000000000..e813a699c2 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyInputRecord.java @@ -0,0 +1,41 @@ +package com.baeldung.batch.understanding.exception; + +import java.io.Serializable; + +public class MyInputRecord implements Serializable { + private int id; + + public MyInputRecord(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + + MyInputRecord that = (MyInputRecord) o; + + return id == that.id; + } + + @Override + public int hashCode() { + return id; + } + + @Override + public String toString() { + return "MyInputRecord: " + id; + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemProcessor.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemProcessor.java new file mode 100644 index 0000000000..4427a1f548 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemProcessor.java @@ -0,0 +1,15 @@ +package com.baeldung.batch.understanding.exception; + +import javax.batch.api.chunk.ItemProcessor; +import javax.inject.Named; + +@Named +public class MyItemProcessor implements ItemProcessor { + @Override + public Object processItem(Object t) { + if (((MyInputRecord) t).getId() == 6) { + throw new NullPointerException(); + } + return new MyOutputRecord(((MyInputRecord) t).getId()); + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemReader.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemReader.java new file mode 100644 index 0000000000..dd1876ab7d --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemReader.java @@ -0,0 +1,42 @@ +package com.baeldung.batch.understanding.exception; + +import javax.batch.api.chunk.AbstractItemReader; +import javax.inject.Named; +import java.io.Serializable; +import java.util.StringTokenizer; + +@Named +public class MyItemReader extends AbstractItemReader { + private StringTokenizer tokens; + private MyInputRecord lastElement; + private boolean alreadyFailed; + + @Override + public void open(Serializable checkpoint) { + tokens = new StringTokenizer("1,2,3,4,5,6,7,8,9,10", ","); + if (checkpoint != null) { + while (!Integer.valueOf(tokens.nextToken()) + .equals(((MyInputRecord) checkpoint).getId())) { + } + } + } + + @Override + public Object readItem() { + if (tokens.hasMoreTokens()) { + int token = Integer.valueOf(tokens.nextToken()); + if (token == 5 && !alreadyFailed) { + alreadyFailed = true; + throw new IllegalArgumentException("Could not read record"); + } + lastElement = new MyInputRecord(token); + return lastElement; + } + return null; + } + + @Override + public Serializable checkpointInfo() throws Exception { + return lastElement; + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemWriter.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemWriter.java new file mode 100644 index 0000000000..4e80d86d44 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyItemWriter.java @@ -0,0 +1,19 @@ + +package com.baeldung.batch.understanding.exception; + +import javax.batch.api.chunk.AbstractItemWriter; +import javax.inject.Named; +import java.util.List; + +@Named +public class MyItemWriter extends AbstractItemWriter { + private static int retries = 0; + + @Override + public void writeItems(List list) { + if (retries <= 3 && list.contains(new MyOutputRecord(8))) { + retries++; + throw new UnsupportedOperationException(); + } + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyOutputRecord.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyOutputRecord.java new file mode 100644 index 0000000000..8f18fca7ba --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyOutputRecord.java @@ -0,0 +1,39 @@ +package com.baeldung.batch.understanding.exception; + +import java.io.Serializable; + +public class MyOutputRecord implements Serializable { + private int id; + + public MyOutputRecord(int id) { + this.id = id; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + MyOutputRecord that = (MyOutputRecord) o; + + return id == that.id; + } + + @Override + public int hashCode() { + return id; + } + + @Override + public String toString() { + return "MyOutputRecord: " + id; + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryProcessorListener.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryProcessorListener.java new file mode 100644 index 0000000000..3bd35820c3 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryProcessorListener.java @@ -0,0 +1,11 @@ +package com.baeldung.batch.understanding.exception; + +import javax.batch.api.chunk.listener.RetryProcessListener; +import javax.inject.Named; + +@Named +public class MyRetryProcessorListener implements RetryProcessListener { + @Override + public void onRetryProcessException(Object item, Exception ex) throws Exception { + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryReadListener.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryReadListener.java new file mode 100644 index 0000000000..5c4f56b75d --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryReadListener.java @@ -0,0 +1,11 @@ +package com.baeldung.batch.understanding.exception; + +import javax.batch.api.chunk.listener.RetryReadListener; +import javax.inject.Named; + +@Named +public class MyRetryReadListener implements RetryReadListener { + @Override + public void onRetryReadException(Exception ex) throws Exception { + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryWriteListener.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryWriteListener.java new file mode 100644 index 0000000000..a8683d86a9 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MyRetryWriteListener.java @@ -0,0 +1,12 @@ +package com.baeldung.batch.understanding.exception; + +import javax.batch.api.chunk.listener.RetryWriteListener; +import javax.inject.Named; +import java.util.List; + +@Named +public class MyRetryWriteListener implements RetryWriteListener { + @Override + public void onRetryWriteException(List items, Exception ex) throws Exception { + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipProcessorListener.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipProcessorListener.java new file mode 100644 index 0000000000..74f7565cf7 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipProcessorListener.java @@ -0,0 +1,11 @@ +package com.baeldung.batch.understanding.exception; + +import javax.batch.api.chunk.listener.SkipProcessListener; +import javax.inject.Named; + +@Named +public class MySkipProcessorListener implements SkipProcessListener { + @Override + public void onSkipProcessItem(Object t, Exception e) throws Exception { + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipReadListener.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipReadListener.java new file mode 100644 index 0000000000..aecaf93e75 --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipReadListener.java @@ -0,0 +1,11 @@ +package com.baeldung.batch.understanding.exception; + +import javax.batch.api.chunk.listener.SkipReadListener; +import javax.inject.Named; + +@Named +public class MySkipReadListener implements SkipReadListener { + @Override + public void onSkipReadItem(Exception e) throws Exception { + } +} diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipWriteListener.java b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipWriteListener.java new file mode 100644 index 0000000000..928773b61d --- /dev/null +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/exception/MySkipWriteListener.java @@ -0,0 +1,13 @@ +package com.baeldung.batch.understanding.exception; + +import javax.batch.api.chunk.listener.SkipWriteListener; +import javax.inject.Named; +import java.util.List; + +@Named +public class MySkipWriteListener implements SkipWriteListener { + @Override + public void onSkipWriteItem(List list, Exception e) throws Exception { + list.remove(new MyOutputRecord(2)); + } +} diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/customCheckPoint.xml b/jee-7/src/main/resources/META-INF/batch-jobs/customCheckPoint.xml new file mode 100644 index 0000000000..b0f327dd39 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/customCheckPoint.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/decideJobSequence.xml b/jee-7/src/main/resources/META-INF/batch-jobs/decideJobSequence.xml new file mode 100644 index 0000000000..4905586fb9 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/decideJobSequence.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/flowJobSequence.xml b/jee-7/src/main/resources/META-INF/batch-jobs/flowJobSequence.xml new file mode 100644 index 0000000000..207a9242b1 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/flowJobSequence.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml b/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml new file mode 100644 index 0000000000..d152f063f6 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml @@ -0,0 +1,13 @@ + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml b/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml new file mode 100644 index 0000000000..76c64ee899 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/simpleBatchLet.xml b/jee-7/src/main/resources/META-INF/batch-jobs/simpleBatchLet.xml new file mode 100644 index 0000000000..9c707de8a4 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/simpleBatchLet.xml @@ -0,0 +1,9 @@ + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/simpleChunk.xml b/jee-7/src/main/resources/META-INF/batch-jobs/simpleChunk.xml new file mode 100644 index 0000000000..b2b15b7bd9 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/simpleChunk.xml @@ -0,0 +1,11 @@ + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/simpleErrorChunk.xml b/jee-7/src/main/resources/META-INF/batch-jobs/simpleErrorChunk.xml new file mode 100644 index 0000000000..743fcafd65 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/simpleErrorChunk.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/simpleErrorSkipChunk.xml b/jee-7/src/main/resources/META-INF/batch-jobs/simpleErrorSkipChunk.xml new file mode 100644 index 0000000000..2fafb83cc7 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/simpleErrorSkipChunk.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/simpleJobSequence.xml b/jee-7/src/main/resources/META-INF/batch-jobs/simpleJobSequence.xml new file mode 100644 index 0000000000..7110db7f23 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/simpleJobSequence.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/splitJobSequence.xml b/jee-7/src/main/resources/META-INF/batch-jobs/splitJobSequence.xml new file mode 100644 index 0000000000..0a9ea97dc7 --- /dev/null +++ b/jee-7/src/main/resources/META-INF/batch-jobs/splitJobSequence.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/beans.xml b/jee-7/src/main/resources/META-INF/beans.xml new file mode 100644 index 0000000000..ae0f4bf2ee --- /dev/null +++ b/jee-7/src/main/resources/META-INF/beans.xml @@ -0,0 +1,8 @@ + + + \ No newline at end of file diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java b/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java new file mode 100644 index 0000000000..5060bd9b91 --- /dev/null +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java @@ -0,0 +1,79 @@ +package com.baeldung.batch.understanding; + +import java.util.HashMap; +import java.util.Map; + +import javax.batch.runtime.BatchRuntime; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.JobExecution; +import javax.batch.runtime.Metric; + +public class BatchTestHelper { + private static final int MAX_TRIES = 40; + private static final int THREAD_SLEEP = 1000; + + private BatchTestHelper() { + throw new UnsupportedOperationException(); + } + + public static JobExecution keepTestAlive(JobExecution jobExecution) throws InterruptedException { + int maxTries = 0; + while (!jobExecution.getBatchStatus() + .equals(BatchStatus.COMPLETED)) { + if (maxTries < MAX_TRIES) { + maxTries++; + Thread.sleep(THREAD_SLEEP); + jobExecution = BatchRuntime.getJobOperator() + .getJobExecution(jobExecution.getExecutionId()); + } else { + break; + } + } + Thread.sleep(THREAD_SLEEP); + return jobExecution; + } + + public static JobExecution keepTestFailed(JobExecution jobExecution) throws InterruptedException { + int maxTries = 0; + while (!jobExecution.getBatchStatus() + .equals(BatchStatus.FAILED)) { + if (maxTries < MAX_TRIES) { + maxTries++; + Thread.sleep(THREAD_SLEEP); + jobExecution = BatchRuntime.getJobOperator() + .getJobExecution(jobExecution.getExecutionId()); + } else { + break; + } + } + Thread.sleep(THREAD_SLEEP); + + return jobExecution; + } + + public static JobExecution keepTestStopped(JobExecution jobExecution) throws InterruptedException { + int maxTries = 0; + while (!jobExecution.getBatchStatus() + .equals(BatchStatus.STOPPED)) { + if (maxTries < MAX_TRIES) { + maxTries++; + Thread.sleep(THREAD_SLEEP); + jobExecution = BatchRuntime.getJobOperator() + .getJobExecution(jobExecution.getExecutionId()); + } else { + break; + } + } + Thread.sleep(THREAD_SLEEP); + return jobExecution; + } + + public static Map getMetricsMap(Metric[] metrics) { + Map metricsMap = new HashMap<>(); + for (Metric metric : metrics) { + metricsMap.put(metric.getType(), metric.getValue()); + } + return metricsMap; + } + +} diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java new file mode 100644 index 0000000000..a9488c5c03 --- /dev/null +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.batch.understanding; + +import static org.junit.jupiter.api.Assertions.*; +import java.util.Map; +import java.util.Properties; +import javax.batch.operations.JobOperator; +import javax.batch.runtime.BatchRuntime; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.JobExecution; +import javax.batch.runtime.Metric; +import javax.batch.runtime.StepExecution; +import com.baeldung.batch.understanding.BatchTestHelper; + +import org.junit.jupiter.api.Test; + +class CustomCheckPointUnitTest { + @Test + public void givenChunk_whenCustomCheckPoint_thenCommitCount_3() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("customCheckPoint", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + for (StepExecution stepExecution : jobOperator.getStepExecutions(executionId)) { + if (stepExecution.getStepName() + .equals("firstChunkStep")) { + Map metricsMap = BatchTestHelper.getMetricsMap(stepExecution.getMetrics()); + assertEquals(3L, metricsMap.get(Metric.MetricType.COMMIT_COUNT) + .longValue()); + } + } + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } +} diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java new file mode 100644 index 0000000000..7c5e8d0b78 --- /dev/null +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/JobSequenceUnitTest.java @@ -0,0 +1,74 @@ +package com.baeldung.batch.understanding; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import javax.batch.operations.JobOperator; +import javax.batch.runtime.BatchRuntime; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.JobExecution; +import javax.batch.runtime.StepExecution; + +import org.junit.jupiter.api.Test; + +class JobSequenceUnitTest { + @Test + public void givenTwoSteps_thenBatch_CompleteWithSuccess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("simpleJobSequence", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + assertEquals(2 , jobOperator.getStepExecutions(executionId).size()); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } + + @Test + public void givenFlow_thenBatch_CompleteWithSuccess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("flowJobSequence", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + assertEquals(3 , jobOperator.getStepExecutions(executionId).size()); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } + + @Test + public void givenDecider_thenBatch_CompleteWithSuccess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("decideJobSequence", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + List stepExecutions = jobOperator.getStepExecutions(executionId); + List executedSteps = new ArrayList<>(); + for (StepExecution stepExecution : stepExecutions) { + executedSteps.add(stepExecution.getStepName()); + } + assertEquals(2, jobOperator.getStepExecutions(executionId).size()); + assertArrayEquals(new String[] { "firstBatchStepStep1", "firstBatchStepStep3" }, executedSteps.toArray()); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } + + @Test + public void givenSplit_thenBatch_CompletesWithSuccess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("splitJobSequence", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + List stepExecutions = jobOperator.getStepExecutions(executionId); + List executedSteps = new ArrayList<>(); + for (StepExecution stepExecution : stepExecutions) { + executedSteps.add(stepExecution.getStepName()); + } + assertEquals(3, stepExecutions.size()); + assertTrue(executedSteps.contains("splitJobSequenceStep1")); + assertTrue(executedSteps.contains("splitJobSequenceStep2")); + assertTrue(executedSteps.contains("splitJobSequenceStep3")); + assertTrue(executedSteps.get(0).equals("splitJobSequenceStep1") || executedSteps.get(0).equals("splitJobSequenceStep2")); + assertTrue(executedSteps.get(1).equals("splitJobSequenceStep1") || executedSteps.get(1).equals("splitJobSequenceStep2")); + assertTrue(executedSteps.get(2).equals("splitJobSequenceStep3")); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } +} diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java new file mode 100644 index 0000000000..485c997cc6 --- /dev/null +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java @@ -0,0 +1,68 @@ +package com.baeldung.batch.understanding; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import javax.batch.operations.JobOperator; +import javax.batch.runtime.BatchRuntime; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.JobExecution; +import javax.batch.runtime.Metric; +import javax.batch.runtime.StepExecution; + +import org.junit.jupiter.api.Test; + +class SimpleBatchLetUnitTest { + @Test + public void givenBatchLet_thenBatch_CompleteWithSuccess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("simpleBatchLet", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } + + @Test + public void givenBatchLetProperty_thenBatch_CompleteWithSuccess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("injectionSimpleBatchLet", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } + + @Test + public void givenBatchLetPartition_thenBatch_CompleteWithSuccess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("partitionSimpleBatchLet", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } + + @Test + public void givenBatchLetStarted_whenStopped_thenBatchStopped() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("simpleBatchLet", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobOperator.stop(executionId); + jobExecution = BatchTestHelper.keepTestStopped(jobExecution); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.STOPPED); + } + + @Test + public void givenBatchLetStopped_whenRestarted_thenBatchCompletesSuccess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("simpleBatchLet", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobOperator.stop(executionId); + jobExecution = BatchTestHelper.keepTestStopped(jobExecution); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.STOPPED); + executionId = jobOperator.restart(jobExecution.getExecutionId(), new Properties()); + jobExecution = BatchTestHelper.keepTestAlive(jobOperator.getJobExecution(executionId)); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } +} diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java new file mode 100644 index 0000000000..57c794ba00 --- /dev/null +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleChunkUnitTest.java @@ -0,0 +1,67 @@ +package com.baeldung.batch.understanding; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; +import java.util.Map; +import java.util.Properties; + +import javax.batch.operations.JobOperator; +import javax.batch.runtime.BatchRuntime; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.JobExecution; +import javax.batch.runtime.Metric; +import javax.batch.runtime.StepExecution; + +import org.junit.jupiter.api.Test; + +class SimpleChunkUnitTest { + @Test + public void givenChunk_thenBatch_CompletesWithSucess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("simpleChunk", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + List stepExecutions = jobOperator.getStepExecutions(executionId); + for (StepExecution stepExecution : stepExecutions) { + if (stepExecution.getStepName() + .equals("firstChunkStep")) { + Map metricsMap = BatchTestHelper.getMetricsMap(stepExecution.getMetrics()); + assertEquals(10L, metricsMap.get(Metric.MetricType.READ_COUNT) + .longValue()); + assertEquals(10L / 2L, metricsMap.get(Metric.MetricType.WRITE_COUNT) + .longValue()); + assertEquals(10L / 3 + (10L % 3 > 0 ? 1 : 0), metricsMap.get(Metric.MetricType.COMMIT_COUNT) + .longValue()); + } + } + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } + + @Test + public void givenChunk__thenBatch_fetchInformation() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("simpleChunk", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + // job name contains simpleBatchLet which is the name of the file + assertTrue(jobOperator.getJobNames().contains("simpleChunk")); + // job parameters are empty + assertTrue(jobOperator.getParameters(executionId).isEmpty()); + // step execution information + List stepExecutions = jobOperator.getStepExecutions(executionId); + assertEquals("firstChunkStep", stepExecutions.get(0).getStepName()); + // finding out batch status + assertEquals(BatchStatus.COMPLETED, stepExecutions.get(0).getBatchStatus()); + Map metricTest = BatchTestHelper.getMetricsMap(stepExecutions.get(0).getMetrics()); + assertEquals(10L, metricTest.get(Metric.MetricType.READ_COUNT).longValue()); + assertEquals(5L, metricTest.get(Metric.MetricType.FILTER_COUNT).longValue()); + assertEquals(4L, metricTest.get(Metric.MetricType.COMMIT_COUNT).longValue()); + assertEquals(5L, metricTest.get(Metric.MetricType.WRITE_COUNT).longValue()); + assertEquals(0L, metricTest.get(Metric.MetricType.READ_SKIP_COUNT).longValue()); + assertEquals(0L, metricTest.get(Metric.MetricType.WRITE_SKIP_COUNT).longValue()); + assertEquals(0L, metricTest.get(Metric.MetricType.PROCESS_SKIP_COUNT).longValue()); + assertEquals(0L, metricTest.get(Metric.MetricType.ROLLBACK_COUNT).longValue()); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } +} diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java new file mode 100644 index 0000000000..0f6d068888 --- /dev/null +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.batch.understanding; + +import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.*; + +import java.util.List; +import java.util.Map; +import java.util.Properties; +import javax.batch.operations.JobOperator; +import javax.batch.runtime.BatchRuntime; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.JobExecution; +import javax.batch.runtime.Metric.MetricType; +import javax.batch.runtime.StepExecution; + +import org.junit.jupiter.api.Test; + +class SimpleErrorChunkUnitTest { + + @Test + public void givenChunkError_thenBatch_CompletesWithFailed() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("simpleErrorChunk", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestFailed(jobExecution); + System.out.println(jobExecution.getBatchStatus()); + assertEquals(jobExecution.getBatchStatus(), BatchStatus.FAILED); + } + + @Test + public void givenChunkError_thenErrorSkipped_CompletesWithSuccess() throws Exception { + JobOperator jobOperator = BatchRuntime.getJobOperator(); + Long executionId = jobOperator.start("simpleErrorSkipChunk", new Properties()); + JobExecution jobExecution = jobOperator.getJobExecution(executionId); + jobExecution = BatchTestHelper.keepTestAlive(jobExecution); + List stepExecutions = jobOperator.getStepExecutions(executionId); + for (StepExecution stepExecution : stepExecutions) { + if (stepExecution.getStepName() + .equals("errorStep")) { + Map metricsMap = BatchTestHelper.getMetricsMap(stepExecution.getMetrics()); + long skipCount = metricsMap.get(MetricType.PROCESS_SKIP_COUNT) + .longValue(); + assertTrue("Skip count=" + skipCount, skipCount == 1l || skipCount == 2l); + } + } + assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); + } +} From cb840c6224ddc74280447e1e55213ca0e07186e9 Mon Sep 17 00:00:00 2001 From: DOHA Date: Sun, 25 Nov 2018 14:55:27 +0200 Subject: [PATCH 100/429] move customise oauth2 requests --- spring-5-security-oauth/pom.xml | 3 ++- .../baeldung/oauth2/CustomAuthorizationRequestResolver.java | 0 .../java/com/baeldung/oauth2/CustomRequestEntityConverter.java | 0 .../java/com/baeldung/oauth2/CustomTokenResponseConverter.java | 0 4 files changed, 2 insertions(+), 1 deletion(-) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java (100%) rename {spring-5-security => spring-5-security-oauth}/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java (100%) diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml index f200052adf..5814f1dd43 100644 --- a/spring-5-security-oauth/pom.xml +++ b/spring-5-security-oauth/pom.xml @@ -31,7 +31,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 @@ -66,6 +66,7 @@ + 2.1.0.RELEASE 2.0.1.RELEASE com.baeldung.oauth2.SpringOAuthApplication diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java diff --git a/spring-5-security/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java similarity index 100% rename from spring-5-security/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java From 0b7f01463c2ce5cadee5fb43f3625f78876a0ca5 Mon Sep 17 00:00:00 2001 From: Trevor Gowing Date: Sun, 25 Nov 2018 17:09:32 +0200 Subject: [PATCH 101/429] Fix typo Passenger#fistName BAEL-2208 --- .../main/java/com/baeldung/limit/Passenger.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java index e7eb3af10b..fb5c35de91 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java @@ -17,7 +17,7 @@ class Passenger { @Basic(optional = false) @Column(nullable = false) - private String fistName; + private String firstName; @Basic(optional = false) @Column(nullable = false) @@ -27,8 +27,8 @@ class Passenger { @Column(nullable = false) private int seatNumber; - private Passenger(String fistName, String lastName, int seatNumber) { - this.fistName = fistName; + private Passenger(String firstName, String lastName, int seatNumber) { + this.firstName = firstName; this.lastName = lastName; this.seatNumber = seatNumber; } @@ -44,20 +44,20 @@ class Passenger { if (object == null || getClass() != object.getClass()) return false; Passenger passenger = (Passenger) object; - return getSeatNumber() == passenger.getSeatNumber() && Objects.equals(getFistName(), passenger.getFistName()) + return getSeatNumber() == passenger.getSeatNumber() && Objects.equals(getFirstName(), passenger.getFirstName()) && Objects.equals(getLastName(), passenger.getLastName()); } @Override public int hashCode() { - return Objects.hash(getFistName(), getLastName(), getSeatNumber()); + return Objects.hash(getFirstName(), getLastName(), getSeatNumber()); } @Override public String toString() { final StringBuilder toStringBuilder = new StringBuilder(getClass().getSimpleName()); toStringBuilder.append("{ id=").append(id); - toStringBuilder.append(", fistName='").append(fistName).append('\''); + toStringBuilder.append(", firstName='").append(firstName).append('\''); toStringBuilder.append(", lastName='").append(lastName).append('\''); toStringBuilder.append(", seatNumber=").append(seatNumber); toStringBuilder.append('}'); @@ -68,8 +68,8 @@ class Passenger { return id; } - String getFistName() { - return fistName; + String getFirstName() { + return firstName; } String getLastName() { From 0c384f13b07351b745ae15b08aeb93ea999ee55b Mon Sep 17 00:00:00 2001 From: Trevor Gowing Date: Sun, 25 Nov 2018 16:13:57 +0200 Subject: [PATCH 102/429] Rename limit package to passenger Rename LimitIntegrationTest to PassengerRepositoryIntegrationTest Going to include code on sorting so it will no longer be limit specific. BAEL-2331 --- .../{limit => passenger}/CustomPassengerRepository.java | 2 +- .../java/com/baeldung/{limit => passenger}/Passenger.java | 2 +- .../baeldung/{limit => passenger}/PassengerRepository.java | 2 +- .../{limit => passenger}/PassengerRepositoryImpl.java | 2 +- .../PassengerRepositoryIntegrationTest.java} | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-) rename persistence-modules/spring-data-jpa/src/main/java/com/baeldung/{limit => passenger}/CustomPassengerRepository.java (80%) rename persistence-modules/spring-data-jpa/src/main/java/com/baeldung/{limit => passenger}/Passenger.java (98%) rename persistence-modules/spring-data-jpa/src/main/java/com/baeldung/{limit => passenger}/PassengerRepository.java (86%) rename persistence-modules/spring-data-jpa/src/main/java/com/baeldung/{limit => passenger}/PassengerRepositoryImpl.java (94%) rename persistence-modules/spring-data-jpa/src/test/java/com/baeldung/{limit/LimitIntegrationTest.java => passenger/PassengerRepositoryIntegrationTest.java} (96%) diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/CustomPassengerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/CustomPassengerRepository.java similarity index 80% rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/CustomPassengerRepository.java rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/CustomPassengerRepository.java index e9b5ba272f..7ae44bfbda 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/CustomPassengerRepository.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/CustomPassengerRepository.java @@ -1,4 +1,4 @@ -package com.baeldung.limit; +package com.baeldung.passenger; import java.util.List; diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java similarity index 98% rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java index fb5c35de91..24ae47e597 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/Passenger.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/Passenger.java @@ -1,4 +1,4 @@ -package com.baeldung.limit; +package com.baeldung.passenger; import javax.persistence.Basic; import javax.persistence.Column; diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java similarity index 86% rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepository.java rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java index 6301f6e307..58c782f27a 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepository.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java @@ -1,4 +1,4 @@ -package com.baeldung.limit; +package com.baeldung.passenger; import org.springframework.data.jpa.repository.JpaRepository; diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepositoryImpl.java similarity index 94% rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepositoryImpl.java rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepositoryImpl.java index 2d13eb7cad..bd6e535e3e 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/limit/PassengerRepositoryImpl.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepositoryImpl.java @@ -1,4 +1,4 @@ -package com.baeldung.limit; +package com.baeldung.passenger; import org.springframework.stereotype.Repository; diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/limit/LimitIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java similarity index 96% rename from persistence-modules/spring-data-jpa/src/test/java/com/baeldung/limit/LimitIntegrationTest.java rename to persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java index 27e0ebdd9f..19366730c5 100644 --- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/limit/LimitIntegrationTest.java +++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java @@ -1,4 +1,4 @@ -package com.baeldung.limit; +package com.baeldung.passenger; import org.junit.Before; import org.junit.Test; @@ -18,7 +18,7 @@ import static org.junit.Assert.assertEquals; @DataJpaTest @RunWith(SpringRunner.class) -public class LimitIntegrationTest { +public class PassengerRepositoryIntegrationTest { @PersistenceContext private EntityManager entityManager; From 322af68ae2093966427c4265440f8994d2416a6d Mon Sep 17 00:00:00 2001 From: Trevor Gowing Date: Sun, 25 Nov 2018 17:11:31 +0200 Subject: [PATCH 103/429] How to sort query results with Spring Data BAEL-2331 --- .../passenger/PassengerRepository.java | 4 +++ .../PassengerRepositoryIntegrationTest.java | 28 +++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java index 58c782f27a..2e4561d91b 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java @@ -2,7 +2,11 @@ package com.baeldung.passenger; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; + interface PassengerRepository extends JpaRepository, CustomPassengerRepository { Passenger findFirstByOrderBySeatNumberAsc(); + + List findByOrderBySeatNumberAsc(); } diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java index 19366730c5..5ca2d21421 100644 --- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java @@ -14,6 +14,8 @@ import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.List; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; import static org.junit.Assert.assertEquals; @DataJpaTest @@ -66,4 +68,30 @@ public class PassengerRepositoryIntegrationTest { Passenger actual = page.getContent().get(0); assertEquals(expected, actual); } + + @Test + public void givenSeveralPassengersWhenOrderedBySeatNumberAscThenThePassengersReturnedInCorrectOrder() { + Passenger fred = Passenger.from("Fred", "Bloggs", 22); + Passenger ricki = Passenger.from("Ricki", "Bobbie", 36); + Passenger jill = Passenger.from("Jill", "Smith", 50); + Passenger siya = Passenger.from("Siya", "Kolisi", 85); + Passenger eve = Passenger.from("Eve", "Jackson", 95); + + List passengers = repository.findByOrderBySeatNumberAsc(); + + assertThat(passengers, contains(fred, ricki, jill, siya, eve)); + } + + @Test + public void givenSeveralPassengersWhenFindAllWithSortBySeatNumberAscThenReturnPassengersInCorrectOrder() { + Passenger fred = Passenger.from("Fred", "Bloggs", 22); + Passenger ricki = Passenger.from("Ricki", "Bobbie", 36); + Passenger jill = Passenger.from("Jill", "Smith", 50); + Passenger siya = Passenger.from("Siya", "Kolisi", 85); + Passenger eve = Passenger.from("Eve", "Jackson", 95); + + List passengers = repository.findAll(Sort.by(Sort.Direction.ASC, "seatNumber")); + + assertThat(passengers, contains(fred, ricki, jill, siya, eve)); + } } From a2722368af3aaec55d19b603e3d75b52639fb9fd Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 25 Nov 2018 20:10:37 +0200 Subject: [PATCH 104/429] add data order methods --- .../java/com/baeldung/passenger/PassengerRepository.java | 5 +++++ .../passenger/PassengerRepositoryIntegrationTest.java | 5 +++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java index 2e4561d91b..6ae6afb403 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/passenger/PassengerRepository.java @@ -1,5 +1,6 @@ package com.baeldung.passenger; +import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; @@ -9,4 +10,8 @@ interface PassengerRepository extends JpaRepository, CustomPass Passenger findFirstByOrderBySeatNumberAsc(); List findByOrderBySeatNumberAsc(); + + List findByLastNameOrderBySeatNumberAsc(String lastName); + + List findByLastName(String lastName, Sort sort); } diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java index 5ca2d21421..c57e771345 100644 --- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/passenger/PassengerRepositoryIntegrationTest.java @@ -70,7 +70,7 @@ public class PassengerRepositoryIntegrationTest { } @Test - public void givenSeveralPassengersWhenOrderedBySeatNumberAscThenThePassengersReturnedInCorrectOrder() { + public void givenPassengers_whenOrderedBySeatNumberAsc_thenCorrectOrder() { Passenger fred = Passenger.from("Fred", "Bloggs", 22); Passenger ricki = Passenger.from("Ricki", "Bobbie", 36); Passenger jill = Passenger.from("Jill", "Smith", 50); @@ -83,7 +83,7 @@ public class PassengerRepositoryIntegrationTest { } @Test - public void givenSeveralPassengersWhenFindAllWithSortBySeatNumberAscThenReturnPassengersInCorrectOrder() { + public void givenPassengers_whenFindAllWithSortBySeatNumberAsc_thenCorrectOrder() { Passenger fred = Passenger.from("Fred", "Bloggs", 22); Passenger ricki = Passenger.from("Ricki", "Bobbie", 36); Passenger jill = Passenger.from("Jill", "Smith", 50); @@ -94,4 +94,5 @@ public class PassengerRepositoryIntegrationTest { assertThat(passengers, contains(fred, ricki, jill, siya, eve)); } + } From 777b9ecc9bbefaf9c8d3bbcbeef50a1a0e6bfbf2 Mon Sep 17 00:00:00 2001 From: DOHA Date: Sun, 25 Nov 2018 22:04:02 +0200 Subject: [PATCH 105/429] minor fix --- spring-5-security-oauth/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml index 5814f1dd43..59150a153f 100644 --- a/spring-5-security-oauth/pom.xml +++ b/spring-5-security-oauth/pom.xml @@ -67,7 +67,7 @@ 2.1.0.RELEASE - 2.0.1.RELEASE + 2.1.0.RELEASE com.baeldung.oauth2.SpringOAuthApplication From 29c9eb444567c40ed0dd20d1661753dfd258fbd7 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Sun, 25 Nov 2018 16:05:39 -0800 Subject: [PATCH 106/429] BAEL-2330 (#5776) update readme --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index 2847a0d0a8..222b28e8ad 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -37,3 +37,4 @@ - [Using indexOf to Find All Occurrences of a Word in a String](https://www.baeldung.com/java-indexOf-find-string-occurrences) - [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) From a1de031c67871e55b54cfbbdb3988a5732709816 Mon Sep 17 00:00:00 2001 From: FrancoCorleone Date: Mon, 26 Nov 2018 04:14:20 +0100 Subject: [PATCH 107/429] Add joining primitives tests (#5740) * Add joining primitives tests * Small refactor * Fix naming for PMD * Add char examples to testing cases * Fix literal separator * CR changes --- .../StringFromPrimitiveArrayUnitTest.java | 129 ++++++++++++++++++ 1 file changed, 129 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java b/java-strings/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java new file mode 100644 index 0000000000..c93089e543 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/StringFromPrimitiveArrayUnitTest.java @@ -0,0 +1,129 @@ +package com.baeldung.string; + +import com.google.common.base.Joiner; +import com.google.common.primitives.Chars; +import com.google.common.primitives.Ints; +import org.apache.commons.lang3.ArrayUtils; +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +import java.nio.CharBuffer; +import java.util.Arrays; +import java.util.StringJoiner; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + + +public class StringFromPrimitiveArrayUnitTest { + + private int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9}; + + private char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'}; + + private char separatorChar = '-'; + + private String separator = String.valueOf(separatorChar); + + private String expectedIntString = "1-2-3-4-5-6-7-8-9"; + + private String expectedCharString = "a-b-c-d-e-f"; + + @Test + public void givenIntArray_whenJoinBySeparator_thenReturnsString_through_Java8CollectorsJoining() { + assertThat(Arrays.stream(intArray) + .mapToObj(String::valueOf) + .collect(Collectors.joining(separator))) + .isEqualTo(expectedIntString); + } + + @Test + public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_Java8CollectorsJoining() { + assertThat(CharBuffer.wrap(charArray).chars() + .mapToObj(intChar -> String.valueOf((char) intChar)) + .collect(Collectors.joining(separator))) + .isEqualTo(expectedCharString); + } + + + @Test + public void giveIntArray_whenJoinBySeparator_thenReturnsString_through_Java8StringJoiner() { + StringJoiner intStringJoiner = new StringJoiner(separator); + + Arrays.stream(intArray) + .mapToObj(String::valueOf) + .forEach(intStringJoiner::add); + + assertThat(intStringJoiner.toString()).isEqualTo(expectedIntString); + } + + @Test + public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_Java8StringJoiner() { + StringJoiner charStringJoiner = new StringJoiner(separator); + + CharBuffer.wrap(charArray).chars() + .mapToObj(intChar -> String.valueOf((char) intChar)) + .forEach(charStringJoiner::add); + + assertThat(charStringJoiner.toString()).isEqualTo(expectedCharString); + } + + @Test + public void givenIntArray_whenJoinBySeparator_thenReturnsString_through_CommonsLang() { + assertThat(StringUtils.join(intArray, separatorChar)).isEqualTo(expectedIntString); + assertThat(StringUtils.join(ArrayUtils.toObject(intArray), separator)).isEqualTo(expectedIntString); + } + + @Test + public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_CommonsLang() { + assertThat(StringUtils.join(charArray, separatorChar)).isEqualTo(expectedCharString); + assertThat(StringUtils.join(ArrayUtils.toObject(charArray), separator)).isEqualTo(expectedCharString); + } + + @Test + public void givenIntArray_whenJoinBySeparator_thenReturnsString_through_GuavaJoiner() { + assertThat(Joiner.on(separator).join(Ints.asList(intArray))).isEqualTo(expectedIntString); + } + + @Test + public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_GuavaJoiner() { + assertThat(Joiner.on(separator).join(Chars.asList(charArray))).isEqualTo(expectedCharString); + } + + @Test + public void givenIntArray_whenJoinBySeparator_thenReturnsString_through_Java7StringBuilder() { + assertThat(joinIntArrayWithStringBuilder(intArray, separator)).isEqualTo(expectedIntString); + } + + @Test + public void givenCharArray_whenJoinBySeparator_thenReturnsString_through_Java7StringBuilder() { + assertThat(joinCharArrayWithStringBuilder(charArray, separator)).isEqualTo(expectedCharString); + } + + private String joinIntArrayWithStringBuilder(int[] array, String separator) { + if (array.length == 0) { + return ""; + } + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < array.length - 1; i++) { + stringBuilder.append(array[i]); + stringBuilder.append(separator); + } + stringBuilder.append(array[array.length - 1]); + return stringBuilder.toString(); + } + + private String joinCharArrayWithStringBuilder(char[] array, String separator) { + if (array.length == 0) { + return ""; + } + StringBuilder stringBuilder = new StringBuilder(); + for (int i = 0; i < array.length - 1; i++) { + stringBuilder.append(array[i]); + stringBuilder.append(separator); + } + stringBuilder.append(array[array.length - 1]); + return stringBuilder.toString(); + } + +} From 7719b2e30a1ed724dc291919fda7dc48b3b53c08 Mon Sep 17 00:00:00 2001 From: Seun Matt Date: Mon, 26 Nov 2018 17:20:11 +0100 Subject: [PATCH 108/429] example code for BAEL-1961 (#5781) * added example code for BAEL-2366 * moved example code for BAEL-2366 * example code for BAEL-1961 * moved example code into integration test * updated the test assertions --- .../com/baeldung/mongodb/Application.java | 8 ++ .../baeldung/mongodb/daos/UserRepository.java | 10 +++ .../mongodb/events/UserModelListener.java | 28 +++++++ .../mongodb/models/DatabaseSequence.java | 32 ++++++++ .../com/baeldung/mongodb/models/User.java | 73 +++++++++++++++++++ .../services/SequenceGeneratorService.java | 35 +++++++++ ...goDbAutoGeneratedFieldIntegrationTest.java | 36 +++++++++ 7 files changed, 222 insertions(+) create mode 100755 spring-boot/src/main/java/com/baeldung/mongodb/daos/UserRepository.java create mode 100644 spring-boot/src/main/java/com/baeldung/mongodb/events/UserModelListener.java create mode 100755 spring-boot/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java create mode 100755 spring-boot/src/main/java/com/baeldung/mongodb/models/User.java create mode 100755 spring-boot/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java create mode 100644 spring-boot/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/Application.java b/spring-boot/src/main/java/com/baeldung/mongodb/Application.java index 092ce3352b..c0a9ad59a7 100644 --- a/spring-boot/src/main/java/com/baeldung/mongodb/Application.java +++ b/spring-boot/src/main/java/com/baeldung/mongodb/Application.java @@ -1,11 +1,19 @@ package com.baeldung.mongodb; +import com.baeldung.mongodb.daos.UserRepository; +import com.baeldung.mongodb.models.User; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +import java.util.List; @SpringBootApplication public class Application { + public static void main(String[] args) { SpringApplication.run(Application.class, args); } + } diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/daos/UserRepository.java b/spring-boot/src/main/java/com/baeldung/mongodb/daos/UserRepository.java new file mode 100755 index 0000000000..7f58fdd1c8 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/mongodb/daos/UserRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.mongodb.daos; + + +import com.baeldung.mongodb.models.User; +import org.springframework.data.mongodb.repository.MongoRepository; + + +public interface UserRepository extends MongoRepository { + +} diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/events/UserModelListener.java b/spring-boot/src/main/java/com/baeldung/mongodb/events/UserModelListener.java new file mode 100644 index 0000000000..24b53f3d2d --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/mongodb/events/UserModelListener.java @@ -0,0 +1,28 @@ +package com.baeldung.mongodb.events; + + +import com.baeldung.mongodb.models.User; +import com.baeldung.mongodb.services.SequenceGeneratorService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.mapping.event.AbstractMongoEventListener; +import org.springframework.data.mongodb.core.mapping.event.BeforeConvertEvent; +import org.springframework.stereotype.Component; + + +@Component +public class UserModelListener extends AbstractMongoEventListener { + + private SequenceGeneratorService sequenceGenerator; + + @Autowired + public UserModelListener(SequenceGeneratorService sequenceGenerator) { + this.sequenceGenerator = sequenceGenerator; + } + + @Override + public void onBeforeConvert(BeforeConvertEvent event) { + event.getSource().setId(sequenceGenerator.generateSequence(User.SEQUENCE_NAME)); + } + + +} diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java b/spring-boot/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java new file mode 100755 index 0000000000..c2c04f7ee6 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java @@ -0,0 +1,32 @@ +package com.baeldung.mongodb.models; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + + +@Document(collection = "database_sequences") +public class DatabaseSequence { + + @Id + private String id; + + private long seq; + + public DatabaseSequence() {} + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public long getSeq() { + return seq; + } + + public void setSeq(long seq) { + this.seq = seq; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/models/User.java b/spring-boot/src/main/java/com/baeldung/mongodb/models/User.java new file mode 100755 index 0000000000..1f08074313 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/mongodb/models/User.java @@ -0,0 +1,73 @@ +package com.baeldung.mongodb.models; + +import org.springframework.data.annotation.Id; +import org.springframework.data.annotation.Transient; +import org.springframework.data.mongodb.core.mapping.Document; + + +@Document(collection = "users") +public class User { + + @Transient + public static final String SEQUENCE_NAME = "users_sequence"; + + @Id + private long id; + + private String firstName; + + private String lastName; + + private String email; + + public User() { } + + public User(String firstName, String lastName, String email) { + this.firstName = firstName; + this.lastName = lastName; + this.email = email; + } + + 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; + } + + 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; + } + + + @Override + public String toString() { + return "User{" + + "id=" + id + + ", firstName='" + firstName + '\'' + + ", lastName='" + lastName + '\'' + + ", email='" + email + '\'' + + '}'; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java b/spring-boot/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java new file mode 100755 index 0000000000..52ece27d63 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java @@ -0,0 +1,35 @@ +package com.baeldung.mongodb.services; + +import com.baeldung.mongodb.models.DatabaseSequence; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoOperations; +import org.springframework.data.mongodb.core.query.Update; +import org.springframework.stereotype.Service; + +import java.util.Objects; + +import static org.springframework.data.mongodb.core.FindAndModifyOptions.options; +import static org.springframework.data.mongodb.core.query.Criteria.where; +import static org.springframework.data.mongodb.core.query.Query.query; + + +@Service +public class SequenceGeneratorService { + + + private MongoOperations mongoOperations; + + @Autowired + public SequenceGeneratorService(MongoOperations mongoOperations) { + this.mongoOperations = mongoOperations; + } + + public long generateSequence(String seqName) { + + DatabaseSequence counter = mongoOperations.findAndModify(query(where("_id").is(seqName)), + new Update().inc("seq",1), options().returnNew(true).upsert(true), + DatabaseSequence.class); + return !Objects.isNull(counter) ? counter.getSeq() : 1; + + } +} diff --git a/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java new file mode 100644 index 0000000000..3430bca69a --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java @@ -0,0 +1,36 @@ +package com.baeldung.mongodb; + +import com.baeldung.mongodb.daos.UserRepository; +import com.baeldung.mongodb.models.User; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.junit4.SpringRunner; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.List; + + +@RunWith(SpringRunner.class) +public class MongoDbAutoGeneratedFieldIntegrationTest { + + @Autowired + private UserRepository userRepository; + + @Test + public void contextLoads() {} + + @Test + public void givenUserObject_whenSave_thenCreateNewUser() { + + User user = new User(); + user.setFirstName("John"); + user.setLastName("Doe"); + user.setEmail("john.doe@example.com"); + userRepository.save(user); + + assertThat(userRepository.findAll().size()).isGreaterThan(0); + } + + +} From 09261fb3b94b3bc2b67d3f1efd356769df9edad6 Mon Sep 17 00:00:00 2001 From: "akash.pandey" Date: Mon, 26 Nov 2018 23:02:44 +0530 Subject: [PATCH 109/429] BAEL-2393: Longest Sub-string without repeating characters. --- ...ongestSubstringNonRepeatingCharacters.java | 51 +++++++++++++++++++ ...stSubstringNonRepeatingCharactersTest.java | 20 ++++++++ 2 files changed, 71 insertions(+) create mode 100644 algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java create mode 100644 algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java new file mode 100644 index 0000000000..840b57cd78 --- /dev/null +++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java @@ -0,0 +1,51 @@ +package com.baeldung.algorithms.string; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class LongestSubstringNonRepeatingCharacters { + + public static String getNonRepeatingCharactersBruteForce(String input) { + String output = ""; + for (int start = 0; start < input.length(); start++) { + Set visited = new HashSet<>(); + int end = start; + for (; end < input.length(); end++) { + char currChar = input.charAt(end); + if (visited.contains(currChar)) { + break; + } else { + visited.add(currChar); + } + } + if (output.length() < end - start + 1) { + output = input.substring(start, end); + } + } + return output; + } + + public static String getNonRepeatingCharacters(String input) { + Map visited = new HashMap<>(); + String output = ""; + for (int start = 0, end = 0; end < input.length(); end++) { + char currChar = input.charAt(end); + if(visited.containsKey(currChar)) { + start = Math.max(visited.get(currChar)+1, start); + } + if(output.length() < end - start + 1) { + output = input.substring(start, end+1); + } + visited.put(currChar, end); + } + return output; + } + + public static void main(String[] args) { + String input = "CODINGISAWESOME"; + System.out.println(getNonRepeatingCharacters(input)); + } + +} diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java new file mode 100644 index 0000000000..a3e67362ad --- /dev/null +++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java @@ -0,0 +1,20 @@ +package com.baeldung.algorithms.string; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class LongestSubstringNonRepeatingCharactersTest { + + @Test + void givenString_whenGetNonRepeatingCharactersBruteForceCalled_thenResultFoundAsExpected() { + String input = "CODINGISAWESOME"; + Assertions.assertEquals("NGISAWE", LongestSubstringNonRepeatingCharacters.getNonRepeatingCharactersBruteForce(input)); + } + + @Test + void givenString_whenGetNonRepeatingCharactersCalled_thenResultFoundAsExpected() { + String input = "CODINGISAWESOME"; + Assertions.assertEquals("NGISAWE",LongestSubstringNonRepeatingCharacters.getNonRepeatingCharacters(input)); + } + +} From 5ba5b605360e1de095fe29d3bd3b7f32fd382761 Mon Sep 17 00:00:00 2001 From: greg Date: Tue, 27 Nov 2018 02:08:42 +0100 Subject: [PATCH 110/429] BAEL-2368 convert array to string and back (#5689) * BAEL-2368 convert string array to string * BAEL-2368 Convert array to string code * BAEL-2368 Change package * Fix for test --- .../ArrayToStringUnitTest.java | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java diff --git a/java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java b/java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java new file mode 100644 index 0000000000..b563475997 --- /dev/null +++ b/java-collections-conversions/src/test/java/org/baeldung/convertarraytostring/ArrayToStringUnitTest.java @@ -0,0 +1,136 @@ +package org.baeldung.convertarraytostring; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +import com.google.common.base.Joiner; +import com.google.common.base.Splitter; + +import static org.hamcrest.CoreMatchers.instanceOf; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; + +public class ArrayToStringUnitTest { + + // convert with Java + + @Test + public void givenAStringArray_whenConvertBeforeJava8_thenReturnString() { + + String[] strArray = { "Convert", "Array", "With", "Java" }; + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < strArray.length; i++) { + stringBuilder.append(strArray[i]); + } + String joinedString = stringBuilder.toString(); + + assertThat(joinedString, instanceOf(String.class)); + assertEquals("ConvertArrayWithJava", joinedString); + } + + @Test + public void givenAString_whenConvertBeforeJava8_thenReturnStringArray() { + + String input = "lorem ipsum dolor sit amet"; + String[] strArray = input.split(" "); + + assertThat(strArray, instanceOf(String[].class)); + assertEquals(5, strArray.length); + + input = "loremipsum"; + strArray = input.split(""); + assertThat(strArray, instanceOf(String[].class)); + assertEquals(10, strArray.length); + } + + @Test + public void givenAnIntArray_whenConvertBeforeJava8_thenReturnString() { + + int[] strArray = { 1, 2, 3, 4, 5 }; + StringBuilder stringBuilder = new StringBuilder(); + + for (int i = 0; i < strArray.length; i++) { + stringBuilder.append(Integer.valueOf(strArray[i])); + } + String joinedString = stringBuilder.toString(); + + assertThat(joinedString, instanceOf(String.class)); + assertEquals("12345", joinedString); + } + + // convert with Java Stream API + + @Test + public void givenAStringArray_whenConvertWithJavaStream_thenReturnString() { + + String[] strArray = { "Convert", "With", "Java", "Streams" }; + String joinedString = Arrays.stream(strArray) + .collect(Collectors.joining()); + assertThat(joinedString, instanceOf(String.class)); + assertEquals("ConvertWithJavaStreams", joinedString); + + joinedString = Arrays.stream(strArray) + .collect(Collectors.joining(",")); + assertThat(joinedString, instanceOf(String.class)); + assertEquals("Convert,With,Java,Streams", joinedString); + } + + + // convert with Apache Commons + + @Test + public void givenAStringArray_whenConvertWithApacheCommons_thenReturnString() { + + String[] strArray = { "Convert", "With", "Apache", "Commons" }; + String joinedString = StringUtils.join(strArray); + + assertThat(joinedString, instanceOf(String.class)); + assertEquals("ConvertWithApacheCommons", joinedString); + } + + @Test + public void givenAString_whenConvertWithApacheCommons_thenReturnStringArray() { + + String input = "lorem ipsum dolor sit amet"; + String[] strArray = StringUtils.split(input, " "); + + assertThat(strArray, instanceOf(String[].class)); + assertEquals(5, strArray.length); + } + + + // convert with Guava + + @Test + public void givenAStringArray_whenConvertWithGuava_thenReturnString() { + + String[] strArray = { "Convert", "With", "Guava", null }; + String joinedString = Joiner.on("") + .skipNulls() + .join(strArray); + + assertThat(joinedString, instanceOf(String.class)); + assertEquals("ConvertWithGuava", joinedString); + } + + + @Test + public void givenAString_whenConvertWithGuava_thenReturnStringArray() { + + String input = "lorem ipsum dolor sit amet"; + + List resultList = Splitter.on(' ') + .trimResults() + .omitEmptyStrings() + .splitToList(input); + String[] strArray = resultList.toArray(new String[0]); + + assertThat(strArray, instanceOf(String[].class)); + assertEquals(5, strArray.length); + } +} From 71bca76bf827294905ea98cb6dab1bde1abc029a Mon Sep 17 00:00:00 2001 From: enpy Date: Tue, 27 Nov 2018 16:21:45 +0100 Subject: [PATCH 111/429] BAEL-2809 Get all Data in a table with Hibernate (#5670) * BAEL-2809 Get all Data in a table with Hibernate * Delete transaction.log * Update FindAll.java * Update FindAllTest.java * Update FindAll.java * Update FindAllTest.java * Rename FindAllTest.java to FindAllUnitTest.java --- .../baeldung/hibernate/findall/FindAll.java | 35 +++++++++++ .../hibernate/findall/FindAllUnitTest.java | 63 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java create mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java new file mode 100644 index 0000000000..cc0c234df0 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/findall/FindAll.java @@ -0,0 +1,35 @@ +package com.baeldung.hibernate.findall; + +import java.util.List; + +import javax.persistence.TypedQuery; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; + +import org.hibernate.Session; + +import com.baeldung.hibernate.pojo.Student; + +public class FindAll { + + private Session session; + + public FindAll(Session session) { + super(); + this.session = session; + } + + public List findAllWithJpql() { + return session.createQuery("SELECT a FROM Student a", Student.class).getResultList(); + } + + public List findAllWithCriteriaQuery() { + CriteriaBuilder cb = session.getCriteriaBuilder(); + CriteriaQuery cq = cb.createQuery(Student.class); + Root rootEntry = cq.from(Student.class); + CriteriaQuery all = cq.select(rootEntry); + TypedQuery allQuery = session.createQuery(all); + return allQuery.getResultList(); + } +} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java new file mode 100644 index 0000000000..8a1b9e9791 --- /dev/null +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/findall/FindAllUnitTest.java @@ -0,0 +1,63 @@ +package com.baeldung.hibernate.findall; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.List; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import com.baeldung.hibernate.HibernateUtil; +import com.baeldung.hibernate.pojo.Student; + +public class FindAllUnitTest { + + private Session session; + private Transaction transaction; + + private FindAll findAll; + + @Before + public void setUp() throws IOException { + + session = HibernateUtil.getSessionFactory().openSession(); + transaction = session.beginTransaction(); + findAll = new FindAll(session); + + session.createNativeQuery("delete from Student").executeUpdate(); + + Student student1 = new Student(); + session.persist(student1); + + Student student2 = new Student(); + session.persist(student2); + + Student student3 = new Student(); + session.persist(student3); + + transaction.commit(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + transaction.rollback(); + session.close(); + } + + @Test + public void givenCriteriaQuery_WhenFindAll_ThenGetAllPersons() { + List list = findAll.findAllWithCriteriaQuery(); + assertEquals(3, list.size()); + } + + @Test + public void givenJpql_WhenFindAll_ThenGetAllPersons() { + List list = findAll.findAllWithJpql(); + assertEquals(3, list.size()); + } +} From 7410f52561a0949751cc27e60a5902fc8d0f65d5 Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Wed, 28 Nov 2018 01:00:16 +0530 Subject: [PATCH 112/429] Changed the source files for incorporating review comments on the tutorial. --- .../main/java/com/baeldung/graph/Graph.java | 116 ++++++------------ .../graph/GraphTraversalUnitTest.java | 30 ++--- 2 files changed, 55 insertions(+), 91 deletions(-) diff --git a/core-java/src/main/java/com/baeldung/graph/Graph.java b/core-java/src/main/java/com/baeldung/graph/Graph.java index 7095f64709..43b5c0aa08 100644 --- a/core-java/src/main/java/com/baeldung/graph/Graph.java +++ b/core-java/src/main/java/com/baeldung/graph/Graph.java @@ -1,67 +1,57 @@ package com.baeldung.graph; +import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; +import java.util.List; import java.util.Map; -import java.util.Set; import java.util.stream.Collectors; public class Graph { - private Set vertices; - private Set edges; - private Map> adjVertices; + private Map> adjVertices; Graph() { - this.vertices = new HashSet(); - this.edges = new HashSet(); - this.adjVertices = new HashMap>(); + this.adjVertices = new HashMap>(); } - boolean addVertex(String label) { - return vertices.add(new Vertex(label)); + void addVertex(String label) { + adjVertices.putIfAbsent(new Vertex(label), new ArrayList<>()); } - boolean removeVertex(String label) { - return vertices.remove(new Vertex(label)); - } - - boolean addEdge(String label1, String label2) { - Vertex v1 = new Vertex(label1); - Vertex v2 = new Vertex(label2); - Edge e = new Edge(v1, v2); - if (this.edges.add(e)) { - adjVertices.putIfAbsent(v1, new HashSet<>()); - adjVertices.putIfAbsent(v2, new HashSet<>()); - adjVertices.get(v1) - .add(e); - adjVertices.get(v2) - .add(e); - } - return true; - } - - boolean removeEdge(String label1, String label2) { - Vertex v1 = new Vertex(label1); - Vertex v2 = new Vertex(label2); - Edge e = new Edge(v1, v2); - if (this.edges.remove(e)) { - Set eV1 = adjVertices.get(v1); - Set eV2 = adjVertices.get(v2); - - if (eV1 != null) - eV1.remove(e); - if (eV2 != null) - eV2.remove(e); - } - return true; - } - - Set getAdjVertices(String label) { + void removeVertex(String label) { Vertex v = new Vertex(label); - return adjVertices.get(v) - .stream() - .map(e -> e.v1.equals(v) ? e.v2 : e.v1) - .collect(Collectors.toSet()); + adjVertices.values().stream().map(e -> e.remove(v)).collect(Collectors.toList()); + adjVertices.remove(new Vertex(label)); + } + + void addEdge(String label1, String label2) { + Vertex v1 = new Vertex(label1); + Vertex v2 = new Vertex(label2); + adjVertices.get(v1).add(v2); + adjVertices.get(v2).add(v1); + } + + void removeEdge(String label1, String label2) { + Vertex v1 = new Vertex(label1); + Vertex v2 = new Vertex(label2); + List eV1 = adjVertices.get(v1); + List eV2 = adjVertices.get(v2); + if (eV1 != null) + eV1.remove(v2); + if (eV2 != null) + eV2.remove(v1); + } + + List getAdjVertices(String label) { + return adjVertices.get(new Vertex(label)); + } + + String printGraph() { + StringBuffer sb = new StringBuffer(); + for(Vertex v : adjVertices.keySet()) { + sb.append(v); + sb.append(adjVertices.get(v)); + } + return sb.toString(); } class Vertex { @@ -83,30 +73,4 @@ public class Graph { return label; } } - - class Edge { - Vertex v1; - Vertex v2; - Edge(String label1, String label2) { - this.v1 = new Vertex(label1); - this.v2 = new Vertex(label2); - } - Edge(Vertex vertex1, Vertex vertex2) { - this.v1 = vertex1; - this.v2 = vertex2; - } - @Override - public boolean equals(Object obj) { - Edge edge = (Edge) obj; - return edge.v1.equals(v1) && edge.v2.equals(v2); - } - @Override - public int hashCode() { - return v1.hashCode() + v2.hashCode(); - } - @Override - public String toString() { - return v1.label + "-" + v2.label; - } - } } \ No newline at end of file diff --git a/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java b/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java index 84611a580a..d955d56d95 100644 --- a/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java +++ b/core-java/src/test/java/com/baeldung/graph/GraphTraversalUnitTest.java @@ -7,30 +7,30 @@ public class GraphTraversalUnitTest { @Test public void givenAGraph_whenTraversingDepthFirst_thenExpectedResult() { Graph graph = createGraph(); - Assert.assertEquals("[A, D, E, B, C]", - GraphTraversal.depthFirstTraversal(graph, "A").toString()); + Assert.assertEquals("[Bob, Rob, Maria, Alice, Mark]", + GraphTraversal.depthFirstTraversal(graph, "Bob").toString()); } @Test public void givenAGraph_whenTraversingBreadthFirst_thenExpectedResult() { Graph graph = createGraph(); - Assert.assertEquals("[A, B, D, C, E]", - GraphTraversal.breadthFirstTraversal(graph, "A").toString()); + Assert.assertEquals("[Bob, Alice, Rob, Mark, Maria]", + GraphTraversal.breadthFirstTraversal(graph, "Bob").toString()); } Graph createGraph() { Graph graph = new Graph(); - graph.addVertex("A"); - graph.addVertex("B"); - graph.addVertex("C"); - graph.addVertex("D"); - graph.addVertex("E"); - graph.addEdge("A", "B"); - graph.addEdge("A", "D"); - graph.addEdge("B", "C"); - graph.addEdge("D", "C"); - graph.addEdge("B", "E"); - graph.addEdge("D", "E"); + graph.addVertex("Bob"); + graph.addVertex("Alice"); + graph.addVertex("Mark"); + graph.addVertex("Rob"); + graph.addVertex("Maria"); + graph.addEdge("Bob", "Alice"); + graph.addEdge("Bob", "Rob"); + graph.addEdge("Alice", "Mark"); + graph.addEdge("Rob", "Mark"); + graph.addEdge("Alice", "Maria"); + graph.addEdge("Rob", "Maria"); return graph; } } \ No newline at end of file From 3d2f6eff678ba244de9a9b1150e7c82307614fa4 Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Tue, 27 Nov 2018 17:32:34 -0200 Subject: [PATCH 113/429] [BAEL-2278] spring-5-reactive | debugging reactive streams (#5789) * First approach for the scenario, not stable yet. * Added 2 services for teh article Consumer is the main example project, with all the debugging functionality * * cleaned unused spring-5-data functionality * cleaning unused spring-5-data pom * *fixed indentation error * addressed Jira comments: * Created live test, and renamed unit test as integrtion test * Tried to fix issue in CI, couldnt reproduce locally --- .../consumer/ConsumerSSEApplication.java | 33 +++++ .../consumer/chronjobs/ChronJobs.java | 122 ++++++++++++++++++ .../ReactiveConfigsToggleRestController.java | 23 ++++ .../debugging/consumer/model/Foo.java | 26 ++++ .../debugging/consumer/model/FooDto.java | 12 ++ .../consumer/service/FooNameHelper.java | 45 +++++++ .../consumer/service/FooQuantityHelper.java | 31 +++++ .../consumer/service/FooReporter.java | 26 ++++ .../consumer/service/FooService.java | 91 +++++++++++++ .../server/ServerSSEApplication.java | 29 +++++ .../server/handlers/ServerHandler.java | 47 +++++++ .../baeldung/debugging/server/model/Foo.java | 16 +++ .../server/routers/ServerRouter.java | 22 ++++ .../src/main/resources/application.properties | 3 +- .../ConsumerFooServiceIntegrationTest.java | 65 ++++++++++ .../consumer/ConsumerFooServiceLiveTest.java | 49 +++++++ .../consumer/utils/ListAppender.java | 25 ++++ .../src/test/resources/logback-test.xml | 16 +++ 18 files changed, 679 insertions(+), 2 deletions(-) create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java create mode 100644 spring-5-reactive/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java create mode 100644 spring-5-reactive/src/test/resources/logback-test.xml diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java new file mode 100644 index 0000000000..55db3d7392 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java @@ -0,0 +1,33 @@ +package com.baeldung.debugging.consumer; + +import java.util.Collections; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; + +import reactor.core.publisher.Hooks; + +@SpringBootApplication(exclude = MongoReactiveAutoConfiguration.class) +@EnableScheduling +public class ConsumerSSEApplication { + + public static void main(String[] args) { + Hooks.onOperatorDebug(); + SpringApplication app = new SpringApplication(ConsumerSSEApplication.class); + app.setDefaultProperties(Collections.singletonMap("server.port", "8082")); + app.run(args); + } + + @Bean + public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() + .anyExchange() + .permitAll(); + return http.build(); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java new file mode 100644 index 0000000000..09cbc34a6f --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java @@ -0,0 +1,122 @@ +package com.baeldung.debugging.consumer.chronjobs; + +import java.time.Duration; +import java.util.concurrent.ThreadLocalRandom; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.client.WebClient; + +import com.baeldung.debugging.consumer.model.Foo; +import com.baeldung.debugging.consumer.model.FooDto; +import com.baeldung.debugging.consumer.service.FooService; + +import reactor.core.publisher.Flux; + +@Component +public class ChronJobs { + + private static Logger logger = LoggerFactory.getLogger(ChronJobs.class); + private WebClient client = WebClient.create("http://localhost:8081"); + + @Autowired + private FooService service; + + @Scheduled(fixedRate = 10000) + public void consumeInfiniteFlux() { + Flux fluxFoo = client.get() + .uri("/functional-reactive/periodic-foo") + .accept(MediaType.TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(FooDto.class) + .delayElements(Duration.ofMillis(100)) + .map(dto -> { + logger.debug("process 1 with dto id {} name{}", dto.getId(), dto.getName()); + return new Foo(dto); + }); + Integer random = ThreadLocalRandom.current() + .nextInt(0, 3); + switch (random) { + case 0: + logger.info("process 1 with approach 1"); + service.processFoo(fluxFoo); + break; + case 1: + logger.info("process 1 with approach 1 EH"); + service.processUsingApproachOneWithErrorHandling(fluxFoo); + break; + default: + logger.info("process 1 with approach 2"); + service.processFooInAnotherScenario(fluxFoo); + break; + + } + } + + @Scheduled(fixedRate = 20000) + public void consumeFiniteFlux2() { + Flux fluxFoo = client.get() + .uri("/functional-reactive/periodic-foo-2") + .accept(MediaType.TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(FooDto.class) + .delayElements(Duration.ofMillis(100)) + .map(dto -> { + logger.debug("process 2 with dto id {} name{}", dto.getId(), dto.getName()); + return new Foo(dto); + }); + Integer random = ThreadLocalRandom.current() + .nextInt(0, 3); + switch (random) { + case 0: + logger.info("process 2 with approach 1"); + service.processFoo(fluxFoo); + break; + case 1: + logger.info("process 2 with approach 1 EH"); + service.processUsingApproachOneWithErrorHandling(fluxFoo); + break; + default: + logger.info("process 2 with approach 2"); + service.processFooInAnotherScenario(fluxFoo); + break; + + } + } + + @Scheduled(fixedRate = 20000) + public void consumeFiniteFlux3() { + Flux fluxFoo = client.get() + .uri("/functional-reactive/periodic-foo-2") + .accept(MediaType.TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(FooDto.class) + .delayElements(Duration.ofMillis(100)) + .map(dto -> { + logger.debug("process 3 with dto id {} name{}", dto.getId(), dto.getName()); + return new Foo(dto); + }); + logger.info("process 3 with approach 3"); + service.processUsingApproachThree(fluxFoo); + } + + @Scheduled(fixedRate = 20000) + public void consumeFiniteFluxWithCheckpoint4() { + Flux fluxFoo = client.get() + .uri("/functional-reactive/periodic-foo-2") + .accept(MediaType.TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(FooDto.class) + .delayElements(Duration.ofMillis(100)) + .map(dto -> { + logger.debug("process 4 with dto id {} name{}", dto.getId(), dto.getName()); + return new Foo(dto); + }); + logger.info("process 4 with approach 4"); + service.processUsingApproachFourWithCheckpoint(fluxFoo); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java new file mode 100644 index 0000000000..3dcdc6c7c0 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/controllers/ReactiveConfigsToggleRestController.java @@ -0,0 +1,23 @@ +package com.baeldung.debugging.consumer.controllers; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +import reactor.core.publisher.Hooks; + +@RestController +public class ReactiveConfigsToggleRestController { + + @GetMapping("/debug-hook-on") + public String setReactiveDebugOn() { + Hooks.onOperatorDebug(); + return "DEBUG HOOK ON"; + } + + @GetMapping("/debug-hook-off") + public String setReactiveDebugOff() { + Hooks.resetOnOperatorDebug(); + return "DEBUG HOOK OFF"; + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java new file mode 100644 index 0000000000..e101457b84 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java @@ -0,0 +1,26 @@ +package com.baeldung.debugging.consumer.model; + +import java.util.concurrent.ThreadLocalRandom; + +import org.springframework.data.annotation.Id; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class Foo { + + @Id + private Integer id; + private String formattedName; + private Integer quantity; + + public Foo(FooDto dto) { + this.id = (ThreadLocalRandom.current() + .nextInt(0, 100) == 0) ? null : dto.getId(); + this.formattedName = dto.getName(); + this.quantity = ThreadLocalRandom.current() + .nextInt(0, 10); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java new file mode 100644 index 0000000000..50508fd216 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java @@ -0,0 +1,12 @@ +package com.baeldung.debugging.consumer.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class FooDto { + + private Integer id; + private String name; +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java new file mode 100644 index 0000000000..772b360437 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooNameHelper.java @@ -0,0 +1,45 @@ +package com.baeldung.debugging.consumer.service; + +import java.util.concurrent.ThreadLocalRandom; + +import com.baeldung.debugging.consumer.model.Foo; + +import reactor.core.publisher.Flux; + +public class FooNameHelper { + + public static Flux concatAndSubstringFooName(Flux flux) { + flux = concatFooName(flux); + flux = substringFooName(flux); + return flux; + } + + public static Flux concatFooName(Flux flux) { + flux = flux.map(foo -> { + String processedName = null; + Integer random = ThreadLocalRandom.current() + .nextInt(0, 80); + processedName = (random != 0) ? foo.getFormattedName() : foo.getFormattedName() + "-bael"; + foo.setFormattedName(processedName); + return foo; + }); + return flux; + } + + public static Flux substringFooName(Flux flux) { + return flux.map(foo -> { + String processedName; + Integer random = ThreadLocalRandom.current() + .nextInt(0, 100); + + processedName = (random == 0) ? foo.getFormattedName() + .substring(10, 15) + : foo.getFormattedName() + .substring(0, 5); + + foo.setFormattedName(processedName); + return foo; + }); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java new file mode 100644 index 0000000000..615239313d --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooQuantityHelper.java @@ -0,0 +1,31 @@ +package com.baeldung.debugging.consumer.service; + +import java.util.concurrent.ThreadLocalRandom; + +import com.baeldung.debugging.consumer.model.Foo; + +import reactor.core.publisher.Flux; + +public class FooQuantityHelper { + + public static Flux processFooReducingQuantity(Flux flux) { + flux = flux.map(foo -> { + Integer result; + Integer random = ThreadLocalRandom.current() + .nextInt(0, 90); + result = (random == 0) ? result = 0 : foo.getQuantity() + 2; + foo.setQuantity(result); + return foo; + }); + return divideFooQuantity(flux); + } + + public static Flux divideFooQuantity(Flux flux) { + return flux.map(foo -> { + Integer result = Math.round(5 / foo.getQuantity()); + foo.setQuantity(result); + return foo; + }); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java new file mode 100644 index 0000000000..f53cd238e0 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooReporter.java @@ -0,0 +1,26 @@ +package com.baeldung.debugging.consumer.service; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.debugging.consumer.model.Foo; + +import reactor.core.publisher.Flux; + +public class FooReporter { + + private static Logger logger = LoggerFactory.getLogger(FooReporter.class); + + public static Flux reportResult(Flux input, String approach) { + return input.map(foo -> { + if (foo.getId() == null) + throw new IllegalArgumentException("Null id is not valid!"); + logger.info("Reporting for approach {}: Foo with id '{}' name '{}' and quantity '{}'", approach, foo.getId(), foo.getFormattedName(), foo.getQuantity()); + return foo; + }); + } + + public static Flux reportResult(Flux input) { + return reportResult(input, "default"); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java new file mode 100644 index 0000000000..937e445ef5 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java @@ -0,0 +1,91 @@ +package com.baeldung.debugging.consumer.service; + +import static com.baeldung.debugging.consumer.service.FooNameHelper.concatAndSubstringFooName; +import static com.baeldung.debugging.consumer.service.FooNameHelper.substringFooName; +import static com.baeldung.debugging.consumer.service.FooQuantityHelper.divideFooQuantity; +import static com.baeldung.debugging.consumer.service.FooQuantityHelper.processFooReducingQuantity; +import static com.baeldung.debugging.consumer.service.FooReporter.reportResult; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import com.baeldung.debugging.consumer.model.Foo; + +import reactor.core.publisher.Flux; + +@Component +public class FooService { + + private static Logger logger = LoggerFactory.getLogger(FooService.class); + + public void processFoo(Flux flux) { + flux = FooNameHelper.concatFooName(flux); + flux = FooNameHelper.substringFooName(flux); + flux = flux.log(); + flux = FooReporter.reportResult(flux); + flux = flux.doOnError(error -> { + logger.error("The following error happened on processFoo method!", error); + }); + flux.subscribe(); + } + + public void processFooInAnotherScenario(Flux flux) { + flux = FooNameHelper.substringFooName(flux); + flux = FooQuantityHelper.divideFooQuantity(flux); + flux.subscribe(); + } + + public void processUsingApproachOneWithErrorHandling(Flux flux) { + logger.info("starting approach one w error handling!"); + flux = concatAndSubstringFooName(flux); + flux = concatAndSubstringFooName(flux); + flux = substringFooName(flux); + flux = processFooReducingQuantity(flux); + flux = processFooReducingQuantity(flux); + flux = processFooReducingQuantity(flux); + flux = reportResult(flux, "ONE w/ EH"); + flux = flux.doOnError(error -> { + logger.error("Approach 1 with Error Handling failed!", error); + }); + flux.subscribe(); + } + + public void processUsingApproachThree(Flux flux) { + logger.info("starting approach three!"); + flux = concatAndSubstringFooName(flux); + flux = reportResult(flux, "THREE"); + flux = flux.doOnError(error -> { + logger.error("Approach 3 failed!", error); + }); + flux.subscribe(); + } + + public void processUsingApproachFourWithCheckpoint(Flux flux) { + logger.info("starting approach four!"); + flux = concatAndSubstringFooName(flux); + flux = flux.checkpoint("CHECKPOINT 1"); + flux = concatAndSubstringFooName(flux); + flux = divideFooQuantity(flux); + flux = flux.checkpoint("CHECKPOINT 2", true); + flux = reportResult(flux, "FOUR"); + flux = concatAndSubstringFooName(flux).doOnError(error -> { + logger.error("Approach 4 failed!", error); + }); + flux.subscribe(); + } + + public void processUsingApproachFourWithInitialCheckpoint(Flux flux) { + logger.info("starting approach four!"); + flux = concatAndSubstringFooName(flux); + flux = flux.checkpoint("CHECKPOINT 1", true); + flux = concatAndSubstringFooName(flux); + flux = divideFooQuantity(flux); + flux = reportResult(flux, "FOUR"); + flux = flux.doOnError(error -> { + logger.error("Approach 4-2 failed!", error); + }); + flux.subscribe(); + } + +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java new file mode 100644 index 0000000000..6b24ee39f0 --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java @@ -0,0 +1,29 @@ +package com.baeldung.debugging.server; + +import java.util.Collections; + +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; +import org.springframework.web.reactive.config.EnableWebFlux; + +@EnableWebFlux +@SpringBootApplication +public class ServerSSEApplication { + + public static void main(String[] args) { + SpringApplication app = new SpringApplication(ServerSSEApplication.class); + app.setDefaultProperties(Collections.singletonMap("server.port", "8081")); + app.run(args); + } + + @Bean + public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() + .anyExchange() + .permitAll(); + return http.build(); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java new file mode 100644 index 0000000000..759cd9b01d --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/handlers/ServerHandler.java @@ -0,0 +1,47 @@ +package com.baeldung.debugging.server.handlers; + +import java.time.Duration; +import java.util.concurrent.ThreadLocalRandom; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.reactive.function.server.ServerRequest; +import org.springframework.web.reactive.function.server.ServerResponse; + +import com.baeldung.debugging.server.model.Foo; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +@Component +public class ServerHandler { + + private static Logger logger = LoggerFactory.getLogger(ServerHandler.class); + + public Mono useHandler(final ServerRequest request) { + // there are chances that something goes wrong here... + return ServerResponse.ok() + .contentType(MediaType.TEXT_EVENT_STREAM) + .body(Flux.interval(Duration.ofSeconds(1)) + .map(sequence -> { + logger.info("retrieving Foo. Sequence: {}", sequence); + if (ThreadLocalRandom.current() + .nextInt(0, 50) == 1) { + throw new RuntimeException("There was an error retrieving the Foo!"); + } + return new Foo(sequence, "name" + sequence); + + }), Foo.class); + } + + public Mono useHandlerFinite(final ServerRequest request) { + return ServerResponse.ok() + .contentType(MediaType.TEXT_EVENT_STREAM) + .body(Flux.range(0, 50) + .map(sequence -> { + return new Foo(new Long(sequence), "theFooNameNumber" + sequence); + }), Foo.class); + } +} diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java new file mode 100644 index 0000000000..a60e468e7f --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/model/Foo.java @@ -0,0 +1,16 @@ +package com.baeldung.debugging.server.model; + +import org.springframework.data.annotation.Id; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@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/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java new file mode 100644 index 0000000000..6378b2213d --- /dev/null +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/routers/ServerRouter.java @@ -0,0 +1,22 @@ +package com.baeldung.debugging.server.routers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.reactive.function.server.RequestPredicates; +import org.springframework.web.reactive.function.server.RouterFunction; +import org.springframework.web.reactive.function.server.RouterFunctions; +import org.springframework.web.reactive.function.server.ServerResponse; + +import com.baeldung.debugging.server.handlers.ServerHandler; + +@Configuration +public class ServerRouter { + + @Bean + public RouterFunction responseRoute(@Autowired ServerHandler handler) { + return RouterFunctions.route(RequestPredicates.GET("/functional-reactive/periodic-foo"), handler::useHandler) + .andRoute(RequestPredicates.GET("/functional-reactive/periodic-foo-2"), handler::useHandlerFinite); + } + +} diff --git a/spring-5-reactive/src/main/resources/application.properties b/spring-5-reactive/src/main/resources/application.properties index 92f3116f84..4b49e8e8a2 100644 --- a/spring-5-reactive/src/main/resources/application.properties +++ b/spring-5-reactive/src/main/resources/application.properties @@ -1,2 +1 @@ -logging.level.root=INFO - +logging.level.root=INFO \ No newline at end of file diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java new file mode 100644 index 0000000000..b7ed031ec7 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceIntegrationTest.java @@ -0,0 +1,65 @@ +package com.baeldung.debugging.consumer; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Optional; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.baeldung.debugging.consumer.model.Foo; +import com.baeldung.debugging.consumer.service.FooService; +import com.baeldung.debugging.consumer.utils.ListAppender; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.classic.spi.IThrowableProxy; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Hooks; + +public class ConsumerFooServiceIntegrationTest { + + FooService service = new FooService(); + + @BeforeEach + public void clearLogList() { + Hooks.onOperatorDebug(); + ListAppender.clearEventList(); + } + + @Test + public void givenFooWithNullId_whenProcessFoo_thenLogsWithDebugTrace() { + Foo one = new Foo(1, "nameverylong", 8); + Foo two = new Foo(null, "nameverylong", 4); + Flux flux = Flux.just(one, two); + + service.processFoo(flux); + + Collection allLoggedEntries = ListAppender.getEvents() + .stream() + .map(ILoggingEvent::getFormattedMessage) + .collect(Collectors.toList()); + + Collection allSuppressedEntries = ListAppender.getEvents() + .stream() + .map(ILoggingEvent::getThrowableProxy) + .flatMap(t -> { + return Optional.ofNullable(t) + .map(IThrowableProxy::getSuppressed) + .map(Arrays::stream) + .orElse(Stream.empty()); + }) + .map(IThrowableProxy::getMessage) + .collect(Collectors.toList()); + assertThat(allLoggedEntries).anyMatch(entry -> entry.contains("The following error happened on processFoo method!")) + .anyMatch(entry -> entry.contains("| onSubscribe")) + .anyMatch(entry -> entry.contains("| cancel()")); + + assertThat(allSuppressedEntries).anyMatch(entry -> entry.contains("Assembly trace from producer")) + .anyMatch(entry -> entry.contains("Error has been observed by the following operator(s)")); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java new file mode 100644 index 0000000000..af9bdfbc9b --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/ConsumerFooServiceLiveTest.java @@ -0,0 +1,49 @@ +package com.baeldung.debugging.consumer; + +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; +import org.springframework.test.web.reactive.server.WebTestClient; +import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; + +import com.baeldung.debugging.consumer.service.FooService; + +public class ConsumerFooServiceLiveTest { + + FooService service = new FooService(); + + private static final String BASE_URL = "http://localhost:8082"; + private static final String DEBUG_HOOK_ON = BASE_URL + "/debug-hook-on"; + private static final String DEBUG_HOOK_OFF = BASE_URL + "/debug-hook-off"; + + private static WebTestClient client; + + @BeforeAll + public static void setup() { + client = WebTestClient.bindToServer() + .baseUrl(BASE_URL) + .build(); + } + + @Test + public void whenRequestingDebugHookOn_thenObtainExpectedMessage() { + ResponseSpec response = client.get() + .uri(DEBUG_HOOK_ON) + .exchange(); + response.expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("DEBUG HOOK ON"); + } + + @Test + public void whenRequestingDebugHookOff_thenObtainExpectedMessage() { + ResponseSpec response = client.get() + .uri(DEBUG_HOOK_OFF) + .exchange(); + response.expectStatus() + .isOk() + .expectBody(String.class) + .isEqualTo("DEBUG HOOK OFF"); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java new file mode 100644 index 0000000000..c8c1c110bb --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/debugging/consumer/utils/ListAppender.java @@ -0,0 +1,25 @@ +package com.baeldung.debugging.consumer.utils; + +import java.util.ArrayList; +import java.util.List; + +import ch.qos.logback.classic.spi.ILoggingEvent; +import ch.qos.logback.core.AppenderBase; + +public class ListAppender extends AppenderBase { + + static private List events = new ArrayList<>(); + + @Override + protected void append(ILoggingEvent eventObject) { + events.add(eventObject); + } + + public static List getEvents() { + return events; + } + + public static void clearEventList() { + events.clear(); + } +} diff --git a/spring-5-reactive/src/test/resources/logback-test.xml b/spring-5-reactive/src/test/resources/logback-test.xml new file mode 100644 index 0000000000..514029e402 --- /dev/null +++ b/spring-5-reactive/src/test/resources/logback-test.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + \ No newline at end of file From 0f2fea091b053a30c418532439c98ee13794767a Mon Sep 17 00:00:00 2001 From: DOHA Date: Wed, 28 Nov 2018 13:59:16 +0200 Subject: [PATCH 114/429] add more custom oauth examples --- .../CustomAuthorizationRequestResolver.java | 7 ++++++ .../LinkedinTokenResponseConverter.java | 24 +++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LinkedinTokenResponseConverter.java diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java index 025064423d..b3fcd15a9a 100644 --- a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java @@ -47,4 +47,11 @@ public class CustomAuthorizationRequestResolver implements OAuth2AuthorizationRe private OAuth2AuthorizationRequest customizeAuthorizationRequest1(OAuth2AuthorizationRequest req) { return OAuth2AuthorizationRequest.from(req).state("xyz").build(); } + + private OAuth2AuthorizationRequest customizeOktaReq(OAuth2AuthorizationRequest req) { + Map extraParams = new HashMap(); + extraParams.putAll(req.getAdditionalParameters()); + extraParams.put("idp", "https://idprovider.com"); + return OAuth2AuthorizationRequest.from(req).additionalParameters(extraParams).build(); + } } diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LinkedinTokenResponseConverter.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LinkedinTokenResponseConverter.java new file mode 100644 index 0000000000..f638b6101a --- /dev/null +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LinkedinTokenResponseConverter.java @@ -0,0 +1,24 @@ +package com.baeldung.oauth2; + +import java.util.Map; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.security.oauth2.core.OAuth2AccessToken; +import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse; +import org.springframework.security.oauth2.core.endpoint.OAuth2ParameterNames; + +public class LinkedinTokenResponseConverter implements Converter, OAuth2AccessTokenResponse> { + + @Override + public OAuth2AccessTokenResponse convert(Map tokenResponseParameters) { + String accessToken = tokenResponseParameters.get(OAuth2ParameterNames.ACCESS_TOKEN); + long expiresIn = Long.valueOf(tokenResponseParameters.get(OAuth2ParameterNames.EXPIRES_IN)); + + OAuth2AccessToken.TokenType accessTokenType = OAuth2AccessToken.TokenType.BEARER; + + return OAuth2AccessTokenResponse.withToken(accessToken) + .tokenType(accessTokenType) + .expiresIn(expiresIn) + .build(); + } +} From ac37b4fb65bcceb3f977a208508f894f0e66fb3e Mon Sep 17 00:00:00 2001 From: Kuba Date: Wed, 28 Nov 2018 15:42:07 +0100 Subject: [PATCH 115/429] BAEL-2279 - Logging reactive sequence * BAEL-2279 - Logging reactive sequence * BAEL-2279 - Logging reactive sequence * Format fix. * Add all examples. Fix formatting. * BAEL 2279 - rename file, formatting fixes, update deps. * BAEL-2279 - Move code to reactive module. * BAEL 2279 - Remove old code. --- logging-modules/log4j/pom.xml | 7 ------- .../baeldung/webflux/logging}/WebFluxLoggingExample.java | 2 +- 2 files changed, 1 insertion(+), 8 deletions(-) rename {logging-modules/log4j/src/main/java/com/baeldung/webFluxLogging => spring-5-reactive/src/main/java/com/baeldung/webflux/logging}/WebFluxLoggingExample.java (91%) diff --git a/logging-modules/log4j/pom.xml b/logging-modules/log4j/pom.xml index 1b27e03445..c5ce1d06ad 100644 --- a/logging-modules/log4j/pom.xml +++ b/logging-modules/log4j/pom.xml @@ -44,12 +44,6 @@ disruptor ${disruptor.version} - - - org.springframework.boot - spring-boot-starter-webflux - ${spring-boot.version} - @@ -57,7 +51,6 @@ 2.7 2.7 3.3.6 - 2.1.0.RELEASE \ No newline at end of file diff --git a/logging-modules/log4j/src/main/java/com/baeldung/webFluxLogging/WebFluxLoggingExample.java b/spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java similarity index 91% rename from logging-modules/log4j/src/main/java/com/baeldung/webFluxLogging/WebFluxLoggingExample.java rename to spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java index f429fd57f3..c4881b2296 100644 --- a/logging-modules/log4j/src/main/java/com/baeldung/webFluxLogging/WebFluxLoggingExample.java +++ b/spring-5-reactive/src/main/java/com/baeldung/webflux/logging/WebFluxLoggingExample.java @@ -1,4 +1,4 @@ -package com.baeldung.webFluxLogging; +package com.baeldung.webflux.logging; import reactor.core.publisher.Flux; From b6431622ed022ca029a725a902bb0458ccbd5720 Mon Sep 17 00:00:00 2001 From: Aravind Ranganathan Date: Wed, 28 Nov 2018 12:01:32 -0500 Subject: [PATCH 116/429] Spring Data Cassandra Reactive Issue: BAEL-1870 --- .../spring-data-cassandra-reactive/pom.xml | 70 +++++++++++++++++++ ...pringDataCassandraReactiveApplication.java | 12 ++++ .../controller/EmployeeController.java | 49 +++++++++++++ .../cassandra/reactive/model/Employee.java | 20 ++++++ .../repository/EmployeeRepository.java | 11 +++ .../reactive/service/EmployeeService.java | 35 ++++++++++ .../src/main/resources/application.properties | 2 + ...tiveEmployeeRepositoryIntegrationTest.java | 55 +++++++++++++++ 8 files changed, 254 insertions(+) create mode 100644 persistence-modules/spring-data-cassandra-reactive/pom.xml create mode 100644 persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/SpringDataCassandraReactiveApplication.java create mode 100644 persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/controller/EmployeeController.java create mode 100644 persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/model/Employee.java create mode 100644 persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/repository/EmployeeRepository.java create mode 100644 persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/service/EmployeeService.java create mode 100644 persistence-modules/spring-data-cassandra-reactive/src/main/resources/application.properties create mode 100644 persistence-modules/spring-data-cassandra-reactive/src/test/java/com/baeldung/cassandra/reactive/ReactiveEmployeeRepositoryIntegrationTest.java diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml new file mode 100644 index 0000000000..037b1fd3c1 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + com.baeldung + spring-data-cassandra-reactive + 0.0.1-SNAPSHOT + jar + + spring-data-cassandra-reactive + Spring Data Cassandra reactive + + + org.springframework.boot + spring-boot-starter-parent + 2.1.0.RELEASE + + + + + UTF-8 + UTF-8 + + 1.8 + + + + + org.springframework.data + spring-data-cassandra + 2.1.2.RELEASE + + + io.projectreactor + reactor-core + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + io.projectreactor + reactor-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/SpringDataCassandraReactiveApplication.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/SpringDataCassandraReactiveApplication.java new file mode 100644 index 0000000000..5f467042a3 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/SpringDataCassandraReactiveApplication.java @@ -0,0 +1,12 @@ +package com.baeldung.cassandra.reactive; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringDataCassandraReactiveApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringDataCassandraReactiveApplication.class, args); + } +} diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/controller/EmployeeController.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/controller/EmployeeController.java new file mode 100644 index 0000000000..e9de213e61 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/controller/EmployeeController.java @@ -0,0 +1,49 @@ +package com.baeldung.cassandra.reactive.controller; + +import com.baeldung.cassandra.reactive.model.Employee; +import com.baeldung.cassandra.reactive.service.EmployeeService; +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 reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import javax.annotation.PostConstruct; +import java.util.ArrayList; +import java.util.List; + +@RestController +@RequestMapping("employee") +public class EmployeeController { + + @Autowired + EmployeeService employeeService; + + @PostConstruct + public void saveEmployees() { + List employees = new ArrayList<>(); + employees.add(new Employee(123, "John Doe", "Delaware", "jdoe@xyz.com", 31)); + employees.add(new Employee(324, "Adam Smith", "North Carolina", "asmith@xyz.com", 43)); + employees.add(new Employee(355, "Kevin Dunner", "Virginia", "kdunner@xyz.com", 24)); + employees.add(new Employee(643, "Mike Lauren", "New York", "mlauren@xyz.com", 41)); + employeeService.initializeEmployees(employees); + } + + @GetMapping("/list") + public Flux getAllEmployees() { + Flux employees = employeeService.getAllEmployees(); + return employees; + } + + @GetMapping("/{id}") + public Mono getEmployeeById(@PathVariable int id) { + return employeeService.getEmployeeById(id); + } + + @GetMapping("/filterByAge/{age}") + public Flux getEmployeesFilterByAge(@PathVariable int age) { + return employeeService.getEmployeesFilterByAge(age); + } +} diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/model/Employee.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/model/Employee.java new file mode 100644 index 0000000000..a78f884778 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/model/Employee.java @@ -0,0 +1,20 @@ +package com.baeldung.cassandra.reactive.model; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.springframework.data.cassandra.core.mapping.PrimaryKey; +import org.springframework.data.cassandra.core.mapping.Table; + +@Table +@Data +@AllArgsConstructor +@NoArgsConstructor +public class Employee { + @PrimaryKey + private int id; + private String name; + private String address; + private String email; + private int age; +} diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/repository/EmployeeRepository.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/repository/EmployeeRepository.java new file mode 100644 index 0000000000..22dc2b4565 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/repository/EmployeeRepository.java @@ -0,0 +1,11 @@ +package com.baeldung.cassandra.reactive.repository; + +import com.baeldung.cassandra.reactive.model.Employee; +import org.springframework.data.cassandra.repository.AllowFiltering; +import org.springframework.data.cassandra.repository.ReactiveCassandraRepository; +import reactor.core.publisher.Flux; + +public interface EmployeeRepository extends ReactiveCassandraRepository { + @AllowFiltering + Flux findByAgeGreaterThan(int age); +} diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/service/EmployeeService.java b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/service/EmployeeService.java new file mode 100644 index 0000000000..40c330937a --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/src/main/java/com/baeldung/cassandra/reactive/service/EmployeeService.java @@ -0,0 +1,35 @@ +package com.baeldung.cassandra.reactive.service; + +import com.baeldung.cassandra.reactive.model.Employee; +import com.baeldung.cassandra.reactive.repository.EmployeeRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +import java.util.List; + +@Service +public class EmployeeService { + + @Autowired + EmployeeRepository employeeRepository; + + public void initializeEmployees(List employees) { + Flux savedEmployees = employeeRepository.saveAll(employees); + savedEmployees.subscribe(); + } + + public Flux getAllEmployees() { + Flux employees = employeeRepository.findAll(); + return employees; + } + + public Flux getEmployeesFilterByAge(int age) { + return employeeRepository.findByAgeGreaterThan(age); + } + + public Mono getEmployeeById(int id) { + return employeeRepository.findById(id); + } +} diff --git a/persistence-modules/spring-data-cassandra-reactive/src/main/resources/application.properties b/persistence-modules/spring-data-cassandra-reactive/src/main/resources/application.properties new file mode 100644 index 0000000000..7ed2f10131 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/src/main/resources/application.properties @@ -0,0 +1,2 @@ +spring.data.cassandra.keyspace-name=practice +spring.data.cassandra.port=9042 \ No newline at end of file diff --git a/persistence-modules/spring-data-cassandra-reactive/src/test/java/com/baeldung/cassandra/reactive/ReactiveEmployeeRepositoryIntegrationTest.java b/persistence-modules/spring-data-cassandra-reactive/src/test/java/com/baeldung/cassandra/reactive/ReactiveEmployeeRepositoryIntegrationTest.java new file mode 100644 index 0000000000..ad726fe969 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/src/test/java/com/baeldung/cassandra/reactive/ReactiveEmployeeRepositoryIntegrationTest.java @@ -0,0 +1,55 @@ +package com.baeldung.cassandra.reactive; + +import com.baeldung.cassandra.reactive.model.Employee; +import com.baeldung.cassandra.reactive.repository.EmployeeRepository; +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.test.context.junit4.SpringRunner; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ReactiveEmployeeRepositoryIntegrationTest { + + @Autowired + EmployeeRepository repository; + + @Before + public void setUp() { + + Flux deleteAndInsert = repository.deleteAll() // + .thenMany(repository.saveAll(Flux.just( + new Employee(111, "John Doe", "Delaware", "jdoe@xyz.com", 31), + new Employee(222, "Adam Smith", "North Carolina", "asmith@xyz.com", 43), + new Employee(333, "Kevin Dunner", "Virginia", "kdunner@xyz.com", 24), + new Employee(444, "Mike Lauren", "New York", "mlauren@xyz.com", 41)))); + + StepVerifier.create(deleteAndInsert).expectNextCount(4).verifyComplete(); + } + + @Test + public void givenRecordsAreInserted_whenDbIsQueried_thenShouldIncludeNewRecords() { + + Mono saveAndCount = repository.count() + .doOnNext(System.out::println) + .thenMany(repository.saveAll(Flux.just(new Employee(325, "Kim Jones", "Florida", "kjones@xyz.com", 42), + new Employee(654, "Tom Moody", "New Hampshire", "tmoody@xyz.com", 44)))) + .last() + .flatMap(v -> repository.count()) + .doOnNext(System.out::println); + + StepVerifier.create(saveAndCount).expectNext(6L).verifyComplete(); + } + + @Test + public void givenAgeForFilter_whenDbIsQueried_thenShouldReturnFilteredRecords() { + StepVerifier.create(repository.findByAgeGreaterThan(35)).expectNextCount(2).verifyComplete(); + } + +} From c81567741e2072face906788d33f366056c95fea Mon Sep 17 00:00:00 2001 From: Josh Cummings Date: Wed, 28 Nov 2018 10:02:09 -0700 Subject: [PATCH 117/429] Move ClassName to core-java-lang (#5796) Issue: BAEL-2309 --- .../src/main/java/com/baeldung/className/RetrievingClassName.java | 0 .../java/com/baeldung/className/RetrievingClassNameUnitTest.java | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename {core-java => core-java-lang}/src/main/java/com/baeldung/className/RetrievingClassName.java (100%) rename {core-java => core-java-lang}/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java (100%) diff --git a/core-java/src/main/java/com/baeldung/className/RetrievingClassName.java b/core-java-lang/src/main/java/com/baeldung/className/RetrievingClassName.java similarity index 100% rename from core-java/src/main/java/com/baeldung/className/RetrievingClassName.java rename to core-java-lang/src/main/java/com/baeldung/className/RetrievingClassName.java diff --git a/core-java/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java b/core-java-lang/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java rename to core-java-lang/src/test/java/com/baeldung/className/RetrievingClassNameUnitTest.java From 866666f3db77a8d72a58a4f269561537d9389533 Mon Sep 17 00:00:00 2001 From: Josh Cummings Date: Wed, 28 Nov 2018 10:02:35 -0700 Subject: [PATCH 118/429] Add load-testing-comparison to Build (#5757) Issue: bael-46 --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 70248b9993..b998967bbf 100644 --- a/pom.xml +++ b/pom.xml @@ -377,6 +377,7 @@ feign flips testing-modules/groovy-spock + testing-modules/load-testing-comparison google-cloud google-web-toolkit gson From 4b6515d8a379b5bfc0aaae572a21ecb7581cb21f Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Wed, 28 Nov 2018 20:46:43 +0100 Subject: [PATCH 119/429] added readme --- restx/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 restx/README.md diff --git a/restx/README.md b/restx/README.md new file mode 100644 index 0000000000..f586f08a21 --- /dev/null +++ b/restx/README.md @@ -0,0 +1,3 @@ +# Relevant Articles + +* [Introduction to RESTX](https://www.baeldung.com/java-restx) From 5871653e65d41da0191afe56ed2b1ce2cac92338 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 28 Nov 2018 23:42:40 +0200 Subject: [PATCH 120/429] Update and rename OptimizedMatcherUnitTest.java to OptimizedMatcherManualTest.java --- ...izedMatcherUnitTest.java => OptimizedMatcherManualTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java/src/test/java/com/baeldung/regexp/optmization/{OptimizedMatcherUnitTest.java => OptimizedMatcherManualTest.java} (98%) diff --git a/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java b/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherManualTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java rename to core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherManualTest.java index 2be6b6ad4b..f44968a5a7 100644 --- a/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherUnitTest.java +++ b/core-java/src/test/java/com/baeldung/regexp/optmization/OptimizedMatcherManualTest.java @@ -11,7 +11,7 @@ import java.util.regex.Pattern; import static org.junit.Assert.assertTrue; -public class OptimizedMatcherUnitTest { +public class OptimizedMatcherManualTest { private String action; From 186c2994a745dccf09a543bd578655556e2ff7c9 Mon Sep 17 00:00:00 2001 From: DOHA Date: Thu, 29 Nov 2018 01:51:07 +0200 Subject: [PATCH 121/429] organise oauth2 request code --- .../oauth2/CustomRequestSecurityConfig.java | 119 ++++++++++++++++++ .../com/baeldung/oauth2/SecurityConfig.java | 13 -- .../CustomAuthorizationRequestResolver.java | 2 +- .../CustomRequestEntityConverter.java | 2 +- .../CustomTokenResponseConverter.java | 2 +- .../LinkedinTokenResponseConverter.java | 2 +- 6 files changed, 123 insertions(+), 17 deletions(-) create mode 100644 spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java rename spring-5-security-oauth/src/main/java/com/baeldung/{oauth2 => oauth2request}/CustomAuthorizationRequestResolver.java (98%) rename spring-5-security-oauth/src/main/java/com/baeldung/{oauth2 => oauth2request}/CustomRequestEntityConverter.java (96%) rename spring-5-security-oauth/src/main/java/com/baeldung/{oauth2 => oauth2request}/CustomTokenResponseConverter.java (98%) rename spring-5-security-oauth/src/main/java/com/baeldung/{oauth2 => oauth2request}/LinkedinTokenResponseConverter.java (96%) diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java new file mode 100644 index 0000000000..51caee8178 --- /dev/null +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java @@ -0,0 +1,119 @@ +package com.baeldung.oauth2; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.PropertySource; +import org.springframework.core.env.Environment; +import org.springframework.http.converter.FormHttpMessageConverter; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; +import org.springframework.security.config.oauth2.client.CommonOAuth2Provider; +import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; +import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; +import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; +import org.springframework.security.oauth2.client.registration.ClientRegistration; +import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; +import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; +import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository; +import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository; +import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; +import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import com.baeldung.oauth2request.CustomAuthorizationRequestResolver; +import com.baeldung.oauth2request.CustomRequestEntityConverter; +import com.baeldung.oauth2request.CustomTokenResponseConverter; + +//@Configuration +@PropertySource("application-oauth2.properties") +public class CustomRequestSecurityConfig extends WebSecurityConfigurerAdapter { + + @Override + protected void configure(HttpSecurity http) throws Exception { + http.authorizeRequests() + .antMatchers("/oauth_login", "/loginFailure", "/") + .permitAll() + .anyRequest() + .authenticated() + .and() + .oauth2Login() + .loginPage("/oauth_login") + .authorizationEndpoint() + .authorizationRequestResolver( new CustomAuthorizationRequestResolver(clientRegistrationRepository(),"/oauth2/authorize-client")) + + .baseUri("/oauth2/authorize-client") + .authorizationRequestRepository(authorizationRequestRepository()) + .and() + .tokenEndpoint() + .accessTokenResponseClient(accessTokenResponseClient()) + .and() + .defaultSuccessUrl("/loginSuccess") + .failureUrl("/loginFailure"); + } + + @Bean + public AuthorizationRequestRepository authorizationRequestRepository() { + return new HttpSessionOAuth2AuthorizationRequestRepository(); + } + + @Bean + public OAuth2AccessTokenResponseClient accessTokenResponseClient() { + DefaultAuthorizationCodeTokenResponseClient accessTokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient(); + accessTokenResponseClient.setRequestEntityConverter(new CustomRequestEntityConverter()); + + OAuth2AccessTokenResponseHttpMessageConverter tokenResponseHttpMessageConverter = new OAuth2AccessTokenResponseHttpMessageConverter(); + tokenResponseHttpMessageConverter.setTokenResponseConverter(new CustomTokenResponseConverter()); + RestTemplate restTemplate = new RestTemplate(Arrays.asList(new FormHttpMessageConverter(), tokenResponseHttpMessageConverter)); + restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler()); + accessTokenResponseClient.setRestOperations(restTemplate); + return accessTokenResponseClient; + } + + + // additional configuration for non-Spring Boot projects + private static List clients = Arrays.asList("google", "facebook"); + + //@Bean + public ClientRegistrationRepository clientRegistrationRepository() { + List registrations = clients.stream() + .map(c -> getRegistration(c)) + .filter(registration -> registration != null) + .collect(Collectors.toList()); + + return new InMemoryClientRegistrationRepository(registrations); + } + + private static String CLIENT_PROPERTY_KEY = "spring.security.oauth2.client.registration."; + + @Autowired + private Environment env; + + private ClientRegistration getRegistration(String client) { + String clientId = env.getProperty(CLIENT_PROPERTY_KEY + client + ".client-id"); + + if (clientId == null) { + return null; + } + + String clientSecret = env.getProperty(CLIENT_PROPERTY_KEY + client + ".client-secret"); + if (client.equals("google")) { + return CommonOAuth2Provider.GOOGLE.getBuilder(client) + .clientId(clientId) + .clientSecret(clientSecret) + .build(); + } + if (client.equals("facebook")) { + return CommonOAuth2Provider.FACEBOOK.getBuilder(client) + .clientId(clientId) + .clientSecret(clientSecret) + .build(); + } + return null; + } + +} diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java index cf27b01a75..e17e339142 100644 --- a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/SecurityConfig.java @@ -9,22 +9,18 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; -import org.springframework.http.converter.FormHttpMessageConverter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.config.oauth2.client.CommonOAuth2Provider; import org.springframework.security.oauth2.client.endpoint.DefaultAuthorizationCodeTokenResponseClient; import org.springframework.security.oauth2.client.endpoint.OAuth2AccessTokenResponseClient; import org.springframework.security.oauth2.client.endpoint.OAuth2AuthorizationCodeGrantRequest; -import org.springframework.security.oauth2.client.http.OAuth2ErrorResponseErrorHandler; import org.springframework.security.oauth2.client.registration.ClientRegistration; import org.springframework.security.oauth2.client.registration.ClientRegistrationRepository; import org.springframework.security.oauth2.client.registration.InMemoryClientRegistrationRepository; import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository; import org.springframework.security.oauth2.client.web.HttpSessionOAuth2AuthorizationRequestRepository; import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationRequest; -import org.springframework.security.oauth2.core.http.converter.OAuth2AccessTokenResponseHttpMessageConverter; -import org.springframework.web.client.RestTemplate; @Configuration @PropertySource("application-oauth2.properties") @@ -41,8 +37,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { .oauth2Login() .loginPage("/oauth_login") .authorizationEndpoint() - .authorizationRequestResolver( new CustomAuthorizationRequestResolver(clientRegistrationRepository(),"/oauth2/authorize-client")) - .baseUri("/oauth2/authorize-client") .authorizationRequestRepository(authorizationRequestRepository()) .and() @@ -61,13 +55,6 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter { @Bean public OAuth2AccessTokenResponseClient accessTokenResponseClient() { DefaultAuthorizationCodeTokenResponseClient accessTokenResponseClient = new DefaultAuthorizationCodeTokenResponseClient(); - accessTokenResponseClient.setRequestEntityConverter(new CustomRequestEntityConverter()); - - OAuth2AccessTokenResponseHttpMessageConverter tokenResponseHttpMessageConverter = new OAuth2AccessTokenResponseHttpMessageConverter(); - tokenResponseHttpMessageConverter.setTokenResponseConverter(new CustomTokenResponseConverter()); - RestTemplate restTemplate = new RestTemplate(Arrays.asList(new FormHttpMessageConverter(), tokenResponseHttpMessageConverter)); - restTemplate.setErrorHandler(new OAuth2ErrorResponseErrorHandler()); - accessTokenResponseClient.setRestOperations(restTemplate); return accessTokenResponseClient; } diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java similarity index 98% rename from spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java index b3fcd15a9a..47aacf9c06 100644 --- a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomAuthorizationRequestResolver.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomAuthorizationRequestResolver.java @@ -1,4 +1,4 @@ -package com.baeldung.oauth2; +package com.baeldung.oauth2request; import java.util.HashMap; import java.util.Map; diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java similarity index 96% rename from spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java index 8884065769..5486105c34 100644 --- a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestEntityConverter.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomRequestEntityConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.oauth2; +package com.baeldung.oauth2request; import org.springframework.core.convert.converter.Converter; import org.springframework.http.RequestEntity; diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java similarity index 98% rename from spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java index 741f44871a..b9775d674a 100644 --- a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomTokenResponseConverter.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/CustomTokenResponseConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.oauth2; +package com.baeldung.oauth2request; import java.util.Arrays; import java.util.Collections; diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LinkedinTokenResponseConverter.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/LinkedinTokenResponseConverter.java similarity index 96% rename from spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LinkedinTokenResponseConverter.java rename to spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/LinkedinTokenResponseConverter.java index f638b6101a..89b3d32de5 100644 --- a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/LinkedinTokenResponseConverter.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2request/LinkedinTokenResponseConverter.java @@ -1,4 +1,4 @@ -package com.baeldung.oauth2; +package com.baeldung.oauth2request; import java.util.Map; From 2ee5e03b887585e5a4f1b4657b5d47583f2984fb Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Thu, 22 Nov 2018 23:07:29 +0330 Subject: [PATCH 122/429] Added the codes used for operator overloading article --- .../kotlin/com/baeldung/operators/Money.kt | 27 +++++++++++++++++ .../kotlin/com/baeldung/operators/Page.kt | 14 +++++++++ .../kotlin/com/baeldung/operators/Point.kt | 14 +++++++++ .../main/kotlin/com/baeldung/operators/UI.kt | 30 +++++++++++++++++++ .../kotlin/com/baeldung/operators/Utils.kt | 4 +++ 5 files changed, 89 insertions(+) create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/operators/UI.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt new file mode 100644 index 0000000000..ffaea71e1e --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt @@ -0,0 +1,27 @@ +enum class Currency { + DOLLARS, EURO +} + +class Money(val amount: BigDecimal, val currency: Currency) : Comparable { + + override fun compareTo(other: Money): Int = + convert(Currency.DOLLARS).compareTo(other.convert(Currency.DOLLARS)) + + fun convert(currency: Currency): BigDecimal = TODO() + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is Money) return false + + if (amount != other.amount) return false + if (currency != other.currency) return false + + return true + } + + override fun hashCode(): Int { + var result = amount.hashCode() + result = 31 * result + currency.hashCode() + return result + } +} \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt new file mode 100644 index 0000000000..db03779b35 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt @@ -0,0 +1,14 @@ +interface Page { + fun pageNumber(): Int + fun pageSize(): Int + fun elements(): MutableList +} + +operator fun Page.get(index: Int): T = elements()[index] +operator fun Page.get(start: Int, endExclusive: Int): List = elements().subList(start, endExclusive) +operator fun Page.set(index: Int, value: T) { + elements()[index] = value +} + +operator fun Page.contains(element: T): Boolean = element in elements() +operator fun Page.iterator() = elements().iterator() \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt new file mode 100644 index 0000000000..7af2fc1cad --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt @@ -0,0 +1,14 @@ +data class Point(val x: Int, val y: Int) + +operator fun Point.unaryMinus() = Point(-x, -y) +operator fun Point.not() = Point(y, x) +operator fun Point.inc() = Point(x + 1, y + 1) +operator fun Point.dec() = Point(x - 1, y - 1) + +operator fun Point.plus(other: Point): Point = Point(x + other.x, y + other.y) +operator fun Point.minus(other: Point): Point = Point(x - other.x, y - other.y) +operator fun Point.times(other: Point): Point = Point(x * other.x, y * other.y) +operator fun Point.div(other: Point): Point = Point(x / other.x, y / other.y) +operator fun Point.rem(other: Point): Point = Point(x % other.x, y % other.y) +operator fun Point.times(factor: Int): Point = Point(x * factor, y * factor) +operator fun Int.times(point: Point): Point = Point(point.x * this, point.y * this) \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/UI.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/UI.kt new file mode 100644 index 0000000000..abb4a4a00c --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/UI.kt @@ -0,0 +1,30 @@ +interface View +class TextView(val value: String) : View +class ImageView(val url: String) : View + +class UI { + private val views = mutableListOf() + + operator fun String.unaryPlus() { + views.add(TextView(this)) + } + + operator fun View.unaryPlus() { + views.add(this) + } +} + +fun ui(init: UI.() -> Unit): UI { + val ui = UI() + ui.init() + + return ui +} + +fun main(args: Array) { + val header = ui { + +ImageView("http://logo.com") + +"Brand name" + +"Brand description" + } +} \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt new file mode 100644 index 0000000000..a3c671369c --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt @@ -0,0 +1,4 @@ +operator fun MutableCollection.plusAssign(element: T) { + add(element) +} +operator fun BigInteger.plus(other: Int): BigInteger = add(BigInteger("$other")) \ No newline at end of file From a8d9eb084a9f48d14dd9af46e2f870b12df74c33 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Thu, 22 Nov 2018 23:47:49 +0330 Subject: [PATCH 123/429] Added two missing import statements --- core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt | 2 ++ core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt | 2 ++ 2 files changed, 4 insertions(+) diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt index ffaea71e1e..1bb015ac27 100644 --- a/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt @@ -1,3 +1,5 @@ +import java.math.BigDecimal + enum class Currency { DOLLARS, EURO } diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt index a3c671369c..ba33d3e7a2 100644 --- a/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt @@ -1,3 +1,5 @@ +import java.math.BigInteger + operator fun MutableCollection.plusAssign(element: T) { add(element) } From 1250605e19850ea102e4275fcc8a882220c82d97 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Sun, 25 Nov 2018 00:51:27 +0330 Subject: [PATCH 124/429] Added a new shape class instead of UI. --- .../kotlin/com/baeldung/operators/Point.kt | 17 ++++++++++- .../main/kotlin/com/baeldung/operators/UI.kt | 30 ------------------- 2 files changed, 16 insertions(+), 31 deletions(-) delete mode 100644 core-kotlin/src/main/kotlin/com/baeldung/operators/UI.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt index 7af2fc1cad..22617a4ee6 100644 --- a/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt @@ -11,4 +11,19 @@ operator fun Point.times(other: Point): Point = Point(x * other.x, y * other.y) operator fun Point.div(other: Point): Point = Point(x / other.x, y / other.y) operator fun Point.rem(other: Point): Point = Point(x % other.x, y % other.y) operator fun Point.times(factor: Int): Point = Point(x * factor, y * factor) -operator fun Int.times(point: Point): Point = Point(point.x * this, point.y * this) \ No newline at end of file +operator fun Int.times(point: Point): Point = Point(point.x * this, point.y * this) + +class Shape { + private val points = mutableListOf() + + operator fun Point.unaryPlus() { + points.add(this) + } +} + +fun shape(init: Shape.() -> Unit): Shape { + val shape = Shape() + shape.init() + + return shape +} \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/UI.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/UI.kt deleted file mode 100644 index abb4a4a00c..0000000000 --- a/core-kotlin/src/main/kotlin/com/baeldung/operators/UI.kt +++ /dev/null @@ -1,30 +0,0 @@ -interface View -class TextView(val value: String) : View -class ImageView(val url: String) : View - -class UI { - private val views = mutableListOf() - - operator fun String.unaryPlus() { - views.add(TextView(this)) - } - - operator fun View.unaryPlus() { - views.add(this) - } -} - -fun ui(init: UI.() -> Unit): UI { - val ui = UI() - ui.init() - - return ui -} - -fun main(args: Array) { - val header = ui { - +ImageView("http://logo.com") - +"Brand name" - +"Brand description" - } -} \ No newline at end of file From ad8ae556a8a8e0673d8810490447366e5a544584 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Thu, 29 Nov 2018 13:30:52 +0330 Subject: [PATCH 125/429] Added a few unit tests for kotlin operator examples. --- .../kotlin/com/baeldung/operators/Money.kt | 2 + .../kotlin/com/baeldung/operators/Page.kt | 2 + .../kotlin/com/baeldung/operators/Point.kt | 4 +- .../kotlin/com/baeldung/operators/Utils.kt | 2 + .../kotlin/com/baeldung/operators/PageTest.kt | 28 +++++++++++ .../com/baeldung/operators/PointTest.kt | 48 +++++++++++++++++++ 6 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/operators/PageTest.kt create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/operators/PointTest.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt index 1bb015ac27..93eb78c5b6 100644 --- a/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Money.kt @@ -1,3 +1,5 @@ +package com.baeldung.operators + import java.math.BigDecimal enum class Currency { diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt index db03779b35..1077eb94f9 100644 --- a/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Page.kt @@ -1,3 +1,5 @@ +package com.baeldung.operators + interface Page { fun pageNumber(): Int fun pageSize(): Int diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt index 22617a4ee6..e3282e64cc 100644 --- a/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Point.kt @@ -1,3 +1,5 @@ +package com.baeldung.operators + data class Point(val x: Int, val y: Int) operator fun Point.unaryMinus() = Point(-x, -y) @@ -14,7 +16,7 @@ operator fun Point.times(factor: Int): Point = Point(x * factor, y * factor) operator fun Int.times(point: Point): Point = Point(point.x * this, point.y * this) class Shape { - private val points = mutableListOf() + val points = mutableListOf() operator fun Point.unaryPlus() { points.add(this) diff --git a/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt b/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt index ba33d3e7a2..0f16544f38 100644 --- a/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt +++ b/core-kotlin/src/main/kotlin/com/baeldung/operators/Utils.kt @@ -1,3 +1,5 @@ +package com.baeldung.operators + import java.math.BigInteger operator fun MutableCollection.plusAssign(element: T) { diff --git a/core-kotlin/src/test/kotlin/com/baeldung/operators/PageTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/operators/PageTest.kt new file mode 100644 index 0000000000..4217fc0c08 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/operators/PageTest.kt @@ -0,0 +1,28 @@ +package com.baeldung.operators + +import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class PageTest { + + private val page = PageImpl(1, 10, "Java", "Kotlin", "Scala") + + @Test + fun `Get convention should work as expected`() { + assertEquals(page[1], "Kotlin") + assertEquals(page[1, 3], listOf("Kotlin", "Scala")) + } + + @Test + fun `In convention should work on a page as expected`() { + assertTrue("Kotlin" in page) + } + +} + +private class PageImpl(val page: Int, val size: Int, vararg val elements: T) : Page { + override fun pageNumber(): Int = page + override fun pageSize(): Int = size + override fun elements(): MutableList = mutableListOf(*elements) +} \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/operators/PointTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/operators/PointTest.kt new file mode 100644 index 0000000000..168ab6431d --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/operators/PointTest.kt @@ -0,0 +1,48 @@ +package com.baeldung.operators + +import org.junit.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class PointTest { + + private val p1 = Point(1, 2) + private val p2 = Point(2, 3) + + @Test + fun `We should be able to add two points together using +`() { + assertEquals(p1 + p2, Point(3, 5)) + } + + @Test + fun `We shoud be able to subtract one point from another using -`() { + assertEquals(p1 - p2, Point(-1, -1)) + } + + @Test + fun `We should be able to multiply two points together with *`() { + assertEquals(p1 * p2, Point(2, 6)) + } + + @Test + fun `We should be able to divide one point by another`() { + assertEquals(p1 / p2, Point(0, 0)) + } + + @Test + fun `We should be able to scale a point by an integral factor`() { + assertEquals(p1 * 2, Point(2, 4)) + assertEquals(2 * p1, Point(2, 4)) + } + + @Test + fun `We should be able to add points to an empty shape`() { + val line = shape { + +Point(0, 0) + +Point(1, 3) + } + + assertTrue(Point(0, 0) in line.points) + assertTrue(Point(1, 3) in line.points) + } +} \ No newline at end of file From ef74a2538e126eec8bec6e5b81d6ecd570454c12 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Thu, 29 Nov 2018 15:57:06 +0330 Subject: [PATCH 126/429] Added a few unit tests for kotlin operator examples. --- .../test/kotlin/com/baeldung/operators/UtilsTest.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/operators/UtilsTest.kt diff --git a/core-kotlin/src/test/kotlin/com/baeldung/operators/UtilsTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/operators/UtilsTest.kt new file mode 100644 index 0000000000..4abe962cb5 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/operators/UtilsTest.kt @@ -0,0 +1,13 @@ +package com.baeldung.operators + +import java.math.BigInteger +import org.junit.Test +import kotlin.test.assertEquals + +class UtilsTest { + + @Test + fun `We should be able to add an int value to an existing BigInteger using +`() { + assertEquals(BigInteger.ZERO + 1, BigInteger.ONE) + } +} \ No newline at end of file From f5b4a5e7023881474110c19e192246694b1bc99d Mon Sep 17 00:00:00 2001 From: Dionis Prifti Date: Thu, 29 Nov 2018 15:46:33 +0100 Subject: [PATCH 127/429] BAEL-2347: Added test examples for Coupound Assignment Operators. --- .../CompoundOperatorsTest.java | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java new file mode 100644 index 0000000000..4a7833af95 --- /dev/null +++ b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java @@ -0,0 +1,111 @@ +package com.baeldung.compoundoperators; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class CompoundOperatorsTest { + + @Test + public void whenAssignmentOperatorIsUsed_thenValueIsAssigned() { + int x = 5; + + assertEquals(5, x); + } + + @Test + public void whenCompoundAssignmentUsed_thenSameAsSimpleAssignment() { + int a = 3, b = 3, c = -2; + a = a * c; // Simple assignment operator + b *= c; // Compound assignment operator + + assertEquals(a, b); + } + + @Test + public void whenAssignmentOperatorIsUsed_thenValueIsReturned() { + long x = 5; + long y = (x=3); + + assertEquals(3, y); + assertEquals(y, x); + } + + @Test + public void whenCompoundOperatorsAreUsed_thenOperationsArePerformedAndAssigned() { + //Simple assignment + int x = 5; //x is 5 + + //Incrementation + x += 5; //x is 10 + assertEquals(10, x); + + //Decrementation + x -= 2; //x is 8 + assertEquals(8, x); + + //Multiplication + x *= 2; //x is 16 + assertEquals(16, x); + + //Division + x /= 4; //x is 4 + assertEquals(4, x); + + //Modulus + x %= 3; //x is 1 + assertEquals(1, x); + + + //Binary AND + x &= 4; //x is 0 + assertEquals(0, x); + + //Binary exclusive OR + x ^= 4; //x is 4 + assertEquals(4, x); + + //Binary inclusive OR + x |= 8; //x is 12 + assertEquals(12, x); + + + //Binary Left Shift + x <<= 2; //x is 48 + assertEquals(48, x); + + //Binary Right Shift + x >>= 2; //x is 12 + assertEquals(12, x); + + //Shift right zero fill + x >>>= 1; //x is 6 + assertEquals(6, x); + } + + @Test(expected = NullPointerException.class) + public void whenArrayIsNull_thenThrowNullException() { + int[] numbers = null; + + //Trying Incrementation + numbers[2] += 5; + } + + @Test(expected = ArrayIndexOutOfBoundsException.class) + public void whenArrayIndexNotCorrect_thenThrowArrayIndexException() { + int[] numbers = {0, 1}; + + //Trying Incrementation + numbers[2] += 5; + } + + @Test + public void whenArrayIndexIsCorrect_thenPerformOperation() { + int[] numbers = {0, 1}; + + //Incrementation + numbers[1] += 5; + assertEquals(6, numbers[1]); + } + +} From 7b3e306d2288022591f0f63ac89fbaad606253be Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Thu, 29 Nov 2018 08:06:18 -0800 Subject: [PATCH 128/429] BAEL-2309 update readme --- core-java-lang/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 62af72818f..79d2375c24 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -57,4 +57,5 @@ - [“Sneaky Throws” in Java](http://www.baeldung.com/java-sneaky-throws) - [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) +- [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) From 5812866573fbd12890b909f88331b238974b509f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Dar=C3=ADo=20Carrasquel?= Date: Thu, 29 Nov 2018 11:58:12 -0500 Subject: [PATCH 129/429] Ways to iterate over a list Issue: BAEL-2311 --- .../com/baeldung/java/list/WaysToIterate.java | 67 +++++++++++++++++ .../java/list/WaysToIterateUnitTest.java | 71 +++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java create mode 100644 core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java b/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java new file mode 100644 index 0000000000..3cce08eabb --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java @@ -0,0 +1,67 @@ +package com.baeldung.java.list; + +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +/** + * Demonstrates the different ways to loop over + * the elements of a list. + */ +public class WaysToIterate { + + List countries = Arrays.asList("Germany", "Panama", "Australia"); + + /** + * Iterate over a list using a basic for loop + */ + public void iterateWithForLoop() { + for (int i = 0; i < countries.size(); i++) { + System.out.println(countries.get(i)); + } + } + + /** + * Iterate over a list using the enhanced for loop + */ + public void iterateWithEnhancedForLoop() { + for (String country : countries) { + System.out.println(country); + } + } + + /** + * Iterate over a list using an Iterator + */ + public void iterateWithIterator() { + Iterator countriesIterator = countries.iterator(); + while(countriesIterator.hasNext()) { + System.out.println(countriesIterator.next()); + } + } + + /** + * Iterate over a list using a ListIterator + */ + public void iterateWithListIterator() { + ListIterator listIterator = countries.listIterator(); + while(listIterator.hasNext()) { + System.out.println(listIterator.next()); + } + } + + /** + * Iterate over a list using the Iterable.forEach() method + */ + public void iterateWithForEach() { + countries.forEach(System.out::println); + } + + /** + * Iterate over a list using the Stream.forEach() method + */ + public void iterateWithStreamForEach() { + countries.stream().forEach((c) -> System.out.println(c)); + } +} \ No newline at end of file diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java b/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java new file mode 100644 index 0000000000..973c60b233 --- /dev/null +++ b/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java @@ -0,0 +1,71 @@ +package com.baeldung.java.list; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +import org.junit.Test; + +public class WaysToIterateUnitTest { + + List globalCountries = new ArrayList(); + List europeanCountries = Arrays.asList("Germany", "Panama", "Australia"); + + @Test + public void whenIteratingUsingForLoop_thenReturnThreeAsSizeOfList() { + for (int i = 0; i < europeanCountries.size(); i++) { + globalCountries.add(europeanCountries.get(i)); + } + assertEquals(globalCountries.size(), 3); + globalCountries.clear(); + } + + @Test + public void whenIteratingUsingEnhancedForLoop_thenReturnThreeAsSizeOfList() { + for (String country : europeanCountries) { + globalCountries.add(country); + } + assertEquals(globalCountries.size(), 3); + globalCountries.clear(); + } + + @Test + public void whenIteratingUsingIterator_thenReturnThreeAsSizeOfList() { + Iterator countriesIterator = europeanCountries.iterator(); + while (countriesIterator.hasNext()) { + globalCountries.add(countriesIterator.next()); + } + + assertEquals(globalCountries.size(), 3); + globalCountries.clear(); + } + + @Test + public void whenIteratingUsingListIterator_thenReturnThreeAsSizeOfList() { + ListIterator countriesIterator = europeanCountries.listIterator(); + while (countriesIterator.hasNext()) { + globalCountries.add(countriesIterator.next()); + } + + assertEquals(globalCountries.size(), 3); + globalCountries.clear(); + } + + @Test + public void whenIteratingUsingForEach_thenReturnThreeAsSizeOfList() { + europeanCountries.forEach(country -> globalCountries.add(country)); + assertEquals(globalCountries.size(), 3); + globalCountries.clear(); + } + + @Test + public void whenIteratingUsingStreamForEach_thenReturnThreeAsSizeOfList() { + europeanCountries.stream().forEach((country) -> globalCountries.add(country)); + assertEquals(globalCountries.size(), 3); + globalCountries.clear(); + } +} \ No newline at end of file From 3b42c4882005976595e55d9eb2239133859e4a34 Mon Sep 17 00:00:00 2001 From: Dionis Prifti Date: Thu, 29 Nov 2018 21:05:59 +0100 Subject: [PATCH 130/429] BAEL-2347: Fixed test about return value of assignment operator. --- .../com/baeldung/compoundoperators/CompoundOperatorsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java index 4a7833af95..3b3478b38e 100644 --- a/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java +++ b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java @@ -24,8 +24,8 @@ public class CompoundOperatorsTest { @Test public void whenAssignmentOperatorIsUsed_thenValueIsReturned() { - long x = 5; - long y = (x=3); + long x = 1; + long y = (x+=2); assertEquals(3, y); assertEquals(y, x); From 97fe04aace59891d3746cf60d46929608053d12d Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Thu, 29 Nov 2018 23:30:46 +0200 Subject: [PATCH 131/429] reenabling some modules --- pom.xml | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/pom.xml b/pom.xml index 35a2de9a45..8fa93373fc 100644 --- a/pom.xml +++ b/pom.xml @@ -637,7 +637,7 @@ dubbo persistence-modules/flyway - + JGit jni jooby @@ -662,24 +662,13 @@ sse-jaxrs static-analysis stripe - + structurizr Twitter4J wicket xstream cas/cas-secured-app cas/cas-server - - - - - - - - - - - - + graphql/graphql-java @@ -687,9 +676,6 @@ spring-boot-custom-starter/greeter persistence-modules/spring-boot-h2/spring-boot-h2-database - - - flyway-cdi-extension spring-security-acl @@ -711,7 +697,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - + spring-security-react spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest @@ -734,8 +720,8 @@ spring-rest-angular spring-rest-full spring-rest-query-language - - + spring-rest + spring-rest-simple spring-resttemplate helidon @@ -1030,7 +1016,7 @@ jackson java-strings - + java-collections-conversions java-collections-maps java-streams @@ -1114,9 +1100,10 @@ rabbitmq - persistence-modules/spring-data-mongodb - --> From 71f76d28ccddb5780254968c81a2810818f8e9ae Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Thu, 29 Nov 2018 16:15:20 -0800 Subject: [PATCH 132/429] BAEL-2279 update readme --- spring-5-reactive/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index 267925b798..4fab0c12ad 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -16,3 +16,4 @@ The "REST With Spring" Classes: http://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) From 02fc56c41bd5004bef4d2d4c091eccde2a341285 Mon Sep 17 00:00:00 2001 From: Kevin Gilmore Date: Thu, 29 Nov 2018 20:54:00 -0600 Subject: [PATCH 133/429] BAEL-2354: add link back to article --- cdi/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cdi/README.md b/cdi/README.md index 0477ce85bd..1523aacf6b 100644 --- a/cdi/README.md +++ b/cdi/README.md @@ -1,3 +1,4 @@ ### 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) +- [Introduction to the Event Notification Model in CDI 2.0](https://www.baeldung.com/cdi-event-notification) From f06a9f4106cff01c7de0b05b6d980dfc98533e7d Mon Sep 17 00:00:00 2001 From: Juan Moreno Date: Fri, 30 Nov 2018 01:30:19 -0300 Subject: [PATCH 134/429] Sample code for BAEL-2333 --- java-streams/pom.xml | 10 +- .../com/baeldung/stream/filter/Customer.java | 55 +++++++++ .../stream/filter/StreamFilterUnitTest.java | 115 ++++++++++++++++++ 3 files changed, 178 insertions(+), 2 deletions(-) create mode 100644 java-streams/src/main/java/com/baeldung/stream/filter/Customer.java create mode 100644 java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java diff --git a/java-streams/pom.xml b/java-streams/pom.xml index e4670c268d..2b52ebb4b3 100644 --- a/java-streams/pom.xml +++ b/java-streams/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 java-streams 0.1.0-SNAPSHOT @@ -74,6 +74,11 @@ aspectjweaver ${asspectj.version} + + pl.touk + throwing-function + ${throwing-function.version} + @@ -108,8 +113,9 @@ 1.15 0.6.5 2.10 + 1.3 - 3.6.1 + 3.11.1 1.8.9 diff --git a/java-streams/src/main/java/com/baeldung/stream/filter/Customer.java b/java-streams/src/main/java/com/baeldung/stream/filter/Customer.java new file mode 100644 index 0000000000..49da6e7175 --- /dev/null +++ b/java-streams/src/main/java/com/baeldung/stream/filter/Customer.java @@ -0,0 +1,55 @@ +package com.baeldung.stream.filter; + +import javax.net.ssl.HttpsURLConnection; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; + +public class Customer { + private String name; + private int points; + private String profilePhotoUrl; + + public Customer(String name, int points) { + this(name, points, ""); + } + + public Customer(String name, int points, String profilePhotoUrl) { + this.name = name; + this.points = points; + this.profilePhotoUrl = profilePhotoUrl; + } + + public String getName() { + return name; + } + + public int getPoints() { + return points; + } + + public boolean hasOver(int points) { + return this.points > points; + } + + public boolean hasOverThousandPoints() { + return this.points > 100; + } + + public boolean hasValidProfilePhoto() throws IOException { + URL url = new URL(this.profilePhotoUrl); + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + return connection.getResponseCode() == HttpURLConnection.HTTP_OK; + } + + public boolean hasValidProfilePhotoWithoutCheckedException() { + try { + URL url = new URL(this.profilePhotoUrl); + HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(); + return connection.getResponseCode() == HttpURLConnection.HTTP_OK; + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java b/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java new file mode 100644 index 0000000000..c89a27cdf1 --- /dev/null +++ b/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java @@ -0,0 +1,115 @@ +package com.baeldung.stream.filter; + +import org.junit.jupiter.api.Test; +import pl.touk.throwing.ThrowingPredicate; +import pl.touk.throwing.exception.WrappedException; + +import java.io.IOException; +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; + +public class StreamFilterUnitTest { + + @Test + public void givenListOfCustomers_whenFilterByLambda_thenGetTwo() { + List customers = Arrays.asList(new Customer("John P.", 15), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), new Customer("Mary T.", 1)); + + long customersWithMoreThan100Points = customers + .stream() + .filter(c -> c.getPoints() > 100) + .count(); + + assertThat(customersWithMoreThan100Points).isEqualTo(2); + } + + @Test + public void givenListOfCustomers_whenFilterByMethodReference_thenGetTwo() { + List customers = Arrays.asList(new Customer("John P.", 15), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), new Customer("Mary T.", 1)); + + long customersWithMoreThan100Points = customers + .stream() + .filter(Customer::hasOverThousandPoints) + .count(); + + assertThat(customersWithMoreThan100Points).isEqualTo(2); + } + + @Test + public void givenListOfCustomersWithOptional_whenFilterBy100Points_thenGetTwo() { + List> customers = Arrays.asList(Optional.of(new Customer("John P.", 15)), Optional.of(new Customer("Sarah M.", 200)), Optional.empty(), Optional.of(new Customer("Mary T.", 300)), Optional.empty()); + + long customersWithMoreThan100Points = customers + .stream() + .flatMap(c -> c + .map(Stream::of) + .orElseGet(Stream::empty)) + .filter(Customer::hasOverThousandPoints) + .count(); + + assertThat(customersWithMoreThan100Points).isEqualTo(2); + } + + @Test + public void givenListOfCustomers_whenFilterWithCustomHandling_thenThrowException() { + List customers = Arrays.asList(new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), + new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e")); + + assertThatThrownBy(() -> customers + .stream() + .filter(Customer::hasValidProfilePhotoWithoutCheckedException) + .count()).isInstanceOf(RuntimeException.class); + } + + @Test + public void givenListOfCustomers_whenFilterWithThrowingFunction_thenThrowException() { + List customers = Arrays.asList(new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), + new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e")); + + assertThatThrownBy(() -> customers + .stream() + .filter((ThrowingPredicate.unchecked(Customer::hasValidProfilePhoto))) + .count()).isInstanceOf(WrappedException.class); + } + + @Test + public void givenListOfCustomers_whenFilterWithTryCatch_thenGetTwo() { + List customers = Arrays.asList(new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), + new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e")); + + long customersWithValidProfilePhoto = customers + .stream() + .filter(c -> { + try { + return c.hasValidProfilePhoto(); + } catch (IOException e) { + //handle exception + } + return false; + }) + .count(); + + assertThat(customersWithValidProfilePhoto).isEqualTo(2); + } + + @Test + public void givenListOfCustomers_whenFilterWithTryCatchAndRuntime_thenThrowException() { + List customers = Arrays.asList(new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), + new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e")); + + assertThatThrownBy(() -> customers + .stream() + .filter(c -> { + try { + return c.hasValidProfilePhoto(); + } catch (IOException e) { + throw new RuntimeException(e); + } + }) + .count()).isInstanceOf(RuntimeException.class); + } +} From f4c5f8b8ae250190defaabe7df9c832a3a80659a Mon Sep 17 00:00:00 2001 From: raghav-jha Date: Fri, 30 Nov 2018 11:40:11 +0530 Subject: [PATCH 135/429] JPA One-To-One Association Tutorial Issue: BAEL-2394 --- .../hibernate/onetoone/HibernateUtil.java | 38 +++++++++ .../baeldung/hibernate/onetoone/Strategy.java | 25 ++++++ .../onetoone/foreignkeybased/Address.java | 60 ++++++++++++++ .../onetoone/foreignkeybased/User.java | 51 ++++++++++++ .../onetoone/jointablebased/Employee.java | 53 ++++++++++++ .../onetoone/jointablebased/WorkStation.java | 61 ++++++++++++++ .../onetoone/sharedkeybased/Address.java | 60 ++++++++++++++ .../onetoone/sharedkeybased/User.java | 50 ++++++++++++ .../src/main/resources/one-to-one.cfg.xml | 16 ++++ ...ToOneAnnotationFKBasedIntegrationTest.java | 80 +++++++++++++++++++ ...ToOneAnnotationJTBasedIntegrationTest.java | 80 +++++++++++++++++++ ...oOneAnnotationSPKBasedIntegrationTest.java | 79 ++++++++++++++++++ .../src/test/resources/one-to-one.cfg.xml | 16 ++++ 13 files changed, 669 insertions(+) create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java create mode 100644 persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml create mode 100644 persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java create mode 100644 persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java create mode 100644 persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java create mode 100644 persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java new file mode 100644 index 0000000000..899fcde947 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java @@ -0,0 +1,38 @@ +package com.baeldung.hibernate.onetoone; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.service.ServiceRegistry; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + private static SessionFactory buildSessionFactory(Strategy strategy) { + try { + // Create the SessionFactory from hibernate-annotation.cfg.xml + Configuration configuration = new Configuration(); + + for (Class entityClass : strategy.getEntityClasses()) { + configuration.addAnnotatedClass(entityClass); + } + configuration.configure("one-to-one.cfg.xml"); + + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()) + .build(); + + SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); + + return sessionFactory; + } catch (Throwable ex) { + ex.printStackTrace(); + throw new ExceptionInInitializerError(ex); + } + } + + public static SessionFactory getSessionFactory(Strategy strategy) { + if (sessionFactory == null) + sessionFactory = buildSessionFactory(strategy); + return sessionFactory; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java new file mode 100644 index 0000000000..3180566ca5 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java @@ -0,0 +1,25 @@ +package com.baeldung.hibernate.onetoone; + + +import java.util.Arrays; +import java.util.List; + +public enum Strategy { + //See that the classes belongs to different packages + FOREIGN_KEY(Arrays.asList(com.baeldung.hibernate.onetoone.foreignkeybased.User.class, + com.baeldung.hibernate.onetoone.foreignkeybased.Address.class)), + SHARED_PRIMARY_KEY(Arrays.asList(com.baeldung.hibernate.onetoone.sharedkeybased.User.class, + com.baeldung.hibernate.onetoone.sharedkeybased.Address.class)), + JOIN_TABLE_BASED(Arrays.asList(com.baeldung.hibernate.onetoone.jointablebased.Employee.class, + com.baeldung.hibernate.onetoone.jointablebased.WorkStation.class)); + + private List> entityClasses; + + Strategy(List> entityClasses) { + this.entityClasses = entityClasses; + } + + public List> getEntityClasses() { + return entityClasses; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java new file mode 100644 index 0000000000..e05eb46030 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java @@ -0,0 +1,60 @@ +package com.baeldung.hibernate.onetoone.foreignkeybased; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "address") +public class Address { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "street") + private String street; + + @Column(name = "city") + private String city; + + @OneToOne(mappedBy = "address") + private User user; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java new file mode 100644 index 0000000000..56b108d0d1 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java @@ -0,0 +1,51 @@ +package com.baeldung.hibernate.onetoone.foreignkeybased; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "username") + private String userName; + + @OneToOne(cascade = CascadeType.ALL) + @JoinColumn(name = "address_id", referencedColumnName = "id") + private Address address; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java new file mode 100644 index 0000000000..a0bc101b9f --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java @@ -0,0 +1,53 @@ +package com.baeldung.hibernate.onetoone.jointablebased; + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "employee") +public class Employee { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "ename") + private String name; + + @OneToOne(cascade = CascadeType.ALL) + @JoinTable(name = "emp_workstation", joinColumns = {@JoinColumn(name = "employee_id", referencedColumnName = "id")}, + inverseJoinColumns = {@JoinColumn(name = "workstation_id", referencedColumnName = "id")}) + private WorkStation workStation; + + 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 WorkStation getWorkStation() { + return workStation; + } + + public void setWorkStation(WorkStation workStation) { + this.workStation = workStation; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java new file mode 100644 index 0000000000..f530611f6e --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.onetoone.jointablebased; + + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "workstation") +public class WorkStation { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "workstation_number") + private Integer workstationNumber; + + @Column(name = "floor") + private String floor; + + @OneToOne(mappedBy = "workStation") + private Employee employee; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Integer getWorkstationNumber() { + return workstationNumber; + } + + public void setWorkstationNumber(Integer workstationNumber) { + this.workstationNumber = workstationNumber; + } + + public String getFloor() { + return floor; + } + + public void setFloor(String floor) { + this.floor = floor; + } + + public Employee getEmployee() { + return employee; + } + + public void setEmployee(Employee employee) { + this.employee = employee; + } +} \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java new file mode 100644 index 0000000000..927516f6bb --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java @@ -0,0 +1,60 @@ +package com.baeldung.hibernate.onetoone.sharedkeybased; + + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.MapsId; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "address") +public class Address { + + @Id + @Column(name = "id") + private Long id; + + @Column(name = "street") + private String street; + + @Column(name = "city") + private String city; + + @OneToOne + @MapsId + private User user; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getStreet() { + return street; + } + + public void setStreet(String street) { + this.street = street; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + public User getUser() { + return user; + } + + public void setUser(User user) { + this.user = user; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java new file mode 100644 index 0000000000..fa00db1271 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java @@ -0,0 +1,50 @@ +package com.baeldung.hibernate.onetoone.sharedkeybased; + + +import javax.persistence.CascadeType; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "users") +public class User { + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "id") + private Long id; + + @Column(name = "username") + private String userName; + + @OneToOne(mappedBy = "user", cascade = CascadeType.ALL) + private Address address; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public Address getAddress() { + return address; + } + + public void setAddress(Address address) { + this.address = address; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml b/persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml new file mode 100644 index 0000000000..7522036acb --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml @@ -0,0 +1,16 @@ + + + + + org.h2.Driver + + jdbc:h2:mem:spring_hibernate_one_to_one + sa + org.hibernate.dialect.H2Dialect + thread + true + create-drop + + \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java new file mode 100644 index 0000000000..475c93f6ff --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java @@ -0,0 +1,80 @@ +package com.baeldung.hibernate.onetoone; + +import com.baeldung.hibernate.onetoone.foreignkeybased.Address; +import com.baeldung.hibernate.onetoone.foreignkeybased.User; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class HibernateOneToOneAnnotationFKBasedIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() { + sessionFactory = HibernateUtil.getSessionFactory(Strategy.FOREIGN_KEY); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenData_whenInsert_thenCreates1to1relationship() { + User user = new User(); + user.setUserName("alice@baeldung.com"); + + Address address = new Address(); + address.setStreet("FK Street"); + address.setCity("FK City"); + + address.setUser(user); + user.setAddress(address); + + //Address entry will automatically be created by hibernate, since cascade type is specified as ALL + session.persist(user); + session.getTransaction().commit(); + + assert1to1InsertedData(); + } + + private void assert1to1InsertedData() { + @SuppressWarnings("unchecked") + List userList = session.createQuery("FROM User").list(); + + assertNotNull(userList); + assertEquals(1, userList.size()); + + User user = userList.get(0); + assertEquals("alice@baeldung.com", user.getUserName()); + + Address address = user.getAddress(); + assertNotNull(address); + assertEquals("FK Street", address.getStreet()); + assertEquals("FK City", address.getCity()); + + } + + @After + public void tearDown() { + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java new file mode 100644 index 0000000000..df4cd4d137 --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java @@ -0,0 +1,80 @@ +package com.baeldung.hibernate.onetoone; + +import com.baeldung.hibernate.onetoone.jointablebased.Employee; +import com.baeldung.hibernate.onetoone.jointablebased.WorkStation; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class HibernateOneToOneAnnotationJTBasedIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() { + sessionFactory = HibernateUtil.getSessionFactory(Strategy.JOIN_TABLE_BASED); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenData_whenInsert_thenCreates1to1relationship() { + Employee employee = new Employee(); + employee.setName("bob@baeldung.com"); + + WorkStation workStation = new WorkStation(); + workStation.setWorkstationNumber(626); + workStation.setFloor("Sixth Floor"); + + + employee.setWorkStation(workStation); + workStation.setEmployee(employee); + + session.persist(employee); + session.getTransaction().commit(); + + assert1to1InsertedData(); + } + + private void assert1to1InsertedData() { + @SuppressWarnings("unchecked") + List employeeList = session.createQuery("FROM Employee").list(); + assertNotNull(employeeList); + assertEquals(1, employeeList.size()); + + Employee employee = employeeList.get(0); + assertEquals("bob@baeldung.com", employee.getName()); + + WorkStation workStation = employee.getWorkStation(); + + assertNotNull(workStation); + assertEquals((long) 626, (long) workStation.getWorkstationNumber()); + assertEquals("Sixth Floor", workStation.getFloor()); + + } + + @After + public void tearDown() { + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java new file mode 100644 index 0000000000..7931a8e3fe --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java @@ -0,0 +1,79 @@ +package com.baeldung.hibernate.onetoone; + +import com.baeldung.hibernate.onetoone.sharedkeybased.Address; +import com.baeldung.hibernate.onetoone.sharedkeybased.User; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class HibernateOneToOneAnnotationSPKBasedIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() { + sessionFactory = HibernateUtil.getSessionFactory(Strategy.SHARED_PRIMARY_KEY); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenData_whenInsert_thenCreates1to1relationship() { + User user = new User(); + user.setUserName("alice@baeldung.com"); + + Address address = new Address(); + address.setStreet("SPK Street"); + address.setCity("SPK City"); + + address.setUser(user); + user.setAddress(address); + + //Address entry will automatically be created by hibernate, since cascade type is specified as ALL + session.persist(user); + session.getTransaction().commit(); + + assert1to1InsertedData(); + } + + + private void assert1to1InsertedData() { + @SuppressWarnings("unchecked") + List userList = session.createQuery("FROM User").list(); + assertNotNull(userList); + assertEquals(1, userList.size()); + + User user = userList.get(0); + assertEquals("alice@baeldung.com", user.getUserName()); + + Address address = user.getAddress(); + assertNotNull(address); + assertEquals("SPK Street", address.getStreet()); + assertEquals("SPK City", address.getCity()); + } + + @After + public void tearDown() { + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} diff --git a/persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml b/persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml new file mode 100644 index 0000000000..60417e312d --- /dev/null +++ b/persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml @@ -0,0 +1,16 @@ + + + + + org.h2.Driver + + jdbc:h2:mem:spring_hibernate_one_to_one + sa + org.hibernate.dialect.H2Dialect + thread + true + create-drop + + From ee6162e04b5394ce234c3e8c0cdd283bf26fa989 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 09:05:42 +0200 Subject: [PATCH 136/429] Update README.md (#5794) --- patterns/design-patterns/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/patterns/design-patterns/README.md b/patterns/design-patterns/README.md index ae372bd460..e56872b3fd 100644 --- a/patterns/design-patterns/README.md +++ b/patterns/design-patterns/README.md @@ -13,3 +13,4 @@ - [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) From e98f2f4f605f8fb805609bbe6ecb664c699e3b57 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 10:27:43 +0200 Subject: [PATCH 137/429] Update README.md --- core-java-lang/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 79d2375c24..607abbcdc5 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -58,4 +58,3 @@ - [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) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) - From 30bbc946d203b16c81b21c7bdbf4d12714a87830 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Fri, 30 Nov 2018 12:06:24 +0200 Subject: [PATCH 138/429] pom cleanup --- pom.xml | 1043 +++++++++++++++++-------------------------------------- 1 file changed, 316 insertions(+), 727 deletions(-) diff --git a/pom.xml b/pom.xml index 8fa93373fc..d149e07f57 100644 --- a/pom.xml +++ b/pom.xml @@ -323,207 +323,164 @@ parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin - asm - atomix - persistence-modules/apache-cayenne - aws - aws-lambda - akka-streams - algorithms-genetic - algorithms-miscellaneous-1 - algorithms-miscellaneous-2 - algorithms-sorting - annotations - apache-cxf - apache-fop - apache-geode - apache-poi - apache-tika - apache-thrift - apache-curator - apache-zookeeper - apache-opennlp - autovalue - axon - azure - bootique - cdi - java-strings - - core-java - core-java-lang - core-java-arrays - core-java-collections - java-collections-conversions - java-collections-maps - core-java-io - core-java-8 - java-streams - persistence-modules/core-java-persistence - core-kotlin - kotlin-libraries - core-groovy - core-java-concurrency - core-java-concurrency-collections - couchbase - persistence-modules/deltaspike - dozer - ethereum - feign - flips - testing-modules/groovy-spock - testing-modules/load-testing-comparison - google-cloud - google-web-toolkit - gson - guava - guava-collections - guava-modules/guava-18 - guava-modules/guava-19 - guava-modules/guava-21 - guice - disruptor - core-scala - spring-static-resources - hazelcast - persistence-modules/hbase - persistence-modules/hibernate5 - httpclient - hystrix - image-processing - immutables - persistence-modules/influxdb - jackson - persistence-modules/java-cassandra - vavr - java-lite - java-numbers - java-rmi - java-vavr-stream - javax-servlets - javaxval - jaxb - javafx - jgroups - jee-7 - jee-7-security - jhipster - jjwt - jsf - json-path - json - jsoup - testing-modules/junit-5 - - libraries - libraries-data - libraries-security - libraries-server - linkrest - logging-modules/log-mdc - logging-modules/log4j - logging-modules/log4j2 - logging-modules/logback - lombok - mapstruct - metrics - maven - mesos-marathon - msf4j - testing-modules/mockito - testing-modules/mockito-2 - testing-modules/mocks - mustache - mvn-wrapper - noexception - persistence-modules/orientdb - osgi - orika - patterns - pdf - protobuffer - persistence-modules/querydsl - reactor-core - persistence-modules/redis - testing-modules/rest-assured - testing-modules/rest-testing - resteasy - rxjava - rxjava-2 - spring-swagger-codegen - testing-modules/selenium-junit-testng - persistence-modules/solr - spark-java - spring-4 - spring-5 - spring-5-data-reactive - spring-5-reactive - spring-5-reactive-security - spring-5-reactive-client - spring-5-mvc - spring-5-security - spring-5-security-oauth - spring-5-reactive-oauth - spring-activiti - spring-akka - spring-amqp - spring-all - spring-amqp-simple - spring-apache-camel - spring-batch - spring-bom - spring-boot - spring-boot-client - spring-boot-keycloak - spring-boot-bootstrap - spring-boot-admin - spring-boot-camel - spring-boot-ops - persistence-modules/spring-boot-persistence - spring-boot-security - spring-boot-mvc - spring-boot-vue - spring-boot-logging-log4j2 - spring-boot-disable-console-logging - spring-cloud-data-flow - spring-cloud - spring-cloud-bus - spring-core - spring-cucumber - spring-ejb - spring-aop - persistence-modules/spring-data-cassandra - persistence-modules/spring-data-couchbase-2 - persistence-modules/spring-data-dynamodb - persistence-modules/spring-data-elasticsearch - persistence-modules/spring-data-jpa - persistence-modules/spring-data-keyvalue - persistence-modules/spring-data-mongodb - persistence-modules/spring-data-neo4j - persistence-modules/spring-data-redis - spring-data-rest - persistence-modules/spring-data-solr - spring-dispatcher-servlet - spring-exceptions - spring-freemarker - persistence-modules/spring-hibernate-3 - persistence-modules/spring-hibernate4 - persistence-modules/spring-hibernate-5 - persistence-modules/spring-data-eclipselink - spring-integration - spring-jenkins-pipeline - spring-jersey - jmeter - spring-jms - spring-jooq - persistence-modules/spring-jpa - ddd - + parent-boot-2 + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin + + asm + atomix + aws + aws-lambda + akka-streams + algorithms-genetic + algorithms-miscellaneous-1 + algorithms-miscellaneous-2 + algorithms-sorting + annotations + apache-cxf + apache-fop + apache-poi + apache-tika + apache-thrift + apache-curator + apache-zookeeper + apache-opennlp + autovalue + axon + azure + apache-velocity + apache-solrj + apache-meecrowave + antlr + + bootique + + cdi + core-java-collections + core-java-io + core-java-8 + core-groovy + couchbase + + dozer + disruptor + drools + deeplearning4j + + ethereum + + feign + flips + + google-cloud + gson + guava + guava-collections + guava-modules/guava-18 + guava-modules/guava-19 + guava-modules/guava-21 + guice + + hazelcast + hystrix + httpclient + + image-processing + immutables + + jackson + java-strings + + java-collections-conversions + java-collections-maps + java-streams + java-lite + java-numbers + java-rmi + java-vavr-stream + javax-servlets + javaxval + jaxb + javafx + jgroups + jee-7 + jee-7-security + jjwt + jsf + json-path + json + jsoup + jta + jws + jersey + java-spi + java-ee-8-security-api + + libraries-data + linkrest + logging-modules/log-mdc + logging-modules/log4j + logging-modules/logback + lombok + lucene + + mapstruct + maven + mesos-marathon + msf4j + mustache + mvn-wrapper + mybatis + metrics + maven-archetype + + noexception + + osgi + orika + + patterns + pdf + protobuffer + performance-tests + + persistence-modules/java-jdbi + persistence-modules/redis + persistence-modules/orientdb + persistence-modules/querydsl + persistence-modules/apache-cayenne + persistence-modules/solr + persistence-modules/spring-data-dynamodb + persistence-modules/spring-data-keyvalue + persistence-modules/spring-data-neo4j + persistence-modules/spring-data-solr + persistence-modules/spring-hibernate-5 + persistence-modules/spring-data-eclipselink + persistence-modules/spring-jpa + persistence-modules/spring-hibernate-3 + persistence-modules/spring-data-gemfire + persistence-modules/spring-boot-persistence + persistence-modules/liquibase + persistence-modules/java-cockroachdb + persistence-modules/deltaspike + persistence-modules/hbase + persistence-modules/influxdb + persistence-modules/spring-hibernate4 + + reactor-core + resteasy + rxjava + rxjava-2 + rabbitmq + + + + persistence-modules/spring-data-mongodb + @@ -562,148 +519,50 @@ parent-java parent-kotlin - spring-session - spring-sleuth - spring-social-login - spring-spel - spring-state-machine - spring-thymeleaf - spring-userservice - spring-zuul - spring-remoting - spring-reactor - spring-vertx - spring-jinq - spring-rest-embedded-tomcat - testing-modules/testing - testing-modules/testng - video-tutorials - xml - xmlunit-2 - struts-2 - apache-velocity - apache-solrj - rabbitmq - vertx - persistence-modules/spring-data-gemfire - mybatis - spring-drools - drools - persistence-modules/liquibase - spring-boot-property-exp - testing-modules/mockserver - testing-modules/test-containers - undertow - vaadin - vertx-and-rxjava - saas - deeplearning4j - lucene - vraptor - persistence-modules/java-cockroachdb - spring-security-thymeleaf - persistence-modules/java-jdbi - jersey - java-spi - performance-tests - twilio - spring-boot-ctx-fluent - java-ee-8-security-api - spring-webflux-amqp - antlr - maven-archetype - optaplanner - apache-meecrowave - spring-reactive-kotlin - persistence-modules/jnosql - spring-boot-angular-ecommerce - jta - - java-websocket - persistence-modules/activejdbc - animal-sniffer-mvn-plugin - apache-avro - apache-bval - apache-shiro - apache-spark - asciidoctor - checker-plugin - - - core-java-sun - custom-pmd - dagger - data-structures - dubbo - persistence-modules/flyway - - JGit - jni - jooby - - - - ratpack - rest-with-spark-java - spring-boot-autoconfiguration - spring-boot-custom-starter - spring-boot-jasypt - spring-data-rest-querydsl - spring-groovy - spring-mobile - spring-mustache - spring-mvc-simple - spring-mybatis - spring-rest-hal-browser - spring-rest-shell - spring-rest-template - spring-roo - spring-security-stormpath - sse-jaxrs - static-analysis - stripe - structurizr - Twitter4J - wicket - xstream - cas/cas-secured-app - cas/cas-server - graphql/graphql-java - - - - - spring-boot-custom-starter/greeter - persistence-modules/spring-boot-h2/spring-boot-h2-database - - flyway-cdi-extension + spring-4 + spring-5 + spring-5-reactive + spring-5-reactive-security + spring-5-reactive-client + spring-5-mvc + spring-5-security + spring-5-security-oauth + spring-activiti + spring-akka + spring-amqp + spring-all + spring-apache-camel + spring-batch + spring-bom - spring-security-acl - spring-security-cache-control - spring-security-client/spring-security-jsp-authentication - spring-security-client/spring-security-jsp-authorize - spring-security-client/spring-security-jsp-config - spring-security-client/spring-security-mvc - spring-security-client/spring-security-thymeleaf-authentication - spring-security-client/spring-security-thymeleaf-authorize - spring-security-client/spring-security-thymeleaf-config - spring-security-core - spring-security-mvc-boot - spring-security-mvc-custom - spring-security-mvc-digest-auth - spring-security-mvc-ldap - spring-security-mvc-login - spring-security-mvc-persisted-remember-me - spring-security-mvc-session - spring-security-mvc-socket - spring-security-openid - spring-security-react - spring-security-rest-basic-auth - spring-security-rest-custom - spring-security-rest - spring-security-sso - spring-security-x509 + spring-boot-keycloak + spring-boot-bootstrap + spring-boot-admin + spring-boot-camel + spring-boot-security + spring-boot-mvc + spring-boot-logging-log4j2 + spring-boot-disable-console-logging + spring-cloud-data-flow + spring-cloud + spring-cloud-bus + spring-core + spring-cucumber + spring-ejb + spring-aop + + spring-data-rest + spring-dispatcher-servlet + spring-exceptions + spring-freemarker + + spring-integration + spring-jenkins-pipeline + spring-jersey + + spring-jms + spring-jooq spring-kafka spring-katharsis spring-ldap @@ -721,49 +580,118 @@ spring-rest-full spring-rest-query-language spring-rest - spring-rest-simple spring-resttemplate - helidon - - - - - - default-third - - - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - 3 - true - - **/*IntegrationTest.java - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/*JdbcTest.java - **/*LiveTest.java - - - - - - - - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin + spring-rest-simple + spring-security-acl + spring-security-cache-control + spring-security-client/spring-security-jsp-authentication + spring-security-client/spring-security-jsp-authorize + spring-security-client/spring-security-jsp-config + spring-security-client/spring-security-mvc + spring-security-client/spring-security-thymeleaf-authentication + spring-security-client/spring-security-thymeleaf-authorize + spring-security-client/spring-security-thymeleaf-config + spring-security-core + spring-security-mvc-boot + spring-security-mvc-digest-auth + spring-security-mvc-ldap + spring-security-mvc-login + spring-security-mvc-persisted-remember-me + spring-security-mvc-session + spring-security-mvc-socket + spring-security-openid + + spring-security-rest-basic-auth + spring-security-rest-custom + spring-security-rest + spring-security-sso + spring-security-x509 + spring-session + spring-sleuth + spring-social-login + spring-spel + spring-state-machine + spring-thymeleaf + spring-userservice + spring-zuul + spring-remoting + spring-reactor + spring-vertx + spring-vault + spring-jinq + spring-rest-embedded-tomcat + spring-static-resources + spring-swagger-codegen + spring-drools + spring-boot-property-exp + spring-security-thymeleaf + spring-boot-ctx-fluent + spring-webflux-amqp + + spark-java + saas + struts-2 + + testing-modules/selenium-junit-testng + testing-modules/groovy-spock + testing-modules/mockito + testing-modules/mockito-2 + testing-modules/mocks + testing-modules/rest-assured + testing-modules/rest-testing + testing-modules/junit-5 + testing-modules/junit5-migration + testing-modules/testing + testing-modules/testng + testing-modules/mockserver + testing-modules/test-containers + twilio + + undertow + + video-tutorials + vaadin + vertx-and-rxjava + vraptor + vertx + vavr + + xmlunit-2 + xml + + + + + + + spring-boot + spring-boot-ops + core-kotlin + core-java + google-web-toolkit + spring-security-mvc-custom + core-java-concurrency + --> + + + + @@ -1140,6 +1068,7 @@ parent-kotlin spring-4 + spring-5 spring-5-reactive spring-5-reactive-security spring-5-reactive-client @@ -1248,45 +1177,6 @@ spring-boot-ctx-fluent spring-webflux-amqp - - - - - - - - - integration-lite-third - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*ManualTest.java - **/*LiveTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin spark-java saas @@ -1338,320 +1228,19 @@ testing-modules/gatling spring-boot spring-boot-ops - spring-5 core-kotlin core-java google-web-toolkit spring-security-mvc-custom core-java-concurrency --> - - - - - - - - integration - - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*ManualTest.java - **/*LiveTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - - - parent-boot-1 - parent-boot-2 - parent-spring-4 - parent-spring-5 - parent-java - parent-kotlin - - - - - - - - - - testing-modules/mockito - testing-modules/mockito-2 - testing-modules/mocks - mustache - mvn-wrapper - noexception - persistence-modules/orientdb - osgi - orika - patterns - pdf - protobuffer - persistence-modules/querydsl - reactor-core - persistence-modules/redis - testing-modules/rest-assured - testing-modules/rest-testing - resteasy - rxjava - rxjava-2 - spring-swagger-codegen - testing-modules/selenium-junit-testng - persistence-modules/solr - spark-java - spring-4 - spring-5 - spring-5-data-reactive - spring-5-reactive - spring-5-reactive-security - spring-5-reactive-client - spring-5-mvc - spring-5-security - spring-5-security-oauth - spring-activiti - spring-akka - spring-amqp - spring-all + + + - - - - spring-bom - spring-boot - spring-boot-client - spring-boot-keycloak - spring-boot-bootstrap - spring-boot-admin - spring-boot-camel - spring-boot-ops - persistence-modules/spring-boot-persistence - spring-boot-security - spring-boot-mvc - spring-boot-logging-log4j2 - spring-boot-disable-console-logging - spring-cloud-data-flow - spring-cloud - spring-cloud-bus - spring-core - spring-cucumber - spring-ejb - spring-aop - persistence-modules/spring-data-cassandra - persistence-modules/spring-data-couchbase-2 - persistence-modules/spring-data-dynamodb - persistence-modules/spring-data-elasticsearch - persistence-modules/spring-data-keyvalue - persistence-modules/spring-data-mongodb - persistence-modules/spring-data-jpa - persistence-modules/spring-data-neo4j - persistence-modules/spring-data-redis - spring-data-rest - - - - - - - persistence-modules/spring-data-solr - spring-dispatcher-servlet - spring-exceptions - spring-freemarker - persistence-modules/spring-hibernate-3 - persistence-modules/spring-hibernate4 - persistence-modules/spring-hibernate-5 - persistence-modules/spring-data-eclipselink - spring-integration - spring-jenkins-pipeline - spring-jersey - spring-jms - spring-jooq - persistence-modules/spring-jpa - spring-kafka - spring-katharsis - spring-ldap - spring-mockito - spring-mvc-forms-jsp - spring-mvc-forms-thymeleaf - spring-mvc-java - spring-mvc-velocity - spring-mvc-webflow - spring-mvc-xml - spring-mvc-kotlin - spring-protobuf - spring-quartz - spring-rest-angular - spring-rest-full - spring-rest-query-language - spring-rest - spring-resttemplate - spring-rest-simple - spring-reactive-kotlin - - - - - - - - - - - - - - - - java-websocket - persistence-modules/activejdbc - animal-sniffer-mvn-plugin - apache-avro - apache-bval - apache-shiro - apache-spark - asciidoctor - checker-plugin - - - core-java-sun - custom-pmd - dagger - data-structures - dubbo - persistence-modules/flyway - - - jni - jooby - - - - ratpack - rest-with-spark-java - spring-boot-autoconfiguration - spring-boot-custom-starter - spring-boot-jasypt - spring-data-rest-querydsl - spring-groovy - spring-mobile - spring-mustache - spring-mvc-simple - spring-mybatis - spring-rest-hal-browser - spring-rest-shell - spring-rest-template - spring-roo - spring-security-stormpath - sse-jaxrs - static-analysis - stripe - - - wicket - xstream - cas/cas-secured-app - - - - - - - - - - - - - - jenkins/hello-world - - - - spring-boot-custom-starter/greeter - persistence-modules/spring-boot-h2/spring-boot-h2-database - - - - + spring-5-data-reactive + --> + From 7be6c2f8de71a4e60f6177b2dd33d2d0c9c9098a Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Fri, 30 Nov 2018 13:10:10 +0200 Subject: [PATCH 139/429] minor pom cleanup --- pom.xml | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index d149e07f57..ef7a7f6b1d 100644 --- a/pom.xml +++ b/pom.xml @@ -468,6 +468,11 @@ persistence-modules/hbase persistence-modules/influxdb persistence-modules/spring-hibernate4 + persistence-modules/spring-data-mongodb + persistence-modules/java-cassandra + persistence-modules/spring-data-cassandra + persistence-modules/spring-data-couchbase-2 + persistence-modules/spring-data-redis reactor-core resteasy @@ -475,12 +480,6 @@ rxjava-2 rabbitmq - - - persistence-modules/spring-data-mongodb - @@ -600,7 +599,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - + spring-security-react spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest @@ -628,7 +627,7 @@ spring-security-thymeleaf spring-boot-ctx-fluent spring-webflux-amqp - + spark-java saas struts-2 @@ -662,12 +661,7 @@ @@ -1020,6 +1014,11 @@ persistence-modules/hbase persistence-modules/influxdb persistence-modules/spring-hibernate4 + persistence-modules/spring-data-mongodb + persistence-modules/java-cassandra + persistence-modules/spring-data-cassandra + persistence-modules/spring-data-couchbase-2 + persistence-modules/spring-data-redis reactor-core resteasy @@ -1027,12 +1026,6 @@ rxjava-2 rabbitmq - - - persistence-modules/spring-data-mongodb - @@ -1148,7 +1141,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - + spring-security-react spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest From 55aff7f5f21fefbf89f8854b38f99813d1e5fd4e Mon Sep 17 00:00:00 2001 From: FrancoCorleone Date: Fri, 30 Nov 2018 13:35:27 +0100 Subject: [PATCH 140/429] Upgrading commons lang3 and guava dependencies (#5790) * Upgrading Guava package * Upgrading commons lang3 package --- java-strings/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/java-strings/pom.xml b/java-strings/pom.xml index ab94c28d4d..f4fb1c0865 100755 --- a/java-strings/pom.xml +++ b/java-strings/pom.xml @@ -122,13 +122,13 @@ - 3.5 + 3.8.1 1.10 3.6.1 1.19 61.1 - 26.0-jre + 27.0.1-jre From a797be29bd1a75868e9714d3a84c0f86260a79cc Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Fri, 30 Nov 2018 18:43:11 +0200 Subject: [PATCH 141/429] temporarily disabling the module --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index ef7a7f6b1d..da17fc2931 100644 --- a/pom.xml +++ b/pom.xml @@ -599,7 +599,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - spring-security-react + spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest @@ -1141,7 +1141,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - spring-security-react + spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest From 4058bfc60114b9a32e69474bfb6e4b148ff06331 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 30 Nov 2018 22:16:08 +0530 Subject: [PATCH 142/429] BAEL-9567 Align module names, folder names and artifact id - Added "name" in pom.xml whereever it was missing and aligned the present ones with the artifactid and foldername --- algorithms-genetic/pom.xml | 4 +-- algorithms-miscellaneous-1/pom.xml | 4 +-- algorithms-miscellaneous-2/pom.xml | 2 +- algorithms-sorting/pom.xml | 2 +- annotations/annotation-processing/pom.xml | 3 +- annotations/annotation-user/pom.xml | 1 + annotations/pom.xml | 3 +- apache-avro/pom.xml | 3 +- apache-bval/pom.xml | 3 +- apache-curator/pom.xml | 1 + apache-cxf/cxf-aegis/pom.xml | 3 +- apache-cxf/cxf-introduction/pom.xml | 3 +- apache-cxf/cxf-jaxrs-implementation/pom.xml | 3 +- apache-cxf/cxf-spring/pom.xml | 1 + apache-cxf/pom.xml | 2 +- apache-cxf/sse-jaxrs/pom.xml | 2 +- apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml | 7 ++-- apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml | 8 ++--- apache-geode/pom.xml | 5 ++- apache-opennlp/pom.xml | 1 + apache-poi/pom.xml | 2 +- apache-pulsar/pom.xml | 33 ++++++++++--------- apache-shiro/pom.xml | 3 +- apache-thrift/pom.xml | 2 +- apache-tika/pom.xml | 4 +-- apache-zookeeper/pom.xml | 2 +- asm/pom.xml | 1 + atomix/pom.xml | 3 +- axon/pom.xml | 3 +- cas/cas-server/pom.xml | 3 +- cdi/pom.xml | 2 +- core-groovy/pom.xml | 1 + core-java-9/pom.xml | 1 - core-java/pom.xml | 2 +- core-kotlin/pom.xml | 1 + core-scala/pom.xml | 1 + data-structures/pom.xml | 2 +- drools/pom.xml | 3 +- dubbo/pom.xml | 1 + flyway-cdi-extension/pom.xml | 2 +- guava-modules/guava-18/pom.xml | 4 +-- guava-modules/guava-19/pom.xml | 4 +-- guava-modules/guava-21/pom.xml | 3 +- guest/core-java-9/pom.xml | 3 +- guest/core-java/pom.xml | 1 + guest/core-kotlin/pom.xml | 3 +- guest/deep-jsf/pom.xml | 1 + guest/junit5-example/pom.xml | 3 +- guest/log4j2-example/pom.xml | 3 +- guest/logback-example/pom.xml | 1 + guest/memory-leaks/pom.xml | 4 +-- guest/remote-debugging/pom.xml | 2 +- guest/slf4j/guide/pom.xml | 3 +- guest/slf4j/guide/slf4j-log4j/pom.xml | 2 +- guest/slf4j/guide/slf4j-log4j2/pom.xml | 2 +- guest/slf4j/guide/slf4j-logback/pom.xml | 2 +- guest/spring-boot-app/pom.xml | 1 + guest/spring-mvc/pom.xml | 2 +- guest/thread-pools/pom.xml | 3 +- guest/tomcat-app/pom.xml | 1 + guest/webservices/rest-client/pom.xml | 1 + guest/webservices/rest-server/pom.xml | 1 + guest/webservices/spring-rest-service/pom.xml | 1 + helidon/helidon-mp/pom.xml | 4 +-- helidon/helidon-se/pom.xml | 4 +-- helidon/pom.xml | 3 +- image-processing/pom.xml | 4 +-- immutables/pom.xml | 4 +-- .../app-auth-basic-store-db/pom.xml | 2 +- .../app-auth-custom-form-store-custom/pom.xml | 2 +- .../app-auth-custom-no-store/pom.xml | 2 +- .../app-auth-form-store-ldap/pom.xml | 2 +- java-ee-8-security-api/pom.xml | 1 + java-lite/pom.xml | 1 + java-rmi/pom.xml | 1 + java-spi/exchange-rate-api/pom.xml | 1 + java-spi/exchange-rate-app/pom.xml | 1 + java-spi/exchange-rate-impl/pom.xml | 1 + java-spi/pom.xml | 1 + java-vavr-stream/pom.xml | 1 + java-websocket/pom.xml | 4 +-- javafx/pom.xml | 3 +- javax-servlets/pom.xml | 1 + javaxval/pom.xml | 4 +-- jee-7/pom.xml | 1 + jenkins/hello-world/pom.xml | 4 +-- jersey/pom.xml | 2 +- jhipster/jhipster-microservice/pom.xml | 4 +-- jhipster/jhipster-monolithic/pom.xml | 1 + jni/pom.xml | 3 +- jsf/pom.xml | 1 + json/pom.xml | 3 +- jsoup/pom.xml | 1 + jta/pom.xml | 3 +- jws/pom.xml | 4 +-- kotlin-libraries/pom.xml | 1 + libraries-server/pom.xml | 3 +- linkrest/pom.xml | 2 +- logging-modules/log4j/pom.xml | 1 + logging-modules/log4j2/pom.xml | 3 +- maven-archetype/pom.xml | 3 +- .../maven-polyglot-json-extension/pom.xml | 4 +-- maven/pom.xml | 1 + maven/versions-maven-plugin/pom.xml | 5 +-- mesos-marathon/pom.xml | 3 +- metrics/pom.xml | 3 +- microprofile/pom.xml | 1 + msf4j/pom.xml | 1 + muleesb/pom.xml | 6 ++-- mybatis/pom.xml | 3 +- optaplanner/pom.xml | 7 ++-- parent-boot-1/pom.xml | 1 + parent-boot-2/pom.xml | 1 + patterns/design-patterns/pom.xml | 4 ++- patterns/front-controller/pom.xml | 1 + patterns/intercepting-filter/pom.xml | 2 +- patterns/pom.xml | 1 + performance-tests/pom.xml | 3 +- persistence-modules/hbase/pom.xml | 1 + persistence-modules/hibernate5/pom.xml | 1 + persistence-modules/java-cassandra/pom.xml | 1 + persistence-modules/java-cockroachdb/pom.xml | 1 + persistence-modules/java-jdbi/pom.xml | 1 + persistence-modules/java-jpa/pom.xml | 7 ++-- persistence-modules/java-mongodb/pom.xml | 1 + .../jnosql/jnosql-artemis/pom.xml | 6 ++-- .../jnosql/jnosql-diana/pom.xml | 6 ++-- persistence-modules/jnosql/pom.xml | 2 +- persistence-modules/liquibase/pom.xml | 1 + persistence-modules/orientdb/pom.xml | 2 +- .../spring-boot-h2-database/pom.xml | 2 +- .../spring-boot-persistence/pom.xml | 4 +-- .../spring-data-gemfire/pom.xml | 1 + persistence-modules/spring-data-jpa/pom.xml | 1 + .../spring-data-keyvalue/pom.xml | 1 + persistence-modules/spring-data-neo4j/pom.xml | 3 +- persistence-modules/spring-data-redis/pom.xml | 1 + protobuffer/pom.xml | 3 +- reactor-core/pom.xml | 4 +-- rxjava-2/pom.xml | 4 +-- rxjava/pom.xml | 4 +-- spring-5-data-reactive/pom.xml | 1 + spring-amqp-simple/pom.xml | 1 + spring-boot-admin/pom.xml | 1 + spring-boot-autoconfiguration/pom.xml | 2 +- spring-boot-camel/pom.xml | 3 +- spring-boot-crud/pom.xml | 2 +- spring-boot-ctx-fluent/pom.xml | 2 +- .../greeter-library/pom.xml | 3 +- .../greeter-spring-boot-autoconfigure/pom.xml | 2 +- .../greeter-spring-boot-sample-app/pom.xml | 2 +- .../greeter-spring-boot-starter/pom.xml | 2 +- spring-boot-custom-starter/greeter/pom.xml | 3 +- spring-boot-custom-starter/pom.xml | 1 + .../disabling-console-jul/pom.xml | 2 +- .../disabling-console-log4j2/pom.xml | 2 +- .../disabling-console-logback/pom.xml | 4 ++- spring-boot-disable-console-logging/pom.xml | 1 + spring-boot-logging-log4j2/pom.xml | 2 +- .../property-exp-custom-config/pom.xml | 3 +- .../property-exp-default-config/pom.xml | 3 +- spring-cloud-bus/pom.xml | 1 + spring-cloud-data-flow/etl/pom.xml | 3 +- spring-cloud-data-flow/pom.xml | 3 +- .../dynamodb-config/pom.xml | 1 + .../spring-cloud-archaius/jdbc-config/pom.xml | 1 + .../zookeeper-config/pom.xml | 1 + spring-cloud/spring-cloud-aws/pom.xml | 2 +- .../spring-cloud-bootstrap/config/pom.xml | 1 + .../spring-cloud-bootstrap/discovery/pom.xml | 2 +- .../spring-cloud-bootstrap/gateway/pom.xml | 1 + spring-cloud/spring-cloud-bootstrap/pom.xml | 1 + .../spring-cloud-bootstrap/svc-book/pom.xml | 2 +- .../spring-cloud-bootstrap/svc-rating/pom.xml | 2 +- .../spring-cloud-bootstrap/zipkin/pom.xml | 1 + .../spring-cloud-config/client/pom.xml | 5 +-- spring-cloud/spring-cloud-config/pom.xml | 1 + .../spring-cloud-config/server/pom.xml | 5 +-- .../spring-cloud-connectors-heroku/pom.xml | 1 + spring-cloud/spring-cloud-contract/pom.xml | 1 + spring-cloud/spring-cloud-eureka/pom.xml | 2 +- .../spring-cloud-eureka-client/pom.xml | 4 +-- .../spring-cloud-eureka-feign-client/pom.xml | 2 +- .../spring-cloud-eureka-server/pom.xml | 2 +- spring-cloud/spring-cloud-functions/pom.xml | 6 ++-- spring-cloud/spring-cloud-gateway/pom.xml | 2 +- .../demo-backend/pom.xml | 3 +- .../demo-frontend/pom.xml | 3 +- spring-cloud/spring-cloud-kubernetes/pom.xml | 2 +- .../spring-cloud-security/auth-server/pom.xml | 1 + spring-cloud/spring-cloud-task/pom.xml | 1 + spring-cloud/spring-cloud-zookeeper/pom.xml | 3 +- .../eureka-client/pom.xml | 2 +- .../eureka-server/pom.xml | 2 +- .../pom.xml | 2 +- .../zuul-server/pom.xml | 1 + spring-drools/pom.xml | 3 +- spring-ejb/spring-ejb-remote/pom.xml | 3 +- spring-ejb/wildfly/pom.xml | 4 +-- spring-ejb/wildfly/widlfly-web/pom.xml | 3 +- spring-ejb/wildfly/wildfly-ear/pom.xml | 3 +- .../wildfly/wildfly-ejb-interfaces/pom.xml | 3 +- spring-ejb/wildfly/wildfly-ejb/pom.xml | 3 +- spring-ejb/wildfly/wildfly-jpa/pom.xml | 3 +- spring-freemarker/pom.xml | 2 +- spring-jersey/pom.xml | 3 +- spring-jooq/pom.xml | 3 +- spring-katharsis/pom.xml | 3 +- spring-ldap/pom.xml | 1 + spring-mvc-simple/pom.xml | 3 +- spring-mybatis/pom.xml | 3 +- spring-reactive-kotlin/pom.xml | 2 +- .../remoting-hessian-burlap/pom.xml | 1 + .../remoting-hessian-burlap-client/pom.xml | 11 ++++--- .../remoting-hessian-burlap-server/pom.xml | 7 ++-- spring-remoting/remoting-http/pom.xml | 4 ++- .../remoting-http-client/pom.xml | 1 + .../remoting-http-server/pom.xml | 1 + spring-remoting/remoting-jms/pom.xml | 10 +++--- .../remoting-jms/remoting-jms-client/pom.xml | 7 ++-- .../remoting-jms/remoting-jms-server/pom.xml | 7 ++-- spring-remoting/remoting-rmi/pom.xml | 3 +- .../remoting-rmi/remoting-rmi-client/pom.xml | 9 ++--- .../remoting-rmi/remoting-rmi-server/pom.xml | 7 ++-- spring-rest-hal-browser/pom.xml | 3 +- spring-roo/pom.xml | 2 +- spring-security-angular/server/pom.xml | 4 +-- spring-security-cache-control/pom.xml | 2 +- .../pom.xml | 2 +- spring-security-x509/pom.xml | 3 +- .../spring-security-x509-basic-auth/pom.xml | 3 +- .../spring-security-x509-client-auth/pom.xml | 3 +- spring-session/spring-session-redis/pom.xml | 1 + spring-sleuth/pom.xml | 3 +- spring-spel/pom.xml | 2 +- spring-state-machine/pom.xml | 3 +- spring-swagger-codegen/pom.xml | 1 + .../spring-swagger-codegen-app/pom.xml | 3 +- spring-thymeleaf/pom.xml | 1 + spring-userservice/pom.xml | 4 +-- spring-vertx/pom.xml | 3 +- sse-jaxrs/pom.xml | 2 +- sse-jaxrs/sse-jaxrs-client/pom.xml | 4 +-- sse-jaxrs/sse-jaxrs-server/pom.xml | 8 ++--- static-analysis/pom.xml | 2 +- structurizr/pom.xml | 2 +- struts-2/pom.xml | 2 +- testing-modules/gatling/pom.xml | 3 +- testing-modules/groovy-spock/pom.xml | 1 + .../load-testing-comparison/pom.xml | 7 ++-- testing-modules/mockito-2/pom.xml | 2 +- testing-modules/mockserver/pom.xml | 3 +- testing-modules/parallel-tests-junit/pom.xml | 2 ++ testing-modules/selenium-junit-testng/pom.xml | 3 +- twilio/pom.xml | 3 +- vertx-and-rxjava/pom.xml | 3 +- video-tutorials/jackson-annotations/pom.xml | 3 +- vraptor/pom.xml | 2 +- xmlunit-2/pom.xml | 1 + 259 files changed, 421 insertions(+), 279 deletions(-) diff --git a/algorithms-genetic/pom.xml b/algorithms-genetic/pom.xml index 2a10a81980..662e0c5913 100644 --- a/algorithms-genetic/pom.xml +++ b/algorithms-genetic/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung algorithms-genetic 0.0.1-SNAPSHOT - + algorithms-genetic + com.baeldung parent-modules diff --git a/algorithms-miscellaneous-1/pom.xml b/algorithms-miscellaneous-1/pom.xml index 16749d452e..75b031282b 100644 --- a/algorithms-miscellaneous-1/pom.xml +++ b/algorithms-miscellaneous-1/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung algorithms-miscellaneous-1 0.0.1-SNAPSHOT - + algorithms-miscellaneous-1 + com.baeldung parent-modules diff --git a/algorithms-miscellaneous-2/pom.xml b/algorithms-miscellaneous-2/pom.xml index eeae544612..25472d4888 100644 --- a/algorithms-miscellaneous-2/pom.xml +++ b/algorithms-miscellaneous-2/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - com.baeldung algorithms-miscellaneous-2 0.0.1-SNAPSHOT + algorithms-miscellaneous-2 com.baeldung diff --git a/algorithms-sorting/pom.xml b/algorithms-sorting/pom.xml index 60ae37f2a4..2aee6e9199 100644 --- a/algorithms-sorting/pom.xml +++ b/algorithms-sorting/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - com.baeldung algorithms-sorting 0.0.1-SNAPSHOT + algorithms-sorting com.baeldung diff --git a/annotations/annotation-processing/pom.xml b/annotations/annotation-processing/pom.xml index 8e53334521..d9aca6040d 100644 --- a/annotations/annotation-processing/pom.xml +++ b/annotations/annotation-processing/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 annotation-processing - + annotation-processing + com.baeldung 1.0.0-SNAPSHOT diff --git a/annotations/annotation-user/pom.xml b/annotations/annotation-user/pom.xml index 07ea9a5b5a..422cc7f119 100644 --- a/annotations/annotation-user/pom.xml +++ b/annotations/annotation-user/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 annotation-user + annotation-user annotations diff --git a/annotations/pom.xml b/annotations/pom.xml index 2c73d3d91b..6d83f5b057 100644 --- a/annotations/pom.xml +++ b/annotations/pom.xml @@ -4,7 +4,8 @@ 4.0.0 annotations pom - + annotations + parent-modules com.baeldung diff --git a/apache-avro/pom.xml b/apache-avro/pom.xml index ddf5844271..18f9c34d64 100644 --- a/apache-avro/pom.xml +++ b/apache-avro/pom.xml @@ -3,10 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung apache-avro 0.0.1-SNAPSHOT - Apache Avro + apache-avro UTF-8 diff --git a/apache-bval/pom.xml b/apache-bval/pom.xml index 5ddb1ecb59..786f587fb1 100644 --- a/apache-bval/pom.xml +++ b/apache-bval/pom.xml @@ -4,7 +4,8 @@ apache-bval apache-bval 0.0.1-SNAPSHOT - + apache-bval + com.baeldung parent-modules diff --git a/apache-curator/pom.xml b/apache-curator/pom.xml index ac10811e7a..bcca38b199 100644 --- a/apache-curator/pom.xml +++ b/apache-curator/pom.xml @@ -4,6 +4,7 @@ apache-curator 0.0.1-SNAPSHOT jar + apache-curator com.baeldung diff --git a/apache-cxf/cxf-aegis/pom.xml b/apache-cxf/cxf-aegis/pom.xml index b7e9e426a2..1d36178b82 100644 --- a/apache-cxf/cxf-aegis/pom.xml +++ b/apache-cxf/cxf-aegis/pom.xml @@ -2,7 +2,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 cxf-aegis - + cxf-aegis + com.baeldung apache-cxf diff --git a/apache-cxf/cxf-introduction/pom.xml b/apache-cxf/cxf-introduction/pom.xml index a9e82c16b3..17f03afd25 100644 --- a/apache-cxf/cxf-introduction/pom.xml +++ b/apache-cxf/cxf-introduction/pom.xml @@ -4,7 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 cxf-introduction - + cxf-introduction + com.baeldung apache-cxf diff --git a/apache-cxf/cxf-jaxrs-implementation/pom.xml b/apache-cxf/cxf-jaxrs-implementation/pom.xml index 89acbdf1bd..03d0f67c90 100644 --- a/apache-cxf/cxf-jaxrs-implementation/pom.xml +++ b/apache-cxf/cxf-jaxrs-implementation/pom.xml @@ -4,7 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 4.0.0 cxf-jaxrs-implementation - + cxf-jaxrs-implementation + com.baeldung apache-cxf diff --git a/apache-cxf/cxf-spring/pom.xml b/apache-cxf/cxf-spring/pom.xml index 31e75e7cdd..97715af54c 100644 --- a/apache-cxf/cxf-spring/pom.xml +++ b/apache-cxf/cxf-spring/pom.xml @@ -3,6 +3,7 @@ 4.0.0 cxf-spring war + cxf-spring com.baeldung diff --git a/apache-cxf/pom.xml b/apache-cxf/pom.xml index 8918fd4450..0016f33d70 100644 --- a/apache-cxf/pom.xml +++ b/apache-cxf/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - com.baeldung apache-cxf 0.0.1-SNAPSHOT + apache-cxf pom diff --git a/apache-cxf/sse-jaxrs/pom.xml b/apache-cxf/sse-jaxrs/pom.xml index d4b6c19d03..cb5c96660a 100644 --- a/apache-cxf/sse-jaxrs/pom.xml +++ b/apache-cxf/sse-jaxrs/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 - sse-jaxrs + sse-jaxrs pom diff --git a/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml b/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml index 0f5406fbc7..c7acf22c32 100644 --- a/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml +++ b/apache-cxf/sse-jaxrs/sse-jaxrs-client/pom.xml @@ -3,15 +3,15 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + sse-jaxrs-client + sse-jaxrs-client + com.baeldung sse-jaxrs 0.0.1-SNAPSHOT - sse-jaxrs-client - 3.2.0 @@ -21,7 +21,6 @@ org.codehaus.mojo exec-maven-plugin - 1.6.0 singleEvent diff --git a/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml b/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml index 2e82dc3829..eeb5726ee1 100644 --- a/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml +++ b/apache-cxf/sse-jaxrs/sse-jaxrs-server/pom.xml @@ -3,16 +3,16 @@ 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 - + sse-jaxrs-server + sse-jaxrs-server + war + com.baeldung sse-jaxrs 0.0.1-SNAPSHOT - sse-jaxrs-server - war - 2.4.2 false diff --git a/apache-geode/pom.xml b/apache-geode/pom.xml index a3f6604ac4..738accdcb8 100644 --- a/apache-geode/pom.xml +++ b/apache-geode/pom.xml @@ -3,11 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - - com.baeldung apache-geode 1.0-SNAPSHOT - + apache-geode + com.baeldung parent-modules diff --git a/apache-opennlp/pom.xml b/apache-opennlp/pom.xml index 985c9a2df2..6b2e6a9729 100644 --- a/apache-opennlp/pom.xml +++ b/apache-opennlp/pom.xml @@ -4,6 +4,7 @@ 4.0.0 apache-opennlp 1.0-SNAPSHOT + apache-opennlp jar diff --git a/apache-poi/pom.xml b/apache-poi/pom.xml index a1ec626d43..54c3e8e928 100644 --- a/apache-poi/pom.xml +++ b/apache-poi/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - com.baeldung apache-poi 0.0.1-SNAPSHOT + apache-poi com.baeldung diff --git a/apache-pulsar/pom.xml b/apache-pulsar/pom.xml index da004a7638..a4c09586eb 100644 --- a/apache-pulsar/pom.xml +++ b/apache-pulsar/pom.xml @@ -1,21 +1,22 @@ - 4.0.0 - com.baeldung.pulsar - pulsar-java - 0.0.1 + 4.0.0 + com.baeldung.pulsar + apache-pulsar + 0.0.1 + apache-pulsar - - - org.apache.pulsar - pulsar-client - 2.1.1-incubating - compile - - - - 1.8 - 1.8 - + + + org.apache.pulsar + pulsar-client + 2.1.1-incubating + compile + + + + 1.8 + 1.8 + diff --git a/apache-shiro/pom.xml b/apache-shiro/pom.xml index 98d9563284..644d70b30a 100644 --- a/apache-shiro/pom.xml +++ b/apache-shiro/pom.xml @@ -5,7 +5,8 @@ 4.0.0 apache-shiro 1.0-SNAPSHOT - + apache-shiro + parent-boot-1 com.baeldung diff --git a/apache-thrift/pom.xml b/apache-thrift/pom.xml index b22364cb19..ab54fc2cef 100644 --- a/apache-thrift/pom.xml +++ b/apache-thrift/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - com.baeldung apache-thrift 0.0.1-SNAPSHOT + apache-thrift pom diff --git a/apache-tika/pom.xml b/apache-tika/pom.xml index 5a76fdeeda..0399914a5f 100644 --- a/apache-tika/pom.xml +++ b/apache-tika/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung apache-tika 0.0.1-SNAPSHOT - + apache-tika + com.baeldung parent-modules diff --git a/apache-zookeeper/pom.xml b/apache-zookeeper/pom.xml index 0b29186ccc..53e4217358 100644 --- a/apache-zookeeper/pom.xml +++ b/apache-zookeeper/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - com.baeldung apache-zookeeper 0.0.1-SNAPSHOT + apache-zookeeper jar diff --git a/asm/pom.xml b/asm/pom.xml index 5aad2a0e37..e56438c808 100644 --- a/asm/pom.xml +++ b/asm/pom.xml @@ -5,6 +5,7 @@ com.baeldung.examples asm 1.0 + asm jar diff --git a/atomix/pom.xml b/atomix/pom.xml index f85d2d7484..e50c1d867f 100644 --- a/atomix/pom.xml +++ b/atomix/pom.xml @@ -4,7 +4,8 @@ com.atomix.io atomix 0.0.1-SNAPSHOT - + atomix + com.baeldung parent-modules diff --git a/axon/pom.xml b/axon/pom.xml index 915a04feb5..c643ea9e57 100644 --- a/axon/pom.xml +++ b/axon/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 axon - + axon + parent-modules com.baeldung diff --git a/cas/cas-server/pom.xml b/cas/cas-server/pom.xml index 9b61aaec3d..98f5f10493 100644 --- a/cas/cas-server/pom.xml +++ b/cas/cas-server/pom.xml @@ -3,8 +3,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd "> 4.0.0 cas-server - war 1.0 + cas-server + war parent-boot-1 diff --git a/cdi/pom.xml b/cdi/pom.xml index 0b735e0ca5..0cf5062ccc 100644 --- a/cdi/pom.xml +++ b/cdi/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - com.baeldung cdi 1.0-SNAPSHOT + cdi com.baeldung diff --git a/core-groovy/pom.xml b/core-groovy/pom.xml index 909250710e..e54c766280 100644 --- a/core-groovy/pom.xml +++ b/core-groovy/pom.xml @@ -4,6 +4,7 @@ 4.0.0 core-groovy 1.0-SNAPSHOT + core-groovy jar diff --git a/core-java-9/pom.xml b/core-java-9/pom.xml index f22d0a3ed9..cd1fa74dbb 100644 --- a/core-java-9/pom.xml +++ b/core-java-9/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.baeldung core-java-9 0.2-SNAPSHOT core-java-9 diff --git a/core-java/pom.xml b/core-java/pom.xml index 9fbc8f6810..64345ab14c 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -3,8 +3,8 @@ 4.0.0 core-java 0.1.0-SNAPSHOT - jar core-java + jar com.baeldung diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml index 2b559b19e0..ed79ebc01b 100644 --- a/core-kotlin/pom.xml +++ b/core-kotlin/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 core-kotlin + core-kotlin jar diff --git a/core-scala/pom.xml b/core-scala/pom.xml index eb7c1c3330..343f21484a 100644 --- a/core-scala/pom.xml +++ b/core-scala/pom.xml @@ -4,6 +4,7 @@ 4.0.0 core-scala 1.0-SNAPSHOT + core-scala jar diff --git a/data-structures/pom.xml b/data-structures/pom.xml index c1a1f1d371..4958598234 100644 --- a/data-structures/pom.xml +++ b/data-structures/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - com.baeldung data-structures 0.0.1-SNAPSHOT + data-structures com.baeldung diff --git a/drools/pom.xml b/drools/pom.xml index 009ac8acec..b5cfc7d6dc 100644 --- a/drools/pom.xml +++ b/drools/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 drools - + drools + com.baeldung parent-spring-4 diff --git a/dubbo/pom.xml b/dubbo/pom.xml index 6f81ec5cff..9fe228bf89 100644 --- a/dubbo/pom.xml +++ b/dubbo/pom.xml @@ -2,6 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 dubbo + dubbo parent-modules diff --git a/flyway-cdi-extension/pom.xml b/flyway-cdi-extension/pom.xml index c6ee26f783..dbb32f1e5a 100644 --- a/flyway-cdi-extension/pom.xml +++ b/flyway-cdi-extension/pom.xml @@ -3,10 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung flyway-cdi-extension 1.0-SNAPSHOT + flyway-cdi-extension 1.8 diff --git a/guava-modules/guava-18/pom.xml b/guava-modules/guava-18/pom.xml index ce9395fbf4..d55aa9ce82 100644 --- a/guava-modules/guava-18/pom.xml +++ b/guava-modules/guava-18/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - com.baeldung guava-18 0.1.0-SNAPSHOT - + guava-18 + com.baeldung parent-java diff --git a/guava-modules/guava-19/pom.xml b/guava-modules/guava-19/pom.xml index 5dfb4d2cec..0548bb0c1f 100644 --- a/guava-modules/guava-19/pom.xml +++ b/guava-modules/guava-19/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - com.baeldung guava-19 0.1.0-SNAPSHOT - + guava-19 + com.baeldung parent-java diff --git a/guava-modules/guava-21/pom.xml b/guava-modules/guava-21/pom.xml index 945b7c27c1..bdb1058a48 100644 --- a/guava-modules/guava-21/pom.xml +++ b/guava-modules/guava-21/pom.xml @@ -4,7 +4,8 @@ 4.0.0 guava-21 1.0-SNAPSHOT - + guava-21 + com.baeldung parent-java diff --git a/guest/core-java-9/pom.xml b/guest/core-java-9/pom.xml index e9271b42ff..3847c19d16 100644 --- a/guest/core-java-9/pom.xml +++ b/guest/core-java-9/pom.xml @@ -4,7 +4,8 @@ com.stackify core-java-9 0.0.1-SNAPSHOT - + core-java-9 + com.baeldung parent-modules diff --git a/guest/core-java/pom.xml b/guest/core-java/pom.xml index 787dd764a1..5057f7eaed 100644 --- a/guest/core-java/pom.xml +++ b/guest/core-java/pom.xml @@ -4,6 +4,7 @@ com.stackify core-java 0.0.1-SNAPSHOT + core-java com.baeldung diff --git a/guest/core-kotlin/pom.xml b/guest/core-kotlin/pom.xml index 6b189143a4..a57dd28ffd 100644 --- a/guest/core-kotlin/pom.xml +++ b/guest/core-kotlin/pom.xml @@ -6,7 +6,8 @@ 1.0-SNAPSHOT com.stackify jar - + core-kotlin + jcenter diff --git a/guest/deep-jsf/pom.xml b/guest/deep-jsf/pom.xml index e09b5e0606..12426a8833 100644 --- a/guest/deep-jsf/pom.xml +++ b/guest/deep-jsf/pom.xml @@ -4,6 +4,7 @@ com.stackify deep-jsf 0.0.1-SNAPSHOT + deep-jsf war diff --git a/guest/junit5-example/pom.xml b/guest/junit5-example/pom.xml index 457fb1fcaa..7c0cc3e776 100644 --- a/guest/junit5-example/pom.xml +++ b/guest/junit5-example/pom.xml @@ -4,7 +4,8 @@ junit5-example junit5-example 0.0.1-SNAPSHOT - + junit5-example + com.baeldung parent-modules diff --git a/guest/log4j2-example/pom.xml b/guest/log4j2-example/pom.xml index f64869879f..ab55e0b60e 100644 --- a/guest/log4j2-example/pom.xml +++ b/guest/log4j2-example/pom.xml @@ -4,7 +4,8 @@ log4j2-example log4j2-example 0.0.1-SNAPSHOT - + log4j2-example + com.baeldung parent-modules diff --git a/guest/logback-example/pom.xml b/guest/logback-example/pom.xml index 04de6a00a2..6e9fe0ddea 100644 --- a/guest/logback-example/pom.xml +++ b/guest/logback-example/pom.xml @@ -4,6 +4,7 @@ com.stackify logback-example 0.0.1-SNAPSHOT + logback-example com.baeldung diff --git a/guest/memory-leaks/pom.xml b/guest/memory-leaks/pom.xml index 956ae9c408..f1d411acbc 100644 --- a/guest/memory-leaks/pom.xml +++ b/guest/memory-leaks/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung memory-leaks 0.0.1-SNAPSHOT - + memory-leaks + com.baeldung parent-modules diff --git a/guest/remote-debugging/pom.xml b/guest/remote-debugging/pom.xml index 974421de97..07b9cc49d8 100644 --- a/guest/remote-debugging/pom.xml +++ b/guest/remote-debugging/pom.xml @@ -5,8 +5,8 @@ com.stackify remote-debugging 0.0.1-SNAPSHOT + remote-debugging war - remote-debugging org.springframework.boot diff --git a/guest/slf4j/guide/pom.xml b/guest/slf4j/guide/pom.xml index 0db9b46247..657ede73b6 100644 --- a/guest/slf4j/guide/pom.xml +++ b/guest/slf4j/guide/pom.xml @@ -2,13 +2,12 @@ 4.0.0 - com.stackify.slf4j.guide slf4j-parent-module 1.0.0-SNAPSHOT + slf4j-parent-module pom - org.springframework.boot spring-boot-starter-parent diff --git a/guest/slf4j/guide/slf4j-log4j/pom.xml b/guest/slf4j/guide/slf4j-log4j/pom.xml index 0d08fa6191..bca5392f4d 100644 --- a/guest/slf4j/guide/slf4j-log4j/pom.xml +++ b/guest/slf4j/guide/slf4j-log4j/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - slf4j-log4j 0.0.1-SNAPSHOT + slf4j-log4j jar diff --git a/guest/slf4j/guide/slf4j-log4j2/pom.xml b/guest/slf4j/guide/slf4j-log4j2/pom.xml index 643649335f..9473362cb8 100644 --- a/guest/slf4j/guide/slf4j-log4j2/pom.xml +++ b/guest/slf4j/guide/slf4j-log4j2/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - slf4j-log4j2 0.0.1-SNAPSHOT + slf4j-log4j2 jar diff --git a/guest/slf4j/guide/slf4j-logback/pom.xml b/guest/slf4j/guide/slf4j-logback/pom.xml index e8aebf0ef6..0327e79732 100644 --- a/guest/slf4j/guide/slf4j-logback/pom.xml +++ b/guest/slf4j/guide/slf4j-logback/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - slf4j-logback 0.0.1-SNAPSHOT + slf4j-logback jar diff --git a/guest/spring-boot-app/pom.xml b/guest/spring-boot-app/pom.xml index 7daa8f668e..423dadbb99 100644 --- a/guest/spring-boot-app/pom.xml +++ b/guest/spring-boot-app/pom.xml @@ -4,6 +4,7 @@ spring-boot-app spring-boot-app 0.0.1-SNAPSHOT + spring-boot-app war diff --git a/guest/spring-mvc/pom.xml b/guest/spring-mvc/pom.xml index c0ef451605..3bffb1530d 100644 --- a/guest/spring-mvc/pom.xml +++ b/guest/spring-mvc/pom.xml @@ -5,8 +5,8 @@ com.stackify.guest spring-mvc 0.0.1-SNAPSHOT - jar spring-mvc + jar Spring MVC sample project diff --git a/guest/thread-pools/pom.xml b/guest/thread-pools/pom.xml index db9a5ac89f..2591cb2746 100644 --- a/guest/thread-pools/pom.xml +++ b/guest/thread-pools/pom.xml @@ -4,7 +4,8 @@ com.stackify thread-pools 0.0.1-SNAPSHOT - + thread-pools + com.baeldung parent-modules diff --git a/guest/tomcat-app/pom.xml b/guest/tomcat-app/pom.xml index 7fd27e869b..9ce77c758a 100644 --- a/guest/tomcat-app/pom.xml +++ b/guest/tomcat-app/pom.xml @@ -4,6 +4,7 @@ com.stackify tomcat-app 0.0.1-SNAPSHOT + tomcat-app war diff --git a/guest/webservices/rest-client/pom.xml b/guest/webservices/rest-client/pom.xml index 5e52b7161c..8508186e86 100644 --- a/guest/webservices/rest-client/pom.xml +++ b/guest/webservices/rest-client/pom.xml @@ -3,6 +3,7 @@ com.stackify rest-client 0.0.1-SNAPSHOT + rest-client war diff --git a/guest/webservices/rest-server/pom.xml b/guest/webservices/rest-server/pom.xml index 4b3d241293..c576924215 100644 --- a/guest/webservices/rest-server/pom.xml +++ b/guest/webservices/rest-server/pom.xml @@ -4,6 +4,7 @@ com.stackify rest-server 0.0.1-SNAPSHOT + rest-server war diff --git a/guest/webservices/spring-rest-service/pom.xml b/guest/webservices/spring-rest-service/pom.xml index 49d35766e8..fcec8a3e12 100644 --- a/guest/webservices/spring-rest-service/pom.xml +++ b/guest/webservices/spring-rest-service/pom.xml @@ -4,6 +4,7 @@ com.stackify spring-rest-service 0.0.1-SNAPSHOT + spring-rest-service war diff --git a/helidon/helidon-mp/pom.xml b/helidon/helidon-mp/pom.xml index 1ec1131a67..1f39431886 100644 --- a/helidon/helidon-mp/pom.xml +++ b/helidon/helidon-mp/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - helidon-mp - + helidon-mp + com.baeldung.helidon helidon diff --git a/helidon/helidon-se/pom.xml b/helidon/helidon-se/pom.xml index 5e14ecb81c..8982bf048e 100644 --- a/helidon/helidon-se/pom.xml +++ b/helidon/helidon-se/pom.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - helidon-se - + helidon-se + com.baeldung.helidon helidon diff --git a/helidon/pom.xml b/helidon/pom.xml index ea8cc52ee0..85bab4db42 100644 --- a/helidon/pom.xml +++ b/helidon/pom.xml @@ -2,10 +2,9 @@ 4.0.0 - com.baeldung.helidon helidon - 1.0.0-SNAPSHOT + helidon pom diff --git a/image-processing/pom.xml b/image-processing/pom.xml index fe8001ae3a..ce75145dc7 100644 --- a/image-processing/pom.xml +++ b/image-processing/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - com.baeldung image-processing 1.0-SNAPSHOT - + image-processing + com.baeldung parent-modules diff --git a/immutables/pom.xml b/immutables/pom.xml index 17510690b0..efb21e584a 100644 --- a/immutables/pom.xml +++ b/immutables/pom.xml @@ -3,8 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 immutables - 1.0.0-SNAPSHOT - + immutables + com.baeldung parent-modules diff --git a/java-ee-8-security-api/app-auth-basic-store-db/pom.xml b/java-ee-8-security-api/app-auth-basic-store-db/pom.xml index 6ecc9f7e80..cf92fe2ecd 100644 --- a/java-ee-8-security-api/app-auth-basic-store-db/pom.xml +++ b/java-ee-8-security-api/app-auth-basic-store-db/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - app-auth-basic-store-db + app-auth-basic-store-db war diff --git a/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml b/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml index bf5315e993..43809f1cd5 100644 --- a/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml +++ b/java-ee-8-security-api/app-auth-custom-form-store-custom/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - app-auth-custom-form-store-custom + app-auth-custom-form-store-custom war diff --git a/java-ee-8-security-api/app-auth-custom-no-store/pom.xml b/java-ee-8-security-api/app-auth-custom-no-store/pom.xml index c05c0f19be..f9d63f8623 100644 --- a/java-ee-8-security-api/app-auth-custom-no-store/pom.xml +++ b/java-ee-8-security-api/app-auth-custom-no-store/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - app-auth-custom-no-store + app-auth-custom-no-store war diff --git a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml b/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml index 570b36add5..6a7b97b2d7 100644 --- a/java-ee-8-security-api/app-auth-form-store-ldap/pom.xml +++ b/java-ee-8-security-api/app-auth-form-store-ldap/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 - app-auth-form-store-ldap + app-auth-form-store-ldap war diff --git a/java-ee-8-security-api/pom.xml b/java-ee-8-security-api/pom.xml index 7546839492..ad33c74ad3 100644 --- a/java-ee-8-security-api/pom.xml +++ b/java-ee-8-security-api/pom.xml @@ -5,6 +5,7 @@ 4.0.0 java-ee-8-security-api 1.0-SNAPSHOT + java-ee-8-security-api pom diff --git a/java-lite/pom.xml b/java-lite/pom.xml index 5111cd2e7f..03f4e29f4e 100644 --- a/java-lite/pom.xml +++ b/java-lite/pom.xml @@ -5,6 +5,7 @@ org.baeldung java-lite 1.0-SNAPSHOT + java-lite war diff --git a/java-rmi/pom.xml b/java-rmi/pom.xml index 33931baedf..ad413b66ab 100644 --- a/java-rmi/pom.xml +++ b/java-rmi/pom.xml @@ -4,6 +4,7 @@ com.baeldung.rmi java-rmi 1.0-SNAPSHOT + java-rmi jar diff --git a/java-spi/exchange-rate-api/pom.xml b/java-spi/exchange-rate-api/pom.xml index b626916b56..fd3a7ae0a7 100644 --- a/java-spi/exchange-rate-api/pom.xml +++ b/java-spi/exchange-rate-api/pom.xml @@ -2,6 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 exchange-rate-api + exchange-rate-api jar diff --git a/java-spi/exchange-rate-app/pom.xml b/java-spi/exchange-rate-app/pom.xml index a42a30ceda..7a076d560c 100644 --- a/java-spi/exchange-rate-app/pom.xml +++ b/java-spi/exchange-rate-app/pom.xml @@ -2,6 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 exchange-rate-app + exchange-rate-app jar diff --git a/java-spi/exchange-rate-impl/pom.xml b/java-spi/exchange-rate-impl/pom.xml index 41c874c659..8a77b51793 100644 --- a/java-spi/exchange-rate-impl/pom.xml +++ b/java-spi/exchange-rate-impl/pom.xml @@ -2,6 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 exchange-rate-impl + exchange-rate-impl jar diff --git a/java-spi/pom.xml b/java-spi/pom.xml index 9ac87bf960..97a22024bd 100644 --- a/java-spi/pom.xml +++ b/java-spi/pom.xml @@ -2,6 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 java-spi + java-spi pom diff --git a/java-vavr-stream/pom.xml b/java-vavr-stream/pom.xml index 395d2c81ba..c92f3c8742 100644 --- a/java-vavr-stream/pom.xml +++ b/java-vavr-stream/pom.xml @@ -5,6 +5,7 @@ com.baeldung.samples java-vavr-stream 1.0 + java-vavr-stream jar diff --git a/java-websocket/pom.xml b/java-websocket/pom.xml index e8ff8dfc36..7ba3ca61d0 100644 --- a/java-websocket/pom.xml +++ b/java-websocket/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung java-websocket - war 0.0.1-SNAPSHOT + java-websocket + war com.baeldung diff --git a/javafx/pom.xml b/javafx/pom.xml index c9c5bc294e..44e6f7e8da 100644 --- a/javafx/pom.xml +++ b/javafx/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 javafx - + javafx + parent-modules com.baeldung diff --git a/javax-servlets/pom.xml b/javax-servlets/pom.xml index 7b4eecd880..f00dd0ebe8 100644 --- a/javax-servlets/pom.xml +++ b/javax-servlets/pom.xml @@ -5,6 +5,7 @@ com.baeldung.javax-servlets javax-servlets 1.0-SNAPSHOT + javax-servlets war diff --git a/javaxval/pom.xml b/javaxval/pom.xml index 22f1827213..5f2690b5b4 100644 --- a/javaxval/pom.xml +++ b/javaxval/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung javaxval 0.1-SNAPSHOT - + javaxval + com.baeldung parent-modules diff --git a/jee-7/pom.xml b/jee-7/pom.xml index 9011648d17..97ed2cc51d 100644 --- a/jee-7/pom.xml +++ b/jee-7/pom.xml @@ -5,6 +5,7 @@ 4.0.0 jee-7 1.0-SNAPSHOT + jee-7 war JavaEE 7 Arquillian Archetype Sample diff --git a/jenkins/hello-world/pom.xml b/jenkins/hello-world/pom.xml index fb2154c7ad..f00a551173 100644 --- a/jenkins/hello-world/pom.xml +++ b/jenkins/hello-world/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - jenkins-hello-world + hello-world 1.0-SNAPSHOT + hello-world hpi - Hello World Plugin A sample Jenkins Hello World plugin diff --git a/jersey/pom.xml b/jersey/pom.xml index b55bdc5330..a3adb4cf5a 100644 --- a/jersey/pom.xml +++ b/jersey/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - com.baeldung jersey 0.0.1-SNAPSHOT + jersey war diff --git a/jhipster/jhipster-microservice/pom.xml b/jhipster/jhipster-microservice/pom.xml index 4a60e47f87..051d5f70b7 100644 --- a/jhipster/jhipster-microservice/pom.xml +++ b/jhipster/jhipster-microservice/pom.xml @@ -3,9 +3,9 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 jhipster-microservice + jhipster-microservice pom - JHipster Microservice - + jhipster com.baeldung.jhipster diff --git a/jhipster/jhipster-monolithic/pom.xml b/jhipster/jhipster-monolithic/pom.xml index e242668759..12dead99df 100644 --- a/jhipster/jhipster-monolithic/pom.xml +++ b/jhipster/jhipster-monolithic/pom.xml @@ -3,6 +3,7 @@ 4.0.0 jhipster-monolithic war + jhipster-monolithic JHipster Monolithic Application diff --git a/jni/pom.xml b/jni/pom.xml index d4cc409d33..4850e07ed7 100644 --- a/jni/pom.xml +++ b/jni/pom.xml @@ -2,7 +2,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 jni - + jni + com.baeldung parent-modules diff --git a/jsf/pom.xml b/jsf/pom.xml index 2ac8a9f7c2..fc6d4a0ee2 100644 --- a/jsf/pom.xml +++ b/jsf/pom.xml @@ -4,6 +4,7 @@ 4.0.0 jsf 0.1-SNAPSHOT + jsf war diff --git a/json/pom.xml b/json/pom.xml index b688baec06..db98ec437e 100644 --- a/json/pom.xml +++ b/json/pom.xml @@ -4,7 +4,8 @@ org.baeldung json 0.0.1-SNAPSHOT - + json + com.baeldung parent-modules diff --git a/jsoup/pom.xml b/jsoup/pom.xml index 2704d7bc00..f6e25e7a23 100644 --- a/jsoup/pom.xml +++ b/jsoup/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 jsoup + jsoup jar diff --git a/jta/pom.xml b/jta/pom.xml index 89bdccf25e..4754c1872b 100644 --- a/jta/pom.xml +++ b/jta/pom.xml @@ -3,8 +3,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 - jta-demo + jta 1.0-SNAPSHOT + jta jar JEE JTA demo diff --git a/jws/pom.xml b/jws/pom.xml index 1970ab9921..2c89b687f8 100644 --- a/jws/pom.xml +++ b/jws/pom.xml @@ -3,9 +3,9 @@ 4.0.0 com.example jws - war 0.0.1-SNAPSHOT - jws-example + jws + war com.baeldung diff --git a/kotlin-libraries/pom.xml b/kotlin-libraries/pom.xml index 92a643e458..ae77a9aa2d 100644 --- a/kotlin-libraries/pom.xml +++ b/kotlin-libraries/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 kotlin-libraries + kotlin-libraries jar diff --git a/libraries-server/pom.xml b/libraries-server/pom.xml index 6fca09faf4..661f5f01d5 100644 --- a/libraries-server/pom.xml +++ b/libraries-server/pom.xml @@ -1,9 +1,10 @@ 4.0.0 - com.baeldung libraries-server 0.0.1-SNAPSHOT + libraries-server + com.baeldung parent-modules diff --git a/linkrest/pom.xml b/linkrest/pom.xml index a27caea1ff..073a173aff 100644 --- a/linkrest/pom.xml +++ b/linkrest/pom.xml @@ -1,9 +1,9 @@ 4.0.0 - com.baeldung linkrest 0.0.1-SNAPSHOT + linkrest war diff --git a/logging-modules/log4j/pom.xml b/logging-modules/log4j/pom.xml index 1b27e03445..40db69fb94 100644 --- a/logging-modules/log4j/pom.xml +++ b/logging-modules/log4j/pom.xml @@ -6,6 +6,7 @@ com.baeldung log4j 1.0-SNAPSHOT + log4j com.baeldung diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml index 65da318636..d46f92dcd6 100644 --- a/logging-modules/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 log4j2 - + log4j2 + com.baeldung parent-modules diff --git a/maven-archetype/pom.xml b/maven-archetype/pom.xml index f7871c81ea..73ddc78fc7 100644 --- a/maven-archetype/pom.xml +++ b/maven-archetype/pom.xml @@ -5,9 +5,10 @@ com.baeldung.archetypes maven-archetype 1.0-SNAPSHOT + maven-archetype maven-archetype Archetype used to generate rest application based on jaxrs 2.1 - + diff --git a/maven-polyglot/maven-polyglot-json-extension/pom.xml b/maven-polyglot/maven-polyglot-json-extension/pom.xml index d5c5b7ab55..fe1e025d1f 100644 --- a/maven-polyglot/maven-polyglot-json-extension/pom.xml +++ b/maven-polyglot/maven-polyglot-json-extension/pom.xml @@ -3,11 +3,11 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.maven.polyglot maven-polyglot-json-extension 1.0-SNAPSHOT - + maven-polyglot-json-extension + 1.8 1.8 diff --git a/maven/pom.xml b/maven/pom.xml index 4bec533226..01fd28db74 100644 --- a/maven/pom.xml +++ b/maven/pom.xml @@ -4,6 +4,7 @@ com.baeldung maven 0.0.1-SNAPSHOT + maven war diff --git a/maven/versions-maven-plugin/pom.xml b/maven/versions-maven-plugin/pom.xml index 295c77b860..dc0cba75f9 100644 --- a/maven/versions-maven-plugin/pom.xml +++ b/maven/versions-maven-plugin/pom.xml @@ -3,9 +3,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 - versions-maven-plugin-example + versions-maven-plugin 0.0.1-SNAPSHOT - + versions-maven-plugin + 1.15 diff --git a/mesos-marathon/pom.xml b/mesos-marathon/pom.xml index f92c00892b..dee8eca10d 100644 --- a/mesos-marathon/pom.xml +++ b/mesos-marathon/pom.xml @@ -5,7 +5,8 @@ com.baeldung mesos-marathon 0.0.1-SNAPSHOT - + mesos-marathon + parent-boot-1 com.baeldung diff --git a/metrics/pom.xml b/metrics/pom.xml index 9cf1ec588f..79d340aa49 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 metrics - + metrics + parent-modules com.baeldung diff --git a/microprofile/pom.xml b/microprofile/pom.xml index d75b6443ed..52df348ace 100644 --- a/microprofile/pom.xml +++ b/microprofile/pom.xml @@ -5,6 +5,7 @@ com.baeldung microprofile 1.0-SNAPSHOT + microprofile war diff --git a/msf4j/pom.xml b/msf4j/pom.xml index 9a6483772b..4a6f63159d 100644 --- a/msf4j/pom.xml +++ b/msf4j/pom.xml @@ -5,6 +5,7 @@ com.baeldung.msf4j msf4j 0.0.1-SNAPSHOT + msf4j parent-modules diff --git a/muleesb/pom.xml b/muleesb/pom.xml index b34123567a..4b74b6d4f4 100644 --- a/muleesb/pom.xml +++ b/muleesb/pom.xml @@ -6,9 +6,9 @@ com.mycompany muleesb 1.0.0-SNAPSHOT - mule - Mule muleesb Application - + muleesb + mule + com.baeldung parent-modules diff --git a/mybatis/pom.xml b/mybatis/pom.xml index aa9ff9e288..4e63d14ded 100644 --- a/mybatis/pom.xml +++ b/mybatis/pom.xml @@ -5,7 +5,8 @@ com.baeldung mybatis 1.0.0-SNAPSHOT - + mybatis + com.baeldung parent-modules diff --git a/optaplanner/pom.xml b/optaplanner/pom.xml index 22abbedc8c..fbce0ea072 100644 --- a/optaplanner/pom.xml +++ b/optaplanner/pom.xml @@ -2,14 +2,15 @@ + 4.0.0 + optaplanner + optaplanner + parent-modules com.baeldung 1.0.0-SNAPSHOT - 4.0.0 - - optaplanner diff --git a/parent-boot-1/pom.xml b/parent-boot-1/pom.xml index 171806390d..53f91f975d 100644 --- a/parent-boot-1/pom.xml +++ b/parent-boot-1/pom.xml @@ -3,6 +3,7 @@ 4.0.0 parent-boot-1 0.0.1-SNAPSHOT + parent-boot-1 pom Parent for all Spring Boot 1.x modules diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index 67837e1a4e..89afd79bf4 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -3,6 +3,7 @@ 4.0.0 parent-boot-2 0.0.1-SNAPSHOT + parent-boot-2 pom Parent for all Spring Boot 2 modules diff --git a/patterns/design-patterns/pom.xml b/patterns/design-patterns/pom.xml index dc2631b36e..ac201ad653 100644 --- a/patterns/design-patterns/pom.xml +++ b/patterns/design-patterns/pom.xml @@ -4,7 +4,9 @@ 4.0.0 design-patterns 1.0 - jar + design-patterns + jar + com.baeldung patterns diff --git a/patterns/front-controller/pom.xml b/patterns/front-controller/pom.xml index 435b0dd9cd..bb003dd00a 100644 --- a/patterns/front-controller/pom.xml +++ b/patterns/front-controller/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 front-controller + front-controller war diff --git a/patterns/intercepting-filter/pom.xml b/patterns/intercepting-filter/pom.xml index fa94d5d1fd..33589dc242 100644 --- a/patterns/intercepting-filter/pom.xml +++ b/patterns/intercepting-filter/pom.xml @@ -2,8 +2,8 @@ 4.0.0 - intercepting-filter + intercepting-filter war diff --git a/patterns/pom.xml b/patterns/pom.xml index df09f1836a..bc1f5173e2 100644 --- a/patterns/pom.xml +++ b/patterns/pom.xml @@ -4,6 +4,7 @@ 4.0.0 patterns pom + patterns com.baeldung diff --git a/performance-tests/pom.xml b/performance-tests/pom.xml index 8c9d027724..7d77c2a0e3 100644 --- a/performance-tests/pom.xml +++ b/performance-tests/pom.xml @@ -4,7 +4,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 performance-tests - + performance-tests + parent-modules com.baeldung diff --git a/persistence-modules/hbase/pom.xml b/persistence-modules/hbase/pom.xml index ffd1464482..daf0db5291 100644 --- a/persistence-modules/hbase/pom.xml +++ b/persistence-modules/hbase/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 hbase + hbase parent-modules diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 24f4055a82..363e2153b6 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -5,6 +5,7 @@ com.baeldung hibernate5 0.0.1-SNAPSHOT + hibernate5 com.baeldung diff --git a/persistence-modules/java-cassandra/pom.xml b/persistence-modules/java-cassandra/pom.xml index 36ec6b5ac8..aac5d49547 100644 --- a/persistence-modules/java-cassandra/pom.xml +++ b/persistence-modules/java-cassandra/pom.xml @@ -4,6 +4,7 @@ com.baeldung java-cassandra 1.0.0-SNAPSHOT + java-cassandra com.baeldung diff --git a/persistence-modules/java-cockroachdb/pom.xml b/persistence-modules/java-cockroachdb/pom.xml index 870707c750..2a92934a6e 100644 --- a/persistence-modules/java-cockroachdb/pom.xml +++ b/persistence-modules/java-cockroachdb/pom.xml @@ -5,6 +5,7 @@ com.baeldung java-cockroachdb 1.0-SNAPSHOT + java-cockroachdb parent-modules diff --git a/persistence-modules/java-jdbi/pom.xml b/persistence-modules/java-jdbi/pom.xml index 885906fcd0..9281f4fd9d 100644 --- a/persistence-modules/java-jdbi/pom.xml +++ b/persistence-modules/java-jdbi/pom.xml @@ -4,6 +4,7 @@ 4.0.0 java-jdbi 1.0-SNAPSHOT + java-jdbi parent-modules diff --git a/persistence-modules/java-jpa/pom.xml b/persistence-modules/java-jpa/pom.xml index 78764f7148..ddab51a2e2 100644 --- a/persistence-modules/java-jpa/pom.xml +++ b/persistence-modules/java-jpa/pom.xml @@ -2,15 +2,16 @@ + 4.0.0 + java-jpa + java-jpa + parent-modules com.baeldung 1.0.0-SNAPSHOT ../../pom.xml - 4.0.0 - - java-jpa diff --git a/persistence-modules/java-mongodb/pom.xml b/persistence-modules/java-mongodb/pom.xml index bbc48f54c2..9658ef567f 100644 --- a/persistence-modules/java-mongodb/pom.xml +++ b/persistence-modules/java-mongodb/pom.xml @@ -5,6 +5,7 @@ com.baeldung java-mongodb 1.0-SNAPSHOT + java-mongodb com.baeldung diff --git a/persistence-modules/jnosql/jnosql-artemis/pom.xml b/persistence-modules/jnosql/jnosql-artemis/pom.xml index 9c2bfd1ba0..8a978fb179 100644 --- a/persistence-modules/jnosql/jnosql-artemis/pom.xml +++ b/persistence-modules/jnosql/jnosql-artemis/pom.xml @@ -3,6 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + jnosql-artemis + jnosql-artemis + war com.baeldung.jnosql @@ -10,9 +13,6 @@ 1.0-SNAPSHOT - jnosql-artemis - war - 2.4.2 false diff --git a/persistence-modules/jnosql/jnosql-diana/pom.xml b/persistence-modules/jnosql/jnosql-diana/pom.xml index 767defb2a8..126f0314d9 100644 --- a/persistence-modules/jnosql/jnosql-diana/pom.xml +++ b/persistence-modules/jnosql/jnosql-diana/pom.xml @@ -3,15 +3,15 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + jnosql-diana + jnosql-diana + com.baeldung.jnosql jnosql 1.0-SNAPSHOT - jnosql-diana - diff --git a/persistence-modules/jnosql/pom.xml b/persistence-modules/jnosql/pom.xml index c87ad3cf4b..5fb29a3b9c 100644 --- a/persistence-modules/jnosql/pom.xml +++ b/persistence-modules/jnosql/pom.xml @@ -3,10 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.jnosql jnosql 1.0-SNAPSHOT + jnosql pom diff --git a/persistence-modules/liquibase/pom.xml b/persistence-modules/liquibase/pom.xml index cb2bee8d48..b06d38e6a0 100644 --- a/persistence-modules/liquibase/pom.xml +++ b/persistence-modules/liquibase/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 liquibase + liquibase parent-modules diff --git a/persistence-modules/orientdb/pom.xml b/persistence-modules/orientdb/pom.xml index e4bc9a0585..a8ac3fb789 100644 --- a/persistence-modules/orientdb/pom.xml +++ b/persistence-modules/orientdb/pom.xml @@ -4,8 +4,8 @@ 4.0.0 orientdb 0.0.1-SNAPSHOT + orientdb jar - intro-orientdb introduction to the OrientDB Java APIs diff --git a/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml b/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml index 4d677ab0d4..6ebc75de8d 100644 --- a/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml +++ b/persistence-modules/spring-boot-h2/spring-boot-h2-database/pom.xml @@ -3,10 +3,10 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.h2db spring-boot-h2-database 0.0.1-SNAPSHOT + spring-boot-h2-database jar Demo Spring Boot applications that starts H2 in memory database diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index 80472fdd57..0ea42b1cb7 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -2,11 +2,11 @@ - 4.0.0 - + 4.0.0 com.baeldung spring-boot-persistence 0.1.0 + spring-boot-persistence parent-boot-2 diff --git a/persistence-modules/spring-data-gemfire/pom.xml b/persistence-modules/spring-data-gemfire/pom.xml index 34346c502f..292b7387ac 100644 --- a/persistence-modules/spring-data-gemfire/pom.xml +++ b/persistence-modules/spring-data-gemfire/pom.xml @@ -5,6 +5,7 @@ com.baeldung spring-data-gemfire 1.0.0-SNAPSHOT + spring-data-gemfire jar diff --git a/persistence-modules/spring-data-jpa/pom.xml b/persistence-modules/spring-data-jpa/pom.xml index 643210ab89..786e587734 100644 --- a/persistence-modules/spring-data-jpa/pom.xml +++ b/persistence-modules/spring-data-jpa/pom.xml @@ -5,6 +5,7 @@ 4.0.0 com.baeldung spring-data-jpa + spring-data-jpa parent-boot-2 diff --git a/persistence-modules/spring-data-keyvalue/pom.xml b/persistence-modules/spring-data-keyvalue/pom.xml index 6675595f2b..1fee0a88d4 100644 --- a/persistence-modules/spring-data-keyvalue/pom.xml +++ b/persistence-modules/spring-data-keyvalue/pom.xml @@ -2,6 +2,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-data-keyvalue + spring-data-keyvalue parent-boot-2 diff --git a/persistence-modules/spring-data-neo4j/pom.xml b/persistence-modules/spring-data-neo4j/pom.xml index 2be4df71be..1e5d51ddf2 100644 --- a/persistence-modules/spring-data-neo4j/pom.xml +++ b/persistence-modules/spring-data-neo4j/pom.xml @@ -3,7 +3,8 @@ 4.0.0 spring-data-neo4j 1.0 - + spring-data-neo4j + com.baeldung parent-modules diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml index bee3d683b8..683f874b6c 100644 --- a/persistence-modules/spring-data-redis/pom.xml +++ b/persistence-modules/spring-data-redis/pom.xml @@ -4,6 +4,7 @@ com.baeldung spring-data-redis 1.0 + spring-data-redis jar diff --git a/protobuffer/pom.xml b/protobuffer/pom.xml index ff443a1615..d9e6cb26e4 100644 --- a/protobuffer/pom.xml +++ b/protobuffer/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 protobuffer - + protobuffer + parent-modules com.baeldung diff --git a/reactor-core/pom.xml b/reactor-core/pom.xml index cf720ad6ea..db9550df7b 100644 --- a/reactor-core/pom.xml +++ b/reactor-core/pom.xml @@ -1,11 +1,11 @@ 4.0.0 - org.baeldung reactor-core 0.0.1-SNAPSHOT - + reactor-core + com.baeldung parent-modules diff --git a/rxjava-2/pom.xml b/rxjava-2/pom.xml index a18b096b6d..3b4c167f3a 100644 --- a/rxjava-2/pom.xml +++ b/rxjava-2/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - rxjava-2 1.0-SNAPSHOT - + rxjava-2 + com.baeldung parent-java diff --git a/rxjava/pom.xml b/rxjava/pom.xml index b316001d87..596a5196da 100644 --- a/rxjava/pom.xml +++ b/rxjava/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - rxjava 1.0-SNAPSHOT - + rxjava + com.baeldung parent-java diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml index 5c723c6e29..aa73cf11ae 100644 --- a/spring-5-data-reactive/pom.xml +++ b/spring-5-data-reactive/pom.xml @@ -3,6 +3,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-5-data-reactive + spring-5-data-reactive jar diff --git a/spring-amqp-simple/pom.xml b/spring-amqp-simple/pom.xml index ea9c227d8c..57d84acee6 100644 --- a/spring-amqp-simple/pom.xml +++ b/spring-amqp-simple/pom.xml @@ -5,6 +5,7 @@ com.baeldung spring-amqp-simple 1.0.0-SNAPSHOT + spring-amqp-simple parent-boot-1 diff --git a/spring-boot-admin/pom.xml b/spring-boot-admin/pom.xml index 58cea728cc..23852dee57 100644 --- a/spring-boot-admin/pom.xml +++ b/spring-boot-admin/pom.xml @@ -3,6 +3,7 @@ 4.0.0 spring-boot-admin 0.0.1-SNAPSHOT + spring-boot-admin pom diff --git a/spring-boot-autoconfiguration/pom.xml b/spring-boot-autoconfiguration/pom.xml index b88587f731..1c3d8796ed 100644 --- a/spring-boot-autoconfiguration/pom.xml +++ b/spring-boot-autoconfiguration/pom.xml @@ -5,7 +5,7 @@ spring-boot-autoconfiguration 0.0.1-SNAPSHOT war - spring-boot-auto-configuration + spring-boot-autoconfiguration This is simple boot application demonstrating a custom auto-configuration diff --git a/spring-boot-camel/pom.xml b/spring-boot-camel/pom.xml index 19a0bec809..8bab0ed5c8 100644 --- a/spring-boot-camel/pom.xml +++ b/spring-boot-camel/pom.xml @@ -5,7 +5,8 @@ com.example spring-boot-camel 0.0.1-SNAPSHOT - + spring-boot-camel + com.baeldung parent-modules diff --git a/spring-boot-crud/pom.xml b/spring-boot-crud/pom.xml index f803a7e70b..749bf9cb5a 100644 --- a/spring-boot-crud/pom.xml +++ b/spring-boot-crud/pom.xml @@ -3,10 +3,10 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 - com.baeldung.spring-boot-crud spring-boot-crud 0.1.0 + spring-boot-crud org.springframework.boot diff --git a/spring-boot-ctx-fluent/pom.xml b/spring-boot-ctx-fluent/pom.xml index f9b691aea7..b238374612 100644 --- a/spring-boot-ctx-fluent/pom.xml +++ b/spring-boot-ctx-fluent/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung spring-boot-ctx-fluent 0.0.1-SNAPSHOT + spring-boot-ctx-fluent jar diff --git a/spring-boot-custom-starter/greeter-library/pom.xml b/spring-boot-custom-starter/greeter-library/pom.xml index 3717ba005c..7e0c5c4d22 100644 --- a/spring-boot-custom-starter/greeter-library/pom.xml +++ b/spring-boot-custom-starter/greeter-library/pom.xml @@ -1,10 +1,11 @@ 4.0.0 - com.baeldung greeter-library 0.0.1-SNAPSHOT + greeter-library + spring-boot-custom-starter com.baeldung 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 5862bdd6c8..1e4ee698c6 100644 --- a/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml +++ b/spring-boot-custom-starter/greeter-spring-boot-autoconfigure/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung greeter-spring-boot-autoconfigure 0.0.1-SNAPSHOT + greeter-spring-boot-autoconfigure spring-boot-custom-starter diff --git a/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml index 88c5d1caf5..91cc41d669 100644 --- a/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml +++ b/spring-boot-custom-starter/greeter-spring-boot-sample-app/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung greeter-spring-boot-sample-app 0.0.1-SNAPSHOT + greeter-spring-boot-sample-app spring-boot-custom-starter diff --git a/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml index e71882db29..560d6fa79b 100644 --- a/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml +++ b/spring-boot-custom-starter/greeter-spring-boot-starter/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - com.baeldung greeter-spring-boot-starter 0.0.1-SNAPSHOT + greeter-spring-boot-starter spring-boot-custom-starter diff --git a/spring-boot-custom-starter/greeter/pom.xml b/spring-boot-custom-starter/greeter/pom.xml index 3cfd6da09e..95fcaa66c8 100644 --- a/spring-boot-custom-starter/greeter/pom.xml +++ b/spring-boot-custom-starter/greeter/pom.xml @@ -1,10 +1,11 @@ 4.0.0 - com.baeldung greeter 0.0.1-SNAPSHOT + greeter + parent-boot-1 com.baeldung diff --git a/spring-boot-custom-starter/pom.xml b/spring-boot-custom-starter/pom.xml index 97b33ce2b8..9c03cfdd0e 100644 --- a/spring-boot-custom-starter/pom.xml +++ b/spring-boot-custom-starter/pom.xml @@ -4,6 +4,7 @@ com.baeldung spring-boot-custom-starter 0.0.1-SNAPSHOT + spring-boot-custom-starter pom diff --git a/spring-boot-disable-console-logging/disabling-console-jul/pom.xml b/spring-boot-disable-console-logging/disabling-console-jul/pom.xml index ceac0616e9..fbcd0768f9 100644 --- a/spring-boot-disable-console-logging/disabling-console-jul/pom.xml +++ b/spring-boot-disable-console-logging/disabling-console-jul/pom.xml @@ -2,7 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 disabling-console-jul - + disabling-console-jul diff --git a/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml b/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml index d6e9a8b5e5..6f3f01669e 100644 --- a/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml +++ b/spring-boot-disable-console-logging/disabling-console-log4j2/pom.xml @@ -2,7 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 disabling-console-log4j2 - + disabling-console-log4j2 diff --git a/spring-boot-disable-console-logging/disabling-console-logback/pom.xml b/spring-boot-disable-console-logging/disabling-console-logback/pom.xml index f18066ea03..fef0a1f4c6 100644 --- a/spring-boot-disable-console-logging/disabling-console-logback/pom.xml +++ b/spring-boot-disable-console-logging/disabling-console-logback/pom.xml @@ -1,11 +1,13 @@ 4.0.0 + disabling-console-logback + disabling-console-logback + com.baeldung spring-boot-disable-console-logging 0.0.1-SNAPSHOT - disabling-console-logback diff --git a/spring-boot-disable-console-logging/pom.xml b/spring-boot-disable-console-logging/pom.xml index ec84372f99..63ed129347 100644 --- a/spring-boot-disable-console-logging/pom.xml +++ b/spring-boot-disable-console-logging/pom.xml @@ -2,6 +2,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-boot-disable-console-logging + spring-boot-disable-console-logging pom Projects for Disabling Spring Boot Console Logging tutorials diff --git a/spring-boot-logging-log4j2/pom.xml b/spring-boot-logging-log4j2/pom.xml index 38dc5fb341..ad678a14cf 100644 --- a/spring-boot-logging-log4j2/pom.xml +++ b/spring-boot-logging-log4j2/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - spring-boot-logging-log4j2 jar + spring-boot-logging-log4j2 Demo project for Spring Boot Logging with Log4J2 diff --git a/spring-boot-property-exp/property-exp-custom-config/pom.xml b/spring-boot-property-exp/property-exp-custom-config/pom.xml index ab22c5ad30..9988924408 100644 --- a/spring-boot-property-exp/property-exp-custom-config/pom.xml +++ b/spring-boot-property-exp/property-exp-custom-config/pom.xml @@ -1,11 +1,10 @@ 4.0.0 - property-exp-custom - com.baeldung property-exp-custom-config 0.0.1-SNAPSHOT + property-exp-custom-config jar diff --git a/spring-boot-property-exp/property-exp-default-config/pom.xml b/spring-boot-property-exp/property-exp-default-config/pom.xml index 4ede36e61a..7892288f45 100644 --- a/spring-boot-property-exp/property-exp-default-config/pom.xml +++ b/spring-boot-property-exp/property-exp-default-config/pom.xml @@ -1,11 +1,10 @@ 4.0.0 - property-exp-default - com.baeldung property-exp-default-config 0.0.1-SNAPSHOT + property-exp-default-config jar diff --git a/spring-cloud-bus/pom.xml b/spring-cloud-bus/pom.xml index d493c4e984..784e4cbae6 100644 --- a/spring-cloud-bus/pom.xml +++ b/spring-cloud-bus/pom.xml @@ -7,6 +7,7 @@ spring-cloud-bus 1.0.0-SNAPSHOT pom + spring-cloud-bus parent-boot-1 diff --git a/spring-cloud-data-flow/etl/pom.xml b/spring-cloud-data-flow/etl/pom.xml index 2b904f6e0d..e203999ee9 100644 --- a/spring-cloud-data-flow/etl/pom.xml +++ b/spring-cloud-data-flow/etl/pom.xml @@ -5,7 +5,8 @@ etl-spring-cloud-data-flow 0.0.1-SNAPSHOT pom - + etl-spring-cloud-data-flow + org.baeldung.spring.cloud spring-cloud-data-flow diff --git a/spring-cloud-data-flow/pom.xml b/spring-cloud-data-flow/pom.xml index 5a007f3c7d..dd1ceed71a 100644 --- a/spring-cloud-data-flow/pom.xml +++ b/spring-cloud-data-flow/pom.xml @@ -5,7 +5,8 @@ spring-cloud-data-flow 0.0.1-SNAPSHOT pom - + spring-cloud-data-flow + com.baeldung parent-modules diff --git a/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml b/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml index 3ffbf8f619..96f6c8711e 100644 --- a/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml +++ b/spring-cloud/spring-cloud-archaius/dynamodb-config/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 dynamodb-config + dynamodb-config jar diff --git a/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml b/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml index bb283576d8..59dea4890e 100644 --- a/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml +++ b/spring-cloud/spring-cloud-archaius/jdbc-config/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 jdbc-config + jdbc-config jar diff --git a/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml b/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml index 8f8ec99ad8..51010eefb2 100644 --- a/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml +++ b/spring-cloud/spring-cloud-archaius/zookeeper-config/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 zookeeper-config + zookeeper-config jar diff --git a/spring-cloud/spring-cloud-aws/pom.xml b/spring-cloud/spring-cloud-aws/pom.xml index 09518483a4..7edabd03f5 100644 --- a/spring-cloud/spring-cloud-aws/pom.xml +++ b/spring-cloud/spring-cloud-aws/pom.xml @@ -5,7 +5,7 @@ com.baeldung.spring.cloud spring-cloud-aws jar - Spring Cloud AWS + spring-cloud-aws Spring Cloud AWS Examples diff --git a/spring-cloud/spring-cloud-bootstrap/config/pom.xml b/spring-cloud/spring-cloud-bootstrap/config/pom.xml index 14a926fc2c..1379af0b05 100644 --- a/spring-cloud/spring-cloud-bootstrap/config/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/config/pom.xml @@ -4,6 +4,7 @@ 4.0.0 config 1.0.0-SNAPSHOT + config parent-boot-1 diff --git a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml index f94d8829f6..735d3745d7 100644 --- a/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/discovery/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - discovery 1.0.0-SNAPSHOT + discovery parent-boot-1 diff --git a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml index fc69c16738..2efa926e3a 100644 --- a/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/gateway/pom.xml @@ -4,6 +4,7 @@ 4.0.0 gateway 1.0.0-SNAPSHOT + gateway parent-boot-1 diff --git a/spring-cloud/spring-cloud-bootstrap/pom.xml b/spring-cloud/spring-cloud-bootstrap/pom.xml index 74801159eb..46460c0d74 100644 --- a/spring-cloud/spring-cloud-bootstrap/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/pom.xml @@ -4,6 +4,7 @@ 4.0.0 spring-cloud-bootstrap 1.0.0-SNAPSHOT + spring-cloud-bootstrap pom diff --git a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml index c0d920d373..eb855a91e3 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-book/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - com.baeldung.spring.cloud svc-book 1.0.0-SNAPSHOT + svc-book parent-boot-1 diff --git a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml index 3aa2db8f65..7c1e93bad1 100644 --- a/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/svc-rating/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - com.baeldung.spring.cloud svc-rating 1.0.0-SNAPSHOT + svc-rating parent-boot-1 diff --git a/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml b/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml index 8735e24d48..1bf9ecb9e7 100644 --- a/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml +++ b/spring-cloud/spring-cloud-bootstrap/zipkin/pom.xml @@ -4,6 +4,7 @@ 4.0.0 zipkin 1.0.0-SNAPSHOT + zipkin parent-boot-1 diff --git a/spring-cloud/spring-cloud-config/client/pom.xml b/spring-cloud/spring-cloud-config/client/pom.xml index 800a496a82..c55f9bc471 100644 --- a/spring-cloud/spring-cloud-config/client/pom.xml +++ b/spring-cloud/spring-cloud-config/client/pom.xml @@ -3,13 +3,14 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + client + client + com.baeldung.spring.cloud spring-cloud-config 1.0-SNAPSHOT - client diff --git a/spring-cloud/spring-cloud-config/pom.xml b/spring-cloud/spring-cloud-config/pom.xml index b28828bf37..1a4efc7a60 100644 --- a/spring-cloud/spring-cloud-config/pom.xml +++ b/spring-cloud/spring-cloud-config/pom.xml @@ -5,6 +5,7 @@ com.baeldung.spring.cloud spring-cloud-config 1.0-SNAPSHOT + spring-cloud-config pom diff --git a/spring-cloud/spring-cloud-config/server/pom.xml b/spring-cloud/spring-cloud-config/server/pom.xml index 7bbb903cf9..b4be7663e2 100644 --- a/spring-cloud/spring-cloud-config/server/pom.xml +++ b/spring-cloud/spring-cloud-config/server/pom.xml @@ -3,13 +3,14 @@ xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - + server + server + com.baeldung.spring.cloud spring-cloud-config 1.0-SNAPSHOT - server diff --git a/spring-cloud/spring-cloud-connectors-heroku/pom.xml b/spring-cloud/spring-cloud-connectors-heroku/pom.xml index f00c9eb1fc..d2e9292511 100644 --- a/spring-cloud/spring-cloud-connectors-heroku/pom.xml +++ b/spring-cloud/spring-cloud-connectors-heroku/pom.xml @@ -5,6 +5,7 @@ com.baeldung.spring.cloud spring-cloud-connectors-heroku 1.0.0-SNAPSHOT + spring-cloud-connectors-heroku parent-boot-1 diff --git a/spring-cloud/spring-cloud-contract/pom.xml b/spring-cloud/spring-cloud-contract/pom.xml index 5dde6a7a99..3563d0ee58 100644 --- a/spring-cloud/spring-cloud-contract/pom.xml +++ b/spring-cloud/spring-cloud-contract/pom.xml @@ -6,6 +6,7 @@ com.baeldung.spring.cloud spring-cloud-contract 1.0.0-SNAPSHOT + spring-cloud-contract com.baeldung.spring.cloud diff --git a/spring-cloud/spring-cloud-eureka/pom.xml b/spring-cloud/spring-cloud-eureka/pom.xml index 7f7e2650d5..99d8c0ed40 100644 --- a/spring-cloud/spring-cloud-eureka/pom.xml +++ b/spring-cloud/spring-cloud-eureka/pom.xml @@ -6,7 +6,7 @@ spring-cloud-eureka 1.0.0-SNAPSHOT pom - Spring Cloud Eureka + spring-cloud-eureka Spring Cloud Eureka Server and Sample Clients diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml index 0bf9547aff..5378095af0 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-client/pom.xml @@ -2,12 +2,10 @@ 4.0.0 - spring-cloud-eureka-client 1.0.0-SNAPSHOT jar - - Spring Cloud Eureka Client + spring-cloud-eureka-client Spring Cloud Eureka Sample Client diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml index d572b10d40..f2057c8a76 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-feign-client/pom.xml @@ -5,7 +5,7 @@ spring-cloud-eureka-feign-client 1.0.0-SNAPSHOT jar - Spring Cloud Eureka Feign Client + spring-cloud-eureka-feign-client Spring Cloud Eureka - Sample Feign Client diff --git a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml index da2c50d3c7..587aed6c49 100644 --- a/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml +++ b/spring-cloud/spring-cloud-eureka/spring-cloud-eureka-server/pom.xml @@ -5,7 +5,7 @@ spring-cloud-eureka-server 1.0.0-SNAPSHOT jar - Spring Cloud Eureka Server + spring-cloud-eureka-server Spring Cloud Eureka Server Demo diff --git a/spring-cloud/spring-cloud-functions/pom.xml b/spring-cloud/spring-cloud-functions/pom.xml index 8b2b0ad385..5686fc8c64 100644 --- a/spring-cloud/spring-cloud-functions/pom.xml +++ b/spring-cloud/spring-cloud-functions/pom.xml @@ -3,13 +3,11 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.spring - cloudfunction-aws + spring-cloud-functions 0.0.1-SNAPSHOT jar - - cloudfunction-aws + spring-cloud-functions Demo project for Spring Cloud Function diff --git a/spring-cloud/spring-cloud-gateway/pom.xml b/spring-cloud/spring-cloud-gateway/pom.xml index 4d8b57d4cf..c297d90896 100644 --- a/spring-cloud/spring-cloud-gateway/pom.xml +++ b/spring-cloud/spring-cloud-gateway/pom.xml @@ -4,7 +4,7 @@ 4.0.0 spring-cloud-gateway jar - Spring Cloud Gateway + spring-cloud-gateway com.baeldung.spring.cloud diff --git a/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml b/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml index 308a81fd74..f7b04baec3 100644 --- a/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/demo-backend/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 demo-backend - + demo-backend + com.baeldung.spring.cloud spring-cloud-kubernetes diff --git a/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml b/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml index 968529c648..da55ca5034 100644 --- a/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/demo-frontend/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 demo-frontend - + demo-frontend + com.baeldung.spring.cloud spring-cloud-kubernetes diff --git a/spring-cloud/spring-cloud-kubernetes/pom.xml b/spring-cloud/spring-cloud-kubernetes/pom.xml index fd9f7b5876..984b3811dd 100644 --- a/spring-cloud/spring-cloud-kubernetes/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/pom.xml @@ -2,11 +2,11 @@ 4.0.0 - com.baeldung.spring.cloud spring-cloud-kubernetes 1.0-SNAPSHOT pom + spring-cloud-kubernetes demo-frontend diff --git a/spring-cloud/spring-cloud-security/auth-server/pom.xml b/spring-cloud/spring-cloud-security/auth-server/pom.xml index 92f92808f6..4b3f94b825 100644 --- a/spring-cloud/spring-cloud-security/auth-server/pom.xml +++ b/spring-cloud/spring-cloud-security/auth-server/pom.xml @@ -3,6 +3,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 auth-server + auth-server Spring Cloud Security APP Server Module diff --git a/spring-cloud/spring-cloud-task/pom.xml b/spring-cloud/spring-cloud-task/pom.xml index ef76d464bc..748cc378f1 100644 --- a/spring-cloud/spring-cloud-task/pom.xml +++ b/spring-cloud/spring-cloud-task/pom.xml @@ -6,6 +6,7 @@ spring-cloud-task 1.0.0-SNAPSHOT pom + spring-cloud-task parent-boot-1 diff --git a/spring-cloud/spring-cloud-zookeeper/pom.xml b/spring-cloud/spring-cloud-zookeeper/pom.xml index 4535c2072d..9661f2b71a 100644 --- a/spring-cloud/spring-cloud-zookeeper/pom.xml +++ b/spring-cloud/spring-cloud-zookeeper/pom.xml @@ -4,7 +4,8 @@ 4.0.0 spring-cloud-zookeeper pom - + spring-cloud-zookeeper + com.baeldung.spring.cloud spring-cloud diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml index 6a5b7ddb55..c4f7ae704a 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-client/pom.xml @@ -5,7 +5,7 @@ eureka-client 1.0.0-SNAPSHOT jar - Spring Cloud Eureka Client + eureka-client Spring Cloud Eureka Sample Client diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml index e3c5109a26..0256ee7000 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/eureka-server/pom.xml @@ -5,7 +5,7 @@ eureka-server 1.0.0-SNAPSHOT jar - Spring Cloud Eureka Server + eureka-server Spring Cloud Eureka Server Demo diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml index 4d3687134f..edd7b9d99e 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/pom.xml @@ -7,7 +7,7 @@ spring-cloud-zuul-eureka-integration 1.0.0-SNAPSHOT pom - Spring Cloud Zuul and Eureka Integration + spring-cloud-zuul-eureka-integration Spring Cloud Zuul and Eureka Integration diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml index e64ceb501e..39f94efdf0 100644 --- a/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/zuul-server/pom.xml @@ -2,6 +2,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 zuul-server + zuul-server com.baeldung.spring.cloud diff --git a/spring-drools/pom.xml b/spring-drools/pom.xml index 8c65d5e34e..5bb2d6a8e9 100644 --- a/spring-drools/pom.xml +++ b/spring-drools/pom.xml @@ -5,7 +5,8 @@ com.baeldung spring-drools 1.0.0-SNAPSHOT - + spring-drools + com.baeldung parent-modules diff --git a/spring-ejb/spring-ejb-remote/pom.xml b/spring-ejb/spring-ejb-remote/pom.xml index 4756846cc8..797cc3ac68 100644 --- a/spring-ejb/spring-ejb-remote/pom.xml +++ b/spring-ejb/spring-ejb-remote/pom.xml @@ -4,7 +4,8 @@ 4.0.0 spring-ejb-remote ejb - + spring-ejb-remote + com.baeldung.spring.ejb spring-ejb diff --git a/spring-ejb/wildfly/pom.xml b/spring-ejb/wildfly/pom.xml index 8f7d4c287a..f50dad82f1 100644 --- a/spring-ejb/wildfly/pom.xml +++ b/spring-ejb/wildfly/pom.xml @@ -2,10 +2,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.wildfly - wildfly-example + wildfly 0.0.1-SNAPSHOT pom - wildfly-example + wildfly com.baeldung.spring.ejb diff --git a/spring-ejb/wildfly/widlfly-web/pom.xml b/spring-ejb/wildfly/widlfly-web/pom.xml index 559c5f1755..1dcb18a230 100644 --- a/spring-ejb/wildfly/widlfly-web/pom.xml +++ b/spring-ejb/wildfly/widlfly-web/pom.xml @@ -3,7 +3,8 @@ 4.0.0 widlfly-web war - + widlfly-web + com.baeldung.wildfly wildfly-example diff --git a/spring-ejb/wildfly/wildfly-ear/pom.xml b/spring-ejb/wildfly/wildfly-ear/pom.xml index d1e47ecd0f..dc9059370f 100644 --- a/spring-ejb/wildfly/wildfly-ear/pom.xml +++ b/spring-ejb/wildfly/wildfly-ear/pom.xml @@ -3,7 +3,8 @@ 4.0.0 wildfly-ear ear - + wildfly-ear + com.baeldung.wildfly wildfly-example diff --git a/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml b/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml index ec502f2ab3..0324aa8e47 100644 --- a/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml +++ b/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml @@ -2,7 +2,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 wildfly-ejb-interfaces - + wildfly-ejb-interfaces + com.baeldung.wildfly wildfly-example diff --git a/spring-ejb/wildfly/wildfly-ejb/pom.xml b/spring-ejb/wildfly/wildfly-ejb/pom.xml index 2c87ec8449..22bceef044 100644 --- a/spring-ejb/wildfly/wildfly-ejb/pom.xml +++ b/spring-ejb/wildfly/wildfly-ejb/pom.xml @@ -3,7 +3,8 @@ 4.0.0 wildfly-ejb ejb - + wildfly-ejb + com.baeldung.wildfly wildfly-example diff --git a/spring-ejb/wildfly/wildfly-jpa/pom.xml b/spring-ejb/wildfly/wildfly-jpa/pom.xml index 12cf2c81e4..6a0352c102 100644 --- a/spring-ejb/wildfly/wildfly-jpa/pom.xml +++ b/spring-ejb/wildfly/wildfly-jpa/pom.xml @@ -2,7 +2,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 wildfly-jpa - + wildfly-jpa + com.baeldung.wildfly wildfly-example diff --git a/spring-freemarker/pom.xml b/spring-freemarker/pom.xml index 4ff57e27f0..02f2a3fd06 100644 --- a/spring-freemarker/pom.xml +++ b/spring-freemarker/pom.xml @@ -5,7 +5,7 @@ spring-freemarker war 1.0-SNAPSHOT - Spring Freemarker Example + spring-freemarker com.baeldung diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml index 872835177d..5e7b50d291 100644 --- a/spring-jersey/pom.xml +++ b/spring-jersey/pom.xml @@ -6,7 +6,8 @@ spring-jersey 0.1-SNAPSHOT war - + spring-jersey + com.baeldung parent-modules diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml index 744ae34cc8..bbd6025418 100644 --- a/spring-jooq/pom.xml +++ b/spring-jooq/pom.xml @@ -2,7 +2,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-jooq - + spring-jooq + parent-boot-1 com.baeldung diff --git a/spring-katharsis/pom.xml b/spring-katharsis/pom.xml index 39648a982c..756aae93d3 100644 --- a/spring-katharsis/pom.xml +++ b/spring-katharsis/pom.xml @@ -5,7 +5,8 @@ spring-katharsis 0.0.1-SNAPSHOT war - + spring-katharsis + parent-boot-1 com.baeldung diff --git a/spring-ldap/pom.xml b/spring-ldap/pom.xml index 3b2525d899..7399a84c2b 100644 --- a/spring-ldap/pom.xml +++ b/spring-ldap/pom.xml @@ -5,6 +5,7 @@ spring-ldap 0.1-SNAPSHOT jar + spring-ldap com.baeldung diff --git a/spring-mvc-simple/pom.xml b/spring-mvc-simple/pom.xml index e4e30183eb..8d7ad0fa7f 100644 --- a/spring-mvc-simple/pom.xml +++ b/spring-mvc-simple/pom.xml @@ -4,8 +4,7 @@ spring-mvc-simple war 0.0.1-SNAPSHOT - Spring MVC simple Maven Webapp - http://maven.apache.org + spring-mvc-simple com.baeldung diff --git a/spring-mybatis/pom.xml b/spring-mybatis/pom.xml index 7b8b66fef1..af70cb6377 100644 --- a/spring-mybatis/pom.xml +++ b/spring-mybatis/pom.xml @@ -5,8 +5,7 @@ spring-mybatis jar 0.0.1-SNAPSHOT - spring-mybatis Maven Webapp - http://maven.apache.org + spring-mybatis com.baeldung diff --git a/spring-reactive-kotlin/pom.xml b/spring-reactive-kotlin/pom.xml index bff39984e0..7bd31396f7 100644 --- a/spring-reactive-kotlin/pom.xml +++ b/spring-reactive-kotlin/pom.xml @@ -4,7 +4,7 @@ 4.0.0 spring-reactive-kotlin jar - Spring Reactive Kotlin + spring-reactive-kotlin Demo project for Spring Boot diff --git a/spring-remoting/remoting-hessian-burlap/pom.xml b/spring-remoting/remoting-hessian-burlap/pom.xml index 6cb5a51812..e63d0ee22e 100644 --- a/spring-remoting/remoting-hessian-burlap/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/pom.xml @@ -5,6 +5,7 @@ 4.0.0 remoting-hessian-burlap pom + remoting-hessian-burlap spring-remoting diff --git a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml index f337d5e51f..104712c3d7 100644 --- a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-client/pom.xml @@ -2,15 +2,16 @@ - + 4.0.0 + spring-remoting-hessian-burlap-client + spring-remoting-hessian-burlap-client + + remoting-hessian-burlap com.baeldung 1.0-SNAPSHOT - 4.0.0 - - spring-remoting-hessian-burlap-client - + org.springframework.boot diff --git a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml index 5b6e03348f..33b824442f 100644 --- a/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/remoting-hessian-burlap-server/pom.xml @@ -2,14 +2,15 @@ + 4.0.0 + remoting-hessian-burlap-server + remoting-hessian-burlap-server + remoting-hessian-burlap com.baeldung 1.0-SNAPSHOT - 4.0.0 - - remoting-hessian-burlap-server diff --git a/spring-remoting/remoting-http/pom.xml b/spring-remoting/remoting-http/pom.xml index 3262736ec8..886a28b886 100644 --- a/spring-remoting/remoting-http/pom.xml +++ b/spring-remoting/remoting-http/pom.xml @@ -4,8 +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 remoting-http - Parent for all modules related to HTTP Spring Remoting. pom + + remoting-http + Parent for all modules related to HTTP Spring Remoting. com.baeldung diff --git a/spring-remoting/remoting-http/remoting-http-client/pom.xml b/spring-remoting/remoting-http/remoting-http-client/pom.xml index 9a6e98ffdd..56412d3cdf 100644 --- a/spring-remoting/remoting-http/remoting-http-client/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-client/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 remoting-http-client + remoting-http-client Shows how to invoke a remote service using Spring Remoting HTTP. diff --git a/spring-remoting/remoting-http/remoting-http-server/pom.xml b/spring-remoting/remoting-http/remoting-http-server/pom.xml index 53d27a5efa..c3f87e776e 100644 --- a/spring-remoting/remoting-http/remoting-http-server/pom.xml +++ b/spring-remoting/remoting-http/remoting-http-server/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 remoting-http-server + remoting-http-server Shows how to expose a service using Spring Remoting HTTP. diff --git a/spring-remoting/remoting-jms/pom.xml b/spring-remoting/remoting-jms/pom.xml index fe36431423..e24b5b7929 100644 --- a/spring-remoting/remoting-jms/pom.xml +++ b/spring-remoting/remoting-jms/pom.xml @@ -2,18 +2,20 @@ + 4.0.0 + remoting-jms + remoting-jms + pom + spring-remoting com.baeldung 1.0-SNAPSHOT - 4.0.0 - pom + remoting-jms-client remoting-jms-server - remoting-jms - \ No newline at end of file diff --git a/spring-remoting/remoting-jms/remoting-jms-client/pom.xml b/spring-remoting/remoting-jms/remoting-jms-client/pom.xml index ed27282a38..b7b1af5a1a 100644 --- a/spring-remoting/remoting-jms/remoting-jms-client/pom.xml +++ b/spring-remoting/remoting-jms/remoting-jms-client/pom.xml @@ -2,14 +2,15 @@ + 4.0.0 + remoting-jms-client + remoting-jms-client + remoting-jms com.baeldung 1.0-SNAPSHOT - 4.0.0 - - remoting-jms-client UTF-8 diff --git a/spring-remoting/remoting-jms/remoting-jms-server/pom.xml b/spring-remoting/remoting-jms/remoting-jms-server/pom.xml index 7657267f1d..8a17cdb0a9 100644 --- a/spring-remoting/remoting-jms/remoting-jms-server/pom.xml +++ b/spring-remoting/remoting-jms/remoting-jms-server/pom.xml @@ -2,14 +2,15 @@ + 4.0.0 + remoting-jms-server + remoting-jms-server + remoting-jms com.baeldung 1.0-SNAPSHOT - 4.0.0 - - remoting-jms-server UTF-8 diff --git a/spring-remoting/remoting-rmi/pom.xml b/spring-remoting/remoting-rmi/pom.xml index cd15a6ec60..b3b84786b8 100644 --- a/spring-remoting/remoting-rmi/pom.xml +++ b/spring-remoting/remoting-rmi/pom.xml @@ -3,8 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - pom remoting-rmi + pom + remoting-rmi spring-remoting diff --git a/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml index 1e3cd4b977..4ac0283e94 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml +++ b/spring-remoting/remoting-rmi/remoting-rmi-client/pom.xml @@ -2,15 +2,16 @@ + 4.0.0 + remoting-rmi-client + remoting-rmi-client + remoting-rmi com.baeldung 1.0-SNAPSHOT - 4.0.0 - - remoting-rmi-client - + org.springframework.boot diff --git a/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml b/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml index 68b01829e1..7fb4d2c1bc 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml +++ b/spring-remoting/remoting-rmi/remoting-rmi-server/pom.xml @@ -2,14 +2,15 @@ + 4.0.0 + remoting-rmi-server + remoting-rmi-server + remoting-rmi com.baeldung 1.0-SNAPSHOT - 4.0.0 - - remoting-rmi-server UTF-8 diff --git a/spring-rest-hal-browser/pom.xml b/spring-rest-hal-browser/pom.xml index 6c56faf0b2..ee0a2c043d 100644 --- a/spring-rest-hal-browser/pom.xml +++ b/spring-rest-hal-browser/pom.xml @@ -3,10 +3,11 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung spring-rest-hal-browser 1.0-SNAPSHOT + spring-rest-hal-browser + diff --git a/spring-roo/pom.xml b/spring-roo/pom.xml index c205c98dc0..baa0e7f5e6 100644 --- a/spring-roo/pom.xml +++ b/spring-roo/pom.xml @@ -6,7 +6,7 @@ com.baeldung spring-roo 1.0.0.BUILD-SNAPSHOT - Spring Roo + spring-roo jar diff --git a/spring-security-angular/server/pom.xml b/spring-security-angular/server/pom.xml index c1faecca55..55269bb35f 100644 --- a/spring-security-angular/server/pom.xml +++ b/spring-security-angular/server/pom.xml @@ -3,10 +3,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 - spring-security-angular + server 0.0.1-SNAPSHOT jar - spring-security-angular + server Spring Security Angular diff --git a/spring-security-cache-control/pom.xml b/spring-security-cache-control/pom.xml index b7dfc9db3a..c630774849 100644 --- a/spring-security-cache-control/pom.xml +++ b/spring-security-cache-control/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - com.baeldung spring-security-cache-control 1.0-SNAPSHOT + spring-security-cache-control parent-boot-1 diff --git a/spring-security-client/spring-security-jsp-authentication/pom.xml b/spring-security-client/spring-security-jsp-authentication/pom.xml index 0e564b47b8..9bb58863d9 100644 --- a/spring-security-client/spring-security-jsp-authentication/pom.xml +++ b/spring-security-client/spring-security-jsp-authentication/pom.xml @@ -6,7 +6,7 @@ spring-security-jsp-authentication 0.0.1-SNAPSHOT war - spring-security-jsp-authenticate + spring-security-jsp-authentication Spring Security JSP Authentication tag sample diff --git a/spring-security-x509/pom.xml b/spring-security-x509/pom.xml index 0cee3b3129..658840e866 100644 --- a/spring-security-x509/pom.xml +++ b/spring-security-x509/pom.xml @@ -6,7 +6,8 @@ spring-security-x509 0.0.1-SNAPSHOT pom - + spring-security-x509 + parent-boot-1 com.baeldung diff --git a/spring-security-x509/spring-security-x509-basic-auth/pom.xml b/spring-security-x509/spring-security-x509-basic-auth/pom.xml index 67f2b4fbcd..5b68a8e63b 100644 --- a/spring-security-x509/spring-security-x509-basic-auth/pom.xml +++ b/spring-security-x509/spring-security-x509-basic-auth/pom.xml @@ -2,11 +2,10 @@ 4.0.0 - spring-security-x509-basic-auth 0.0.1-SNAPSHOT jar - Spring Security x.509 Basic Authentication + spring-security-x509-basic-auth Spring x.509 Authentication Demo diff --git a/spring-security-x509/spring-security-x509-client-auth/pom.xml b/spring-security-x509/spring-security-x509-client-auth/pom.xml index 5cb4001a94..47ec7f971d 100644 --- a/spring-security-x509/spring-security-x509-client-auth/pom.xml +++ b/spring-security-x509/spring-security-x509-client-auth/pom.xml @@ -2,11 +2,10 @@ 4.0.0 - spring-security-x509-client-auth 0.0.1-SNAPSHOT jar - Spring Security x.509 Client Authentication + spring-security-x509-client-auth Spring x.509 Client Authentication Demo diff --git a/spring-session/spring-session-redis/pom.xml b/spring-session/spring-session-redis/pom.xml index 00da656226..96d90b2776 100644 --- a/spring-session/spring-session-redis/pom.xml +++ b/spring-session/spring-session-redis/pom.xml @@ -5,6 +5,7 @@ spring-session-redis 1.0.0-SNAPSHOT jar + spring-session-redis parent-boot-1 diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml index a9a8d3e96e..5ce9e07858 100644 --- a/spring-sleuth/pom.xml +++ b/spring-sleuth/pom.xml @@ -6,7 +6,8 @@ spring-sleuth 1.0.0-SNAPSHOT jar - + spring-sleuth + parent-boot-1 com.baeldung diff --git a/spring-spel/pom.xml b/spring-spel/pom.xml index 4af318fde2..aa6eb45158 100644 --- a/spring-spel/pom.xml +++ b/spring-spel/pom.xml @@ -5,7 +5,7 @@ com.baeldung spring-spel 1.0-SNAPSHOT - Spring SpEL + spring-spel com.baeldung diff --git a/spring-state-machine/pom.xml b/spring-state-machine/pom.xml index 5d15e4dfad..b911b5b5ee 100644 --- a/spring-state-machine/pom.xml +++ b/spring-state-machine/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-state-machine - + spring-state-machine + parent-modules com.baeldung diff --git a/spring-swagger-codegen/pom.xml b/spring-swagger-codegen/pom.xml index 8e551d850f..e1bb98360e 100644 --- a/spring-swagger-codegen/pom.xml +++ b/spring-swagger-codegen/pom.xml @@ -4,6 +4,7 @@ spring-swagger-codegen 0.0.1-SNAPSHOT pom + spring-swagger-codegen com.baeldung diff --git a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml index 4aff696828..f9410b6865 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-app/pom.xml @@ -2,7 +2,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 spring-swagger-codegen-app - + spring-swagger-codegen-app + com.baeldung spring-swagger-codegen diff --git a/spring-thymeleaf/pom.xml b/spring-thymeleaf/pom.xml index 0926728aba..78f95fe1df 100644 --- a/spring-thymeleaf/pom.xml +++ b/spring-thymeleaf/pom.xml @@ -5,6 +5,7 @@ spring-thymeleaf 0.1-SNAPSHOT war + spring-thymeleaf com.baeldung diff --git a/spring-userservice/pom.xml b/spring-userservice/pom.xml index 7144a57ca6..e562171103 100644 --- a/spring-userservice/pom.xml +++ b/spring-userservice/pom.xml @@ -1,12 +1,12 @@ 4.0.0 - spring-userservice spring-userservice 0.0.1-SNAPSHOT war - + spring-userservice + com.baeldung parent-spring-4 diff --git a/spring-vertx/pom.xml b/spring-vertx/pom.xml index 790eeff128..14ed77d359 100644 --- a/spring-vertx/pom.xml +++ b/spring-vertx/pom.xml @@ -2,10 +2,9 @@ 4.0.0 - spring-vertx jar - Spring Vertx + spring-vertx A demo project with vertx spring integration diff --git a/sse-jaxrs/pom.xml b/sse-jaxrs/pom.xml index ac9bff937f..68d1b1bc2b 100644 --- a/sse-jaxrs/pom.xml +++ b/sse-jaxrs/pom.xml @@ -3,10 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.baeldung.sse sse-jaxrs 1.0-SNAPSHOT + sse-jaxrs pom diff --git a/sse-jaxrs/sse-jaxrs-client/pom.xml b/sse-jaxrs/sse-jaxrs-client/pom.xml index a9068e133f..15a991bfc0 100644 --- a/sse-jaxrs/sse-jaxrs-client/pom.xml +++ b/sse-jaxrs/sse-jaxrs-client/pom.xml @@ -3,6 +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 + sse-jaxrs-client + sse-jaxrs-client com.baeldung.sse @@ -10,8 +12,6 @@ 1.0-SNAPSHOT - sse-jaxrs-client - 3.2.0 diff --git a/sse-jaxrs/sse-jaxrs-server/pom.xml b/sse-jaxrs/sse-jaxrs-server/pom.xml index 1e89c70e13..825dcddbdf 100644 --- a/sse-jaxrs/sse-jaxrs-server/pom.xml +++ b/sse-jaxrs/sse-jaxrs-server/pom.xml @@ -3,16 +3,16 @@ 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 - + sse-jaxrs-server + war + sse-jaxrs-server + com.baeldung.sse sse-jaxrs 1.0-SNAPSHOT - sse-jaxrs-server - war - 2.4.2 false diff --git a/static-analysis/pom.xml b/static-analysis/pom.xml index 14853d81f7..94d68f895b 100644 --- a/static-analysis/pom.xml +++ b/static-analysis/pom.xml @@ -2,10 +2,10 @@ 4.0.0 - com.baeldung static-analysis 1.0-SNAPSHOT + static-analysis com.baeldung diff --git a/structurizr/pom.xml b/structurizr/pom.xml index cbbbf8d68c..76b1e355f1 100644 --- a/structurizr/pom.xml +++ b/structurizr/pom.xml @@ -2,9 +2,9 @@ 4.0.0 - com.baeldung structurizr + structurizr com.baeldung diff --git a/struts-2/pom.xml b/struts-2/pom.xml index fee68c8303..ac8579d9e0 100644 --- a/struts-2/pom.xml +++ b/struts-2/pom.xml @@ -5,7 +5,7 @@ struts-2 0.0.1-SNAPSHOT pom - Struts 2 + struts-2 com.baeldung diff --git a/testing-modules/gatling/pom.xml b/testing-modules/gatling/pom.xml index 8d4c89ec62..158da176c6 100644 --- a/testing-modules/gatling/pom.xml +++ b/testing-modules/gatling/pom.xml @@ -6,7 +6,8 @@ org.baeldung gatling 1.0-SNAPSHOT - + gatling + com.baeldung parent-modules diff --git a/testing-modules/groovy-spock/pom.xml b/testing-modules/groovy-spock/pom.xml index e0da345eb4..3dd01c29ab 100644 --- a/testing-modules/groovy-spock/pom.xml +++ b/testing-modules/groovy-spock/pom.xml @@ -6,6 +6,7 @@ groovy-spock 1.0-SNAPSHOT jar + groovy-spock com.baeldung diff --git a/testing-modules/load-testing-comparison/pom.xml b/testing-modules/load-testing-comparison/pom.xml index 869eda1bb5..42614d310b 100644 --- a/testing-modules/load-testing-comparison/pom.xml +++ b/testing-modules/load-testing-comparison/pom.xml @@ -2,15 +2,16 @@ + 4.0.0 + load-testing-comparison + load-testing-comparison + parent-modules com.baeldung 1.0.0-SNAPSHOT ../../pom.xml - 4.0.0 - - load-testing-bakeoff 1.8 diff --git a/testing-modules/mockito-2/pom.xml b/testing-modules/mockito-2/pom.xml index cab4d7977b..5f60566566 100644 --- a/testing-modules/mockito-2/pom.xml +++ b/testing-modules/mockito-2/pom.xml @@ -5,7 +5,7 @@ mockito-2 0.0.1-SNAPSHOT jar - mockito-2-with-java8 + mockito-2 com.baeldung diff --git a/testing-modules/mockserver/pom.xml b/testing-modules/mockserver/pom.xml index c2fa2870e2..1db409bd7c 100644 --- a/testing-modules/mockserver/pom.xml +++ b/testing-modules/mockserver/pom.xml @@ -5,7 +5,8 @@ com.baeldung mockserver 1.0.0-SNAPSHOT - + mockserver + com.baeldung parent-modules diff --git a/testing-modules/parallel-tests-junit/pom.xml b/testing-modules/parallel-tests-junit/pom.xml index 3fd4e695e5..ecca8b3930 100644 --- a/testing-modules/parallel-tests-junit/pom.xml +++ b/testing-modules/parallel-tests-junit/pom.xml @@ -5,6 +5,8 @@ parallel-tests-junit 0.0.1-SNAPSHOT pom + parallel-tests-junit + math-test-functions string-test-functions diff --git a/testing-modules/selenium-junit-testng/pom.xml b/testing-modules/selenium-junit-testng/pom.xml index e22f7421cf..ae15fc97c0 100644 --- a/testing-modules/selenium-junit-testng/pom.xml +++ b/testing-modules/selenium-junit-testng/pom.xml @@ -4,7 +4,8 @@ com.baeldung selenium-junit-testng 0.0.1-SNAPSHOT - + selenium-junit-testng + com.baeldung parent-modules diff --git a/twilio/pom.xml b/twilio/pom.xml index 610cc04b60..81fbf8ab20 100644 --- a/twilio/pom.xml +++ b/twilio/pom.xml @@ -4,7 +4,8 @@ 4.0.0 twilio 1.0-SNAPSHOT - + twilio + parent-modules com.baeldung diff --git a/vertx-and-rxjava/pom.xml b/vertx-and-rxjava/pom.xml index cbc94dd8f1..389eaf687b 100644 --- a/vertx-and-rxjava/pom.xml +++ b/vertx-and-rxjava/pom.xml @@ -3,7 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 vertx-and-rxjava - + vertx-and-rxjava + com.baeldung parent-modules diff --git a/video-tutorials/jackson-annotations/pom.xml b/video-tutorials/jackson-annotations/pom.xml index 748721b83c..121609ad4d 100644 --- a/video-tutorials/jackson-annotations/pom.xml +++ b/video-tutorials/jackson-annotations/pom.xml @@ -1,11 +1,10 @@ 4.0.0 - com.baeldung jackson-annotations 1.0.0-SNAPSHOT - jacksonannotation + jackson-annotations com.baeldung diff --git a/vraptor/pom.xml b/vraptor/pom.xml index ae43d8e083..97005bd158 100644 --- a/vraptor/pom.xml +++ b/vraptor/pom.xml @@ -1,11 +1,11 @@ 4.0.0 - com.baeldung vraptor 1.0.0 war + vraptor A demo project to start using VRaptor 4 diff --git a/xmlunit-2/pom.xml b/xmlunit-2/pom.xml index 806ebb6c0e..faefeca7a1 100644 --- a/xmlunit-2/pom.xml +++ b/xmlunit-2/pom.xml @@ -4,6 +4,7 @@ com.baeldung xmlunit-2 1.0 + xmlunit-2 com.baeldung From 30864ad7bf208a24a6e7d445828a2dea1d22d4bb Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 30 Nov 2018 22:28:32 +0530 Subject: [PATCH 143/429] BAEL-9567 Align module names, folder names and artifact id - Fixed parent pom id --- spring-ejb/wildfly/widlfly-web/pom.xml | 4 ++-- spring-ejb/wildfly/wildfly-ear/pom.xml | 2 +- spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml | 2 +- spring-ejb/wildfly/wildfly-ejb/pom.xml | 2 +- spring-ejb/wildfly/wildfly-jpa/pom.xml | 2 +- spring-ejb/wildfly/wildfly-mdb/pom.xml | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/spring-ejb/wildfly/widlfly-web/pom.xml b/spring-ejb/wildfly/widlfly-web/pom.xml index 1dcb18a230..f0baac10dd 100644 --- a/spring-ejb/wildfly/widlfly-web/pom.xml +++ b/spring-ejb/wildfly/widlfly-web/pom.xml @@ -4,10 +4,10 @@ widlfly-web war widlfly-web - + com.baeldung.wildfly - wildfly-example + wildfly 0.0.1-SNAPSHOT diff --git a/spring-ejb/wildfly/wildfly-ear/pom.xml b/spring-ejb/wildfly/wildfly-ear/pom.xml index dc9059370f..93d6df96e5 100644 --- a/spring-ejb/wildfly/wildfly-ear/pom.xml +++ b/spring-ejb/wildfly/wildfly-ear/pom.xml @@ -7,7 +7,7 @@ com.baeldung.wildfly - wildfly-example + wildfly 0.0.1-SNAPSHOT diff --git a/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml b/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml index 0324aa8e47..41c7012ea9 100644 --- a/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml +++ b/spring-ejb/wildfly/wildfly-ejb-interfaces/pom.xml @@ -6,7 +6,7 @@ com.baeldung.wildfly - wildfly-example + wildfly 0.0.1-SNAPSHOT diff --git a/spring-ejb/wildfly/wildfly-ejb/pom.xml b/spring-ejb/wildfly/wildfly-ejb/pom.xml index 22bceef044..12bfc9c1bf 100644 --- a/spring-ejb/wildfly/wildfly-ejb/pom.xml +++ b/spring-ejb/wildfly/wildfly-ejb/pom.xml @@ -7,7 +7,7 @@ com.baeldung.wildfly - wildfly-example + wildfly 0.0.1-SNAPSHOT diff --git a/spring-ejb/wildfly/wildfly-jpa/pom.xml b/spring-ejb/wildfly/wildfly-jpa/pom.xml index 6a0352c102..3005ab714c 100644 --- a/spring-ejb/wildfly/wildfly-jpa/pom.xml +++ b/spring-ejb/wildfly/wildfly-jpa/pom.xml @@ -6,7 +6,7 @@ com.baeldung.wildfly - wildfly-example + wildfly 0.0.1-SNAPSHOT diff --git a/spring-ejb/wildfly/wildfly-mdb/pom.xml b/spring-ejb/wildfly/wildfly-mdb/pom.xml index 186ddc50c0..a2ffca2fc5 100644 --- a/spring-ejb/wildfly/wildfly-mdb/pom.xml +++ b/spring-ejb/wildfly/wildfly-mdb/pom.xml @@ -6,7 +6,7 @@ com.baeldung.wildfly - wildfly-example + wildfly 0.0.1-SNAPSHOT From b02321519f0193b25a193cdbf5a7a7ce0313f5b1 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 19:28:39 +0200 Subject: [PATCH 144/429] Update CustomRequestSecurityConfig.java --- .../java/com/baeldung/oauth2/CustomRequestSecurityConfig.java | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java index 51caee8178..2aba5a82ac 100644 --- a/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java +++ b/spring-5-security-oauth/src/main/java/com/baeldung/oauth2/CustomRequestSecurityConfig.java @@ -115,5 +115,4 @@ public class CustomRequestSecurityConfig extends WebSecurityConfigurerAdapter { } return null; } - } From dfa76b232f6a5d0299acf763bfb19a190c7a6621 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 19:41:31 +0200 Subject: [PATCH 145/429] Update README.md --- spring-5-reactive/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index 4fab0c12ad..fc898a56dc 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -17,3 +17,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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) + From 2c44ec056e1056ece63ebdc722a700cfbe7321c5 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 19:56:53 +0200 Subject: [PATCH 146/429] Update README.md --- cdi/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/cdi/README.md b/cdi/README.md index 1523aacf6b..bfb635be9e 100644 --- a/cdi/README.md +++ b/cdi/README.md @@ -2,3 +2,4 @@ - [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) - [Introduction to the Event Notification Model in CDI 2.0](https://www.baeldung.com/cdi-event-notification) + From 6f717e04d5f119f39fd1753f6f3a234217b7a5bf Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 20:26:30 +0200 Subject: [PATCH 147/429] Update and rename CompoundOperatorsTest.java to CompoundOperatorsUnitTest.java --- ...ompoundOperatorsTest.java => CompoundOperatorsUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename core-java-lang/src/test/java/com/baeldung/compoundoperators/{CompoundOperatorsTest.java => CompoundOperatorsUnitTest.java} (98%) diff --git a/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java similarity index 98% rename from core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java rename to core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java index 3b3478b38e..532776edd4 100644 --- a/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsTest.java +++ b/core-java-lang/src/test/java/com/baeldung/compoundoperators/CompoundOperatorsUnitTest.java @@ -4,7 +4,7 @@ import org.junit.Test; import static org.junit.Assert.assertEquals; -public class CompoundOperatorsTest { +public class CompoundOperatorsUnitTest { @Test public void whenAssignmentOperatorIsUsed_thenValueIsAssigned() { From a2982271e3362b467d57dd36b3557c8eb0dbc094 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 21:16:33 +0200 Subject: [PATCH 148/429] Update README.md --- core-java-lang/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 607abbcdc5..79d2375c24 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -58,3 +58,4 @@ - [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) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) + From b740a59e2baa23032febb4abb5892c7072f95f37 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 21:17:29 +0200 Subject: [PATCH 149/429] Update README.md --- restx/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/restx/README.md b/restx/README.md index f586f08a21..665f7ea82d 100644 --- a/restx/README.md +++ b/restx/README.md @@ -1,3 +1,4 @@ # Relevant Articles * [Introduction to RESTX](https://www.baeldung.com/java-restx) + From 95dc6fd367ab733887dd7f7a314965d98ee43764 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 21:17:59 +0200 Subject: [PATCH 150/429] Update pom.xml --- algorithms-genetic/pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/algorithms-genetic/pom.xml b/algorithms-genetic/pom.xml index 662e0c5913..fc6d36dac1 100644 --- a/algorithms-genetic/pom.xml +++ b/algorithms-genetic/pom.xml @@ -61,4 +61,5 @@ 1.11 - \ No newline at end of file + + From 6e478c5fed04af8807be8afce9d5266cf59b68d3 Mon Sep 17 00:00:00 2001 From: Muhammad Asif Anwar Date: Sat, 1 Dec 2018 00:57:07 +0400 Subject: [PATCH 151/429] for BAEL 10834 (#5816) * Update pom.xml * enabling spring-security-react module --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index da17fc2931..ef7a7f6b1d 100644 --- a/pom.xml +++ b/pom.xml @@ -599,7 +599,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - + spring-security-react spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest @@ -1141,7 +1141,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - + spring-security-react spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest From eeb02d95ae78750ea0254be3338c007a20df5f3e Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 30 Nov 2018 23:20:02 +0200 Subject: [PATCH 152/429] Update pom.xml --- pom.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index ef7a7f6b1d..7b295abc24 100644 --- a/pom.xml +++ b/pom.xml @@ -405,7 +405,8 @@ jaxb javafx jgroups - jee-7 + jee-7-security jjwt jsf From b0039348cfa292774718babb813e4dde15955e77 Mon Sep 17 00:00:00 2001 From: Loredana Date: Fri, 30 Nov 2018 23:50:52 +0200 Subject: [PATCH 153/429] fix module names --- spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml | 1 - spring-cloud-data-flow/etl/customer-transform/pom.xml | 1 - spring-cloud-data-flow/etl/pom.xml | 5 ++--- spring-cloud-data-flow/pom.xml | 3 +-- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml index 468d8e17d0..779a4a803a 100644 --- a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml +++ b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml @@ -4,7 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.customer customer-mongodb-sink jar diff --git a/spring-cloud-data-flow/etl/customer-transform/pom.xml b/spring-cloud-data-flow/etl/customer-transform/pom.xml index bc4b648907..c344b0fc57 100644 --- a/spring-cloud-data-flow/etl/customer-transform/pom.xml +++ b/spring-cloud-data-flow/etl/customer-transform/pom.xml @@ -4,7 +4,6 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.customer customer-transform 0.0.1-SNAPSHOT jar diff --git a/spring-cloud-data-flow/etl/pom.xml b/spring-cloud-data-flow/etl/pom.xml index e203999ee9..1f35d2072b 100644 --- a/spring-cloud-data-flow/etl/pom.xml +++ b/spring-cloud-data-flow/etl/pom.xml @@ -1,11 +1,10 @@ 4.0.0 - org.baeldung.spring.cloud - etl-spring-cloud-data-flow + etl + etl 0.0.1-SNAPSHOT pom - etl-spring-cloud-data-flow org.baeldung.spring.cloud diff --git a/spring-cloud-data-flow/pom.xml b/spring-cloud-data-flow/pom.xml index dd1ceed71a..b5ef5d2c2a 100644 --- a/spring-cloud-data-flow/pom.xml +++ b/spring-cloud-data-flow/pom.xml @@ -1,11 +1,10 @@ 4.0.0 - org.baeldung.spring.cloud spring-cloud-data-flow 0.0.1-SNAPSHOT pom - spring-cloud-data-flow + spring-cloud-data-flow com.baeldung From eb1a92698b544a30e9ec5ad2f99711ca9a8f1309 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Fri, 30 Nov 2018 15:26:54 -0800 Subject: [PATCH 154/429] BAEL-2368 update readme --- java-collections-conversions/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md index 761a78d7b0..0f89e07d63 100644 --- a/java-collections-conversions/README.md +++ b/java-collections-conversions/README.md @@ -8,4 +8,5 @@ - [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) \ No newline at end of file +- [How to Convert List to Map in Java](http://www.baeldung.com/java-list-to-map) +- [Array to String Conversions](https://www.baeldung.com/java-array-to-string) From b81bcc75f68ab9db34e1e761c6aedc78c2dcdda0 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Fri, 30 Nov 2018 15:27:12 -0800 Subject: [PATCH 155/429] Update README.md --- core-java-lang/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 79d2375c24..0f75e9474b 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -59,3 +59,4 @@ - [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) + From ed0713046ffb3dad79611b87a753dad780fce618 Mon Sep 17 00:00:00 2001 From: "akash.pandey" Date: Sat, 1 Dec 2018 09:08:53 +0530 Subject: [PATCH 156/429] Renamed method names to replace "non-repeating" with "Unique". --- ...ongestSubstringNonRepeatingCharacters.java | 102 +++++++++--------- ...stSubstringNonRepeatingCharactersTest.java | 40 +++---- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java index 840b57cd78..51ae013cd6 100644 --- a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java +++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharacters.java @@ -1,51 +1,51 @@ -package com.baeldung.algorithms.string; - -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; - -public class LongestSubstringNonRepeatingCharacters { - - public static String getNonRepeatingCharactersBruteForce(String input) { - String output = ""; - for (int start = 0; start < input.length(); start++) { - Set visited = new HashSet<>(); - int end = start; - for (; end < input.length(); end++) { - char currChar = input.charAt(end); - if (visited.contains(currChar)) { - break; - } else { - visited.add(currChar); - } - } - if (output.length() < end - start + 1) { - output = input.substring(start, end); - } - } - return output; - } - - public static String getNonRepeatingCharacters(String input) { - Map visited = new HashMap<>(); - String output = ""; - for (int start = 0, end = 0; end < input.length(); end++) { - char currChar = input.charAt(end); - if(visited.containsKey(currChar)) { - start = Math.max(visited.get(currChar)+1, start); - } - if(output.length() < end - start + 1) { - output = input.substring(start, end+1); - } - visited.put(currChar, end); - } - return output; - } - - public static void main(String[] args) { - String input = "CODINGISAWESOME"; - System.out.println(getNonRepeatingCharacters(input)); - } - -} +package com.baeldung.algorithms.string; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class LongestSubstringNonRepeatingCharacters { + + public static String getUniqueCharacterSubstringBruteForce(String input) { + String output = ""; + for (int start = 0; start < input.length(); start++) { + Set visited = new HashSet<>(); + int end = start; + for (; end < input.length(); end++) { + char currChar = input.charAt(end); + if (visited.contains(currChar)) { + break; + } else { + visited.add(currChar); + } + } + if (output.length() < end - start + 1) { + output = input.substring(start, end); + } + } + return output; + } + + public static String getUniqueCharacterSubstring(String input) { + Map visited = new HashMap<>(); + String output = ""; + for (int start = 0, end = 0; end < input.length(); end++) { + char currChar = input.charAt(end); + if (visited.containsKey(currChar)) { + start = Math.max(visited.get(currChar) + 1, start); + } + if (output.length() < end - start + 1) { + output = input.substring(start, end + 1); + } + visited.put(currChar, end); + } + return output; + } + + public static void main(String[] args) { + String input = "CODINGISAWESOME"; + System.out.println(getUniqueCharacterSubstring(input)); + } + +} diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java index a3e67362ad..2d8e762dd1 100644 --- a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java +++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java @@ -1,20 +1,20 @@ -package com.baeldung.algorithms.string; - -import org.junit.jupiter.api.Assertions; -import org.junit.jupiter.api.Test; - -public class LongestSubstringNonRepeatingCharactersTest { - - @Test - void givenString_whenGetNonRepeatingCharactersBruteForceCalled_thenResultFoundAsExpected() { - String input = "CODINGISAWESOME"; - Assertions.assertEquals("NGISAWE", LongestSubstringNonRepeatingCharacters.getNonRepeatingCharactersBruteForce(input)); - } - - @Test - void givenString_whenGetNonRepeatingCharactersCalled_thenResultFoundAsExpected() { - String input = "CODINGISAWESOME"; - Assertions.assertEquals("NGISAWE",LongestSubstringNonRepeatingCharacters.getNonRepeatingCharacters(input)); - } - -} +package com.baeldung.algorithms.string; + +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.Test; + +public class LongestSubstringNonRepeatingCharactersTest { + + @Test + void givenString_whenGetUniqueCharacterSubstringBruteForceCalled_thenResultFoundAsExpected() { + String input = "CODINGISAWESOME"; + Assertions.assertEquals("NGISAWE", LongestSubstringNonRepeatingCharacters.getUniqueCharacterSubstringBruteForce(input)); + } + + @Test + void givenString_whenGetUniqueCharacterSubstringCalled_thenResultFoundAsExpected() { + String input = "CODINGISAWESOME"; + Assertions.assertEquals("NGISAWE",LongestSubstringNonRepeatingCharacters.getUniqueCharacterSubstring(input)); + } + +} From e884dc106340904c5af72dd54932c1bf8d3e6d94 Mon Sep 17 00:00:00 2001 From: eric-martin Date: Fri, 30 Nov 2018 22:39:06 -0600 Subject: [PATCH 157/429] Fixed compiler errors in spring-boot-crud --- .../src/main/java/com/baeldung/crud/Application.java | 2 -- .../baeldung/crud/controllers/UserController.java | 6 ++++-- .../com/baeldung/crud/UserControllerUnitTest.java | 12 +++++++----- .../test/java/com/baeldung/crud/UserUnitTest.java | 4 +++- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java b/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java index 436cccb964..d9f594fb75 100644 --- a/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java +++ b/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java @@ -14,8 +14,6 @@ import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableJpaRepositories(basePackages="com.baeldung.crud.repositories") @EnableTransactionManagement @EntityScan(basePackages="com.baeldung.crud.entities") - -@SpringBootApplication public class Application { public static void main(String[] args) { diff --git a/spring-boot-crud/src/main/java/com/baeldung/crud/controllers/UserController.java b/spring-boot-crud/src/main/java/com/baeldung/crud/controllers/UserController.java index 1b7185c2fd..9a6cb477aa 100644 --- a/spring-boot-crud/src/main/java/com/baeldung/crud/controllers/UserController.java +++ b/spring-boot-crud/src/main/java/com/baeldung/crud/controllers/UserController.java @@ -1,8 +1,7 @@ package com.baeldung.crud.controllers; -import com.baeldung.crud.UserRepository; -import com.baeldung.crud.entities.User; import javax.validation.Valid; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -11,6 +10,9 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import com.baeldung.crud.entities.User; +import com.baeldung.crud.repositories.UserRepository; + @Controller public class UserController { diff --git a/spring-boot-crud/src/test/java/com/baeldung/crud/UserControllerUnitTest.java b/spring-boot-crud/src/test/java/com/baeldung/crud/UserControllerUnitTest.java index 7773a962fb..2de0828ae5 100644 --- a/spring-boot-crud/src/test/java/com/baeldung/crud/UserControllerUnitTest.java +++ b/spring-boot-crud/src/test/java/com/baeldung/crud/UserControllerUnitTest.java @@ -1,16 +1,18 @@ package com.baeldung.crud; -import com.baeldung.crud.UserController; -import com.baeldung.crud.entities.User; -import com.baeldung.crud.UserRepository; import static org.assertj.core.api.Assertions.assertThat; -import org.junit.BeforeClass; -import org.junit.Test; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; + +import org.junit.BeforeClass; +import org.junit.Test; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; +import com.baeldung.crud.controllers.UserController; +import com.baeldung.crud.entities.User; +import com.baeldung.crud.repositories.UserRepository; + public class UserControllerUnitTest { private static UserController userController; diff --git a/spring-boot-crud/src/test/java/com/baeldung/crud/UserUnitTest.java b/spring-boot-crud/src/test/java/com/baeldung/crud/UserUnitTest.java index a3c6a922d8..565f6727c3 100644 --- a/spring-boot-crud/src/test/java/com/baeldung/crud/UserUnitTest.java +++ b/spring-boot-crud/src/test/java/com/baeldung/crud/UserUnitTest.java @@ -1,9 +1,11 @@ package com.baeldung.crud; -import com.baeldung.crud.User; import static org.assertj.core.api.Assertions.assertThat; + import org.junit.Test; +import com.baeldung.crud.entities.User; + public class UserUnitTest { @Test From a303df4442c3d7c038f50f412c6248e913290dba Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 1 Dec 2018 08:51:37 +0200 Subject: [PATCH 158/429] fix module names --- spring-cloud-data-flow/data-flow-server/pom.xml | 1 - spring-cloud-data-flow/data-flow-shell/pom.xml | 1 - spring-cloud-data-flow/etl/pom.xml | 2 +- spring-cloud-data-flow/log-sink/pom.xml | 1 - spring-cloud-data-flow/time-processor/pom.xml | 1 - spring-cloud-data-flow/time-source/pom.xml | 1 - 6 files changed, 1 insertion(+), 6 deletions(-) diff --git a/spring-cloud-data-flow/data-flow-server/pom.xml b/spring-cloud-data-flow/data-flow-server/pom.xml index 0133d65978..a02d2984c1 100644 --- a/spring-cloud-data-flow/data-flow-server/pom.xml +++ b/spring-cloud-data-flow/data-flow-server/pom.xml @@ -3,7 +3,6 @@ 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.spring.cloud data-flow-server 0.0.1-SNAPSHOT jar diff --git a/spring-cloud-data-flow/data-flow-shell/pom.xml b/spring-cloud-data-flow/data-flow-shell/pom.xml index e4ec145277..3b155736c3 100644 --- a/spring-cloud-data-flow/data-flow-shell/pom.xml +++ b/spring-cloud-data-flow/data-flow-shell/pom.xml @@ -3,7 +3,6 @@ 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.spring.cloud data-flow-shell 0.0.1-SNAPSHOT jar diff --git a/spring-cloud-data-flow/etl/pom.xml b/spring-cloud-data-flow/etl/pom.xml index 1f35d2072b..7d5040e8ad 100644 --- a/spring-cloud-data-flow/etl/pom.xml +++ b/spring-cloud-data-flow/etl/pom.xml @@ -7,7 +7,7 @@ pom - org.baeldung.spring.cloud + com.baeldung spring-cloud-data-flow 0.0.1-SNAPSHOT diff --git a/spring-cloud-data-flow/log-sink/pom.xml b/spring-cloud-data-flow/log-sink/pom.xml index 33a0a4df45..69de679c2a 100644 --- a/spring-cloud-data-flow/log-sink/pom.xml +++ b/spring-cloud-data-flow/log-sink/pom.xml @@ -3,7 +3,6 @@ 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.spring.cloud log-sink 0.0.1-SNAPSHOT jar diff --git a/spring-cloud-data-flow/time-processor/pom.xml b/spring-cloud-data-flow/time-processor/pom.xml index 4f31e55b96..e630df1865 100644 --- a/spring-cloud-data-flow/time-processor/pom.xml +++ b/spring-cloud-data-flow/time-processor/pom.xml @@ -3,7 +3,6 @@ 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.spring.cloud time-processor 0.0.1-SNAPSHOT jar diff --git a/spring-cloud-data-flow/time-source/pom.xml b/spring-cloud-data-flow/time-source/pom.xml index dc593fdb14..649af32cf0 100644 --- a/spring-cloud-data-flow/time-source/pom.xml +++ b/spring-cloud-data-flow/time-source/pom.xml @@ -3,7 +3,6 @@ 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.spring.cloud time-source 0.0.1-SNAPSHOT jar From 8a48239decdea2f491d6d3845f2cfbefbaec66d5 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 1 Dec 2018 08:53:41 +0200 Subject: [PATCH 159/429] Update pom.xml --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 7b295abc24..3c5c171c96 100644 --- a/pom.xml +++ b/pom.xml @@ -600,7 +600,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - spring-security-react + spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest From 51352c470f98c417bb4ecb9b3150eb9f167bc361 Mon Sep 17 00:00:00 2001 From: Josh Cummings Date: Sat, 1 Dec 2018 00:40:53 -0700 Subject: [PATCH 160/429] SQLite with Spring Boot Added custom dialect for SQLite database. Simplify spring-data-rest Configuration Now uses profiles so that learners don't need to uncomment code in order for demonstrations to work. Issue: BAEL-2213 --- spring-data-rest/pom.xml | 11 +++ .../java/com/baeldung/config/DbConfig.java | 26 ++++++- .../com/baeldung/dialect/SQLiteDialect.java | 78 +++++++++++++++++++ .../dialect/SQLiteIdentityColumnSupport.java | 22 ++++++ .../src/main/resources/application.properties | 1 + .../resources/persistence-sqlite.properties | 7 +- 6 files changed, 142 insertions(+), 3 deletions(-) create mode 100644 spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteDialect.java create mode 100644 spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteIdentityColumnSupport.java diff --git a/spring-data-rest/pom.xml b/spring-data-rest/pom.xml index a6f12e1904..2fe4715bac 100644 --- a/spring-data-rest/pom.xml +++ b/spring-data-rest/pom.xml @@ -33,6 +33,15 @@ com.h2database h2 + + org.springframework.boot + spring-boot-autoconfigure + + + org.xerial + sqlite-jdbc + ${sqlite.version} + @@ -43,6 +52,8 @@ + com.baeldung.SpringDataRestApplication + 3.25.2 2.1.0.RELEASE diff --git a/spring-data-rest/src/main/java/com/baeldung/config/DbConfig.java b/spring-data-rest/src/main/java/com/baeldung/config/DbConfig.java index 8d1f9de497..26d882d6a0 100644 --- a/spring-data-rest/src/main/java/com/baeldung/config/DbConfig.java +++ b/spring-data-rest/src/main/java/com/baeldung/config/DbConfig.java @@ -7,6 +7,7 @@ import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; @@ -14,11 +15,12 @@ import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; -//@Configuration +@Configuration @EnableJpaRepositories(basePackages = "com.baeldung.repositories") // @PropertySource("persistence-h2.properties") // @PropertySource("persistence-hsqldb.properties") // @PropertySource("persistence-derby.properties") +//@PropertySource("persistence-sqlite.properties") public class DbConfig { @Autowired @@ -59,3 +61,25 @@ public class DbConfig { } } + +@Configuration +@Profile("h2") +@PropertySource("persistence-h2.properties") +class H2Config {} + +@Configuration +@Profile("hsqldb") +@PropertySource("persistence-hsqldb.properties") +class HsqldbConfig {} + + +@Configuration +@Profile("derby") +@PropertySource("persistence-derby.properties") +class DerbyConfig {} + + +@Configuration +@Profile("sqlite") +@PropertySource("persistence-sqlite.properties") +class SqliteConfig {} diff --git a/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteDialect.java b/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteDialect.java new file mode 100644 index 0000000000..4512f7d34d --- /dev/null +++ b/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteDialect.java @@ -0,0 +1,78 @@ +package com.baeldung.dialect; + +import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.identity.IdentityColumnSupport; + +import java.sql.Types; + +public class SQLiteDialect extends Dialect { + + public SQLiteDialect() { + registerColumnType(Types.BIT, "integer"); + registerColumnType(Types.TINYINT, "tinyint"); + registerColumnType(Types.SMALLINT, "smallint"); + registerColumnType(Types.INTEGER, "integer"); + registerColumnType(Types.BIGINT, "bigint"); + registerColumnType(Types.FLOAT, "float"); + registerColumnType(Types.REAL, "real"); + registerColumnType(Types.DOUBLE, "double"); + registerColumnType(Types.NUMERIC, "numeric"); + registerColumnType(Types.DECIMAL, "decimal"); + registerColumnType(Types.CHAR, "char"); + registerColumnType(Types.VARCHAR, "varchar"); + registerColumnType(Types.LONGVARCHAR, "longvarchar"); + registerColumnType(Types.DATE, "date"); + registerColumnType(Types.TIME, "time"); + registerColumnType(Types.TIMESTAMP, "timestamp"); + registerColumnType(Types.BINARY, "blob"); + registerColumnType(Types.VARBINARY, "blob"); + registerColumnType(Types.LONGVARBINARY, "blob"); + registerColumnType(Types.BLOB, "blob"); + registerColumnType(Types.CLOB, "clob"); + registerColumnType(Types.BOOLEAN, "integer"); + } + + public IdentityColumnSupport getIdentityColumnSupport() { + return new SQLiteIdentityColumnSupport(); + } + + public boolean hasAlterTable() { + return false; + } + + public boolean dropConstraints() { + return false; + } + + public String getDropForeignKeyString() { + return ""; + } + + public String getAddForeignKeyConstraintString(String constraintName, String[] foreignKey, String referencedTable, String[] primaryKey, boolean referencesPrimaryKey) { + return ""; + } + + public String getAddPrimaryKeyConstraintString(String constraintName) { + return ""; + } + + public String getForUpdateString() { + return ""; + } + + public String getAddColumnString() { + return "add column"; + } + + public boolean supportsOuterJoinForUpdate() { + return false; + } + + public boolean supportsIfExistsBeforeTableName() { + return true; + } + + public boolean supportsCascadeDelete() { + return false; + } +} diff --git a/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteIdentityColumnSupport.java b/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteIdentityColumnSupport.java new file mode 100644 index 0000000000..cf6e3a9a97 --- /dev/null +++ b/spring-data-rest/src/main/java/com/baeldung/dialect/SQLiteIdentityColumnSupport.java @@ -0,0 +1,22 @@ +package com.baeldung.dialect; + +import org.hibernate.MappingException; +import org.hibernate.dialect.identity.IdentityColumnSupportImpl; + +public class SQLiteIdentityColumnSupport extends IdentityColumnSupportImpl { + + @Override + public boolean supportsIdentityColumns() { + return true; + } + + @Override + public String getIdentitySelectString(String table, String column, int type) throws MappingException { + return "select last_insert_rowid()"; + } + + @Override + public String getIdentityColumnString(int type) throws MappingException { + return "integer"; + } +} diff --git a/spring-data-rest/src/main/resources/application.properties b/spring-data-rest/src/main/resources/application.properties index e69de29bb2..06cb22a4fe 100644 --- a/spring-data-rest/src/main/resources/application.properties +++ b/spring-data-rest/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.profiles.default=h2 \ No newline at end of file diff --git a/spring-data-rest/src/main/resources/persistence-sqlite.properties b/spring-data-rest/src/main/resources/persistence-sqlite.properties index 018c2cbaca..b6b5f4e4d6 100644 --- a/spring-data-rest/src/main/resources/persistence-sqlite.properties +++ b/spring-data-rest/src/main/resources/persistence-sqlite.properties @@ -1,4 +1,7 @@ driverClassName=org.sqlite.JDBC -url=jdbc:sqlite:memory:myDb +url=jdbc:sqlite:memory:myDb?cache=shared username=sa -password=sa \ No newline at end of file +password=sa +hibernate.dialect=com.baeldung.dialect.SQLiteDialect +hibernate.hbm2ddl.auto=create-drop +hibernate.show_sql=true From d2f148c90fee69b4e60b288e9defe1c476c056fa Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 1 Dec 2018 09:53:13 +0200 Subject: [PATCH 161/429] Update Application.java --- .../src/main/java/com/baeldung/crud/Application.java | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java b/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java index d9f594fb75..0b686e90e9 100644 --- a/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java +++ b/spring-boot-crud/src/main/java/com/baeldung/crud/Application.java @@ -19,4 +19,5 @@ public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } + } From 0bdc4f6602b530d4f009a8582edb7a3a2a93650c Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sat, 1 Dec 2018 09:53:40 +0200 Subject: [PATCH 162/429] Update README.md --- core-java-lang/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 0f75e9474b..79d2375c24 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -59,4 +59,3 @@ - [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) - From 7cbd26433d079de819e1c564941fac67ca2d59e5 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 1 Dec 2018 11:22:23 +0200 Subject: [PATCH 163/429] pom cleanup work --- pom.xml | 186 +++++++++++++++++++++++++++----------------------------- 1 file changed, 88 insertions(+), 98 deletions(-) diff --git a/pom.xml b/pom.xml index 3c5c171c96..86ed229bce 100644 --- a/pom.xml +++ b/pom.xml @@ -363,6 +363,9 @@ core-java-8 core-groovy couchbase + core-java-concurrency + core-kotlin + core-java dozer disruptor @@ -419,6 +422,7 @@ java-spi java-ee-8-security-api + libraries libraries-data linkrest logging-modules/log-mdc @@ -469,7 +473,7 @@ persistence-modules/hbase persistence-modules/influxdb persistence-modules/spring-hibernate4 - persistence-modules/spring-data-mongodb + persistence-modules/spring-data-mongodb persistence-modules/java-cassandra persistence-modules/spring-data-cassandra persistence-modules/spring-data-couchbase-2 @@ -527,6 +531,8 @@ spring-5-mvc spring-5-security spring-5-security-oauth + + spring-aop spring-activiti spring-akka spring-amqp @@ -534,7 +540,6 @@ spring-apache-camel spring-batch spring-bom - spring-boot-keycloak spring-boot-bootstrap spring-boot-admin @@ -543,29 +548,34 @@ spring-boot-mvc spring-boot-logging-log4j2 spring-boot-disable-console-logging + spring-boot-property-exp + spring-boot-ctx-fluent + spring-boot + spring-boot-ops spring-cloud-data-flow spring-cloud spring-cloud-bus spring-core spring-cucumber - spring-ejb - spring-aop - spring-data-rest + spring-drools spring-dispatcher-servlet + spring-ejb spring-exceptions + spring-freemarker - spring-integration + + spring-jinq spring-jenkins-pipeline spring-jersey - spring-jms spring-jooq spring-kafka spring-katharsis spring-ldap + spring-mockito spring-mvc-forms-jsp spring-mvc-forms-thymeleaf @@ -574,6 +584,7 @@ spring-mvc-webflow spring-mvc-xml spring-mvc-kotlin + spring-protobuf spring-quartz spring-rest-angular @@ -582,6 +593,26 @@ spring-rest spring-resttemplate spring-rest-simple + spring-remoting + + spring-session + spring-sleuth + spring-social-login + spring-spel + spring-state-machine + spring-thymeleaf + spring-userservice + + spring-zuul + spring-reactor + spring-vertx + spring-vault + spring-rest-embedded-tomcat + spring-swagger-codegen + spring-webflux-amqp + + spring-static-resources + spring-security-thymeleaf spring-security-acl spring-security-cache-control spring-security-client/spring-security-jsp-authentication @@ -600,34 +631,13 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - + spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest spring-security-sso spring-security-x509 - spring-session - spring-sleuth - spring-social-login - spring-spel - spring-state-machine - spring-thymeleaf - spring-userservice - spring-zuul - spring-remoting - spring-reactor - spring-vertx - spring-vault - spring-jinq - spring-rest-embedded-tomcat - - spring-static-resources - spring-swagger-codegen - spring-drools - spring-boot-property-exp - spring-security-thymeleaf - spring-boot-ctx-fluent - spring-webflux-amqp + spring-security-mvc-custom spark-java saas @@ -668,17 +678,12 @@ @@ -910,6 +915,9 @@ core-java-8 core-groovy couchbase + core-java-concurrency + core-kotlin + core-java dozer disruptor @@ -952,7 +960,8 @@ jaxb javafx jgroups - jee-7 + jee-7-security jjwt jsf @@ -965,6 +974,7 @@ java-spi java-ee-8-security-api + libraries libraries-data linkrest logging-modules/log-mdc @@ -1015,7 +1025,7 @@ persistence-modules/hbase persistence-modules/influxdb persistence-modules/spring-hibernate4 - persistence-modules/spring-data-mongodb + persistence-modules/spring-data-mongodb persistence-modules/java-cassandra persistence-modules/spring-data-cassandra persistence-modules/spring-data-couchbase-2 @@ -1069,6 +1079,8 @@ spring-5-mvc spring-5-security spring-5-security-oauth + + spring-aop spring-activiti spring-akka spring-amqp @@ -1076,7 +1088,6 @@ spring-apache-camel spring-batch spring-bom - spring-boot-keycloak spring-boot-bootstrap spring-boot-admin @@ -1085,29 +1096,34 @@ spring-boot-mvc spring-boot-logging-log4j2 spring-boot-disable-console-logging + spring-boot-property-exp + spring-boot-ctx-fluent + spring-boot + spring-boot-ops spring-cloud-data-flow spring-cloud spring-cloud-bus spring-core spring-cucumber - spring-ejb - spring-aop - spring-data-rest + spring-drools spring-dispatcher-servlet + spring-ejb spring-exceptions + spring-freemarker - spring-integration + + spring-jinq spring-jenkins-pipeline spring-jersey - spring-jms spring-jooq spring-kafka spring-katharsis spring-ldap + spring-mockito spring-mvc-forms-jsp spring-mvc-forms-thymeleaf @@ -1116,6 +1132,7 @@ spring-mvc-webflow spring-mvc-xml spring-mvc-kotlin + spring-protobuf spring-quartz spring-rest-angular @@ -1124,6 +1141,26 @@ spring-rest spring-resttemplate spring-rest-simple + spring-remoting + + spring-session + spring-sleuth + spring-social-login + spring-spel + spring-state-machine + spring-thymeleaf + spring-userservice + + spring-zuul + spring-reactor + spring-vertx + spring-vault + spring-rest-embedded-tomcat + spring-swagger-codegen + spring-webflux-amqp + + spring-static-resources + spring-security-thymeleaf spring-security-acl spring-security-cache-control spring-security-client/spring-security-jsp-authentication @@ -1142,35 +1179,13 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - spring-security-react + spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest spring-security-sso spring-security-x509 - spring-session - spring-sleuth - spring-social-login - spring-spel - spring-state-machine - spring-thymeleaf - spring-userservice - spring-zuul - spring-remoting - spring-reactor - spring-vertx - spring-vault - spring-jinq - spring-rest-embedded-tomcat - - spring-static-resources - spring-swagger-codegen - spring-drools - spring-boot-property-exp - spring-security-thymeleaf - spring-boot-ctx-fluent - spring-webflux-amqp - + spring-security-mvc-custom spark-java saas @@ -1205,28 +1220,18 @@ @@ -1268,23 +1273,8 @@ parent-spring-5 parent-java parent-kotlin - libraries - geotools - jhipster - testing-modules/gatling - spring-boot - spring-boot-ops - spring-5 - core-kotlin - kotlin-libraries - core-java - google-web-toolkit - spring-security-mvc-custom - persistence-modules/hibernate5 - persistence-modules/spring-data-elasticsearch - core-java-concurrency - core-java-concurrency-collections - restx + + From 5d512da017bcdf653fb6d96c4fb2d4ee6951f193 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 1 Dec 2018 11:23:47 +0200 Subject: [PATCH 164/429] adding the jira --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 86ed229bce..cd128aa4c5 100644 --- a/pom.xml +++ b/pom.xml @@ -631,7 +631,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - + spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest @@ -1179,7 +1179,7 @@ spring-security-mvc-session spring-security-mvc-socket spring-security-openid - + spring-security-rest-basic-auth spring-security-rest-custom spring-security-rest From a2b79472d9cbd74f076f32f792a1c31d138762c4 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 1 Dec 2018 07:10:46 -0600 Subject: [PATCH 165/429] BAEL-2246: add link back to article (#5824) --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index 222b28e8ad..11893e68a2 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -38,3 +38,4 @@ - [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) +- [Join Array of Primitives with Separator in Java](https://www.baeldung.com/java-join-primitive-array) From 2fa22543451c87fd28f98280e4abd19997f6af53 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 1 Dec 2018 18:49:06 +0200 Subject: [PATCH 166/429] ignoring module --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index cd128aa4c5..4b64a1a27e 100644 --- a/pom.xml +++ b/pom.xml @@ -364,7 +364,7 @@ core-groovy couchbase core-java-concurrency - core-kotlin + core-java dozer @@ -916,7 +916,7 @@ core-groovy couchbase core-java-concurrency - core-kotlin + core-java dozer From 90ca342016f2495acb1d551d17143be3043650e5 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 1 Dec 2018 19:39:47 +0200 Subject: [PATCH 167/429] disabling very long running module --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4b64a1a27e..f9eee3b5e6 100644 --- a/pom.xml +++ b/pom.xml @@ -363,7 +363,7 @@ core-java-8 core-groovy couchbase - core-java-concurrency + core-java From 56400babbf49417074097d0b10c4747610a4cdfa Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 1 Dec 2018 19:40:23 +0200 Subject: [PATCH 168/429] disabling very long running module --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f9eee3b5e6..2bed3c4960 100644 --- a/pom.xml +++ b/pom.xml @@ -915,7 +915,7 @@ core-java-8 core-groovy couchbase - core-java-concurrency + core-java From fe7e4f87f2ad412e60ac50405870ad89baf49b29 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Sat, 1 Dec 2018 20:45:56 +0200 Subject: [PATCH 169/429] ignoring long running module --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 2bed3c4960..6480193201 100644 --- a/pom.xml +++ b/pom.xml @@ -422,7 +422,7 @@ java-spi java-ee-8-security-api - libraries + libraries-data linkrest logging-modules/log-mdc @@ -974,7 +974,7 @@ java-spi java-ee-8-security-api - libraries + libraries-data linkrest logging-modules/log-mdc From 6ced1260225e5f57006b66edad77db9802c22288 Mon Sep 17 00:00:00 2001 From: geroza Date: Fri, 30 Nov 2018 20:50:40 -0200 Subject: [PATCH 170/429] created parent-boot-2 copy, and point all projects to that new temporary parent pom --- azure/pom.xml | 4 +- jib/pom.xml | 4 +- parent-boot-2.0-temp/README.md | 1 + parent-boot-2.0-temp/pom.xml | 85 +++++++++++++++++++ parent-boot-2/pom.xml | 2 +- .../spring-boot-persistence/pom.xml | 4 +- persistence-modules/spring-data-jpa/pom.xml | 4 +- .../spring-data-keyvalue/pom.xml | 4 +- persistence-modules/spring-data-redis/pom.xml | 4 +- pom.xml | 5 ++ spring-5-data-reactive/pom.xml | 4 +- spring-5-mvc/pom.xml | 4 +- spring-5-reactive-client/pom.xml | 4 +- spring-5-reactive-security/pom.xml | 4 +- spring-5-reactive/pom.xml | 4 +- spring-5-security-oauth/pom.xml | 4 +- spring-5-security/pom.xml | 4 +- spring-5/pom.xml | 4 +- spring-all/pom.xml | 4 +- spring-boot-autoconfiguration/pom.xml | 4 +- spring-boot-bootstrap/pom.xml | 4 +- spring-boot-client/pom.xml | 4 +- spring-boot-ctx-fluent/pom.xml | 4 +- spring-boot-disable-console-logging/pom.xml | 4 +- spring-boot-jasypt/pom.xml | 4 +- spring-boot-mvc/pom.xml | 4 +- spring-boot-ops/pom.xml | 4 +- spring-boot-vue/pom.xml | 4 +- spring-boot/pom.xml | 4 +- .../etl/customer-mongodb-sink/pom.xml | 4 +- .../etl/customer-transform/pom.xml | 4 +- spring-cloud/spring-cloud-vault/pom.xml | 4 +- spring-data-rest/pom.xml | 4 +- spring-mvc-forms-thymeleaf/pom.xml | 4 +- spring-rest-angular/pom.xml | 4 +- spring-rest-query-language/pom.xml | 4 +- spring-rest-shell/pom.xml | 4 +- spring-rest-simple/pom.xml | 4 +- spring-rest-template/pom.xml | 4 +- spring-rest/pom.xml | 4 +- spring-resttemplate/pom.xml | 4 +- spring-security-mvc-boot/pom.xml | 4 +- spring-security-openid/pom.xml | 4 +- spring-security-sso/pom.xml | 4 +- spring-security-thymeleaf/pom.xml | 4 +- spring-session/spring-session-jdbc/pom.xml | 4 +- spring-vault/pom.xml | 4 +- spring-webflux-amqp/pom.xml | 4 +- vaadin/pom.xml | 4 +- vavr/pom.xml | 4 +- 50 files changed, 184 insertions(+), 93 deletions(-) create mode 100644 parent-boot-2.0-temp/README.md create mode 100644 parent-boot-2.0-temp/pom.xml diff --git a/azure/pom.xml b/azure/pom.xml index 555efeef70..04438710a0 100644 --- a/azure/pom.xml +++ b/azure/pom.xml @@ -10,10 +10,10 @@ Demo project for Spring Boot on Azure - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/jib/pom.xml b/jib/pom.xml index e71250f157..d7bdcf0b34 100644 --- a/jib/pom.xml +++ b/jib/pom.xml @@ -6,10 +6,10 @@ jib - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/parent-boot-2.0-temp/README.md b/parent-boot-2.0-temp/README.md new file mode 100644 index 0000000000..740848a470 --- /dev/null +++ b/parent-boot-2.0-temp/README.md @@ -0,0 +1 @@ +This pom will be ued only temporary until we migrate parent-boot-2 to 2.1.0 for ticket BAEL-10354 diff --git a/parent-boot-2.0-temp/pom.xml b/parent-boot-2.0-temp/pom.xml new file mode 100644 index 0000000000..9284e4af13 --- /dev/null +++ b/parent-boot-2.0-temp/pom.xml @@ -0,0 +1,85 @@ + + 4.0.0 + parent-boot-2.0-temp + 0.0.1-SNAPSHOT + pom + Temporary Parent for all Spring Boot 2.0.x modules + + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + + + + io.rest-assured + rest-assured + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + ${spring-boot.version} + + ${start-class} + + + + + + + + + + thin-jar + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.springframework.boot.experimental + spring-boot-thin-layout + ${thin.version} + + + + + + + + + + 3.1.0 + + 1.0.11.RELEASE + 2.0.5.RELEASE + + + + diff --git a/parent-boot-2/pom.xml b/parent-boot-2/pom.xml index 89afd79bf4..280d226e95 100644 --- a/parent-boot-2/pom.xml +++ b/parent-boot-2/pom.xml @@ -78,7 +78,7 @@ 3.1.0 1.0.11.RELEASE - 2.0.5.RELEASE + 2.1.1.RELEASE diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index 0ea42b1cb7..b717bec31f 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -9,10 +9,10 @@ spring-boot-persistence - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-2.0-temp diff --git a/persistence-modules/spring-data-jpa/pom.xml b/persistence-modules/spring-data-jpa/pom.xml index 786e587734..6674bab70d 100644 --- a/persistence-modules/spring-data-jpa/pom.xml +++ b/persistence-modules/spring-data-jpa/pom.xml @@ -8,10 +8,10 @@ spring-data-jpa - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-2.0-temp diff --git a/persistence-modules/spring-data-keyvalue/pom.xml b/persistence-modules/spring-data-keyvalue/pom.xml index 1fee0a88d4..ece59d5586 100644 --- a/persistence-modules/spring-data-keyvalue/pom.xml +++ b/persistence-modules/spring-data-keyvalue/pom.xml @@ -5,10 +5,10 @@ spring-data-keyvalue - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-2.0-temp diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml index 683f874b6c..0520d253a1 100644 --- a/persistence-modules/spring-data-redis/pom.xml +++ b/persistence-modules/spring-data-redis/pom.xml @@ -8,10 +8,10 @@ jar - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-2.0-temp diff --git a/pom.xml b/pom.xml index ef7a7f6b1d..1db3b5d519 100644 --- a/pom.xml +++ b/pom.xml @@ -324,6 +324,7 @@ parent-boot-1 parent-boot-2 + parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -513,6 +514,7 @@ parent-boot-1 parent-boot-2 + parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -870,6 +872,7 @@ parent-boot-1 parent-boot-2 + parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -1055,6 +1058,7 @@ parent-boot-1 parent-boot-2 + parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -1263,6 +1267,7 @@ parent-boot-1 parent-boot-2 + parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java diff --git a/spring-5-data-reactive/pom.xml b/spring-5-data-reactive/pom.xml index aa73cf11ae..53e46b526d 100644 --- a/spring-5-data-reactive/pom.xml +++ b/spring-5-data-reactive/pom.xml @@ -7,10 +7,10 @@ jar - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-5-mvc/pom.xml b/spring-5-mvc/pom.xml index f5346a0fa0..24b46e7d2c 100644 --- a/spring-5-mvc/pom.xml +++ b/spring-5-mvc/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-boot-2 + parent-boot-2.0-temp 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index 6e39743ed0..1f2c961cf0 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-2.0-temp 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-5-reactive-security/pom.xml b/spring-5-reactive-security/pom.xml index 3b64b9b3ac..93700b4262 100644 --- a/spring-5-reactive-security/pom.xml +++ b/spring-5-reactive-security/pom.xml @@ -12,9 +12,9 @@ com.baeldung - parent-boot-2 + parent-boot-2.0-temp 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml index e903b57c4e..969e8a7617 100644 --- a/spring-5-reactive/pom.xml +++ b/spring-5-reactive/pom.xml @@ -12,9 +12,9 @@ com.baeldung - parent-boot-2 + parent-boot-2.0-temp 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml index 59150a153f..142326757b 100644 --- a/spring-5-security-oauth/pom.xml +++ b/spring-5-security-oauth/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-2.0-temp 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-5-security/pom.xml b/spring-5-security/pom.xml index 763e505e51..916af7f629 100644 --- a/spring-5-security/pom.xml +++ b/spring-5-security/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2 + parent-boot-2.0-temp 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-5/pom.xml b/spring-5/pom.xml index 293edb5bda..6337f7d417 100644 --- a/spring-5/pom.xml +++ b/spring-5/pom.xml @@ -12,9 +12,9 @@ com.baeldung - parent-boot-2 + parent-boot-2.0-temp 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-all/pom.xml b/spring-all/pom.xml index 2dc4915bab..faddab6ea6 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -7,10 +7,10 @@ war - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot-autoconfiguration/pom.xml b/spring-boot-autoconfiguration/pom.xml index 1c3d8796ed..87418bd2c7 100644 --- a/spring-boot-autoconfiguration/pom.xml +++ b/spring-boot-autoconfiguration/pom.xml @@ -9,10 +9,10 @@ This is simple boot application demonstrating a custom auto-configuration - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot-bootstrap/pom.xml b/spring-boot-bootstrap/pom.xml index b5bf4bc7b6..4b0abd5f2e 100644 --- a/spring-boot-bootstrap/pom.xml +++ b/spring-boot-bootstrap/pom.xml @@ -8,10 +8,10 @@ spring-boot-bootstrap Demo project for Spring Boot - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot-client/pom.xml b/spring-boot-client/pom.xml index fc89931f79..282488c4b1 100644 --- a/spring-boot-client/pom.xml +++ b/spring-boot-client/pom.xml @@ -9,10 +9,10 @@ This is simple boot client application for Spring boot actuator test - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot-ctx-fluent/pom.xml b/spring-boot-ctx-fluent/pom.xml index b238374612..52139fec3c 100644 --- a/spring-boot-ctx-fluent/pom.xml +++ b/spring-boot-ctx-fluent/pom.xml @@ -8,10 +8,10 @@ jar - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot-disable-console-logging/pom.xml b/spring-boot-disable-console-logging/pom.xml index 63ed129347..c8c43ada7a 100644 --- a/spring-boot-disable-console-logging/pom.xml +++ b/spring-boot-disable-console-logging/pom.xml @@ -7,10 +7,10 @@ Projects for Disabling Spring Boot Console Logging tutorials - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot-jasypt/pom.xml b/spring-boot-jasypt/pom.xml index de0df92678..a1707b45b0 100644 --- a/spring-boot-jasypt/pom.xml +++ b/spring-boot-jasypt/pom.xml @@ -10,10 +10,10 @@ Demo project for Spring Boot - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot-mvc/pom.xml b/spring-boot-mvc/pom.xml index b219e53431..8191645d76 100644 --- a/spring-boot-mvc/pom.xml +++ b/spring-boot-mvc/pom.xml @@ -8,10 +8,10 @@ Module For Spring Boot MVC - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot-ops/pom.xml b/spring-boot-ops/pom.xml index 57779c3f8e..760fc69462 100644 --- a/spring-boot-ops/pom.xml +++ b/spring-boot-ops/pom.xml @@ -9,10 +9,10 @@ Demo project for Spring Boot - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot-vue/pom.xml b/spring-boot-vue/pom.xml index d581b11d68..919f3e0ff9 100644 --- a/spring-boot-vue/pom.xml +++ b/spring-boot-vue/pom.xml @@ -12,10 +12,10 @@ Demo project for Spring Boot Vue project - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 87c782b044..40caf4fb97 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -8,10 +8,10 @@ This is simple boot application for Spring boot actuator test - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2 + ../parent-boot-2.0-temp diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml index 468d8e17d0..8eba820dfa 100644 --- a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml +++ b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml @@ -12,10 +12,10 @@ Example ETL Load Project - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-2 + ../../../parent-boot-2.0-temp diff --git a/spring-cloud-data-flow/etl/customer-transform/pom.xml b/spring-cloud-data-flow/etl/customer-transform/pom.xml index bc4b648907..821f06541f 100644 --- a/spring-cloud-data-flow/etl/customer-transform/pom.xml +++ b/spring-cloud-data-flow/etl/customer-transform/pom.xml @@ -13,10 +13,10 @@ Example transform ETL step - parent-boot-2 + parent-boot-2.0-temp com.baeldung 0.0.1-SNAPSHOT - ../../../parent-boot-2 + ../../../parent-boot-2.0-temp diff --git a/spring-cloud/spring-cloud-vault/pom.xml b/spring-cloud/spring-cloud-vault/pom.xml index 68b8e44875..a19d7f3459 100644 --- a/spring-cloud/spring-cloud-vault/pom.xml +++ b/spring-cloud/spring-cloud-vault/pom.xml @@ -12,9 +12,9 @@ com.baeldung - parent-boot-2 + parent-boot-2.0-temp 0.0.1-SNAPSHOT - ../../parent-boot-2 + ../../parent-boot-2.0-temp + org.apache.maven.plugins maven-surefire-plugin @@ -143,14 +144,6 @@ methods true - - **/*IntegrationTest.java - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/JdbcTest.java - **/*LiveTest.java - diff --git a/spring-5/src/main/java/com/baeldung/exception/SpringExceptionApplication.java b/spring-5/src/main/java/com/baeldung/exception/SpringExceptionApplication.java index ed163f7fa7..82a5fe083b 100644 --- a/spring-5/src/main/java/com/baeldung/exception/SpringExceptionApplication.java +++ b/spring-5/src/main/java/com/baeldung/exception/SpringExceptionApplication.java @@ -6,7 +6,7 @@ import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfi import org.springframework.context.annotation.ComponentScan; @SpringBootApplication(exclude = SecurityAutoConfiguration.class) -@ComponentScan(basePackages = { "com.baeldung.execption" }) +@ComponentScan(basePackages = { "com.baeldung.exception" }) public class SpringExceptionApplication { public static void main(String[] args) { SpringApplication.run(SpringExceptionApplication.class, args); diff --git a/spring-5/src/main/java/com/baeldung/jsonb/Spring5Application.java b/spring-5/src/main/java/com/baeldung/jsonb/Spring5Application.java index 00fce06834..540992b4bc 100644 --- a/spring-5/src/main/java/com/baeldung/jsonb/Spring5Application.java +++ b/spring-5/src/main/java/com/baeldung/jsonb/Spring5Application.java @@ -6,12 +6,13 @@ import java.util.Collection; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.http.HttpMessageConverters; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.JsonbHttpMessageConverter; -@SpringBootApplication +@SpringBootApplication(exclude = SecurityAutoConfiguration.class) @ComponentScan(basePackages = { "com.baeldung.jsonb" }) public class Spring5Application { diff --git a/spring-5/src/main/java/com/baeldung/restdocs/SpringRestDocsApplication.java b/spring-5/src/main/java/com/baeldung/restdocs/SpringRestDocsApplication.java index 02332ee7b6..f512b52af4 100644 --- a/spring-5/src/main/java/com/baeldung/restdocs/SpringRestDocsApplication.java +++ b/spring-5/src/main/java/com/baeldung/restdocs/SpringRestDocsApplication.java @@ -2,8 +2,9 @@ package com.baeldung.restdocs; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; -@SpringBootApplication +@SpringBootApplication(exclude = SecurityAutoConfiguration.class) public class SpringRestDocsApplication { public static void main(String[] args) { diff --git a/spring-5/src/test/java/com/baeldung/Example1IntegrationTest.java b/spring-5/src/test/java/com/baeldung/Example1IntegrationTest.java index ecc677465e..8b9e66213f 100644 --- a/spring-5/src/test/java/com/baeldung/Example1IntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/Example1IntegrationTest.java @@ -3,12 +3,10 @@ package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -@EnableJpaRepositories("com.baeldung.persistence") public class Example1IntegrationTest { @Test diff --git a/spring-5/src/test/java/com/baeldung/Example2IntegrationTest.java b/spring-5/src/test/java/com/baeldung/Example2IntegrationTest.java index e1d56c2fc3..6ed53ca4e9 100644 --- a/spring-5/src/test/java/com/baeldung/Example2IntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/Example2IntegrationTest.java @@ -3,12 +3,10 @@ package com.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest -@EnableJpaRepositories("com.baeldung.persistence") public class Example2IntegrationTest { @Test diff --git a/spring-5/src/test/java/com/baeldung/functional/BeanRegistrationIntegrationTest.java b/spring-5/src/test/java/com/baeldung/functional/BeanRegistrationIntegrationTest.java index fba01726f4..9c462e0412 100644 --- a/spring-5/src/test/java/com/baeldung/functional/BeanRegistrationIntegrationTest.java +++ b/spring-5/src/test/java/com/baeldung/functional/BeanRegistrationIntegrationTest.java @@ -1,12 +1,11 @@ package com.baeldung.functional; -import static org.junit.Assert.*; +import static org.junit.Assert.assertTrue; 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.jpa.repository.config.EnableJpaRepositories; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.web.context.support.GenericWebApplicationContext; @@ -14,7 +13,6 @@ import com.baeldung.Spring5Application; @RunWith(SpringRunner.class) @SpringBootTest(classes = Spring5Application.class) -@EnableJpaRepositories("com.baeldung.persistence") public class BeanRegistrationIntegrationTest { @Autowired From dcb2dd46027ea9ed32e579a025b3f96496c506b5 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Sun, 2 Dec 2018 07:41:24 -0800 Subject: [PATCH 173/429] BAEL-2300 update readme --- core-java/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java/README.md b/core-java/README.md index e8923e9a2f..b8ad28cc0c 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -88,3 +88,4 @@ - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) +- [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding) From 0a87548bf80fdb8cfbd15edab2621df836ba1bda Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Sun, 2 Dec 2018 08:11:11 -0800 Subject: [PATCH 174/429] BAEL-2089 update readme --- persistence-modules/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/README.md b/persistence-modules/README.md index f12163bd6a..75ccc749e5 100644 --- a/persistence-modules/README.md +++ b/persistence-modules/README.md @@ -9,3 +9,4 @@ - [Introduction to Lettuce – the Java Redis Client](http://www.baeldung.com/java-redis-lettuce) - [A Guide to Jdbi](http://www.baeldung.com/jdbi) - [Pessimistic Locking in JPA](http://www.baeldung.com/jpa-pessimistic-locking) +- [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all) From 530395a44a35abab70d4ca599cc5088ba01a855a Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sun, 2 Dec 2018 23:45:35 +0530 Subject: [PATCH 175/429] BAEL-2403: Immutable Map implementations in Java --- .../baeldung/java/map/ImmutableMapTest.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java new file mode 100644 index 0000000000..d2637d8368 --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java @@ -0,0 +1,87 @@ +package com.baeldung.java.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 java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import com.google.common.collect.ImmutableMap; + + +public class ImmutableMapTest { + + @Test + public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + Map unmodifiableMap = Collections.unmodifiableMap(mutableMap); + assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertFalse(unmodifiableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertTrue(unmodifiableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap); + assertTrue(immutableMap.containsKey("USA")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + ImmutableMap immutableMap = ImmutableMap.builder() + .putAll(mutableMap) + .put("Costa Rica", "North America") + .build(); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + ImmutableMap immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + } + +} From 857192358caf26bba0fec77f6991aed290fa91ab Mon Sep 17 00:00:00 2001 From: fanatixan Date: Sun, 2 Dec 2018 19:36:38 +0100 Subject: [PATCH 176/429] bael-2361 (#5804) * bael-2361 * Update RemoveLeadingAndTrailingZeroes.java * moving examples to java-string project --- .../RemoveLeadingAndTrailingZeroes.java | 103 +++++++++++++ ...emoveLeadingAndTrailingZeroesUnitTest.java | 143 ++++++++++++++++++ 2 files changed, 246 insertions(+) create mode 100644 java-strings/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java create mode 100644 java-strings/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java diff --git a/java-strings/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java b/java-strings/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java new file mode 100644 index 0000000000..c9d748e897 --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroes.java @@ -0,0 +1,103 @@ +package com.baeldung.string.removeleadingtrailingchar; + + +import org.apache.commons.lang3.StringUtils; + +import com.google.common.base.CharMatcher; + +public class RemoveLeadingAndTrailingZeroes { + + public static String removeLeadingZeroesWithStringBuilder(String s) { + StringBuilder sb = new StringBuilder(s); + + while (sb.length() > 1 && sb.charAt(0) == '0') { + sb.deleteCharAt(0); + } + + return sb.toString(); + } + + public static String removeTrailingZeroesWithStringBuilder(String s) { + StringBuilder sb = new StringBuilder(s); + + while (sb.length() > 1 && sb.charAt(sb.length() - 1) == '0') { + sb.setLength(sb.length() - 1); + } + + return sb.toString(); + } + + public static String removeLeadingZeroesWithSubstring(String s) { + int index = 0; + + for (; index < s.length() - 1; index++) { + if (s.charAt(index) != '0') { + break; + } + } + + return s.substring(index); + } + + public static String removeTrailingZeroesWithSubstring(String s) { + int index = s.length() - 1; + + for (; index > 0; index--) { + if (s.charAt(index) != '0') { + break; + } + } + + return s.substring(0, index + 1); + } + + public static String removeLeadingZeroesWithApacheCommonsStripStart(String s) { + String stripped = StringUtils.stripStart(s, "0"); + + if (stripped.isEmpty() && !s.isEmpty()) { + return "0"; + } + + return stripped; + } + + public static String removeTrailingZeroesWithApacheCommonsStripEnd(String s) { + String stripped = StringUtils.stripEnd(s, "0"); + + if (stripped.isEmpty() && !s.isEmpty()) { + return "0"; + } + + return stripped; + } + + public static String removeLeadingZeroesWithGuavaTrimLeadingFrom(String s) { + String stripped = CharMatcher.is('0') + .trimLeadingFrom(s); + + if (stripped.isEmpty() && !s.isEmpty()) { + return "0"; + } + + return stripped; + } + + public static String removeTrailingZeroesWithGuavaTrimTrailingFrom(String s) { + String stripped = CharMatcher.is('0') + .trimTrailingFrom(s); + + if (stripped.isEmpty() && !s.isEmpty()) { + return "0"; + } + + return stripped; + } + + public static String removeLeadingZeroesWithRegex(String s) { + return s.replaceAll("^0+(?!$)", ""); + } + + public static String removeTrailingZeroesWithRegex(String s) { + return s.replaceAll("(?!^)0+$", ""); + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java b/java-strings/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java new file mode 100644 index 0000000000..55f932fea1 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/removeleadingtrailingchar/RemoveLeadingAndTrailingZeroesUnitTest.java @@ -0,0 +1,143 @@ +package com.baeldung.string.removeleadingtrailingchar; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.stream.Stream; + +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public class RemoveLeadingAndTrailingZeroesUnitTest { + + public static Stream leadingZeroTestProvider() { + return Stream.of(Arguments.of("", ""), Arguments.of("abc", "abc"), Arguments.of("123", "123"), Arguments.of("0abc", "abc"), Arguments.of("0123", "123"), Arguments.of("0000123", "123"), Arguments.of("1230", "1230"), Arguments.of("01230", "1230"), Arguments.of("01", "1"), + Arguments.of("0001", "1"), Arguments.of("0", "0"), Arguments.of("00", "0"), Arguments.of("0000", "0"), Arguments.of("12034", "12034"), Arguments.of("1200034", "1200034"), Arguments.of("0012034", "12034"), Arguments.of("1203400", "1203400")); + } + + public static Stream trailingZeroTestProvider() { + return Stream.of(Arguments.of("", ""), Arguments.of("abc", "abc"), Arguments.of("123", "123"), Arguments.of("abc0", "abc"), Arguments.of("1230", "123"), Arguments.of("1230000", "123"), Arguments.of("0123", "0123"), Arguments.of("01230", "0123"), Arguments.of("10", "1"), + Arguments.of("1000", "1"), Arguments.of("0", "0"), Arguments.of("00", "0"), Arguments.of("0000", "0"), Arguments.of("12034", "12034"), Arguments.of("1200034", "1200034"), Arguments.of("0012034", "0012034"), Arguments.of("1203400", "12034")); + } + + @ParameterizedTest + @MethodSource("leadingZeroTestProvider") + public void givenTestStrings_whenRemoveLeadingZeroesWithStringBuilder_thenReturnWithoutLeadingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithStringBuilder(input); + + // then + assertThat(result).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("trailingZeroTestProvider") + public void givenTestStrings_whenRemoveTrailingZeroesWithStringBuilder_thenReturnWithoutTrailingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithStringBuilder(input); + + // then + assertThat(result).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("leadingZeroTestProvider") + public void givenTestStrings_whenRemoveLeadingZeroesWithSubstring_thenReturnWithoutLeadingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithSubstring(input); + + // then + assertThat(result).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("trailingZeroTestProvider") + public void givenTestStrings_whenRemoveTrailingZeroesWithSubstring_thenReturnWithoutTrailingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithSubstring(input); + + // then + assertThat(result).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("leadingZeroTestProvider") + public void givenTestStrings_whenRemoveLeadingZeroesWithApacheCommonsStripStart_thenReturnWithoutLeadingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithApacheCommonsStripStart(input); + + // then + assertThat(result).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("trailingZeroTestProvider") + public void givenTestStrings_whenRemoveTrailingZeroesWithApacheCommonsStripEnd_thenReturnWithoutTrailingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithApacheCommonsStripEnd(input); + + // then + assertThat(result).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("leadingZeroTestProvider") + public void givenTestStrings_whenRemoveLeadingZeroesWithGuavaTrimLeadingFrom_thenReturnWithoutLeadingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithGuavaTrimLeadingFrom(input); + + // then + assertThat(result).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("trailingZeroTestProvider") + public void givenTestStrings_whenRemoveTrailingZeroesWithGuavaTrimTrailingFrom_thenReturnWithoutTrailingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithGuavaTrimTrailingFrom(input); + + // then + assertThat(result).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("leadingZeroTestProvider") + public void givenTestStrings_whenRemoveLeadingZeroesWithRegex_thenReturnWithoutLeadingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeLeadingZeroesWithRegex(input); + + // then + assertThat(result).isEqualTo(expected); + } + + @ParameterizedTest + @MethodSource("trailingZeroTestProvider") + public void givenTestStrings_whenRemoveTrailingZeroesWithRegex_thenReturnWithoutTrailingZeroes(String input, String expected) { + // given + + // when + String result = RemoveLeadingAndTrailingZeroes.removeTrailingZeroesWithRegex(input); + + // then + assertThat(result).isEqualTo(expected); + } + +} From 0147b5c699123c2e4a6dff91e7c615e5fb42e2cb Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 2 Dec 2018 23:08:16 +0200 Subject: [PATCH 177/429] fix jedis map ex --- .../src/test/java/com/baeldung/JedisIntegrationTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java b/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java index 5795e9912b..50d28af3d1 100644 --- a/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java +++ b/persistence-modules/redis/src/test/java/com/baeldung/JedisIntegrationTest.java @@ -144,8 +144,8 @@ public class JedisIntegrationTest { scores.put("PlayerTwo", 1500.0); scores.put("PlayerThree", 8200.0); - scores.keySet().forEach(player -> { - jedis.zadd(key, scores.get(player), player); + scores.entrySet().forEach(playerScore -> { + jedis.zadd(key, playerScore.getValue(), playerScore.getKey()); }); Set players = jedis.zrevrange(key, 0, 1); From 6b29e94a406d81e23f6d7534c3692b7c855da12a Mon Sep 17 00:00:00 2001 From: chrisoberle Date: Sun, 2 Dec 2018 21:23:39 -0500 Subject: [PATCH 178/429] BAEL-2174 How to use proxies in core java (#5805) * move samples from core-java to new core-java-net module * remove erroneous commit of .vscode dir --- core-java-net/.gitignore | 25 +++++++++++++++++++ core-java-net/README.md | 3 +++ core-java-net/pom.xml | 19 ++++++++++++++ .../proxies/CommandLineProxyDemo.java | 0 .../networking/proxies/DirectProxyDemo.java | 0 .../networking/proxies/SocksProxyDemo.java | 0 .../proxies/SystemPropertyProxyDemo.java | 0 .../proxies/UrlConnectionUtils.java | 0 .../networking/proxies/WebProxyDemo.java | 0 core-java-net/src/test/resources/.gitignore | 13 ++++++++++ pom.xml | 4 ++- 11 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 core-java-net/.gitignore create mode 100644 core-java-net/README.md create mode 100644 core-java-net/pom.xml rename {core-java => core-java-net}/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java (100%) rename {core-java => core-java-net}/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java (100%) rename {core-java => core-java-net}/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java (100%) rename {core-java => core-java-net}/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java (100%) rename {core-java => core-java-net}/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java (100%) rename {core-java => core-java-net}/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java (100%) create mode 100644 core-java-net/src/test/resources/.gitignore diff --git a/core-java-net/.gitignore b/core-java-net/.gitignore new file mode 100644 index 0000000000..374c8bf907 --- /dev/null +++ b/core-java-net/.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-net/README.md b/core-java-net/README.md new file mode 100644 index 0000000000..b7a142ea27 --- /dev/null +++ b/core-java-net/README.md @@ -0,0 +1,3 @@ +========= + +## Core Java Net diff --git a/core-java-net/pom.xml b/core-java-net/pom.xml new file mode 100644 index 0000000000..28d5766a9a --- /dev/null +++ b/core-java-net/pom.xml @@ -0,0 +1,19 @@ + + 4.0.0 + core-java-net + 0.1.0-SNAPSHOT + jar + core-java-net + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + core-java-net + + diff --git a/core-java/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java rename to core-java-net/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java diff --git a/core-java/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java rename to core-java-net/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java diff --git a/core-java/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java rename to core-java-net/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java diff --git a/core-java/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java rename to core-java-net/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java diff --git a/core-java/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java rename to core-java-net/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java diff --git a/core-java/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java b/core-java-net/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java rename to core-java-net/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java diff --git a/core-java-net/src/test/resources/.gitignore b/core-java-net/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-net/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 6480193201..b5c61dff9d 100644 --- a/pom.xml +++ b/pom.xml @@ -366,7 +366,8 @@ core-java - + core-java-net + dozer disruptor drools @@ -918,6 +919,7 @@ core-java + core-java-net dozer disruptor From dcf28dd16638a27ea620d5d47b904ebe1195afc5 Mon Sep 17 00:00:00 2001 From: Seun Matt Date: Mon, 3 Dec 2018 17:03:41 +0100 Subject: [PATCH 179/429] refactor the spring boot persistence mongodb module (#5829) * added example code for BAEL-2366 * moved example code for BAEL-2366 * example code for BAEL-1961 * moved example code into integration test * updated the test assertions * refactor the spring boot persistence mongodb module * remove redundant example code * declared the spring boot persistence module in the root pom * fixed issue with non-imported file --- .../.gitignore | 4 + .../spring-boot-persistence-mongodb/pom.xml | 106 ++++++++++++++++++ .../SpringBootPersistenceApplication.java | 13 +++ .../baeldung/mongodb/daos/UserRepository.java | 0 .../mongodb/events/UserModelListener.java | 0 .../mongodb/models/DatabaseSequence.java | 0 .../com/baeldung/mongodb/models/User.java | 0 .../services/SequenceGeneratorService.java | 0 .../src/main/resources/application.properties | 8 ++ ...goDbAutoGeneratedFieldIntegrationTest.java | 7 +- pom.xml | 1 + .../com/baeldung/mongodb/Application.java | 19 ---- .../mongodb/MongoDbSpringIntegrationTest.java | 1 + 13 files changed, 137 insertions(+), 22 deletions(-) create mode 100644 persistence-modules/spring-boot-persistence-mongodb/.gitignore create mode 100644 persistence-modules/spring-boot-persistence-mongodb/pom.xml create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/SpringBootPersistenceApplication.java rename {spring-boot => persistence-modules/spring-boot-persistence-mongodb}/src/main/java/com/baeldung/mongodb/daos/UserRepository.java (100%) rename {spring-boot => persistence-modules/spring-boot-persistence-mongodb}/src/main/java/com/baeldung/mongodb/events/UserModelListener.java (100%) rename {spring-boot => persistence-modules/spring-boot-persistence-mongodb}/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java (100%) rename {spring-boot => persistence-modules/spring-boot-persistence-mongodb}/src/main/java/com/baeldung/mongodb/models/User.java (100%) rename {spring-boot => persistence-modules/spring-boot-persistence-mongodb}/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java (100%) create mode 100644 persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties rename {spring-boot => persistence-modules/spring-boot-persistence-mongodb}/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java (88%) delete mode 100644 spring-boot/src/main/java/com/baeldung/mongodb/Application.java diff --git a/persistence-modules/spring-boot-persistence-mongodb/.gitignore b/persistence-modules/spring-boot-persistence-mongodb/.gitignore new file mode 100644 index 0000000000..f96dae6a60 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/.gitignore @@ -0,0 +1,4 @@ + +/.idea/ +/target/ +/spring-boot-persistence.iml diff --git a/persistence-modules/spring-boot-persistence-mongodb/pom.xml b/persistence-modules/spring-boot-persistence-mongodb/pom.xml new file mode 100644 index 0000000000..fc267eedf6 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/pom.xml @@ -0,0 +1,106 @@ + + + 4.0.0 + + + parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../../parent-boot-2 + + + spring-boot-persistence-mongodb + war + spring-boot-persistence-mongodb + This is simple boot application for Spring boot persistence mongodb test + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + + org.junit.jupiter + junit-jupiter-api + test + + + org.junit.jupiter + junit-jupiter-engine + test + + + + + org.junit.platform + junit-platform-launcher + ${junit-platform.version} + test + + + org.springframework.boot + spring-boot-starter-test + test + + + + + spring-boot-persistence + + + src/main/resources + true + + + + + org.apache.maven.plugins + maven-war-plugin + + + + + + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*IntTest.java + + + + + + + json + + + + + + + + + + \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/SpringBootPersistenceApplication.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/SpringBootPersistenceApplication.java new file mode 100644 index 0000000000..2dff3f37df --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/SpringBootPersistenceApplication.java @@ -0,0 +1,13 @@ +package com.baeldung; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringBootPersistenceApplication { + + public static void main(String ... args) { + SpringApplication.run(SpringBootPersistenceApplication.class, args); + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/daos/UserRepository.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/daos/UserRepository.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/mongodb/daos/UserRepository.java rename to persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/daos/UserRepository.java diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/events/UserModelListener.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/events/UserModelListener.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/mongodb/events/UserModelListener.java rename to persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/events/UserModelListener.java diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java rename to persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/DatabaseSequence.java diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/models/User.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/User.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/mongodb/models/User.java rename to persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/models/User.java diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java b/persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java similarity index 100% rename from spring-boot/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java rename to persistence-modules/spring-boot-persistence-mongodb/src/main/java/com/baeldung/mongodb/services/SequenceGeneratorService.java diff --git a/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties new file mode 100644 index 0000000000..5b1b8000d0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/src/main/resources/application.properties @@ -0,0 +1,8 @@ +spring.application.name=spring-boot-persistence +server.port=${PORT:0} + +#spring boot mongodb +spring.data.mongodb.host=localhost +spring.data.mongodb.port=27017 +spring.data.mongodb.database=springboot-mongo + diff --git a/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java similarity index 88% rename from spring-boot/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java rename to persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java index 3430bca69a..cec1ad5fea 100644 --- a/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence-mongodb/src/test/java/com/baeldung/mongodb/MongoDbAutoGeneratedFieldIntegrationTest.java @@ -5,17 +5,18 @@ import com.baeldung.mongodb.models.User; 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 static org.assertj.core.api.Assertions.assertThat; -import java.util.List; +import static org.assertj.core.api.Assertions.assertThat; @RunWith(SpringRunner.class) +@SpringBootTest public class MongoDbAutoGeneratedFieldIntegrationTest { @Autowired - private UserRepository userRepository; + UserRepository userRepository; @Test public void contextLoads() {} diff --git a/pom.xml b/pom.xml index b5c61dff9d..dabb4a9628 100644 --- a/pom.xml +++ b/pom.xml @@ -479,6 +479,7 @@ persistence-modules/spring-data-cassandra persistence-modules/spring-data-couchbase-2 persistence-modules/spring-data-redis + persistence-modules/spring-boot-persistence-mongodb reactor-core resteasy diff --git a/spring-boot/src/main/java/com/baeldung/mongodb/Application.java b/spring-boot/src/main/java/com/baeldung/mongodb/Application.java deleted file mode 100644 index c0a9ad59a7..0000000000 --- a/spring-boot/src/main/java/com/baeldung/mongodb/Application.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.mongodb; - -import com.baeldung.mongodb.daos.UserRepository; -import com.baeldung.mongodb.models.User; -import org.springframework.boot.CommandLineRunner; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; - -import java.util.List; - -@SpringBootApplication -public class Application { - - public static void main(String[] args) { - SpringApplication.run(Application.class, args); - } - -} diff --git a/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java b/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java index 5431217c3e..39127f62e9 100644 --- a/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java +++ b/spring-boot/src/test/java/com/baeldung/mongodb/MongoDbSpringIntegrationTest.java @@ -2,6 +2,7 @@ package com.baeldung.mongodb; import static org.assertj.core.api.Assertions.assertThat; +import org.baeldung.boot.Application; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; From baa628837597a9a6a21d6c1d2659ff8ec056e9e4 Mon Sep 17 00:00:00 2001 From: geroza Date: Mon, 3 Dec 2018 14:53:39 -0200 Subject: [PATCH 180/429] Migration of the following modules: * spring-5-mvc * spring-5-reactive --- spring-5-mvc/pom.xml | 4 +-- .../java/com/baeldung/Spring5Application.java | 3 +- .../springbootkotlin/KotlinDemoApplication.kt | 3 +- .../com/baeldung/LiveTest.java | 0 spring-5-reactive/pom.xml | 16 +++++----- ...java => ConsumerDebuggingApplication.java} | 6 ++-- ...n.java => ServerDebuggingApplication.java} | 6 ++-- .../FunctionalSpringBootApplication.java | 14 ++++----- .../reactive/Spring5ReactiveApplication.java | 2 -- .../CorsOnAnnotatedElementsApplication.java | 8 +++++ .../global/CorsGlobalConfigApplication.java | 8 +++++ ....java => CorsGlobalFunctionalHandler.java} | 2 +- .../routers/CorsRouterFunctions.java | 4 +-- .../webfilter/CorsWebFilterApplication.java | 9 ++++++ .../CorsWithWebFilterRouterFunctions.java | 2 +- .../consumer/ConsumerSSEApplication.java | 14 ++++++++- .../server/ServerSSEApplication.java | 16 ++++++++-- .../FunctionalValidationsApplication.java | 12 ++++++++ .../routers/ValidationsRouters.java | 2 +- .../configuration/WebFluxSecurityConfig.java | 8 ++--- ...nctionalWebApplicationIntegrationTest.java | 1 + ...g5ReactiveServerClientIntegrationTest.java | 30 +++++++++++-------- .../cors/CorsOnAnnotatedElementsLiveTest.java | 3 -- .../cors/CorsOnGlobalConfigLiveTest.java | 3 -- .../cors/CorsOnWebFilterLiveTest.java | 3 -- .../ErrorHandlingIntegrationTest.java | 2 ++ .../filters/PlayerHandlerIntegrationTest.java | 2 ++ .../UserControllerIntegrationTest.java | 2 ++ .../ResponseHeaderLiveTest.java | 3 -- .../ServiceSentEventLiveTest.java | 5 ++-- ...ernsUsingHandlerMethodIntegrationTest.java | 2 ++ ...FunctionalEndpointValidationsLiveTest.java | 3 -- .../client/WebTestClientIntegrationTest.java | 6 +++- 33 files changed, 131 insertions(+), 73 deletions(-) rename spring-5-mvc/src/test/{kotlin => java}/com/baeldung/LiveTest.java (100%) rename spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/{ConsumerSSEApplication.java => ConsumerDebuggingApplication.java} (80%) rename spring-5-reactive/src/main/java/com/baeldung/debugging/server/{ServerSSEApplication.java => ServerDebuggingApplication.java} (77%) rename spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/{FunctionalHandler.java => CorsGlobalFunctionalHandler.java} (93%) diff --git a/spring-5-mvc/pom.xml b/spring-5-mvc/pom.xml index 24b46e7d2c..f5346a0fa0 100644 --- a/spring-5-mvc/pom.xml +++ b/spring-5-mvc/pom.xml @@ -11,9 +11,9 @@ com.baeldung - parent-boot-2.0-temp + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-5-mvc/src/main/java/com/baeldung/Spring5Application.java b/spring-5-mvc/src/main/java/com/baeldung/Spring5Application.java index 8251467122..74a348dea6 100644 --- a/spring-5-mvc/src/main/java/com/baeldung/Spring5Application.java +++ b/spring-5-mvc/src/main/java/com/baeldung/Spring5Application.java @@ -4,10 +4,11 @@ import javax.servlet.Filter; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration; import org.springframework.web.filter.DelegatingFilterProxy; import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; -@SpringBootApplication +@SpringBootApplication( exclude = SecurityAutoConfiguration.class) public class Spring5Application { public static void main(String[] args) { diff --git a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt index f95586af80..8904d8d805 100644 --- a/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt +++ b/spring-5-mvc/src/main/kotlin/com/baeldung/springbootkotlin/KotlinDemoApplication.kt @@ -2,8 +2,9 @@ package com.baeldung.springbootkotlin import org.springframework.boot.SpringApplication import org.springframework.boot.autoconfigure.SpringBootApplication +import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration -@SpringBootApplication(scanBasePackages = arrayOf("com.baeldung.springbootkotlin")) +@SpringBootApplication(scanBasePackages = arrayOf("com.baeldung.springbootkotlin"), exclude = arrayOf(SecurityAutoConfiguration::class)) class KotlinDemoApplication fun main(args: Array) { diff --git a/spring-5-mvc/src/test/kotlin/com/baeldung/LiveTest.java b/spring-5-mvc/src/test/java/com/baeldung/LiveTest.java similarity index 100% rename from spring-5-mvc/src/test/kotlin/com/baeldung/LiveTest.java rename to spring-5-mvc/src/test/java/com/baeldung/LiveTest.java diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml index 969e8a7617..ab64d1e2fa 100644 --- a/spring-5-reactive/pom.xml +++ b/spring-5-reactive/pom.xml @@ -12,9 +12,9 @@ com.baeldung - parent-boot-2.0-temp + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -75,6 +75,11 @@ spring-boot-starter-test test + + org.springframework.security + spring-security-test + test + @@ -116,12 +121,6 @@ ${project-reactor-test} test - - org.junit.platform - junit-platform-runner - ${junit.platform.version} - test - @@ -145,7 +144,6 @@ 1.0 4.1 3.1.6.RELEASE - 1.2.0 diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java similarity index 80% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java rename to spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java index 55db3d7392..486c5e77eb 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerSSEApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/ConsumerDebuggingApplication.java @@ -14,17 +14,17 @@ import reactor.core.publisher.Hooks; @SpringBootApplication(exclude = MongoReactiveAutoConfiguration.class) @EnableScheduling -public class ConsumerSSEApplication { +public class ConsumerDebuggingApplication { public static void main(String[] args) { Hooks.onOperatorDebug(); - SpringApplication app = new SpringApplication(ConsumerSSEApplication.class); + SpringApplication app = new SpringApplication(ConsumerDebuggingApplication.class); app.setDefaultProperties(Collections.singletonMap("server.port", "8082")); app.run(args); } @Bean - public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + public SecurityWebFilterChain debuggingConsumerSpringSecurityFilterChain(ServerHttpSecurity http) { http.authorizeExchange() .anyExchange() .permitAll(); diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java similarity index 77% rename from spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java rename to spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java index 6b24ee39f0..4fdc1dd137 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerSSEApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/server/ServerDebuggingApplication.java @@ -11,16 +11,16 @@ import org.springframework.web.reactive.config.EnableWebFlux; @EnableWebFlux @SpringBootApplication -public class ServerSSEApplication { +public class ServerDebuggingApplication { public static void main(String[] args) { - SpringApplication app = new SpringApplication(ServerSSEApplication.class); + SpringApplication app = new SpringApplication(ServerDebuggingApplication.class); app.setDefaultProperties(Collections.singletonMap("server.port", "8081")); app.run(args); } @Bean - public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { + public SecurityWebFilterChain debuggingServerSpringSecurityFilterChain(ServerHttpSecurity http) { http.authorizeExchange() .anyExchange() .permitAll(); diff --git a/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java b/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java index a1d5d87d5c..9cbc1b7669 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/functional/FunctionalSpringBootApplication.java @@ -17,8 +17,6 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; import org.springframework.core.io.ClassPathResource; import org.springframework.http.server.reactive.HttpHandler; import org.springframework.web.reactive.function.server.RouterFunction; @@ -40,11 +38,14 @@ public class FunctionalSpringBootApplication { private RouterFunction routingFunction() { FormHandler formHandler = new FormHandler(); - RouterFunction restfulRouter = route(GET("/"), serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), serverRequest -> serverRequest.bodyToMono(Actor.class) - .doOnNext(actors::add) - .then(ok().build())); + RouterFunction restfulRouter = route(GET("/"), + serverRequest -> ok().body(Flux.fromIterable(actors), Actor.class)).andRoute(POST("/"), + serverRequest -> serverRequest.bodyToMono(Actor.class) + .doOnNext(actors::add) + .then(ok().build())); - return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld"))).andRoute(POST("/login"), formHandler::handleLogin) + return route(GET("/test"), serverRequest -> ok().body(fromObject("helloworld"))) + .andRoute(POST("/login"), formHandler::handleLogin) .andRoute(POST("/upload"), formHandler::handleUpload) .and(RouterFunctions.resources("/files/**", new ClassPathResource("files/"))) .andNest(path("/actor"), restfulRouter) @@ -68,5 +69,4 @@ public class FunctionalSpringBootApplication { public static void main(String[] args) { SpringApplication.run(FunctionalSpringBootApplication.class, args); } - } diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java index 1656f70221..a8cd18c470 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/Spring5ReactiveApplication.java @@ -1,9 +1,7 @@ package com.baeldung.reactive; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; @SpringBootApplication public class Spring5ReactiveApplication{ diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/CorsOnAnnotatedElementsApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/CorsOnAnnotatedElementsApplication.java index d990928abe..69ae24b849 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/CorsOnAnnotatedElementsApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/annotated/CorsOnAnnotatedElementsApplication.java @@ -4,6 +4,9 @@ import java.util.Collections; 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 CorsOnAnnotatedElementsApplication { @@ -14,4 +17,9 @@ public class CorsOnAnnotatedElementsApplication { app.run(args); } + @Bean + public SecurityWebFilterChain corsAnnotatedSpringSecurityFilterChain(ServerHttpSecurity http) { + http.csrf().disable(); + return http.build(); + } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/CorsGlobalConfigApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/CorsGlobalConfigApplication.java index 8228944569..a70f937980 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/CorsGlobalConfigApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/CorsGlobalConfigApplication.java @@ -8,6 +8,9 @@ import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfigurat import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; @SpringBootApplication(exclude = { MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, @@ -22,4 +25,9 @@ public class CorsGlobalConfigApplication { app.run(args); } + @Bean + public SecurityWebFilterChain corsGlobalSpringSecurityFilterChain(ServerHttpSecurity http) { + http.csrf().disable(); + return http.build(); + } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/FunctionalHandler.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/CorsGlobalFunctionalHandler.java similarity index 93% rename from spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/FunctionalHandler.java rename to spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/CorsGlobalFunctionalHandler.java index e6e32d7cc8..d2b7af29a6 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/FunctionalHandler.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/handlers/CorsGlobalFunctionalHandler.java @@ -7,7 +7,7 @@ import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Mono; @Component -public class FunctionalHandler { +public class CorsGlobalFunctionalHandler { public Mono useHandler(final ServerRequest request) { final String responseMessage = "CORS GLOBAL CONFIG IS NOT EFFECTIVE ON FUNCTIONAL ENDPOINTS!!!"; diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/routers/CorsRouterFunctions.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/routers/CorsRouterFunctions.java index 19621a9e97..0a520828b9 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/routers/CorsRouterFunctions.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/global/functional/routers/CorsRouterFunctions.java @@ -8,13 +8,13 @@ import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; -import com.baeldung.reactive.cors.global.functional.handlers.FunctionalHandler; +import com.baeldung.reactive.cors.global.functional.handlers.CorsGlobalFunctionalHandler; @Configuration public class CorsRouterFunctions { @Bean - public RouterFunction responseHeaderRoute(@Autowired FunctionalHandler handler) { + public RouterFunction corsGlobalRouter(@Autowired CorsGlobalFunctionalHandler handler) { return RouterFunctions.route(RequestPredicates.PUT("/global-config-on-functional/cors-disabled-functional-endpoint"), handler::useHandler); } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/CorsWebFilterApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/CorsWebFilterApplication.java index 38140c0d71..7792975768 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/CorsWebFilterApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/CorsWebFilterApplication.java @@ -8,6 +8,9 @@ import org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfigurat import org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration; import org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; @SpringBootApplication(exclude = { MongoAutoConfiguration.class, MongoDataAutoConfiguration.class, @@ -21,5 +24,11 @@ public class CorsWebFilterApplication { app.setDefaultProperties(Collections.singletonMap("server.port", "8083")); app.run(args); } + + @Bean + public SecurityWebFilterChain corsWebfilterSpringSecurityFilterChain(ServerHttpSecurity http) { + http.csrf().disable(); + return http.build(); + } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/routers/CorsWithWebFilterRouterFunctions.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/routers/CorsWithWebFilterRouterFunctions.java index a3905bb79f..6056b9bf5a 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/routers/CorsWithWebFilterRouterFunctions.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/cors/webfilter/functional/routers/CorsWithWebFilterRouterFunctions.java @@ -14,7 +14,7 @@ import com.baeldung.reactive.cors.webfilter.functional.handlers.CorsWithWebFilte public class CorsWithWebFilterRouterFunctions { @Bean - public RouterFunction responseHeaderRoute(@Autowired CorsWithWebFilterHandler handler) { + public RouterFunction corsWebfilterRouter(@Autowired CorsWithWebFilterHandler handler) { return RouterFunctions.route(RequestPredicates.PUT("/web-filter-on-functional/functional-endpoint"), handler::useHandler); } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java index 3997607ef0..d8edaf7fd5 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/consumer/ConsumerSSEApplication.java @@ -4,9 +4,13 @@ import java.util.Collections; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration; +import org.springframework.context.annotation.Bean; import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; -@SpringBootApplication +@SpringBootApplication(exclude = { RedisReactiveAutoConfiguration.class }) @EnableAsync public class ConsumerSSEApplication { @@ -15,5 +19,13 @@ public class ConsumerSSEApplication { app.setDefaultProperties(Collections.singletonMap("server.port", "8082")); app.run(args); } + + @Bean + public SecurityWebFilterChain sseConsumerSpringSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() + .anyExchange() + .permitAll(); + return http.build(); + } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/ServerSSEApplication.java b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/ServerSSEApplication.java index 2750e6616d..c040b83da0 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/ServerSSEApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/reactive/serversentevents/server/ServerSSEApplication.java @@ -4,14 +4,26 @@ import java.util.Collections; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration; +import org.springframework.context.annotation.Bean; +import org.springframework.security.config.web.server.ServerHttpSecurity; +import org.springframework.security.web.server.SecurityWebFilterChain; -@SpringBootApplication +@SpringBootApplication(exclude = { RedisReactiveAutoConfiguration.class }) public class ServerSSEApplication { - + public static void main(String[] args) { SpringApplication app = new SpringApplication(ServerSSEApplication.class); app.setDefaultProperties(Collections.singletonMap("server.port", "8081")); app.run(args); } + @Bean + public SecurityWebFilterChain sseServerSpringSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() + .anyExchange() + .permitAll(); + return http.build(); + } + } diff --git a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java index e548e33c85..4cbb65dc60 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java +++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/FunctionalValidationsApplication.java @@ -2,6 +2,9 @@ package com.baeldung.validations.functional; 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 FunctionalValidationsApplication { @@ -9,4 +12,13 @@ public class FunctionalValidationsApplication { public static void main(String[] args) { SpringApplication.run(FunctionalValidationsApplication.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/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java index efbdbe3f99..29582a0b0f 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java +++ b/spring-5-reactive/src/main/java/com/baeldung/validations/functional/routers/ValidationsRouters.java @@ -17,7 +17,7 @@ import com.baeldung.validations.functional.handlers.impl.OtherEntityValidationHa public class ValidationsRouters { @Bean - public RouterFunction responseHeaderRoute(@Autowired CustomRequestEntityValidationHandler dryHandler, + public RouterFunction validationsRouter(@Autowired CustomRequestEntityValidationHandler dryHandler, @Autowired FunctionalHandler complexHandler, @Autowired OtherEntityValidationHandler otherHandler, @Autowired AnnotatedRequestEntityValidationHandler annotatedEntityHandler) { diff --git a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java index 452bcac8ab..61927e47ab 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java +++ b/spring-5-reactive/src/main/java/com/baeldung/websession/configuration/WebFluxSecurityConfig.java @@ -34,9 +34,8 @@ public class WebFluxSecurityConfig { } @Bean - public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) { - http - .authorizeExchange() + public SecurityWebFilterChain webSessionSpringSecurityFilterChain(ServerHttpSecurity http) { + http.authorizeExchange() .anyExchange().authenticated() .and() .httpBasic() @@ -44,8 +43,7 @@ public class WebFluxSecurityConfig { .and() .formLogin(); - http - .csrf().disable(); + http.csrf().disable(); return http.build(); diff --git a/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java index 4dea2a05cf..1256d5f129 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/functional/FunctionalWebApplicationIntegrationTest.java @@ -10,6 +10,7 @@ import org.springframework.boot.web.server.WebServer; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java index 5ebfa39358..b8dd9c9509 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/Spring5ReactiveServerClientIntegrationTest.java @@ -1,6 +1,10 @@ package com.baeldung.reactive; -import com.baeldung.web.reactive.Task; +import static org.springframework.web.reactive.function.server.RequestPredicates.GET; +import static org.springframework.web.reactive.function.server.RequestPredicates.POST; + +import java.time.Duration; + import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.springframework.http.server.reactive.HttpHandler; @@ -8,22 +12,22 @@ import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; + +import com.baeldung.web.reactive.Task; + import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import reactor.ipc.netty.NettyContext; -import reactor.ipc.netty.http.server.HttpServer; - -import java.time.Duration; - -import static org.springframework.web.reactive.function.server.RequestPredicates.GET; -import static org.springframework.web.reactive.function.server.RequestPredicates.POST; +import reactor.netty.DisposableServer; +import reactor.netty.http.server.HttpServer; public class Spring5ReactiveServerClientIntegrationTest { - private static NettyContext nettyContext; + private static DisposableServer disposableServer; @BeforeAll public static void setUp() throws Exception { - HttpServer server = HttpServer.create("localhost", 8080); + HttpServer server = HttpServer.create() + .host("localhost") + .port(8080); RouterFunction route = RouterFunctions.route(POST("/task/process"), request -> ServerResponse.ok() .body(request.bodyToFlux(Task.class) .map(ll -> new Task("TaskName", 1)), Task.class)) @@ -31,13 +35,13 @@ public class Spring5ReactiveServerClientIntegrationTest { .body(Mono.just("server is alive"), String.class))); HttpHandler httpHandler = RouterFunctions.toHttpHandler(route); ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(httpHandler); - nettyContext = server.newHandler(adapter) - .block(); + disposableServer = server.handle(adapter) + .bindNow(); } @AfterAll public static void shutDown() { - nettyContext.dispose(); + disposableServer.disposeNow(); } // @Test diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnAnnotatedElementsLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnAnnotatedElementsLiveTest.java index 0043d62e5a..e6847e63da 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnAnnotatedElementsLiveTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnAnnotatedElementsLiveTest.java @@ -2,13 +2,10 @@ package com.baeldung.reactive.cors; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class CorsOnAnnotatedElementsLiveTest { diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnGlobalConfigLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnGlobalConfigLiveTest.java index 39927af4c3..008f1a16f2 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnGlobalConfigLiveTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnGlobalConfigLiveTest.java @@ -2,13 +2,10 @@ package com.baeldung.reactive.cors; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class CorsOnGlobalConfigLiveTest { diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnWebFilterLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnWebFilterLiveTest.java index e5a3c8a99a..f8a4f34e29 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnWebFilterLiveTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/cors/CorsOnWebFilterLiveTest.java @@ -2,13 +2,10 @@ package com.baeldung.reactive.cors; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class CorsOnWebFilterLiveTest { 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 bea2eaa75f..10cfaffce4 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 @@ -8,11 +8,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = WebEnvironment.DEFINED_PORT) +@WithMockUser public class ErrorHandlingIntegrationTest { @Autowired diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/PlayerHandlerIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/PlayerHandlerIntegrationTest.java index bb2408ea79..fbf46a93cc 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/PlayerHandlerIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/PlayerHandlerIntegrationTest.java @@ -4,6 +4,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.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.EntityExchangeResult; import org.springframework.test.web.reactive.server.WebTestClient; @@ -12,6 +13,7 @@ import static org.junit.Assert.assertEquals; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@WithMockUser public class PlayerHandlerIntegrationTest { @Autowired diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/UserControllerIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/UserControllerIntegrationTest.java index e7d289e5c4..22991b298f 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/UserControllerIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/filters/UserControllerIntegrationTest.java @@ -4,6 +4,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.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.EntityExchangeResult; import org.springframework.test.web.reactive.server.WebTestClient; @@ -12,6 +13,7 @@ import static org.junit.Assert.assertEquals; @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@WithMockUser public class UserControllerIntegrationTest { @Autowired diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/responseheaders/ResponseHeaderLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/responseheaders/ResponseHeaderLiveTest.java index db563e27d1..927c52e7e6 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/responseheaders/ResponseHeaderLiveTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/responseheaders/ResponseHeaderLiveTest.java @@ -2,13 +2,10 @@ package com.baeldung.reactive.responseheaders; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class ResponseHeaderLiveTest { diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/serversentsevents/ServiceSentEventLiveTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/serversentsevents/ServiceSentEventLiveTest.java index 53f4a3b1bb..547cd99034 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/serversentsevents/ServiceSentEventLiveTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/serversentsevents/ServiceSentEventLiveTest.java @@ -3,14 +3,13 @@ package com.baeldung.reactive.serversentsevents; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.function.Executable; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.http.MediaType; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.web.reactive.server.WebTestClient; -@RunWith(JUnitPlatform.class) @SpringBootTest +@WithMockUser public class ServiceSentEventLiveTest { private WebTestClient client = WebTestClient.bindToServer() diff --git a/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java index 9f31608ff7..d4c1cfe4c8 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/reactive/urlmatch/PathPatternsUsingHandlerMethodIntegrationTest.java @@ -4,6 +4,7 @@ import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; @@ -12,6 +13,7 @@ import com.baeldung.reactive.controller.PathPatternController; @RunWith(SpringRunner.class) @SpringBootTest(classes = Spring5ReactiveApplication.class) +@WithMockUser public class PathPatternsUsingHandlerMethodIntegrationTest { private static WebTestClient client; 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 5fe764bf8f..73968cdf05 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 @@ -2,9 +2,7 @@ package com.baeldung.validations.functional; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; -import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.test.web.reactive.server.WebTestClient.ResponseSpec; @@ -13,7 +11,6 @@ import com.baeldung.validations.functional.model.CustomRequestEntity; import reactor.core.publisher.Mono; -@RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class FunctionalEndpointValidationsLiveTest { diff --git a/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientIntegrationTest.java b/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientIntegrationTest.java index 08bd883b0b..2e37f2ffbd 100644 --- a/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientIntegrationTest.java +++ b/spring-5-reactive/src/test/java/com/baeldung/web/client/WebTestClientIntegrationTest.java @@ -1,10 +1,10 @@ package com.baeldung.web.client; -import com.baeldung.reactive.Spring5ReactiveApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.web.server.LocalServerPort; +import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.reactive.server.WebTestClient; import org.springframework.web.reactive.function.server.RequestPredicates; @@ -12,10 +12,14 @@ import org.springframework.web.reactive.function.server.RouterFunction; import org.springframework.web.reactive.function.server.RouterFunctions; import org.springframework.web.reactive.function.server.ServerResponse; import org.springframework.web.server.WebHandler; + +import com.baeldung.reactive.Spring5ReactiveApplication; + import reactor.core.publisher.Mono; @RunWith(SpringRunner.class) @SpringBootTest(classes = Spring5ReactiveApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +@WithMockUser public class WebTestClientIntegrationTest { @LocalServerPort From 3b30ae74ceb47604688fac7922e5a850e51d5423 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Mon, 3 Dec 2018 22:53:00 +0530 Subject: [PATCH 181/429] BAEL-2403: Immutable Map implementations in Java - Changed file name --- .../map/{ImmutableMapTest.java => ImmutableMapUnitTest.java} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename java-collections-maps/src/test/java/com/baeldung/java/map/{ImmutableMapTest.java => ImmutableMapUnitTest.java} (98%) diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java similarity index 98% rename from java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java rename to java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java index d2637d8368..b239ae07d8 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java @@ -13,7 +13,7 @@ import org.junit.jupiter.api.Test; import com.google.common.collect.ImmutableMap; -public class ImmutableMapTest { +public class ImmutableMapUnitTest { @Test public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { From d25f0f1bb3e4dae3618ccfdcc09e2bf61212c978 Mon Sep 17 00:00:00 2001 From: yatendragoel Date: Mon, 3 Dec 2018 23:02:16 +0530 Subject: [PATCH 182/429] BAEL-2403: Immutable Map implementations in Java (#5828) * BAEL-2203 - Convert java.time.Instant to java.sql.Timestamp and vice-versa * BAEL-2203: Review edits * Removed ZoneId code * Converted class to JUnit Test * Update and rename ConvertInstantToTimestampTest.java to ConvertInstantToTimestampUnitTest.java * BAEL-2403: Immutable Map implementations in Java * BAEL-2403: Immutable Map implementations in Java - Changed file name --- .../java/map/ImmutableMapUnitTest.java | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java diff --git a/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java new file mode 100644 index 0000000000..b239ae07d8 --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/java/map/ImmutableMapUnitTest.java @@ -0,0 +1,87 @@ +package com.baeldung.java.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 java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.junit.jupiter.api.Test; + +import com.google.common.collect.ImmutableMap; + + +public class ImmutableMapUnitTest { + + @Test + public void whenCollectionsUnModifiableMapMethod_thenOriginalCollectionChangesReflectInUnmodifiableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + Map unmodifiableMap = Collections.unmodifiableMap(mutableMap); + assertThrows(UnsupportedOperationException.class, () -> unmodifiableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertFalse(unmodifiableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertTrue(unmodifiableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromCopyOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + ImmutableMap immutableMap = ImmutableMap.copyOf(mutableMap); + assertTrue(immutableMap.containsKey("USA")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromBuilderMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + Map mutableMap = new HashMap<>(); + mutableMap.put("USA", "North America"); + + ImmutableMap immutableMap = ImmutableMap.builder() + .putAll(mutableMap) + .put("Costa Rica", "North America") + .build(); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + + mutableMap.remove("USA"); + assertTrue(immutableMap.containsKey("USA")); + + mutableMap.put("Mexico", "North America"); + assertFalse(immutableMap.containsKey("Mexico")); + } + + @Test + @SuppressWarnings("deprecation") + public void whenGuavaImmutableMapFromOfMethod_thenOriginalCollectionChangesDoNotReflectInImmutableMap() { + + ImmutableMap immutableMap = ImmutableMap.of("USA", "North America", "Costa Rica", "North America"); + assertTrue(immutableMap.containsKey("USA")); + assertTrue(immutableMap.containsKey("Costa Rica")); + + assertThrows(UnsupportedOperationException.class, () -> immutableMap.put("Canada", "North America")); + } + +} From f2d258a20561231260cb2d3021e03fe7151488c5 Mon Sep 17 00:00:00 2001 From: Javier Date: Mon, 3 Dec 2018 21:33:53 +0100 Subject: [PATCH 183/429] BAEL-2412 Working with primitive values in Gson. --- .../fromJsonPrimitiveTypes.java | 17 +++++++++++ .../toJsonPrimitiveTypes.java | 13 +++++++++ ...JsonIntegerRepresentationBooleanValue.java | 17 +++++++++++ ...nInvalidValueWithinStringBooleanValue.java | 16 +++++++++++ .../JsonYesRepresentationBooleanValue.java | 16 +++++++++++ .../byte_value/ToJsonBitString.java | 27 ++++++++++++++++++ .../byte_value/fromJsonBitString.java | 28 +++++++++++++++++++ .../char_value/JsonUnicodeCharValue.java | 16 +++++++++++ .../models/GsonBitString.java | 9 ++++++ .../models/GsonBoolean.java | 9 ++++++ .../gsonprimitivetypes/models/GsonBundle.java | 19 +++++++++++++ .../gsonprimitivetypes/models/GsonFloat.java | 9 ++++++ .../models/GsonLatinChar.java | 9 ++++++ .../JsonNonCompatibleNumberTypeValue.java | 15 ++++++++++ .../number_value/JsonOverflowValue.java | 15 ++++++++++ .../JsonPrecissionMismatchValue.java | 15 ++++++++++ .../special_value/JsonEmptyValue.java | 15 ++++++++++ .../special_value/JsonInvalidStringValue.java | 15 ++++++++++ .../special_value/JsonInvalidValue.java | 15 ++++++++++ .../special_value/JsonNullValue.java | 15 ++++++++++ .../special_value/JsonValidStringValue.java | 15 ++++++++++ 21 files changed, 325 insertions(+) create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java create mode 100644 gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java new file mode 100644 index 0000000000..259a9ca1ce --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java @@ -0,0 +1,17 @@ +package com.baeldung.gson_primitive_types.all_primitive_values; + +import com.baeldung.gson_primitive_types.models.GsonBundle; +import com.google.gson.Gson; + +public class fromJsonPrimitiveTypes { + public static void main(String[] args) { + String json = "{\"value\": 17, \"shortValue\": 3, \"intValue\": 3, " + + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + + ", \"booleanValue\": true, \"charValue\": \"a\"}"; + + Gson gson = new Gson(); + GsonBundle gsonBundle = gson.fromJson(json, GsonBundle.class); + + System.out.println(gsonBundle); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java new file mode 100644 index 0000000000..a55ba85e4f --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java @@ -0,0 +1,13 @@ +package com.baeldung.gson_primitive_types.all_primitive_values; + +import com.baeldung.gson_primitive_types.models.GsonBundle; +import com.google.gson.Gson; + +public class toJsonPrimitiveTypes { + public static void main(String[] args) { + GsonBundle gsonBundle = new GsonBundle(); + Gson gson = new Gson(); + + System.out.println(gson.toJson(gsonBundle)); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java new file mode 100644 index 0000000000..5a90e39fce --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java @@ -0,0 +1,17 @@ +package com.baeldung.gson_primitive_types.boolean_value; + +import com.baeldung.gson_primitive_types.models.GsonBoolean; +import com.baeldung.gson_primitive_types.models.GsonFloat; +import com.google.gson.Gson; + +public class JsonIntegerRepresentationBooleanValue { + public static void main(String[] args) { + // Raises exception. + String json = "{\"value\": 1}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java new file mode 100644 index 0000000000..58fbed6a8f --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java @@ -0,0 +1,16 @@ +package com.baeldung.gson_primitive_types.boolean_value; + +import com.baeldung.gson_primitive_types.models.GsonBoolean; +import com.google.gson.Gson; + +public class JsonInvalidValueWithinStringBooleanValue { + public static void main(String[] args) { + // It is ignored. + String json = "{\"value\": \"15x\"}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java new file mode 100644 index 0000000000..f6061c1cea --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java @@ -0,0 +1,16 @@ +package com.baeldung.gson_primitive_types.boolean_value; + +import com.baeldung.gson_primitive_types.models.GsonBoolean; +import com.google.gson.Gson; + +public class JsonYesRepresentationBooleanValue { + public static void main(String[] args) { + // It fails silently. + String json = "{\"value\": yes}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java new file mode 100644 index 0000000000..f9b8045d6c --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java @@ -0,0 +1,27 @@ +package com.baeldung.gson_primitive_types.byte_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.*; + +import java.lang.reflect.Type; + +public class ToJsonBitString { + public static void main(String[] args) { + GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(GsonBitString.class, new GsonBitStringSerializer()); + + Gson gson = builder.create(); + GsonBitString model = new GsonBitString(); + model.value = (byte) 0b1111; + + System.out.println(gson.toJson(model)); + } + + static class GsonBitStringSerializer implements JsonSerializer { + @Override public JsonElement serialize(GsonBitString gsonBundle, Type type, JsonSerializationContext jsonSerializationContext) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("value", Integer.toBinaryString(gsonBundle.value)); + return jsonObject; + } + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java new file mode 100644 index 0000000000..4bd404d811 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java @@ -0,0 +1,28 @@ +package com.baeldung.gson_primitive_types.byte_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.*; + +import java.lang.reflect.Type; + +public class fromJsonBitString { + public static void main(String[] args) { + String json = "{\"value\": \"1111\"}"; + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(GsonBitString.class, new GsonBitStringDeserializer()); + + Gson gson = gsonBuilder.create(); + + System.out.println(gson.fromJson(json, GsonBitString.class)); + } + + static class GsonBitStringDeserializer implements JsonDeserializer { + @Override public GsonBitString deserialize(JsonElement jsonElement, + Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + GsonBitString gsonBitString = new GsonBitString(); + gsonBitString.value = (byte) Integer.parseInt( + jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsString(), 2); + return gsonBitString; + } + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java new file mode 100644 index 0000000000..d98fd823d1 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java @@ -0,0 +1,16 @@ +package com.baeldung.gson_primitive_types.char_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.baeldung.gson_primitive_types.models.GsonLatinChar; +import com.google.gson.Gson; + +public class JsonUnicodeCharValue { + public static void main(String[] args) { + // The field is converted. + Gson gson = new Gson(); + String json = "{\"value\": \"\\u00AE\"}"; + GsonLatinChar model = gson.fromJson(json, GsonLatinChar.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java new file mode 100644 index 0000000000..7598b718be --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java @@ -0,0 +1,9 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonBitString { + public byte value = (byte) 1; + + public String toString() { + return "{byte: " + value + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java new file mode 100644 index 0000000000..ce54276228 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java @@ -0,0 +1,9 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonBoolean { + public boolean value; + + public String toString() { + return "{boolean: " + value + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java new file mode 100644 index 0000000000..51c68198ca --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java @@ -0,0 +1,19 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonBundle { + public byte byteValue = (byte) 0x00001111; + public short shortValue = (short) 3; + public int intValue = 3; + public long longValue = 3; + public float floatValue = 3.5f; + public double doubleValue = 3.5; + public boolean booleanValue = true; + public char charValue = 'a'; + + public String toString() { + return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " + + "int: " + intValue + ", " + "long: " + longValue + ", " + "float: " + + floatValue + ", " + "double: " + doubleValue + ", " + "boolean: " + + booleanValue + ", " + "char: " + charValue + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java new file mode 100644 index 0000000000..bf4abf9fbb --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java @@ -0,0 +1,9 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonFloat { + public float value; + + public String toString() { + return "{float: " + value + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java new file mode 100644 index 0000000000..73b73f6bb4 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java @@ -0,0 +1,9 @@ +package com.baeldung.gson_primitive_types.models; + +public class GsonLatinChar { + public char value; + + public String toString() { + return "{char: " + value + "}"; + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java new file mode 100644 index 0000000000..848248fd77 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.number_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonNonCompatibleNumberTypeValue { + public static void main(String[] args) { + // Raises an exception. + Gson gson = new Gson(); + String json = "{\"value\": 2.3}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java new file mode 100644 index 0000000000..6b63ee791e --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.number_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonOverflowValue { + public static void main(String[] args) { + // Overflow happens unnoticed. + Gson gson = new Gson(); + String json = "{\"value\": \"300\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java new file mode 100644 index 0000000000..6abe7101ee --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.number_value; + +import com.baeldung.gson_primitive_types.models.GsonFloat; +import com.google.gson.Gson; + +public class JsonPrecissionMismatchValue { + public static void main(String[] args) { + String json = "{\"value\": 12.123456789123456}"; + Gson gson = new Gson(); + + GsonFloat model = gson.fromJson(json, GsonFloat.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java new file mode 100644 index 0000000000..401e355efb --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonEmptyValue { + public static void main(String[] args) { + // Raises an exception. + Gson gson = new Gson(); + String json = "{\"value\": \"\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java new file mode 100644 index 0000000000..3100d0b939 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonInvalidStringValue { + public static void main(String[] args) { + // Raises an exception. + Gson gson = new Gson(); + String json = "{\"value\": \"15x\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java new file mode 100644 index 0000000000..cfa88258d4 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonInvalidValue { + public static void main(String[] args) { + // Raises an exception. + Gson gson = new Gson(); + String json = "{\"value\": s15s}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java new file mode 100644 index 0000000000..075a029f5e --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonNullValue { + public static void main(String[] args) { + // The field will just be ignored. + Gson gson = new Gson(); + String json = "{\"value\": null}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java new file mode 100644 index 0000000000..8b13a2b84d --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java @@ -0,0 +1,15 @@ +package com.baeldung.gson_primitive_types.special_value; + +import com.baeldung.gson_primitive_types.models.GsonBitString; +import com.google.gson.Gson; + +public class JsonValidStringValue { + public static void main(String[] args) { + // The field is converted. + Gson gson = new Gson(); + String json = "{\"value\": \"15\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + System.out.println(model); + } +} From b91f7e321e52ad8e2879862dca126ee31dec8e57 Mon Sep 17 00:00:00 2001 From: geroza Date: Mon, 3 Dec 2018 19:13:43 -0200 Subject: [PATCH 184/429] Migrated the following modules to parent-boot with spring-boot 2.1: * spring-5-reactive-client * spring-5-reactive-security * spring-5-security * spring-5-security-oauth * spring-all --- spring-5-reactive-client/pom.xml | 4 ++-- spring-5-reactive-security/pom.xml | 4 ++-- .../actuator/Spring5ReactiveApplication.java | 2 -- .../security/SpringSecurity5Application.java | 15 +++++++++------ spring-5-security-oauth/pom.xml | 4 ++-- spring-5-security/pom.xml | 6 +++--- .../resources/templatesextrafields/index.html | 2 +- spring-all/pom.xml | 4 ++-- 8 files changed, 21 insertions(+), 20 deletions(-) diff --git a/spring-5-reactive-client/pom.xml b/spring-5-reactive-client/pom.xml index 1f2c961cf0..6e39743ed0 100644 --- a/spring-5-reactive-client/pom.xml +++ b/spring-5-reactive-client/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2.0-temp + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-5-reactive-security/pom.xml b/spring-5-reactive-security/pom.xml index 93700b4262..3b64b9b3ac 100644 --- a/spring-5-reactive-security/pom.xml +++ b/spring-5-reactive-security/pom.xml @@ -12,9 +12,9 @@ com.baeldung - parent-boot-2.0-temp + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java index f07ddfb0f7..03943d436d 100644 --- a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java +++ b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/actuator/Spring5ReactiveApplication.java @@ -1,9 +1,7 @@ package com.baeldung.reactive.actuator; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Bean; @SpringBootApplication public class Spring5ReactiveApplication{ diff --git a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java index f2963c4fa5..325923f577 100644 --- a/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java +++ b/spring-5-reactive-security/src/main/java/com/baeldung/reactive/security/SpringSecurity5Application.java @@ -8,8 +8,9 @@ import org.springframework.http.server.reactive.HttpHandler; import org.springframework.http.server.reactive.ReactorHttpHandlerAdapter; import org.springframework.web.reactive.config.EnableWebFlux; import org.springframework.web.server.adapter.WebHttpHandlerBuilder; -import reactor.ipc.netty.NettyContext; -import reactor.ipc.netty.http.server.HttpServer; + +import reactor.netty.DisposableServer; +import reactor.netty.http.server.HttpServer; @ComponentScan(basePackages = {"com.baeldung.reactive.security"}) @EnableWebFlux @@ -18,17 +19,19 @@ public class SpringSecurity5Application { public static void main(String[] args) { try (AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringSecurity5Application.class)) { - context.getBean(NettyContext.class).onClose().block(); + context.getBean(DisposableServer.class).onDispose().block(); } } @Bean - public NettyContext nettyContext(ApplicationContext context) { + public DisposableServer disposableServer(ApplicationContext context) { HttpHandler handler = WebHttpHandlerBuilder.applicationContext(context) .build(); ReactorHttpHandlerAdapter adapter = new ReactorHttpHandlerAdapter(handler); - HttpServer httpServer = HttpServer.create("localhost", 8080); - return httpServer.newHandler(adapter).block(); + HttpServer httpServer = HttpServer.create(); + httpServer.host("localhost"); + httpServer.port(8080); + return httpServer.handle(adapter).bindNow(); } } diff --git a/spring-5-security-oauth/pom.xml b/spring-5-security-oauth/pom.xml index 142326757b..59150a153f 100644 --- a/spring-5-security-oauth/pom.xml +++ b/spring-5-security-oauth/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2.0-temp + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-5-security/pom.xml b/spring-5-security/pom.xml index 916af7f629..c26e370381 100644 --- a/spring-5-security/pom.xml +++ b/spring-5-security/pom.xml @@ -10,9 +10,9 @@ com.baeldung - parent-boot-2.0-temp + parent-boot-2 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -31,7 +31,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 org.springframework diff --git a/spring-5-security/src/main/resources/templatesextrafields/index.html b/spring-5-security/src/main/resources/templatesextrafields/index.html index 37833ff0d2..1dd9c12d42 100644 --- a/spring-5-security/src/main/resources/templatesextrafields/index.html +++ b/spring-5-security/src/main/resources/templatesextrafields/index.html @@ -1,5 +1,5 @@ - + Spring Security with Extra Fields diff --git a/spring-all/pom.xml b/spring-all/pom.xml index faddab6ea6..2dc4915bab 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -7,10 +7,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 From 64acbeec4e3caee2e35079a3c29adb00244fcbdb Mon Sep 17 00:00:00 2001 From: geroza Date: Mon, 3 Dec 2018 21:38:12 -0200 Subject: [PATCH 185/429] Migrated modules to parent-boot with spring-boot 2.1: * spring-boot-persistence * persistence-modules/spring-data-jpa * persistence-modules/spring-data-keyvalue * persistence-modules/spring-data-redis --- .../spring-boot-persistence/pom.xml | 4 +-- persistence-modules/spring-data-jpa/pom.xml | 4 +-- .../config/PersistenceConfiguration.java | 33 +++++++++---------- .../src/main/resources/application.properties | 4 ++- .../resources/import_entities.sql | 0 .../SpringContextIntegrationTest.java | 5 --- .../SpringJpaContextIntegrationTest.java | 25 ++++++++++++++ .../spring-data-keyvalue/pom.xml | 4 +-- persistence-modules/spring-data-redis/pom.xml | 18 ++-------- 9 files changed, 52 insertions(+), 45 deletions(-) rename persistence-modules/spring-data-jpa/src/{test => main}/resources/import_entities.sql (100%) create mode 100644 persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringJpaContextIntegrationTest.java diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index b717bec31f..0ea42b1cb7 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -9,10 +9,10 @@ spring-boot-persistence - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2.0-temp + ../../parent-boot-2 diff --git a/persistence-modules/spring-data-jpa/pom.xml b/persistence-modules/spring-data-jpa/pom.xml index 6674bab70d..786e587734 100644 --- a/persistence-modules/spring-data-jpa/pom.xml +++ b/persistence-modules/spring-data-jpa/pom.xml @@ -8,10 +8,10 @@ spring-data-jpa - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2.0-temp + ../../parent-boot-2 diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java index 16407e510a..2bdd4e5451 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/config/PersistenceConfiguration.java @@ -1,13 +1,14 @@ package com.baeldung.config; -import com.baeldung.services.IBarService; -import com.baeldung.services.impl.BarSpringDataJpaService; -import com.google.common.base.Preconditions; -import com.baeldung.dao.repositories.impl.ExtendedRepositoryImpl; -import com.baeldung.services.IFooService; -import com.baeldung.services.impl.FooService; +import java.util.Properties; + +import javax.sql.DataSource; + import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.*; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; import org.springframework.core.env.Environment; import org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @@ -20,13 +21,15 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; -import javax.sql.DataSource; -import java.util.Properties; +import com.baeldung.dao.repositories.impl.ExtendedRepositoryImpl; +import com.baeldung.services.IBarService; +import com.baeldung.services.impl.BarSpringDataJpaService; +import com.google.common.base.Preconditions; @Configuration -@ComponentScan({"com.baeldung.dao", "com.baeldung.services"}) +@ComponentScan({ "com.baeldung.dao", "com.baeldung.services" }) @EnableTransactionManagement -@EnableJpaRepositories(basePackages = {"com.baeldung.dao"}, repositoryBaseClass = ExtendedRepositoryImpl.class) +@EnableJpaRepositories(basePackages = { "com.baeldung.dao" }, repositoryBaseClass = ExtendedRepositoryImpl.class) @EnableJpaAuditing @PropertySource("classpath:persistence.properties") public class PersistenceConfiguration { @@ -79,11 +82,6 @@ public class PersistenceConfiguration { return new BarSpringDataJpaService(); } - @Bean - public IFooService fooService() { - return new FooService(); - } - private final Properties hibernateProperties() { final Properties hibernateProperties = new Properties(); hibernateProperties.setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto")); @@ -94,7 +92,8 @@ public class PersistenceConfiguration { // hibernateProperties.setProperty("hibernate.globally_quoted_identifiers", "true"); // Envers properties - hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", env.getProperty("envers.audit_table_suffix")); + hibernateProperties.setProperty("org.hibernate.envers.audit_table_suffix", + env.getProperty("envers.audit_table_suffix")); return hibernateProperties; } diff --git a/persistence-modules/spring-data-jpa/src/main/resources/application.properties b/persistence-modules/spring-data-jpa/src/main/resources/application.properties index 73d72bc7d6..37fb9ca9c4 100644 --- a/persistence-modules/spring-data-jpa/src/main/resources/application.properties +++ b/persistence-modules/spring-data-jpa/src/main/resources/application.properties @@ -12,4 +12,6 @@ hibernate.cache.use_second_level_cache=true hibernate.cache.use_query_cache=true hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory -spring.datasource.data=import_entities.sql \ No newline at end of file +spring.datasource.data=import_entities.sql + +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/persistence-modules/spring-data-jpa/src/test/resources/import_entities.sql b/persistence-modules/spring-data-jpa/src/main/resources/import_entities.sql similarity index 100% rename from persistence-modules/spring-data-jpa/src/test/resources/import_entities.sql rename to persistence-modules/spring-data-jpa/src/main/resources/import_entities.sql diff --git a/persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringContextIntegrationTest.java index 0a60412813..7f906bdbcd 100644 --- a/persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -2,17 +2,12 @@ package org.baeldung; import org.junit.Test; import org.junit.runner.RunWith; -import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.Application; -import com.baeldung.config.PersistenceConfiguration; -import com.baeldung.config.PersistenceProductConfiguration; -import com.baeldung.config.PersistenceUserConfiguration; @RunWith(SpringRunner.class) -@DataJpaTest(excludeAutoConfiguration = {PersistenceConfiguration.class, PersistenceUserConfiguration.class, PersistenceProductConfiguration.class}) @SpringBootTest(classes = Application.class) public class SpringContextIntegrationTest { diff --git a/persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringJpaContextIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringJpaContextIntegrationTest.java new file mode 100644 index 0000000000..66b5b20b97 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/test/java/org/baeldung/SpringJpaContextIntegrationTest.java @@ -0,0 +1,25 @@ +package org.baeldung; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import com.baeldung.Application; +import com.baeldung.config.PersistenceConfiguration; +import com.baeldung.config.PersistenceProductConfiguration; +import com.baeldung.config.PersistenceUserConfiguration; + +@RunWith(SpringRunner.class) +@DataJpaTest(excludeAutoConfiguration = { + PersistenceConfiguration.class, + PersistenceUserConfiguration.class, + PersistenceProductConfiguration.class }) +@ContextConfiguration(classes = Application.class) +public class SpringJpaContextIntegrationTest { + + @Test + public void whenSpringContextIsBootstrapped_thenNoExceptions() { + } +} diff --git a/persistence-modules/spring-data-keyvalue/pom.xml b/persistence-modules/spring-data-keyvalue/pom.xml index ece59d5586..1fee0a88d4 100644 --- a/persistence-modules/spring-data-keyvalue/pom.xml +++ b/persistence-modules/spring-data-keyvalue/pom.xml @@ -5,10 +5,10 @@ spring-data-keyvalue - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2.0-temp + ../../parent-boot-2 diff --git a/persistence-modules/spring-data-redis/pom.xml b/persistence-modules/spring-data-redis/pom.xml index 0520d253a1..fb80b0413f 100644 --- a/persistence-modules/spring-data-redis/pom.xml +++ b/persistence-modules/spring-data-redis/pom.xml @@ -8,10 +8,10 @@ jar - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2.0-temp + ../../parent-boot-2 @@ -47,21 +47,9 @@ org.junit.jupiter junit-jupiter-api - - org.junit.jupiter - junit-jupiter-engine - test - - - org.junit.platform - junit-platform-surefire-provider - ${junit.platform.version} - test - org.junit.platform junit-platform-runner - ${junit.platform.version} test @@ -97,8 +85,6 @@ 0.10.0 2.0.3.RELEASE 0.6 - 1.0.0 - 5.0.2 From 3addff050fd2d2c67408f6151f3a96f42752e832 Mon Sep 17 00:00:00 2001 From: Mher Baghinyan Date: Tue, 4 Dec 2018 09:17:57 +0400 Subject: [PATCH 186/429] printf examples Issue: BAEL-2228 --- .../com/baeldung/printf/PrintfExamples.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/printf/PrintfExamples.java diff --git a/core-java/src/main/java/com/baeldung/printf/PrintfExamples.java b/core-java/src/main/java/com/baeldung/printf/PrintfExamples.java new file mode 100644 index 0000000000..3d451f6f50 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/printf/PrintfExamples.java @@ -0,0 +1,61 @@ +package com.baeldung.printf; + +import java.util.Date; +import java.util.Locale; + +public class PrintfExamples { + + public static void main(String[] args) { + + printfNewLine(); + printfChar(); + printfString(); + printfNumber(); + printfDateTime(); + printfBoolean(); + } + + private static void printfNewLine() { + System.out.printf("baeldung%nline%nterminator"); + } + + private static void printfString() { + System.out.printf("'%s' %n", "baeldung"); + System.out.printf("'%S' %n", "baeldung"); + System.out.printf("'%15s' %n", "baeldung"); + System.out.printf("'%-10s' %n", "baeldung"); + } + + private static void printfChar() { + System.out.printf("%c%n", 's'); + System.out.printf("%C%n", 's'); + } + + private static void printfNumber() { + System.out.printf("simple integer: %d%n", 10000L); + + System.out.printf(Locale.US, "%,d %n", 10000); + System.out.printf(Locale.ITALY, "%,d %n", 10000); + + System.out.printf("%f%n", 5.1473); + System.out.printf("'%5.2f'%n", 5.1473); + System.out.printf("'%5.2e'%n", 5.1473); + } + + private static void printfBoolean() { + System.out.printf("%b%n", null); + System.out.printf("%B%n", false); + System.out.printf("%B%n", 5.3); + System.out.printf("%b%n", "random text"); + } + + private static void printfDateTime() { + Date date = new Date(); + System.out.printf("%tT%n", date); + System.out.printf("hours %tH: minutes %tM: seconds %tS%n", date, date, date); + System.out.printf("%1$tH:%1$tM:%1$tS %1$tp %1$tL %1$tN %1$tz %n", date); + + System.out.printf("%1$tA %1$tB %1$tY %n", date); + System.out.printf("%1$td.%1$tm.%1$ty %n", date); + } +} From 44e5a0b6a2cae868e7f98112feb096fd8b6d6e61 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 4 Dec 2018 06:46:41 +0100 Subject: [PATCH 187/429] BAEL-2412 Renaming packages. --- .../allprimitives}/fromJsonPrimitiveTypes.java | 4 ++-- .../allprimitives}/toJsonPrimitiveTypes.java | 4 ++-- .../JsonIntegerRepresentationBooleanValue.java | 5 ++--- .../JsonInvalidValueWithinStringBooleanValue.java | 5 ++--- .../booleanvalue}/JsonYesRepresentationBooleanValue.java | 4 ++-- .../bytevalue}/ToJsonBitString.java | 4 ++-- .../bytevalue}/fromJsonBitString.java | 4 ++-- .../charvalue}/JsonUnicodeCharValue.java | 7 +++---- .../models/GsonBitString.java | 2 +- .../models/GsonBoolean.java | 2 +- .../models/GsonBundle.java | 2 +- .../GsonLatinChar.java => primitives/models/GsonChar.java} | 4 ++-- .../models/GsonFloat.java | 2 +- .../numbervalue}/JsonNonCompatibleNumberTypeValue.java | 4 ++-- .../numbervalue}/JsonOverflowValue.java | 4 ++-- .../numbervalue}/JsonPrecissionMismatchValue.java | 4 ++-- .../specialvalue}/JsonEmptyValue.java | 4 ++-- .../specialvalue}/JsonInvalidStringValue.java | 4 ++-- .../specialvalue}/JsonInvalidValue.java | 4 ++-- .../specialvalue}/JsonNullValue.java | 4 ++-- .../specialvalue}/JsonValidStringValue.java | 4 ++-- 21 files changed, 39 insertions(+), 42 deletions(-) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/all_primitive_values => primitives/allprimitives}/fromJsonPrimitiveTypes.java (79%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/all_primitive_values => primitives/allprimitives}/toJsonPrimitiveTypes.java (67%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/boolean_value => primitives/booleanvalue}/JsonIntegerRepresentationBooleanValue.java (65%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/boolean_value => primitives/booleanvalue}/JsonInvalidValueWithinStringBooleanValue.java (59%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/boolean_value => primitives/booleanvalue}/JsonYesRepresentationBooleanValue.java (74%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/byte_value => primitives/bytevalue}/ToJsonBitString.java (88%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/byte_value => primitives/bytevalue}/fromJsonBitString.java (89%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/char_value => primitives/charvalue}/JsonUnicodeCharValue.java (52%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes => primitives}/models/GsonBitString.java (74%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes => primitives}/models/GsonBoolean.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes => primitives}/models/GsonBundle.java (93%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/models/GsonLatinChar.java => primitives/models/GsonChar.java} (56%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes => primitives}/models/GsonFloat.java (72%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/number_value => primitives/numbervalue}/JsonNonCompatibleNumberTypeValue.java (74%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/number_value => primitives/numbervalue}/JsonOverflowValue.java (74%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/number_value => primitives/numbervalue}/JsonPrecissionMismatchValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonEmptyValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonInvalidStringValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonInvalidValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonNullValue.java (73%) rename gson/src/main/java/org/baeldung/gson/{gsonprimitivetypes/special_value => primitives/specialvalue}/JsonValidStringValue.java (73%) diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java similarity index 79% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java rename to gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java index 259a9ca1ce..66e4d9dc77 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/fromJsonPrimitiveTypes.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.all_primitive_values; +package org.baeldung.gson.primitives.allprimitives; -import com.baeldung.gson_primitive_types.models.GsonBundle; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBundle; public class fromJsonPrimitiveTypes { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java similarity index 67% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java rename to gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java index a55ba85e4f..ce35f37490 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/all_primitive_values/toJsonPrimitiveTypes.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java @@ -1,6 +1,6 @@ -package com.baeldung.gson_primitive_types.all_primitive_values; +package org.baeldung.gson.primitives.allprimitives; -import com.baeldung.gson_primitive_types.models.GsonBundle; +import org.baeldung.gson.primitives.models.GsonBundle; import com.google.gson.Gson; public class toJsonPrimitiveTypes { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java similarity index 65% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java index 5a90e39fce..7cbc1f7869 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonIntegerRepresentationBooleanValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java @@ -1,8 +1,7 @@ -package com.baeldung.gson_primitive_types.boolean_value; +package org.baeldung.gson.primitives.booleanvalue; -import com.baeldung.gson_primitive_types.models.GsonBoolean; -import com.baeldung.gson_primitive_types.models.GsonFloat; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBoolean; public class JsonIntegerRepresentationBooleanValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java similarity index 59% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java index 58fbed6a8f..a345d5e6f9 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonInvalidValueWithinStringBooleanValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java @@ -1,6 +1,5 @@ -package com.baeldung.gson_primitive_types.boolean_value; +package org.baeldung.gson.primitives.booleanvalue; -import com.baeldung.gson_primitive_types.models.GsonBoolean; import com.google.gson.Gson; public class JsonInvalidValueWithinStringBooleanValue { @@ -9,7 +8,7 @@ public class JsonInvalidValueWithinStringBooleanValue { String json = "{\"value\": \"15x\"}"; Gson gson = new Gson(); - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + org.baeldung.gson.primitives.models.GsonBoolean model = gson.fromJson(json, org.baeldung.gson.primitives.models.GsonBoolean.class); System.out.println(model); } diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java similarity index 74% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java index f6061c1cea..b5e2e74a9a 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/boolean_value/JsonYesRepresentationBooleanValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.boolean_value; +package org.baeldung.gson.primitives.booleanvalue; -import com.baeldung.gson_primitive_types.models.GsonBoolean; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBoolean; public class JsonYesRepresentationBooleanValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java similarity index 88% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java rename to gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java index f9b8045d6c..20247efbff 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/ToJsonBitString.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.byte_value; +package org.baeldung.gson.primitives.bytevalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.*; +import org.baeldung.gson.primitives.models.GsonBitString; import java.lang.reflect.Type; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java similarity index 89% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java rename to gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java index 4bd404d811..18471ff365 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/byte_value/fromJsonBitString.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.byte_value; +package org.baeldung.gson.primitives.bytevalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.*; +import org.baeldung.gson.primitives.models.GsonBitString; import java.lang.reflect.Type; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java b/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java similarity index 52% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java index d98fd823d1..9164607e8d 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/char_value/JsonUnicodeCharValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java @@ -1,15 +1,14 @@ -package com.baeldung.gson_primitive_types.char_value; +package org.baeldung.gson.primitives.charvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; -import com.baeldung.gson_primitive_types.models.GsonLatinChar; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonChar; public class JsonUnicodeCharValue { public static void main(String[] args) { // The field is converted. Gson gson = new Gson(); String json = "{\"value\": \"\\u00AE\"}"; - GsonLatinChar model = gson.fromJson(json, GsonLatinChar.class); + GsonChar model = gson.fromJson(json, GsonChar.class); System.out.println(model); } diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java similarity index 74% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java index 7598b718be..f84a7f82f2 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBitString.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java @@ -1,4 +1,4 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; public class GsonBitString { public byte value = (byte) 1; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java index ce54276228..228f89fa3b 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBoolean.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java @@ -1,4 +1,4 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; public class GsonBoolean { public boolean value; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java similarity index 93% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java index 51c68198ca..1fff9a8a29 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonBundle.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java @@ -1,4 +1,4 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; public class GsonBundle { public byte byteValue = (byte) 0x00001111; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java similarity index 56% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java index 73b73f6bb4..6983f7bfff 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonLatinChar.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java @@ -1,6 +1,6 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; -public class GsonLatinChar { +public class GsonChar { public char value; public String toString() { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java similarity index 72% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java index bf4abf9fbb..43d1d9af16 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/models/GsonFloat.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java @@ -1,4 +1,4 @@ -package com.baeldung.gson_primitive_types.models; +package org.baeldung.gson.primitives.models; public class GsonFloat { public float value; diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java similarity index 74% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java index 848248fd77..8aba292858 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonNonCompatibleNumberTypeValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.number_value; +package org.baeldung.gson.primitives.numbervalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonNonCompatibleNumberTypeValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java similarity index 74% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java index 6b63ee791e..0cceff042d 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonOverflowValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.number_value; +package org.baeldung.gson.primitives.numbervalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonOverflowValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java index 6abe7101ee..40bc6532fb 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/number_value/JsonPrecissionMismatchValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.number_value; +package org.baeldung.gson.primitives.numbervalue; -import com.baeldung.gson_primitive_types.models.GsonFloat; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonFloat; public class JsonPrecissionMismatchValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java index 401e355efb..3460383704 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonEmptyValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonEmptyValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java index 3100d0b939..9453fc1215 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidStringValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonInvalidStringValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java index cfa88258d4..92094f98bd 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonInvalidValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonInvalidValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java index 075a029f5e..47d8df7b54 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonNullValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonNullValue { public static void main(String[] args) { diff --git a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java similarity index 73% rename from gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java rename to gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java index 8b13a2b84d..315bf2a73d 100644 --- a/gson/src/main/java/org/baeldung/gson/gsonprimitivetypes/special_value/JsonValidStringValue.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java @@ -1,7 +1,7 @@ -package com.baeldung.gson_primitive_types.special_value; +package org.baeldung.gson.primitives.specialvalue; -import com.baeldung.gson_primitive_types.models.GsonBitString; import com.google.gson.Gson; +import org.baeldung.gson.primitives.models.GsonBitString; public class JsonValidStringValue { public static void main(String[] args) { From 57d6c392b2cdabc158274ee5c3d87447f107795b Mon Sep 17 00:00:00 2001 From: Eugen Date: Tue, 4 Dec 2018 17:00:27 +0200 Subject: [PATCH 188/429] Update README.md --- spring-rest-full/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-rest-full/README.md b/spring-rest-full/README.md index b8fef9cb82..a5d72372f7 100644 --- a/spring-rest-full/README.md +++ b/spring-rest-full/README.md @@ -17,7 +17,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [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) - [Bootstrap a Web Application with Spring 4](http://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration) -- [Build a REST API with Spring 4 and Java Config](http://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration) +- [Build a REST API with Spring and Java Config](http://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration) - [Error Handling for REST with Spring](http://www.baeldung.com/exception-handling-for-rest-with-spring) From 127c3eca04034f8098162bf37d1b8e1c03802c8d Mon Sep 17 00:00:00 2001 From: TINO Date: Tue, 4 Dec 2018 22:31:10 +0300 Subject: [PATCH 189/429] Code formatted --- rxjava-2/pom.xml | 94 +++++++++---------- ...yncAndSyncToObservableIntegrationTest.java | 16 ++-- 2 files changed, 57 insertions(+), 53 deletions(-) diff --git a/rxjava-2/pom.xml b/rxjava-2/pom.xml index f437a6005b..3038c20037 100644 --- a/rxjava-2/pom.xml +++ b/rxjava-2/pom.xml @@ -1,53 +1,53 @@ - - 4.0.0 + + 4.0.0 - rxjava-2 - 1.0-SNAPSHOT + rxjava-2 + 1.0-SNAPSHOT - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + - - - io.reactivex.rxjava2 - rxjava - ${rx.java2.version} - - - com.jayway.awaitility - awaitility - ${awaitility.version} - - - org.assertj - assertj-core - ${assertj.version} - - - com.jakewharton.rxrelay2 - rxrelay - ${rxrelay.version} - - - - com.github.akarnokd - rxjava2-extensions - ${rxjava2.ext.version} - - - + + + io.reactivex.rxjava2 + rxjava + ${rx.java2.version} + + + com.jayway.awaitility + awaitility + ${awaitility.version} + + + org.assertj + assertj-core + ${assertj.version} + + + com.jakewharton.rxrelay2 + rxrelay + ${rxrelay.version} + + + + com.github.akarnokd + rxjava2-extensions + ${rxjava2.ext.version} + + - - 3.8.0 - 2.2.2 - 1.7.0 - 2.0.0 - 0.20.4 - + + 3.8.0 + 2.2.2 + 1.7.0 + 2.0.0 + 0.20.4 + \ No newline at end of file diff --git a/rxjava-2/src/test/java/com/baeldung/rxjava/AsyncAndSyncToObservableIntegrationTest.java b/rxjava-2/src/test/java/com/baeldung/rxjava/AsyncAndSyncToObservableIntegrationTest.java index a646b453ff..90f4fe94ae 100644 --- a/rxjava-2/src/test/java/com/baeldung/rxjava/AsyncAndSyncToObservableIntegrationTest.java +++ b/rxjava-2/src/test/java/com/baeldung/rxjava/AsyncAndSyncToObservableIntegrationTest.java @@ -21,8 +21,9 @@ public class AsyncAndSyncToObservableIntegrationTest { AtomicInteger counter = new AtomicInteger(); Callable callable = () -> counter.incrementAndGet(); + /* Method will execute every time it gets subscribed*/ @Test - public void givenSyncMethod_whenConvertedWithFromCallable_thenReturnObservable() {// method will execute every time it gets subscribed + public void givenSyncMethod_whenConvertedWithFromCallable_thenReturnObservable() { Observable source = Observable.fromCallable(callable); @@ -35,8 +36,9 @@ public class AsyncAndSyncToObservableIntegrationTest { } } + /* Method will execute only once and cache its result.*/ @Test - public void givenSyncMethod_whenConvertedWithStart_thenReturnObservable() {// method will execute only once and cache its result. + public void givenSyncMethod_whenConvertedWithStart_thenReturnObservable() { Observable source = AsyncObservable.start(callable); @@ -49,8 +51,9 @@ public class AsyncAndSyncToObservableIntegrationTest { } } + /* Method will execute only once and cache its result.*/ @Test - public void givenAsyncMethod_whenConvertedWithFromFuture_thenRetrunObservble() { // method will execute only once and cache its result. + public void givenAsyncMethod_whenConvertedWithFromFuture_thenRetrunObservble() { ExecutorService executor = Executors.newSingleThreadExecutor(); Future future = executor.submit(callable); @@ -67,8 +70,9 @@ public class AsyncAndSyncToObservableIntegrationTest { executor.shutdown(); } + /* Method will execute every time it gets subscribed*/ @Test - public void givenAsyncMethod_whenConvertedWithStartFuture_thenRetrunObservble() {// method will execute every time it gets subscribed + public void givenAsyncMethod_whenConvertedWithStartFuture_thenRetrunObservble() { ExecutorService executor = Executors.newSingleThreadExecutor(); Observable source = AsyncObservable.startFuture(() -> executor.submit(callable)); @@ -84,9 +88,9 @@ public class AsyncAndSyncToObservableIntegrationTest { executor.shutdown(); } + /*Method will execute only once and cache its result.*/ @Test - public void givenAsyncMethod_whenConvertedWithDeferFuture_thenRetrunObservble() { // method will execute only once and cache its result. - + public void givenAsyncMethod_whenConvertedWithDeferFuture_thenRetrunObservble() { List list = Arrays.asList(new Integer[] { counter.incrementAndGet(), counter.incrementAndGet(), counter.incrementAndGet() }); ExecutorService exec = Executors.newSingleThreadExecutor(); Callable> callable = () -> Observable.fromIterable(list); From 4c0ce1d7464ccb173bc1380959088034001c6128 Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 4 Dec 2018 20:32:02 +0100 Subject: [PATCH 190/429] BAEL-2412 Replace main apps by unit tests. --- .../allprimitives/fromJsonPrimitiveTypes.java | 17 -- .../allprimitives/toJsonPrimitiveTypes.java | 13 -- ...JsonIntegerRepresentationBooleanValue.java | 16 -- ...nInvalidValueWithinStringBooleanValue.java | 15 -- .../JsonYesRepresentationBooleanValue.java | 16 -- .../primitives/bytevalue/ToJsonBitString.java | 27 --- .../bytevalue/fromJsonBitString.java | 28 --- .../charvalue/JsonUnicodeCharValue.java | 15 -- .../JsonNonCompatibleNumberTypeValue.java | 15 -- .../numbervalue/JsonOverflowValue.java | 15 -- .../JsonPrecissionMismatchValue.java | 15 -- .../specialvalue/JsonEmptyValue.java | 15 -- .../specialvalue/JsonInvalidStringValue.java | 15 -- .../specialvalue/JsonInvalidValue.java | 15 -- .../specialvalue/JsonNullValue.java | 15 -- .../specialvalue/JsonValidStringValue.java | 15 -- .../baeldung/gson/primitives/UnitTest.java | 180 ++++++++++++++++++ 17 files changed, 180 insertions(+), 267 deletions(-) delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java create mode 100644 gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java deleted file mode 100644 index 66e4d9dc77..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/fromJsonPrimitiveTypes.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.baeldung.gson.primitives.allprimitives; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBundle; - -public class fromJsonPrimitiveTypes { - public static void main(String[] args) { - String json = "{\"value\": 17, \"shortValue\": 3, \"intValue\": 3, " - + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" - + ", \"booleanValue\": true, \"charValue\": \"a\"}"; - - Gson gson = new Gson(); - GsonBundle gsonBundle = gson.fromJson(json, GsonBundle.class); - - System.out.println(gsonBundle); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java b/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java deleted file mode 100644 index ce35f37490..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/allprimitives/toJsonPrimitiveTypes.java +++ /dev/null @@ -1,13 +0,0 @@ -package org.baeldung.gson.primitives.allprimitives; - -import org.baeldung.gson.primitives.models.GsonBundle; -import com.google.gson.Gson; - -public class toJsonPrimitiveTypes { - public static void main(String[] args) { - GsonBundle gsonBundle = new GsonBundle(); - Gson gson = new Gson(); - - System.out.println(gson.toJson(gsonBundle)); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java deleted file mode 100644 index 7cbc1f7869..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonIntegerRepresentationBooleanValue.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung.gson.primitives.booleanvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBoolean; - -public class JsonIntegerRepresentationBooleanValue { - public static void main(String[] args) { - // Raises exception. - String json = "{\"value\": 1}"; - Gson gson = new Gson(); - - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java deleted file mode 100644 index a345d5e6f9..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonInvalidValueWithinStringBooleanValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.booleanvalue; - -import com.google.gson.Gson; - -public class JsonInvalidValueWithinStringBooleanValue { - public static void main(String[] args) { - // It is ignored. - String json = "{\"value\": \"15x\"}"; - Gson gson = new Gson(); - - org.baeldung.gson.primitives.models.GsonBoolean model = gson.fromJson(json, org.baeldung.gson.primitives.models.GsonBoolean.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java b/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java deleted file mode 100644 index b5e2e74a9a..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/booleanvalue/JsonYesRepresentationBooleanValue.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.baeldung.gson.primitives.booleanvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBoolean; - -public class JsonYesRepresentationBooleanValue { - public static void main(String[] args) { - // It fails silently. - String json = "{\"value\": yes}"; - Gson gson = new Gson(); - - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java deleted file mode 100644 index 20247efbff..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/ToJsonBitString.java +++ /dev/null @@ -1,27 +0,0 @@ -package org.baeldung.gson.primitives.bytevalue; - -import com.google.gson.*; -import org.baeldung.gson.primitives.models.GsonBitString; - -import java.lang.reflect.Type; - -public class ToJsonBitString { - public static void main(String[] args) { - GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(GsonBitString.class, new GsonBitStringSerializer()); - - Gson gson = builder.create(); - GsonBitString model = new GsonBitString(); - model.value = (byte) 0b1111; - - System.out.println(gson.toJson(model)); - } - - static class GsonBitStringSerializer implements JsonSerializer { - @Override public JsonElement serialize(GsonBitString gsonBundle, Type type, JsonSerializationContext jsonSerializationContext) { - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("value", Integer.toBinaryString(gsonBundle.value)); - return jsonObject; - } - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java deleted file mode 100644 index 18471ff365..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/bytevalue/fromJsonBitString.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.baeldung.gson.primitives.bytevalue; - -import com.google.gson.*; -import org.baeldung.gson.primitives.models.GsonBitString; - -import java.lang.reflect.Type; - -public class fromJsonBitString { - public static void main(String[] args) { - String json = "{\"value\": \"1111\"}"; - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(GsonBitString.class, new GsonBitStringDeserializer()); - - Gson gson = gsonBuilder.create(); - - System.out.println(gson.fromJson(json, GsonBitString.class)); - } - - static class GsonBitStringDeserializer implements JsonDeserializer { - @Override public GsonBitString deserialize(JsonElement jsonElement, - Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - GsonBitString gsonBitString = new GsonBitString(); - gsonBitString.value = (byte) Integer.parseInt( - jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsString(), 2); - return gsonBitString; - } - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java b/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java deleted file mode 100644 index 9164607e8d..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/charvalue/JsonUnicodeCharValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.charvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonChar; - -public class JsonUnicodeCharValue { - public static void main(String[] args) { - // The field is converted. - Gson gson = new Gson(); - String json = "{\"value\": \"\\u00AE\"}"; - GsonChar model = gson.fromJson(json, GsonChar.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java deleted file mode 100644 index 8aba292858..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonNonCompatibleNumberTypeValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.numbervalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonNonCompatibleNumberTypeValue { - public static void main(String[] args) { - // Raises an exception. - Gson gson = new Gson(); - String json = "{\"value\": 2.3}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java deleted file mode 100644 index 0cceff042d..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonOverflowValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.numbervalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonOverflowValue { - public static void main(String[] args) { - // Overflow happens unnoticed. - Gson gson = new Gson(); - String json = "{\"value\": \"300\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java b/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java deleted file mode 100644 index 40bc6532fb..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/numbervalue/JsonPrecissionMismatchValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.numbervalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonFloat; - -public class JsonPrecissionMismatchValue { - public static void main(String[] args) { - String json = "{\"value\": 12.123456789123456}"; - Gson gson = new Gson(); - - GsonFloat model = gson.fromJson(json, GsonFloat.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java deleted file mode 100644 index 3460383704..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonEmptyValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonEmptyValue { - public static void main(String[] args) { - // Raises an exception. - Gson gson = new Gson(); - String json = "{\"value\": \"\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java deleted file mode 100644 index 9453fc1215..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidStringValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonInvalidStringValue { - public static void main(String[] args) { - // Raises an exception. - Gson gson = new Gson(); - String json = "{\"value\": \"15x\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java deleted file mode 100644 index 92094f98bd..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonInvalidValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonInvalidValue { - public static void main(String[] args) { - // Raises an exception. - Gson gson = new Gson(); - String json = "{\"value\": s15s}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java deleted file mode 100644 index 47d8df7b54..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonNullValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonNullValue { - public static void main(String[] args) { - // The field will just be ignored. - Gson gson = new Gson(); - String json = "{\"value\": null}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java b/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java deleted file mode 100644 index 315bf2a73d..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/specialvalue/JsonValidStringValue.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.baeldung.gson.primitives.specialvalue; - -import com.google.gson.Gson; -import org.baeldung.gson.primitives.models.GsonBitString; - -public class JsonValidStringValue { - public static void main(String[] args) { - // The field is converted. - Gson gson = new Gson(); - String json = "{\"value\": \"15\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); - - System.out.println(model); - } -} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java new file mode 100644 index 0000000000..da91f02447 --- /dev/null +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -0,0 +1,180 @@ +package org.baeldung.gson.primitives; + +import com.google.gson.*; +import org.baeldung.gson.primitives.models.*; +import org.junit.Test; + +import java.lang.reflect.Type; + +import static junit.framework.TestCase.*; + +public class UnitTest { + @Test public void toJsonAllPrimitives() { + GsonBundle gsonBundle = new GsonBundle(); + Gson gson = new Gson(); + + String expected = "{\"byteValue\":17,\"shortValue\":3,\"intValue\":3," + "\"longValue\":3,\"floatValue\":3.5" + ",\"doubleValue\":3.5" + ",\"booleanValue\":true,\"charValue\":\"a\"}"; + + assertEquals(expected, gson.toJson(gsonBundle)); + } + + @Test public void fromJsonAllPrimitives() { + String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + ", \"booleanValue\": true, \"charValue\": \"a\"}"; + + Gson gson = new Gson(); + GsonBundle model = gson.fromJson(json, GsonBundle.class); + + assertEquals(17, model.byteValue); + assertEquals(3, model.shortValue); + assertEquals(3, model.intValue); + assertEquals(3, model.longValue); + assertEquals(3.5, model.floatValue, 0.0001); + assertEquals(3.5, model.doubleValue, 0.0001); + assertTrue(model.booleanValue); + assertEquals('a', model.charValue); + } + + @Test public void toJsonByteToBitString() { + GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(GsonBitString.class, new GsonBitStringSerializer()); + + Gson gson = builder.create(); + GsonBitString model = new GsonBitString(); + model.value = (byte) 0b1111; + + assertEquals("{\"value\":\"1111\"}", gson.toJson(model)); + } + + @Test public void fromJsonByteFromBitString() { + String json = "{\"value\": \"1111\"}"; + GsonBuilder gsonBuilder = new GsonBuilder(); + gsonBuilder.registerTypeAdapter(GsonBitString.class, new GsonBitStringDeserializer()); + + Gson gson = gsonBuilder.create(); + + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + assertEquals(15, model.value); + } + + @Test public void fromJsonPrecissionMismatch() { + String json = "{\"value\": 12.123456789123456}"; + Gson gson = new Gson(); + GsonFloat model = gson.fromJson(json, GsonFloat.class); + assertEquals(12.123457f, model.value, 0.000001); + } + + @Test public void fromJsonOverflow() { + Gson gson = new Gson(); + String json = "{\"value\": \"300\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + assertEquals(44, model.value); + } + + @Test public void fromJsonNonCompatibleNumberTypes() { + Gson gson = new Gson(); + String json = "{\"value\": 2.3}"; + try { + gson.fromJson(json, GsonBitString.class); + } catch (Exception ex) { + assertTrue(ex instanceof JsonSyntaxException); + assertTrue(ex.getCause() instanceof NumberFormatException); + return; + } + + fail(); + } + + @Test public void fromJsonUnicodeChar() { + Gson gson = new Gson(); + String json = "{\"value\": \"\\u00AE\"}"; + GsonChar model = gson.fromJson(json, GsonChar.class); + + assertEquals('\u00AE', model.value); + } + + @Test public void fromJsonNull() { + Gson gson = new Gson(); + String json = "{\"value\": null}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + assertEquals(1, model.value); + } + + @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { + Gson gson = new Gson(); + String json = "{\"value\": \"\"}"; + gson.fromJson(json, GsonBitString.class); + } + + @Test public void fromJsonValidValueWithinString() { + Gson gson = new Gson(); + String json = "{\"value\": \"15\"}"; + GsonBitString model = gson.fromJson(json, GsonBitString.class); + + assertEquals(15, model.value); + } + + @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueWithinString() { + Gson gson = new Gson(); + String json = "{\"value\": \"15x\"}"; + gson.fromJson(json, GsonBitString.class); + } + + @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueNotInAString() { + Gson gson = new Gson(); + String json = "{\"value\": s15s}"; + gson.fromJson(json, GsonBitString.class); + } + + @Test public void fromJsonBooleanFrom2ValueInteger() { + String json = "{\"value\": 1}"; + Gson gson = new Gson(); + + try { + gson.fromJson(json, GsonBoolean.class); + } catch (Exception ex) { + assertTrue(ex instanceof JsonSyntaxException); + assertTrue(ex.getCause() instanceof IllegalStateException); + return; + } + + fail(); + } + + @Test public void fromJsonBooleanfromYes() { + String json = "{\"value\": yes}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + // pay attention here that we are deserializing yes. + assertFalse(model.value); + } + + @Test public void fromJsonBooleanFromInvalidValue() { + String json = "{\"value\": \"15x\"}"; + Gson gson = new Gson(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + assertFalse(model.value); + } + + static class GsonBitStringDeserializer implements JsonDeserializer { + @Override public GsonBitString deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + GsonBitString gsonBitString = new GsonBitString(); + gsonBitString.value = (byte) Integer.parseInt(jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsString(), 2); + return gsonBitString; + } + } + + static class GsonBitStringSerializer implements JsonSerializer { + @Override public JsonElement serialize(GsonBitString gsonBundle, Type type, JsonSerializationContext jsonSerializationContext) { + JsonObject jsonObject = new JsonObject(); + jsonObject.addProperty("value", Integer.toBinaryString(gsonBundle.value)); + return jsonObject; + } + } +} From a370f6e78170adbede74bb3d6a749ea9c8685850 Mon Sep 17 00:00:00 2001 From: Dhananjay Singh Date: Wed, 5 Dec 2018 07:23:51 +0530 Subject: [PATCH 191/429] Calculate Factorial in Java (#5748) * Factorials * Refactored factorials * Change input to int * Small fixes * Renamed tests --- algorithms-miscellaneous-1/pom.xml | 6 ++ .../algorithms/factorial/Factorial.java | 63 ++++++++++++++++ .../factorial/FactorialUnitTest.java | 72 +++++++++++++++++++ 3 files changed, 141 insertions(+) create mode 100644 algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/factorial/Factorial.java create mode 100644 algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java diff --git a/algorithms-miscellaneous-1/pom.xml b/algorithms-miscellaneous-1/pom.xml index 75b031282b..5006670dd9 100644 --- a/algorithms-miscellaneous-1/pom.xml +++ b/algorithms-miscellaneous-1/pom.xml @@ -17,6 +17,11 @@ commons-math3 ${commons-math3.version} + + com.google.guava + guava + ${guava.version} + commons-codec commons-codec @@ -73,6 +78,7 @@ 3.6.1 3.9.0 1.11 + 25.1-jre \ No newline at end of file diff --git a/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/factorial/Factorial.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/factorial/Factorial.java new file mode 100644 index 0000000000..43d2221773 --- /dev/null +++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/factorial/Factorial.java @@ -0,0 +1,63 @@ +package com.baeldung.algorithms.factorial; + +import java.math.BigInteger; +import java.util.stream.LongStream; + +import org.apache.commons.math3.util.CombinatoricsUtils; + +import com.google.common.math.BigIntegerMath; + +public class Factorial { + + public long factorialUsingForLoop(int n) { + long fact = 1; + for (int i = 2; i <= n; i++) { + fact = fact * i; + } + return fact; + } + + public long factorialUsingStreams(int n) { + return LongStream.rangeClosed(1, n) + .reduce(1, (long x, long y) -> x * y); + } + + public long factorialUsingRecursion(int n) { + if (n <= 2) { + return n; + } + return n * factorialUsingRecursion(n - 1); + } + + private Long[] factorials = new Long[20]; + + public long factorialUsingMemoize(int n) { + + if (factorials[n] != null) { + return factorials[n]; + } + + if (n <= 2) { + return n; + } + long nthValue = n * factorialUsingMemoize(n - 1); + factorials[n] = nthValue; + return nthValue; + } + + public BigInteger factorialHavingLargeResult(int n) { + BigInteger result = BigInteger.ONE; + for (int i = 2; i <= n; i++) + result = result.multiply(BigInteger.valueOf(i)); + return result; + } + + public long factorialUsingApacheCommons(int n) { + return CombinatoricsUtils.factorial(n); + } + + public BigInteger factorialUsingGuava(int n) { + return BigIntegerMath.factorial(n); + } + +} diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java new file mode 100644 index 0000000000..c185dba62b --- /dev/null +++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/factorial/FactorialUnitTest.java @@ -0,0 +1,72 @@ +package com.baeldung.algorithms.factorial; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.math.BigInteger; + +import org.junit.Before; +import org.junit.Test; + +public class FactorialUnitTest { + + Factorial factorial; + + @Before + public void setup() { + factorial = new Factorial(); + } + + @Test + public void whenCalculatingFactorialUsingForLoop_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingForLoop(n)).isEqualTo(120); + } + + @Test + public void whenCalculatingFactorialUsingStreams_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingStreams(n)).isEqualTo(120); + } + + @Test + public void whenCalculatingFactorialUsingRecursion_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingRecursion(n)).isEqualTo(120); + } + + @Test + public void whenCalculatingFactorialUsingMemoize_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(120); + + n = 6; + + assertThat(factorial.factorialUsingMemoize(n)).isEqualTo(720); + } + + @Test + public void whenCalculatingFactorialHavingLargeResult_thenCorrect() { + int n = 22; + + assertThat(factorial.factorialHavingLargeResult(n)).isEqualTo(new BigInteger("1124000727777607680000")); + } + + @Test + public void whenCalculatingFactorialUsingApacheCommons_thenCorrect() { + int n = 5; + + assertThat(factorial.factorialUsingApacheCommons(n)).isEqualTo(120); + } + + @Test + public void whenCalculatingFactorialUsingGuava_thenCorrect() { + int n = 22; + + assertThat(factorial.factorialUsingGuava(n)).isEqualTo(new BigInteger("1124000727777607680000")); + } + +} From c4d92d17b5d77d9e675d25a4e0620af4cb8f130f Mon Sep 17 00:00:00 2001 From: gmconte <3528114+gmconte@users.noreply.github.com> Date: Wed, 5 Dec 2018 03:09:47 +0000 Subject: [PATCH 192/429] BAEL-2346: modifying concurrency code to add more examples (#5843) --- .../ScheduledExecutorServiceDemo.java | 58 ++++++++++++------- .../daemon/MultipleThreadsExample.java | 12 ++++ .../baeldung/concurrent/daemon/NewThread.java | 10 +++- .../daemon/SingleThreadExample.java | 8 +++ 4 files changed, 65 insertions(+), 23 deletions(-) create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java index b77019eea5..0989195ba7 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java @@ -1,34 +1,52 @@ package com.baeldung.concurrent.Scheduledexecutorservice; import java.util.concurrent.Executors; -import java.util.concurrent.Future; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import java.util.function.Function; public class ScheduledExecutorServiceDemo { - public void execute() { + private void execute() { ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor(); - - ScheduledFuture scheduledFuture = executorService.schedule(() -> { - // Task - }, 1, TimeUnit.SECONDS); - - executorService.scheduleAtFixedRate(() -> { - // Task - }, 1, 10, TimeUnit.SECONDS); - - executorService.scheduleWithFixedDelay(() -> { - // Task - }, 1, 10, TimeUnit.SECONDS); - - Future future = executorService.schedule(() -> { - // Task - return "Hellow world"; - }, 1, TimeUnit.SECONDS); - + getTasksToRun().apply(executorService); executorService.shutdown(); } + private void executeWithMultiThread() { + ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2); + getTasksToRun().apply(executorService); + executorService.shutdown(); + } + + private Function getTasksToRun() { + return (executorService -> { + ScheduledFuture scheduledFuture1 = executorService.schedule(() -> { + // Task + }, 1, TimeUnit.SECONDS); + + ScheduledFuture scheduledFuture2 = executorService.scheduleAtFixedRate(() -> { + // Task + }, 1, 10, TimeUnit.SECONDS); + + ScheduledFuture scheduledFuture3 = executorService.scheduleWithFixedDelay(() -> { + // Task + }, 1, 10, TimeUnit.SECONDS); + + ScheduledFuture scheduledFuture4 = executorService.schedule(() -> { + // Task + return "Hellow world"; + }, 1, TimeUnit.SECONDS); + return null; + }); + } + + public static void main(String... args) { + ScheduledExecutorServiceDemo demo = new ScheduledExecutorServiceDemo(); + demo.execute(); + demo.executeWithMultiThread(); + } + + } diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java new file mode 100644 index 0000000000..492466e0c3 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java @@ -0,0 +1,12 @@ +package com.baeldung.concurrent.daemon; + +public class MultipleThreadsExample { + public static void main(String[] args) { + NewThread t1 = new NewThread(); + t1.setName("MyThread-1"); + NewThread t2 = new NewThread(); + t2.setName("MyThread-2"); + t1.start(); + t2.start(); + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java index 4d87978070..370ce99c09 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java @@ -1,14 +1,18 @@ package com.baeldung.concurrent.daemon; public class NewThread extends Thread { - public void run() { long startTime = System.currentTimeMillis(); while (true) { for (int i = 0; i < 10; i++) { - System.out.println("New Thread is running..." + i); + System.out.println(this.getName() + ": New Thread is running..." + i); + try { + //Wait for one sec so it doesn't print too fast + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } } - // prevent the Thread to run forever. It will finish it's execution after 2 seconds if (System.currentTimeMillis() - startTime > 2000) { Thread.currentThread().interrupt(); diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java new file mode 100644 index 0000000000..16d8b2be1e --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java @@ -0,0 +1,8 @@ +package com.baeldung.concurrent.daemon; + +public class SingleThreadExample { + public static void main(String[] args) { + NewThread t = new NewThread(); + t.start(); + } +} From a21f82001cee47d1d69fecc069b8da631a3d6533 Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Wed, 5 Dec 2018 01:14:12 -0200 Subject: [PATCH 193/429] Added cases using subscribeOn and publishOn when debuggin reactive streams, for analysis (#5841) --- .../consumer/chronjobs/ChronJobs.java | 32 +++++++++++++++++++ .../debugging/consumer/model/Foo.java | 7 +++- .../debugging/consumer/model/FooDto.java | 8 +++-- .../consumer/service/FooService.java | 29 +++++++++++++++++ 4 files changed, 73 insertions(+), 3 deletions(-) diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java index 09cbc34a6f..bf96ab56d6 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/chronjobs/ChronJobs.java @@ -119,4 +119,36 @@ public class ChronJobs { logger.info("process 4 with approach 4"); service.processUsingApproachFourWithCheckpoint(fluxFoo); } + + @Scheduled(fixedRate = 20000) + public void consumeFiniteFluxWitParallelScheduler() { + Flux fluxFoo = client.get() + .uri("/functional-reactive/periodic-foo-2") + .accept(MediaType.TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(FooDto.class) + .delayElements(Duration.ofMillis(100)) + .map(dto -> { + logger.debug("process 5-parallel with dto id {} name{}", dto.getId(), dto.getName()); + return new Foo(dto); + }); + logger.info("process 5-parallel with approach 5-parallel"); + service.processUsingApproachFivePublishingToDifferentParallelThreads(fluxFoo); + } + + @Scheduled(fixedRate = 20000) + public void consumeFiniteFluxWithSingleSchedulers() { + Flux fluxFoo = client.get() + .uri("/functional-reactive/periodic-foo-2") + .accept(MediaType.TEXT_EVENT_STREAM) + .retrieve() + .bodyToFlux(FooDto.class) + .delayElements(Duration.ofMillis(100)) + .map(dto -> { + logger.debug("process 5-single with dto id {} name{}", dto.getId(), dto.getName()); + return new Foo(dto); + }); + logger.info("process 5-single with approach 5-single"); + service.processUsingApproachFivePublishingToDifferentSingleThreads(fluxFoo); + } } diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java index e101457b84..ac5093c261 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/Foo.java @@ -6,8 +6,13 @@ import org.springframework.data.annotation.Id; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; -@Data +@Getter +@Setter +@NoArgsConstructor @AllArgsConstructor public class Foo { diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java index 50508fd216..33f19c4e60 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/model/FooDto.java @@ -1,9 +1,13 @@ package com.baeldung.debugging.consumer.model; import lombok.AllArgsConstructor; -import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; -@Data +@Getter +@Setter +@NoArgsConstructor @AllArgsConstructor public class FooDto { diff --git a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java index 937e445ef5..438f6d473c 100644 --- a/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java +++ b/spring-5-reactive/src/main/java/com/baeldung/debugging/consumer/service/FooService.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Component; import com.baeldung.debugging.consumer.model.Foo; import reactor.core.publisher.Flux; +import reactor.core.scheduler.Schedulers; @Component public class FooService { @@ -88,4 +89,32 @@ public class FooService { flux.subscribe(); } + public void processUsingApproachFivePublishingToDifferentParallelThreads(Flux flux) { + logger.info("starting approach five-parallel!"); + flux = concatAndSubstringFooName(flux).publishOn(Schedulers.newParallel("five-parallel-foo")) + .log(); + flux = concatAndSubstringFooName(flux); + flux = divideFooQuantity(flux); + flux = reportResult(flux, "FIVE-PARALLEL").publishOn(Schedulers.newSingle("five-parallel-bar")); + flux = concatAndSubstringFooName(flux).doOnError(error -> { + logger.error("Approach 5-parallel failed!", error); + }); + flux.subscribeOn(Schedulers.newParallel("five-parallel-starter")) + .subscribe(); + } + + public void processUsingApproachFivePublishingToDifferentSingleThreads(Flux flux) { + logger.info("starting approach five-single!"); + flux = flux.log() + .subscribeOn(Schedulers.newSingle("five-single-starter")); + flux = concatAndSubstringFooName(flux).publishOn(Schedulers.newSingle("five-single-foo")); + flux = concatAndSubstringFooName(flux); + flux = divideFooQuantity(flux); + flux = reportResult(flux, "FIVE-SINGLE").publishOn(Schedulers.newSingle("five-single-bar")); + flux = concatAndSubstringFooName(flux).doOnError(error -> { + logger.error("Approach 5-single failed!", error); + }); + flux.subscribe(); + } + } From 744283db802a4019bd4e8aaeb545aa25cc314fb3 Mon Sep 17 00:00:00 2001 From: "akash.pandey" Date: Wed, 5 Dec 2018 10:07:06 +0530 Subject: [PATCH 194/429] Updated UnitTest name. --- .../string/LongestSubstringNonRepeatingCharactersTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java index 2150be2532..5c732ad134 100644 --- a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java +++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java @@ -9,7 +9,7 @@ import static com.baeldung.algorithms.string.LongestSubstringNonRepeatingCharact public class LongestSubstringNonRepeatingCharactersTest { @Test - void givenString_whenGetUniqueCharacterSubstringBruteForceCalled_thenResultFoundAsExpected() { + void givenString_whenGetUniqueCharacterSubstringBruteForceCalled_thenResultFoundAsExpectedUnitTest() { assertEquals("", getUniqueCharacterSubstringBruteForce("")); assertEquals("A", getUniqueCharacterSubstringBruteForce("A")); assertEquals("ABCDEF", getUniqueCharacterSubstringBruteForce("AABCDEF")); @@ -19,7 +19,7 @@ public class LongestSubstringNonRepeatingCharactersTest { } @Test - void givenString_whenGetUniqueCharacterSubstringCalled_thenResultFoundAsExpected() { + void givenString_whenGetUniqueCharacterSubstringCalled_thenResultFoundAsExpectedUnitTest() { assertEquals("", getUniqueCharacterSubstring("")); assertEquals("A", getUniqueCharacterSubstring("A")); assertEquals("ABCDEF", getUniqueCharacterSubstring("AABCDEF")); From cac62f06ae95ca2c97d1707a24973a48c778d246 Mon Sep 17 00:00:00 2001 From: Priyesh Mashelkar Date: Wed, 5 Dec 2018 18:30:14 +0000 Subject: [PATCH 195/429] BAEL-2344 Hibernate Named Query (#5835) * Added writer * Added implementation and test class * Added more details * Updated tests * Updated code as per review comments * Added test class and one named query * Updated test class * Added update HQL * Added new initialisation script and new queries * Corrected queries * Removed commented code * printf examples Issue: BAEL-2228 * Update README.md * Added implementation and test class * Added more details * Updated tests * Updated code as per review comments * Added test class and one named query * Updated test class * Added update HQL * Added new initialisation script and new queries * Corrected queries * Removed commented code --- .../hibernate/entities/DeptEmployee.java | 75 +++++++++++++ .../src/main/resources/init_database.sql | 10 ++ .../hibernate/NamedQueryIntegrationTest.java | 103 ++++++++++++++++++ .../resources/hibernate-namedquery.properties | 9 ++ .../hibernate/entities/DeptEmployee.java | 14 ++- 5 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java create mode 100644 hibernate5/src/main/resources/init_database.sql create mode 100644 hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java create mode 100644 hibernate5/src/test/resources/hibernate-namedquery.properties diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java new file mode 100644 index 0000000000..7813e89a48 --- /dev/null +++ b/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java @@ -0,0 +1,75 @@ +package com.baeldung.hibernate.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +@org.hibernate.annotations.NamedQueries({ @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindByEmployeeNumber", query = "from DeptEmployee where employeeNumber = :employeeNo"), + @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindAllByDesgination", query = "from DeptEmployee where designation = :designation"), + @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_UpdateEmployeeDepartment", query = "Update DeptEmployee set department = :newDepartment where employeeNumber = :employeeNo"), + @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindAllByDepartment", query = "from DeptEmployee where department = :department", timeout = 1, fetchSize = 10) }) +@org.hibernate.annotations.NamedNativeQueries({ @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_FindByEmployeeName", query = "select * from deptemployee emp where name=:name", resultClass = DeptEmployee.class), + @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_UpdateEmployeeDesignation", query = "call UPDATE_EMPLOYEE_DESIGNATION(:employeeNumber, :newDesignation)", resultClass = DeptEmployee.class) }) +@Entity +public class DeptEmployee { + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE) + private long id; + + private String employeeNumber; + + private String designation; + + private String name; + + @ManyToOne + private Department department; + + public DeptEmployee(String name, String employeeNumber, Department department) { + this.name = name; + this.employeeNumber = employeeNumber; + this.department = department; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getEmployeeNumber() { + return employeeNumber; + } + + public void setEmployeeNumber(String employeeNumber) { + this.employeeNumber = employeeNumber; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Department getDepartment() { + return department; + } + + public void setDepartment(Department department) { + this.department = department; + } + + public String getDesignation() { + return designation; + } + + public void setDesignation(String designation) { + this.designation = designation; + } +} diff --git a/hibernate5/src/main/resources/init_database.sql b/hibernate5/src/main/resources/init_database.sql new file mode 100644 index 0000000000..154a5a0bc0 --- /dev/null +++ b/hibernate5/src/main/resources/init_database.sql @@ -0,0 +1,10 @@ +CREATE ALIAS UPDATE_EMPLOYEE_DESIGNATION AS $$ +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +@CODE +void updateEmployeeDesignation(final Connection conn, final String employeeNumber, final String designation) throws SQLException { + CallableStatement updateStatement = conn.prepareCall("update deptemployee set designation = '" + designation + "' where employeeNumber = '" + employeeNumber + "'"); + updateStatement.execute(); +} +$$; \ No newline at end of file diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java new file mode 100644 index 0000000000..ef6ec89bc4 --- /dev/null +++ b/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java @@ -0,0 +1,103 @@ +package com.baeldung.hibernate; + +import java.io.IOException; + +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.NativeQuery; +import org.hibernate.query.Query; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import com.baeldung.hibernate.entities.Department; +import com.baeldung.hibernate.entities.DeptEmployee; + +public class NamedQueryIntegrationTest { + private static Session session; + + private Transaction transaction; + + private Long purchaseDeptId; + + @BeforeClass + public static void setUpClass() throws IOException { + session = HibernateUtil.getSessionFactory("hibernate-namedquery.properties").openSession(); + } + + @Before + public void setUp() throws IOException { + transaction = session.beginTransaction(); + session.createNativeQuery("delete from deptemployee").executeUpdate(); + session.createNativeQuery("delete from department").executeUpdate(); + Department salesDepartment = new Department("Sales"); + Department purchaseDepartment = new Department("Purchase"); + DeptEmployee employee1 = new DeptEmployee("John Wayne", "001", salesDepartment); + DeptEmployee employee2 = new DeptEmployee("Sarah Vinton", "002", salesDepartment); + DeptEmployee employee3 = new DeptEmployee("Lisa Carter", "003", salesDepartment); + session.persist(salesDepartment); + session.persist(purchaseDepartment); + purchaseDeptId = purchaseDepartment.getId(); + session.persist(employee1); + session.persist(employee2); + session.persist(employee3); + transaction.commit(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + if(transaction.isActive()) { + transaction.rollback(); + } + } + + @Test + public void whenNamedQueryIsCalledUsingCreateNamedQuery_ThenOk() { + Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeNumber", DeptEmployee.class); + query.setParameter("employeeNo", "001"); + DeptEmployee result = query.getSingleResult(); + Assert.assertNotNull(result); + Assert.assertEquals("John Wayne", result.getName()); + } + + @Test + public void whenNamedNativeQueryIsCalledUsingCreateNamedQuery_ThenOk() { + Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeName", DeptEmployee.class); + query.setParameter("name", "John Wayne"); + DeptEmployee result = query.getSingleResult(); + Assert.assertNotNull(result); + Assert.assertEquals("001", result.getEmployeeNumber()); + } + + @Test + public void whenNamedNativeQueryIsCalledUsingGetNamedNativeQuery_ThenOk() { + @SuppressWarnings("rawtypes") + NativeQuery query = session.getNamedNativeQuery("DeptEmployee_FindByEmployeeName"); + query.setParameter("name", "John Wayne"); + DeptEmployee result = (DeptEmployee) query.getSingleResult(); + Assert.assertNotNull(result); + Assert.assertEquals("001", result.getEmployeeNumber()); + } + + @Test + public void whenUpdateQueryIsCalledWithCreateNamedQuery_ThenOk() { + Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDepartment"); + spQuery.setParameter("employeeNo", "001"); + Department newDepartment = session.find(Department.class, purchaseDeptId); + spQuery.setParameter("newDepartment", newDepartment); + spQuery.executeUpdate(); + transaction.commit(); + } + + @Test + public void whenNamedStoredProcedureIsCalledWithCreateNamedQuery_ThenOk() { + Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDesignation"); + spQuery.setParameter("employeeNumber", "002"); + spQuery.setParameter("newDesignation", "Supervisor"); + spQuery.executeUpdate(); + transaction.commit(); + } +} diff --git a/hibernate5/src/test/resources/hibernate-namedquery.properties b/hibernate5/src/test/resources/hibernate-namedquery.properties new file mode 100644 index 0000000000..457f965347 --- /dev/null +++ b/hibernate5/src/test/resources/hibernate-namedquery.properties @@ -0,0 +1,9 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'src/main/resources/init_database.sql' +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java index 8b5d9c41f3..6510e70650 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java @@ -1,7 +1,17 @@ package com.baeldung.hibernate.entities; -import javax.persistence.*; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +@org.hibernate.annotations.NamedQueries({ @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindByEmployeeNumber", query = "from DeptEmployee where employeeNumber = :employeeNo"), + @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindAllByDesgination", query = "from DeptEmployee where designation = :designation"), + @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_UpdateEmployeeDepartment", query = "Update DeptEmployee set department = :newDepartment where employeeNumber = :employeeNo"), + @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindAllByDepartment", query = "from DeptEmployee where department = :department", timeout = 1, fetchSize = 10) }) +@org.hibernate.annotations.NamedNativeQueries({ @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_FindByEmployeeName", query = "select * from deptemployee emp where name=:name", resultClass = DeptEmployee.class), + @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_UpdateEmployeeDesignation", query = "call UPDATE_EMPLOYEE_DESIGNATION(:employeeNumber, :newDesignation)", resultClass = DeptEmployee.class) }) @Entity public class DeptEmployee { @Id @@ -16,7 +26,7 @@ public class DeptEmployee { @ManyToOne private Department department; - + public DeptEmployee(String name, String employeeNumber, Department department) { this.name = name; this.employeeNumber = employeeNumber; From de2f02ff5d18ef9496429555539d2f8c54495346 Mon Sep 17 00:00:00 2001 From: raghav-jha Date: Thu, 6 Dec 2018 01:14:37 +0530 Subject: [PATCH 196/429] BAEL-2394 JPA One-to-One Relationship (#5847) --- .../hibernate/onetoone/HibernateUtil.java | 66 +++++++++++++++++++ .../baeldung/hibernate/onetoone/Strategy.java | 0 .../onetoone/foreignkeybased/Address.java | 0 .../onetoone/foreignkeybased/User.java | 2 +- .../onetoone/jointablebased/Employee.java | 0 .../onetoone/jointablebased/WorkStation.java | 0 .../onetoone/sharedkeybased/Address.java | 0 .../onetoone/sharedkeybased/User.java | 0 ...ToOneAnnotationFKBasedIntegrationTest.java | 0 ...ToOneAnnotationJTBasedIntegrationTest.java | 0 ...oOneAnnotationSPKBasedIntegrationTest.java | 0 .../hibernate/onetoone/HibernateUtil.java | 38 ----------- .../src/main/resources/one-to-one.cfg.xml | 16 ----- .../src/test/resources/one-to-one.cfg.xml | 16 ----- 14 files changed, 67 insertions(+), 71 deletions(-) create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java (100%) rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java (100%) rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java (94%) rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java (100%) rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java (100%) rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java (100%) rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java (100%) rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java (100%) rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java (100%) rename persistence-modules/{spring-hibernate-5 => hibernate5}/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java (100%) delete mode 100644 persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java delete mode 100644 persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml delete mode 100644 persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java new file mode 100644 index 0000000000..972ade9671 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java @@ -0,0 +1,66 @@ +package com.baeldung.hibernate.onetoone; + +import com.baeldung.hibernate.customtypes.LocalDateStringType; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + private HibernateUtil() { + } + + public static SessionFactory getSessionFactory(Strategy strategy) { + if (sessionFactory == null) { + sessionFactory = buildSessionFactory(strategy); + } + return sessionFactory; + } + + private static SessionFactory buildSessionFactory(Strategy strategy) { + try { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + for (Class entityClass : strategy.getEntityClasses()) { + metadataSources.addAnnotatedClass(entityClass); + } + + Metadata metadata = metadataSources.getMetadataBuilder() + .applyBasicType(LocalDateStringType.INSTANCE) + .build(); + + return metadata.getSessionFactoryBuilder() + .build(); + } catch (IOException ex) { + throw new ExceptionInInitializerError(ex); + } + } + + + private static ServiceRegistry configureServiceRegistry() throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties) + .build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource("hibernate.properties"); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java similarity index 100% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java rename to persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/Strategy.java diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java similarity index 100% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java rename to persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/Address.java diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java similarity index 94% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java rename to persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java index 56b108d0d1..dda972f29c 100644 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/foreignkeybased/User.java @@ -22,7 +22,7 @@ public class User { private String userName; @OneToOne(cascade = CascadeType.ALL) - @JoinColumn(name = "address_id", referencedColumnName = "id") + @JoinColumn(name = "address_id", referencedColumnName = "id") private Address address; public Long getId() { diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java similarity index 100% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java rename to persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/Employee.java diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java similarity index 100% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java rename to persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/jointablebased/WorkStation.java diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java similarity index 100% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java rename to persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/Address.java diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java similarity index 100% rename from persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java rename to persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/onetoone/sharedkeybased/User.java diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java similarity index 100% rename from persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java rename to persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationFKBasedIntegrationTest.java diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java similarity index 100% rename from persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java rename to persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationJTBasedIntegrationTest.java diff --git a/persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java similarity index 100% rename from persistence-modules/spring-hibernate-5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java rename to persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/onetoone/HibernateOneToOneAnnotationSPKBasedIntegrationTest.java diff --git a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java b/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java deleted file mode 100644 index 899fcde947..0000000000 --- a/persistence-modules/spring-hibernate-5/src/main/java/com/baeldung/hibernate/onetoone/HibernateUtil.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.baeldung.hibernate.onetoone; - -import org.hibernate.SessionFactory; -import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.Configuration; -import org.hibernate.service.ServiceRegistry; - -public class HibernateUtil { - private static SessionFactory sessionFactory; - - private static SessionFactory buildSessionFactory(Strategy strategy) { - try { - // Create the SessionFactory from hibernate-annotation.cfg.xml - Configuration configuration = new Configuration(); - - for (Class entityClass : strategy.getEntityClasses()) { - configuration.addAnnotatedClass(entityClass); - } - configuration.configure("one-to-one.cfg.xml"); - - ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()) - .build(); - - SessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); - - return sessionFactory; - } catch (Throwable ex) { - ex.printStackTrace(); - throw new ExceptionInInitializerError(ex); - } - } - - public static SessionFactory getSessionFactory(Strategy strategy) { - if (sessionFactory == null) - sessionFactory = buildSessionFactory(strategy); - return sessionFactory; - } -} diff --git a/persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml b/persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml deleted file mode 100644 index 7522036acb..0000000000 --- a/persistence-modules/spring-hibernate-5/src/main/resources/one-to-one.cfg.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - org.h2.Driver - - jdbc:h2:mem:spring_hibernate_one_to_one - sa - org.hibernate.dialect.H2Dialect - thread - true - create-drop - - \ No newline at end of file diff --git a/persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml b/persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml deleted file mode 100644 index 60417e312d..0000000000 --- a/persistence-modules/spring-hibernate-5/src/test/resources/one-to-one.cfg.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - org.h2.Driver - - jdbc:h2:mem:spring_hibernate_one_to_one - sa - org.hibernate.dialect.H2Dialect - thread - true - create-drop - - From df7b723cbafd493d064ac6f97d3b58540b484b38 Mon Sep 17 00:00:00 2001 From: Josh Cummings Date: Wed, 5 Dec 2018 15:54:20 -0700 Subject: [PATCH 197/429] Update README.md (#5850) Issue: BAEL-2213 --- spring-data-rest/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-data-rest/README.md b/spring-data-rest/README.md index db94a86a6f..1624a3abfd 100644 --- a/spring-data-rest/README.md +++ b/spring-data-rest/README.md @@ -21,3 +21,4 @@ To view the running application, visit [http://localhost:8080](http://localhost: - [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) From 8b8fda7d0b989174b3f0db1e20cadbcdf837257c Mon Sep 17 00:00:00 2001 From: Paul van Gool Date: Wed, 5 Dec 2018 18:11:21 -0800 Subject: [PATCH 198/429] BAEL-1049 * BAEL-1049: Update to latest version, and added tests. * Update FunctionalJavaUnitTest.java * Update FunctionalJavaUnitTest.java * Add blank lines before asserts. --- libraries/pom.xml | 2 +- .../baeldung/fj/FunctionalJavaUnitTest.java | 201 +++++++++++------- 2 files changed, 123 insertions(+), 80 deletions(-) diff --git a/libraries/pom.xml b/libraries/pom.xml index 936e86873d..fb1f1cd1b6 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -942,7 +942,7 @@ 2.0.4 1.3.1 1.2.6 - 4.7 + 4.8.1 1.0.1 3.3.5 2.1 diff --git a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java b/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java index d62a115abd..aa06ba4eb9 100644 --- a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java +++ b/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java @@ -1,79 +1,122 @@ -package com.baeldung.fj; - -import static org.junit.Assert.assertEquals; - -import org.junit.Test; - -import fj.F; -import fj.data.Array; -import fj.data.List; -import fj.data.Option; -import fj.function.Characters; -import fj.function.Integers; - -public class FunctionalJavaUnitTest { - - public static final F isEven = i -> i % 2 == 0; - - @Test - public void calculateEvenNumbers_givenIntList_returnTrue() { - List fList = List.list(3, 4, 5, 6); - List evenList = fList.map(isEven); - List evenListTrueResult = List.list(false, true, false, true); - List evenListFalseResult = List.list(true, false, false, true); - assertEquals(evenList.equals(evenListTrueResult), true); - assertEquals(evenList.equals(evenListFalseResult), false); - } - - @Test - public void mapList_givenIntList_returnResult() { - List fList = List.list(3, 4, 5, 6); - fList = fList.map(i -> i + 100); - List resultList = List.list(103, 104, 105, 106); - List falseResultList = List.list(15, 504, 105, 106); - assertEquals(fList.equals(resultList), true); - assertEquals(fList.equals(falseResultList), false); - } - - @Test - public void filterList_givenIntList_returnResult() { - Array array = Array.array(3, 4, 5, 6); - Array filteredArray = array.filter(Integers.even); - Array result = Array.array(4, 6); - Array wrongResult = Array.array(3, 5); - assertEquals(filteredArray.equals(result), true); - assertEquals(filteredArray.equals(wrongResult), false); - } - - @Test - public void checkForLowerCase_givenStringArray_returnResult() { - Array array = Array.array("Welcome", "To", "baeldung"); - Array array2 = Array.array("Welcome", "To", "Baeldung"); - Boolean isExist = array.exists(s -> List.fromString(s).forall(Characters.isLowerCase)); - Boolean isExist2 = array2.exists(s -> List.fromString(s).forall(Characters.isLowerCase)); - assertEquals(isExist, true); - assertEquals(isExist2, false); - } - - @Test - public void checkOptions_givenOptions_returnResult() { - Option n1 = Option.some(1); - Option n2 = Option.some(2); - - F> f1 = i -> i % 2 == 0 ? Option.some(i + 100) : Option.none(); - - Option result1 = n1.bind(f1); - Option result2 = n2.bind(f1); - - assertEquals(result1, Option.none()); - assertEquals(result2, Option.some(102)); - } - - @Test - public void foldLeft_givenArray_returnResult() { - Array intArray = Array.array(17, 44, 67, 2, 22, 80, 1, 27); - int sum = intArray.foldLeft(Integers.add, 0); - assertEquals(sum, 260); - } - -} +package com.baeldung.fj; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import fj.F; +import fj.Show; +import fj.data.Array; +import fj.data.List; +import fj.data.Option; +import fj.function.Characters; +import fj.function.Integers; + +public class FunctionalJavaUnitTest { + + public static final F isEven = i -> i % 2 == 0; + + public static final Integer timesTwoRegular(Integer i) { + return i * 2; + } + + public static final F timesTwo = i -> i * 2; + + public static final F plusOne = i -> i + 1; + + @Test + public void multiplyNumbers_givenIntList_returnTrue() { + List fList = List.list(1, 2, 3, 4); + List fList1 = fList.map(timesTwo); + List fList2 = fList.map(i -> i * 2); + + assertEquals(fList1.equals(fList2), true); + } + + @Test + public void applyMultipleFunctions_givenIntList_returnFalse() { + List fList = List.list(1, 2, 3, 4); + List fList1 = fList.map(timesTwo).map(plusOne); + Show.listShow(Show.intShow).println(fList1); + List fList2 = fList.map(plusOne).map(timesTwo); + Show.listShow(Show.intShow).println(fList2); + + assertEquals(fList1.equals(fList2), false); + } + + @Test + public void calculateEvenNumbers_givenIntList_returnTrue() { + List fList = List.list(3, 4, 5, 6); + List evenList = fList.map(isEven); + List evenListTrueResult = List.list(false, true, false, true); + List evenListFalseResult = List.list(true, false, false, true); + + assertEquals(evenList.equals(evenListTrueResult), true); + assertEquals(evenList.equals(evenListFalseResult), false); + } + + @Test + public void mapList_givenIntList_returnResult() { + List fList = List.list(3, 4, 5, 6); + fList = fList.map(i -> i + 100); + List resultList = List.list(103, 104, 105, 106); + List falseResultList = List.list(15, 504, 105, 106); + + assertEquals(fList.equals(resultList), true); + assertEquals(fList.equals(falseResultList), false); + } + + @Test + public void filterList_givenIntList_returnResult() { + Array array = Array.array(3, 4, 5, 6); + Array filteredArray = array.filter(isEven); + Array result = Array.array(4, 6); + Array wrongResult = Array.array(3, 5); + + assertEquals(filteredArray.equals(result), true); + assertEquals(filteredArray.equals(wrongResult), false); + } + + @Test + public void checkForLowerCase_givenStringArray_returnResult() { + Array array = Array.array("Welcome", "To", "baeldung"); + Array array2 = Array.array("Welcome", "To", "Baeldung"); + Boolean isExist = array.exists(s -> List.fromString(s).forall(Characters.isLowerCase)); + Boolean isExist2 = array2.exists(s -> List.fromString(s).forall(Characters.isLowerCase)); + Boolean isAll = array.forall(s -> List.fromString(s).forall(Characters.isLowerCase)); + + assertEquals(isExist, true); + assertEquals(isExist2, false); + assertEquals(isAll, false); + } + + @Test + public void checkOptions_givenOptions_returnResult() { + Option n1 = Option.some(1); + Option n2 = Option.some(2); + Option n3 = Option.none(); + + F> function = i -> i % 2 == 0 ? Option.some(i + 100) : Option.none(); + + Option result1 = n1.bind(function); + Option result2 = n2.bind(function); + Option result3 = n3.bind(function); + + assertEquals(result1, Option.none()); + assertEquals(result2, Option.some(102)); + assertEquals(result3, Option.none()); + } + + @Test + public void foldLeft_givenArray_returnResult() { + Array intArray = Array.array(17, 44, 67, 2, 22, 80, 1, 27); + int sumAll = intArray.foldLeft(Integers.add, 0); + + assertEquals(sumAll, 260); + + int sumEven = intArray.filter(isEven).foldLeft(Integers.add, 0); + + assertEquals(sumEven, 148); + } + +} From 9fa39257e4ca61f3d0405e15c7e8ccead6da3d20 Mon Sep 17 00:00:00 2001 From: "akash.pandey" Date: Thu, 6 Dec 2018 08:38:51 +0530 Subject: [PATCH 199/429] PMD Fix: Update Test file name --- ...t.java => LongestSubstringNonRepeatingCharactersUnitTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/{LongestSubstringNonRepeatingCharactersTest.java => LongestSubstringNonRepeatingCharactersUnitTest.java} (100%) diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java similarity index 100% rename from algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersTest.java rename to algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java From 11f4a4aee053fa9139de9e28ddb92e092427d41d Mon Sep 17 00:00:00 2001 From: "akash.pandey" Date: Thu, 6 Dec 2018 08:43:21 +0530 Subject: [PATCH 200/429] PMD Fix : Renamed Unit Test --- .../string/LongestSubstringNonRepeatingCharactersUnitTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java index 5c732ad134..9f1e6a2519 100644 --- a/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java +++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/LongestSubstringNonRepeatingCharactersUnitTest.java @@ -6,7 +6,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static com.baeldung.algorithms.string.LongestSubstringNonRepeatingCharacters.getUniqueCharacterSubstring; import static com.baeldung.algorithms.string.LongestSubstringNonRepeatingCharacters.getUniqueCharacterSubstringBruteForce; -public class LongestSubstringNonRepeatingCharactersTest { +public class LongestSubstringNonRepeatingCharactersUnitTest { @Test void givenString_whenGetUniqueCharacterSubstringBruteForceCalled_thenResultFoundAsExpectedUnitTest() { From 7f5789c274788a2ca15025fc3fc7f66adb1db0e9 Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Thu, 6 Dec 2018 13:30:59 +0330 Subject: [PATCH 201/429] Added a simple function for bytecode inspection. --- .../kotlin/com/baeldung/functions/Inline.kt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/functions/Inline.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/functions/Inline.kt b/core-kotlin/src/main/kotlin/com/baeldung/functions/Inline.kt new file mode 100644 index 0000000000..239c425c03 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/functions/Inline.kt @@ -0,0 +1,28 @@ +package com.baeldung.functions + +import kotlin.random.Random + +/** + * An extension function on all collections to apply a function to all collection + * elements. + */ +fun Collection.each(block: (T) -> Unit) { + for (e in this) block(e) +} + +/** + * In order to see the the JVM bytecode: + * 1. Compile the Kotlin file using `kotlinc Inline.kt` + * 2. Take a peek at the bytecode using the `javap -c InlineKt` + */ +fun main() { + val numbers = listOf(1, 2, 3, 4, 5) + val random = random() + + numbers.each { println(random * it) } // capturing the random variable +} + +/** + * Generates a random number. + */ +private fun random(): Int = Random.nextInt() \ No newline at end of file From 19ed35aef4979947448d0d13b50add52db428069 Mon Sep 17 00:00:00 2001 From: Javier Date: Thu, 6 Dec 2018 10:13:20 +0100 Subject: [PATCH 202/429] BAEL-2412 Change name of a class. Move class init code to tests. Add solution to deserializing a boolean from an 2-value integer. Change formatting for long sentences, mainly the serializers/deserializers. --- .../{GsonBundle.java => PrimitiveBundle.java} | 18 ++-- .../baeldung/gson/primitives/UnitTest.java | 87 ++++++++++++++++--- 2 files changed, 83 insertions(+), 22 deletions(-) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonBundle.java => PrimitiveBundle.java} (55%) diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java similarity index 55% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java index 1fff9a8a29..30bc4d0d9f 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBundle.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java @@ -1,14 +1,14 @@ package org.baeldung.gson.primitives.models; -public class GsonBundle { - public byte byteValue = (byte) 0x00001111; - public short shortValue = (short) 3; - public int intValue = 3; - public long longValue = 3; - public float floatValue = 3.5f; - public double doubleValue = 3.5; - public boolean booleanValue = true; - public char charValue = 'a'; +public class PrimitiveBundle { + public byte byteValue; + public short shortValue; + public int intValue; + public long longValue; + public float floatValue; + public double doubleValue; + public boolean booleanValue; + public char charValue; public String toString() { return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index da91f02447..890e6eefd7 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -10,28 +10,42 @@ import static junit.framework.TestCase.*; public class UnitTest { @Test public void toJsonAllPrimitives() { - GsonBundle gsonBundle = new GsonBundle(); + PrimitiveBundle primitiveBundle = new PrimitiveBundle(); + + // @formatter:off + primitiveBundle.byteValue = (byte) 0x00001111; + primitiveBundle.shortValue = (short) 3; + primitiveBundle.intValue = 3; + primitiveBundle.longValue = 3; + primitiveBundle.floatValue = 3.5f; + primitiveBundle.doubleValue = 3.5; + primitiveBundle.booleanValue = true; + primitiveBundle.charValue = 'a'; + // @formatter:on + Gson gson = new Gson(); String expected = "{\"byteValue\":17,\"shortValue\":3,\"intValue\":3," + "\"longValue\":3,\"floatValue\":3.5" + ",\"doubleValue\":3.5" + ",\"booleanValue\":true,\"charValue\":\"a\"}"; - assertEquals(expected, gson.toJson(gsonBundle)); + assertEquals(expected, gson.toJson(primitiveBundle)); } @Test public void fromJsonAllPrimitives() { String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + ", \"booleanValue\": true, \"charValue\": \"a\"}"; Gson gson = new Gson(); - GsonBundle model = gson.fromJson(json, GsonBundle.class); + PrimitiveBundle model = gson.fromJson(json, PrimitiveBundle.class); - assertEquals(17, model.byteValue); - assertEquals(3, model.shortValue); - assertEquals(3, model.intValue); - assertEquals(3, model.longValue); + // @formatter:off + assertEquals(17, model.byteValue); + assertEquals(3, model.shortValue); + assertEquals(3, model.intValue); + assertEquals(3, model.longValue); assertEquals(3.5, model.floatValue, 0.0001); assertEquals(3.5, model.doubleValue, 0.0001); - assertTrue(model.booleanValue); + assertTrue( model.booleanValue); assertEquals('a', model.charValue); + // @formatter:on } @Test public void toJsonByteToBitString() { @@ -143,7 +157,19 @@ public class UnitTest { fail(); } - @Test public void fromJsonBooleanfromYes() { + @Test public void fromJsonBooleanFrom2ValueIntegerSolution() { + String json = "{\"value\": 1}"; + GsonBuilder builder = new GsonBuilder(); + builder.registerTypeAdapter(GsonBoolean.class, new GsonBoolean2ValueIntegerDeserializer()); + + Gson gson = builder.create(); + + GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + + assertTrue(model.value); + } + + @Test public void fromJsonBooleanFromYes() { String json = "{\"value\": yes}"; Gson gson = new Gson(); @@ -162,19 +188,54 @@ public class UnitTest { assertFalse(model.value); } + // @formatter:off static class GsonBitStringDeserializer implements JsonDeserializer { - @Override public GsonBitString deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + @Override public GsonBitString deserialize( + JsonElement jsonElement, + Type type, + JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + GsonBitString gsonBitString = new GsonBitString(); - gsonBitString.value = (byte) Integer.parseInt(jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsString(), 2); + gsonBitString.value = (byte) Integer.parseInt( + jsonElement.getAsJsonObject() + .getAsJsonPrimitive("value") + .getAsString() + , 2); return gsonBitString; } } static class GsonBitStringSerializer implements JsonSerializer { - @Override public JsonElement serialize(GsonBitString gsonBundle, Type type, JsonSerializationContext jsonSerializationContext) { + @Override public JsonElement serialize( + GsonBitString model, + Type type, + JsonSerializationContext jsonSerializationContext) { + JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("value", Integer.toBinaryString(gsonBundle.value)); + jsonObject.addProperty("value", Integer.toBinaryString(model.value)); return jsonObject; } } + + static class GsonBoolean2ValueIntegerDeserializer implements JsonDeserializer { + @Override public GsonBoolean deserialize( + JsonElement jsonElement, + Type type, + JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + + GsonBoolean model = new GsonBoolean(); + int value = jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsInt(); + if (value == 0) { + model.value = false; + } else if (value == 1) { + model.value = true; + } else { + throw new JsonParseException("Unexpected value. Trying to deserialize " + + "a boolean from an integer different than 0 and 1."); + } + + return model; + } + } + // @formatter:on } From dec5eabe81a7063ac5cdc5deeb64e46eb8673d0f Mon Sep 17 00:00:00 2001 From: clininger Date: Thu, 6 Dec 2018 23:09:43 +0700 Subject: [PATCH 203/429] BAELDUNG-2283 --- rsocket/pom.xml | 54 +++++++++ .../com/baeldung/rsocket/ChannelClient.java | 33 ++++++ .../baeldung/rsocket/FireNForgetClient.java | 86 ++++++++++++++ .../com/baeldung/rsocket/ReqResClient.java | 32 ++++++ .../com/baeldung/rsocket/ReqStreamClient.java | 33 ++++++ .../java/com/baeldung/rsocket/Server.java | 107 ++++++++++++++++++ .../baeldung/rsocket/support/Constants.java | 10 ++ .../rsocket/support/GameController.java | 84 ++++++++++++++ .../rsocket/support/WindDataPublisher.java | 31 +++++ rsocket/src/main/resources/logback.xml | 13 +++ .../rsocket/RSocketIntegrationTest.java | 71 ++++++++++++ 11 files changed, 554 insertions(+) create mode 100644 rsocket/pom.xml create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/Server.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java create mode 100644 rsocket/src/main/resources/logback.xml create mode 100644 rsocket/src/test/java/com/baeldung/rsocket/RSocketIntegrationTest.java diff --git a/rsocket/pom.xml b/rsocket/pom.xml new file mode 100644 index 0000000000..8b04a31583 --- /dev/null +++ b/rsocket/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + rsocket + 0.0.1-SNAPSHOT + rsocket + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + jar + + + + io.rsocket + rsocket-core + 0.11.13 + + + io.rsocket + rsocket-transport-netty + 0.11.13 + + + junit + junit + 4.12 + test + + + org.hamcrest + hamcrest-core + 1.3 + test + + + ch.qos.logback + logback-classic + 1.2.3 + + + ch.qos.logback + logback-core + 1.2.3 + + + org.slf4j + slf4j-api + 1.7.25 + + + \ No newline at end of file diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java new file mode 100644 index 0000000000..9f26384c95 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java @@ -0,0 +1,33 @@ +package com.baeldung.rsocket; + +import static com.baeldung.rsocket.support.Constants.*; +import com.baeldung.rsocket.support.GameController; +import io.rsocket.RSocket; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.client.TcpClientTransport; +import reactor.core.publisher.Flux; + +public class ChannelClient { + + private final RSocket socket; + private final GameController gameController; + + public ChannelClient() { + this.socket = RSocketFactory.connect() + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); + + this.gameController = new GameController("Client Player"); + } + + public void playGame() { + socket.requestChannel(Flux.from(gameController)) + .doOnNext(gameController::processPayload) + .blockLast(); + } + + public void dispose() { + this.socket.dispose(); + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java b/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java new file mode 100644 index 0000000000..61d6173b23 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java @@ -0,0 +1,86 @@ +package com.baeldung.rsocket; + +import static com.baeldung.rsocket.support.Constants.*; +import io.rsocket.Payload; +import io.rsocket.RSocket; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.client.TcpClientTransport; +import io.rsocket.util.DefaultPayload; +import java.nio.ByteBuffer; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.publisher.Flux; + +public class FireNForgetClient { + + private static final Logger LOG = LoggerFactory.getLogger(FireNForgetClient.class); + + private final RSocket socket; + private final List data; + + public FireNForgetClient() { + this.socket = RSocketFactory.connect() + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); + this.data = Collections.unmodifiableList(generateData()); + } + + /** + * Send binary velocity (float) every 50ms + */ + public void sendData() { + Flux.interval(Duration.ofMillis(50)) + .take(data.size()) + .map(this::createFloatPayload) + .map(socket::fireAndForget) + .flatMap(Function.identity()) + .blockLast(); + } + + /** + * Create a binary payload containing a single float value + * + * @param index Index into the data list + * @return Payload ready to send to the server + */ + private Payload createFloatPayload(Long index) { + float velocity = data.get(index.intValue()); + ByteBuffer buffer = ByteBuffer.allocate(4).putFloat(velocity); + buffer.rewind(); + return DefaultPayload.create(buffer); + } + + /** + * Generate sample data + * + * @return List of random floats + */ + private List generateData() { + List dataList = new ArrayList<>(WIND_DATA_LENGTH); + float velocity = 0; + for (int i = 0; i < WIND_DATA_LENGTH; i++) { + velocity += Math.random(); + dataList.add(velocity); + } + return dataList; + } + + /** + * Get the data used for this client. + * + * @return list of data values + */ + public List getData() { + return data; + } + + public void dispose() { + this.socket.dispose(); + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java new file mode 100644 index 0000000000..8865acd995 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java @@ -0,0 +1,32 @@ +package com.baeldung.rsocket; + +import static com.baeldung.rsocket.support.Constants.*; +import io.rsocket.Payload; +import io.rsocket.RSocket; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.client.TcpClientTransport; +import io.rsocket.util.DefaultPayload; + +public class ReqResClient { + + private final RSocket socket; + + public ReqResClient() { + this.socket = RSocketFactory.connect() + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); + } + + public String callBlocking(String string) { + return socket + .requestResponse(DefaultPayload.create(string)) + .map(Payload::getDataUtf8) + .onErrorReturn(ERROR_MSG) + .block(); + } + + public void dispose() { + this.socket.dispose(); + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java new file mode 100644 index 0000000000..eaab777c15 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java @@ -0,0 +1,33 @@ +package com.baeldung.rsocket; + +import static com.baeldung.rsocket.support.Constants.*; +import io.rsocket.Payload; +import io.rsocket.RSocket; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.client.TcpClientTransport; +import io.rsocket.util.DefaultPayload; +import reactor.core.publisher.Flux; + +public class ReqStreamClient { + + private final RSocket socket; + + public ReqStreamClient() { + this.socket = RSocketFactory.connect() + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); + } + + public Flux getDataStream() { + return socket + .requestStream(DefaultPayload.create(WIND_DATA_STREAM_NAME)) + .map(Payload::getData) + .map(buf -> buf.getFloat()) + .onErrorReturn(null); + } + + public void dispose() { + this.socket.dispose(); + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/Server.java b/rsocket/src/main/java/com/baeldung/rsocket/Server.java new file mode 100644 index 0000000000..9cec3c69c8 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/Server.java @@ -0,0 +1,107 @@ +package com.baeldung.rsocket; + +import com.baeldung.rsocket.support.WindDataPublisher; +import static com.baeldung.rsocket.support.Constants.*; +import com.baeldung.rsocket.support.GameController; +import io.rsocket.AbstractRSocket; +import io.rsocket.Payload; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.server.TcpServerTransport; +import org.reactivestreams.Publisher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.Disposable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public class Server { + + private static final Logger LOG = LoggerFactory.getLogger(Server.class); + + private final Disposable server; + private final WindDataPublisher windDataPublisher = new WindDataPublisher(); + private final GameController gameController; + + public Server() { + this.server = RSocketFactory.receive() + .acceptor((setupPayload, reactiveSocket) -> Mono.just(new RSocketImpl())) + .transport(TcpServerTransport.create("localhost", TCP_PORT)) + .start() + .doOnNext(x -> LOG.info("Server started")) + .subscribe(); + + this.gameController = new GameController("Server Player"); + } + + public void dispose() { + windDataPublisher.complete(); + this.server.dispose(); + } + + /** + * RSocket implementation + */ + private class RSocketImpl extends AbstractRSocket { + + /** + * Handle Request/Response messages + * + * @param payload Message payload + * @return payload response + */ + @Override + public Mono requestResponse(Payload payload) { + try { + return Mono.just(payload); // reflect the payload back to the sender + } catch (Exception x) { + return Mono.error(x); + } + } + + /** + * Handle Fire-and-Forget messages + * + * @param payload Message payload + * @return nothing + */ + @Override + public Mono fireAndForget(Payload payload) { + try { + windDataPublisher.publish(payload); // forward the payload + return Mono.empty(); + } catch (Exception x) { + return Mono.error(x); + } + } + + /** + * Handle Request/Stream messages. Each request returns a new stream. + * + * @param payload Payload that can be used to determine which stream to return + * @return Flux stream containing simulated wind speed data + */ + @Override + public Flux requestStream(Payload payload) { + String streamName = payload.getDataUtf8(); + if (WIND_DATA_STREAM_NAME.equals(streamName)) { + return Flux.from(windDataPublisher); + } + return Flux.error(new IllegalArgumentException(streamName)); + } + + /** + * Handle request for bidirectional channel + * + * @param payloads Stream of payloads delivered from the client + * @return + */ + @Override + public Flux requestChannel(Publisher payloads) { + Flux.from(payloads) + .subscribe(gameController::processPayload); + Flux channel = Flux.from(gameController); + return channel; + } + } + +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java b/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java new file mode 100644 index 0000000000..01bb374b4e --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java @@ -0,0 +1,10 @@ +package com.baeldung.rsocket.support; + +public interface Constants { + + int TCP_PORT = 7101; + String ERROR_MSG = "error"; + int WIND_DATA_LENGTH = 30; + String WIND_DATA_STREAM_NAME = "wind-data"; + int SHOT_COUNT = 10; +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java b/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java new file mode 100644 index 0000000000..35b6fe4b95 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java @@ -0,0 +1,84 @@ +package com.baeldung.rsocket.support; + +import static com.baeldung.rsocket.support.Constants.*; +import io.rsocket.Payload; +import io.rsocket.util.DefaultPayload; +import java.util.List; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.publisher.Flux; + +public class GameController implements Publisher { + + private static final Logger LOG = LoggerFactory.getLogger(GameController.class); + + private final String playerName; + private final List shots; + private Subscriber subscriber; + private boolean truce = false; + + public GameController(String playerName) { + this.playerName = playerName; + this.shots = generateShotList(); + } + + /** + * Create a random list of time intervals, 0-1000ms + * + * @return List of time intervals + */ + private List generateShotList() { + return Flux.range(1, SHOT_COUNT) + .map(x -> (long) Math.ceil(Math.random() * 1000)) + .collectList() + .block(); + } + + @Override + public void subscribe(Subscriber subscriber) { + this.subscriber = subscriber; + fireAtWill(); + } + + /** + * Publish game events asynchronously + */ + private void fireAtWill() { + new Thread(() -> { + for (Long shotDelay : shots) { + try { Thread.sleep(shotDelay); } catch (Exception x) {} + if (truce) { + break; + } + LOG.info("{}: bang!", playerName); + subscriber.onNext(DefaultPayload.create("bang!")); + } + if (!truce) { + LOG.info("{}: I give up!", playerName); + subscriber.onNext(DefaultPayload.create("I give up")); + } + subscriber.onComplete(); + }).start(); + } + + /** + * Process events from the opponent + * + * @param payload Payload received from the rSocket + */ + public void processPayload(Payload payload) { + String message = payload.getDataUtf8(); + switch (message) { + case "bang!": + String result = Math.random() < 0.5 ? "Haha missed!" : "Ow!"; + LOG.info("{}: {}", playerName, result); + break; + case "I give up": + truce = true; + LOG.info("{}: OK, truce", playerName); + break; + } + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java b/rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java new file mode 100644 index 0000000000..2ad5b5144b --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java @@ -0,0 +1,31 @@ +package com.baeldung.rsocket.support; + +import io.rsocket.Payload; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; + +/** + * Simple PUblisher to provide async data to Flux stream + */ +public class WindDataPublisher implements Publisher { + + private Subscriber subscriber; + + @Override + public void subscribe(Subscriber subscriber) { + this.subscriber = subscriber; + } + + public void publish(Payload payload) { + if (subscriber != null) { + subscriber.onNext(payload); + } + } + + public void complete() { + if (subscriber != null) { + subscriber.onComplete(); + } + } + +} diff --git a/rsocket/src/main/resources/logback.xml b/rsocket/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/rsocket/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/rsocket/src/test/java/com/baeldung/rsocket/RSocketIntegrationTest.java b/rsocket/src/test/java/com/baeldung/rsocket/RSocketIntegrationTest.java new file mode 100644 index 0000000000..8f2d4a9ffd --- /dev/null +++ b/rsocket/src/test/java/com/baeldung/rsocket/RSocketIntegrationTest.java @@ -0,0 +1,71 @@ +package com.baeldung.rsocket; + +import java.util.List; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.Disposable; + +public class RSocketIntegrationTest { + + private static final Logger LOG = LoggerFactory.getLogger(RSocketIntegrationTest.class); + + private static Server server; + + public RSocketIntegrationTest() { + } + + @BeforeClass + public static void setUpClass() { + server = new Server(); + } + + @AfterClass + public static void tearDownClass() { + server.dispose(); + } + + @Test + public void testRequestResponse() { + ReqResClient client = new ReqResClient(); + String string = "Hello RSocket"; + assertEquals(string, client.callBlocking(string)); + client.dispose(); + } + + @Test + public void testFNFAndRequestStream() { + // create the client that pushes data to the server and start sending + FireNForgetClient fnfClient = new FireNForgetClient(); + // get the data that is used by the client + List data = fnfClient.getData(); + + // create a client to read a stream from the server and subscribe to events + ReqStreamClient streamClient = new ReqStreamClient(); + // assert that the data received is the same as the data sent + Disposable subscription = streamClient.getDataStream() + .index() + .doOnNext(element -> assertEquals(data.get(element.getT1().intValue()), element.getT2())) + .count() + .subscribe(count -> assertEquals(data.size(), count.intValue())); + + // start sending the data + fnfClient.sendData(); + + // wait a short time for the data to complete then dispose everything + try { Thread.sleep(500); } catch (Exception x) {} + subscription.dispose(); + fnfClient.dispose(); + } + + @Test + public void testChannel() { + ChannelClient client = new ChannelClient(); + client.playGame(); + client.dispose(); + } + +} From 291ba89004008aaf83cf198e9a582e8840ca9e97 Mon Sep 17 00:00:00 2001 From: pandachris Date: Thu, 6 Dec 2018 23:14:05 +0700 Subject: [PATCH 204/429] BAELDUNG-2283 (#6) --- rsocket/pom.xml | 54 +++++++++ .../com/baeldung/rsocket/ChannelClient.java | 33 ++++++ .../baeldung/rsocket/FireNForgetClient.java | 86 ++++++++++++++ .../com/baeldung/rsocket/ReqResClient.java | 32 ++++++ .../com/baeldung/rsocket/ReqStreamClient.java | 33 ++++++ .../java/com/baeldung/rsocket/Server.java | 107 ++++++++++++++++++ .../baeldung/rsocket/support/Constants.java | 10 ++ .../rsocket/support/GameController.java | 84 ++++++++++++++ .../rsocket/support/WindDataPublisher.java | 31 +++++ rsocket/src/main/resources/logback.xml | 13 +++ .../rsocket/RSocketIntegrationTest.java | 71 ++++++++++++ 11 files changed, 554 insertions(+) create mode 100644 rsocket/pom.xml create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/Server.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java create mode 100644 rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java create mode 100644 rsocket/src/main/resources/logback.xml create mode 100644 rsocket/src/test/java/com/baeldung/rsocket/RSocketIntegrationTest.java diff --git a/rsocket/pom.xml b/rsocket/pom.xml new file mode 100644 index 0000000000..8b04a31583 --- /dev/null +++ b/rsocket/pom.xml @@ -0,0 +1,54 @@ + + + 4.0.0 + rsocket + 0.0.1-SNAPSHOT + rsocket + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + + jar + + + + io.rsocket + rsocket-core + 0.11.13 + + + io.rsocket + rsocket-transport-netty + 0.11.13 + + + junit + junit + 4.12 + test + + + org.hamcrest + hamcrest-core + 1.3 + test + + + ch.qos.logback + logback-classic + 1.2.3 + + + ch.qos.logback + logback-core + 1.2.3 + + + org.slf4j + slf4j-api + 1.7.25 + + + \ No newline at end of file diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java new file mode 100644 index 0000000000..9f26384c95 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java @@ -0,0 +1,33 @@ +package com.baeldung.rsocket; + +import static com.baeldung.rsocket.support.Constants.*; +import com.baeldung.rsocket.support.GameController; +import io.rsocket.RSocket; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.client.TcpClientTransport; +import reactor.core.publisher.Flux; + +public class ChannelClient { + + private final RSocket socket; + private final GameController gameController; + + public ChannelClient() { + this.socket = RSocketFactory.connect() + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); + + this.gameController = new GameController("Client Player"); + } + + public void playGame() { + socket.requestChannel(Flux.from(gameController)) + .doOnNext(gameController::processPayload) + .blockLast(); + } + + public void dispose() { + this.socket.dispose(); + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java b/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java new file mode 100644 index 0000000000..61d6173b23 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java @@ -0,0 +1,86 @@ +package com.baeldung.rsocket; + +import static com.baeldung.rsocket.support.Constants.*; +import io.rsocket.Payload; +import io.rsocket.RSocket; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.client.TcpClientTransport; +import io.rsocket.util.DefaultPayload; +import java.nio.ByteBuffer; +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.function.Function; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.publisher.Flux; + +public class FireNForgetClient { + + private static final Logger LOG = LoggerFactory.getLogger(FireNForgetClient.class); + + private final RSocket socket; + private final List data; + + public FireNForgetClient() { + this.socket = RSocketFactory.connect() + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); + this.data = Collections.unmodifiableList(generateData()); + } + + /** + * Send binary velocity (float) every 50ms + */ + public void sendData() { + Flux.interval(Duration.ofMillis(50)) + .take(data.size()) + .map(this::createFloatPayload) + .map(socket::fireAndForget) + .flatMap(Function.identity()) + .blockLast(); + } + + /** + * Create a binary payload containing a single float value + * + * @param index Index into the data list + * @return Payload ready to send to the server + */ + private Payload createFloatPayload(Long index) { + float velocity = data.get(index.intValue()); + ByteBuffer buffer = ByteBuffer.allocate(4).putFloat(velocity); + buffer.rewind(); + return DefaultPayload.create(buffer); + } + + /** + * Generate sample data + * + * @return List of random floats + */ + private List generateData() { + List dataList = new ArrayList<>(WIND_DATA_LENGTH); + float velocity = 0; + for (int i = 0; i < WIND_DATA_LENGTH; i++) { + velocity += Math.random(); + dataList.add(velocity); + } + return dataList; + } + + /** + * Get the data used for this client. + * + * @return list of data values + */ + public List getData() { + return data; + } + + public void dispose() { + this.socket.dispose(); + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java new file mode 100644 index 0000000000..8865acd995 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java @@ -0,0 +1,32 @@ +package com.baeldung.rsocket; + +import static com.baeldung.rsocket.support.Constants.*; +import io.rsocket.Payload; +import io.rsocket.RSocket; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.client.TcpClientTransport; +import io.rsocket.util.DefaultPayload; + +public class ReqResClient { + + private final RSocket socket; + + public ReqResClient() { + this.socket = RSocketFactory.connect() + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); + } + + public String callBlocking(String string) { + return socket + .requestResponse(DefaultPayload.create(string)) + .map(Payload::getDataUtf8) + .onErrorReturn(ERROR_MSG) + .block(); + } + + public void dispose() { + this.socket.dispose(); + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java new file mode 100644 index 0000000000..eaab777c15 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java @@ -0,0 +1,33 @@ +package com.baeldung.rsocket; + +import static com.baeldung.rsocket.support.Constants.*; +import io.rsocket.Payload; +import io.rsocket.RSocket; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.client.TcpClientTransport; +import io.rsocket.util.DefaultPayload; +import reactor.core.publisher.Flux; + +public class ReqStreamClient { + + private final RSocket socket; + + public ReqStreamClient() { + this.socket = RSocketFactory.connect() + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); + } + + public Flux getDataStream() { + return socket + .requestStream(DefaultPayload.create(WIND_DATA_STREAM_NAME)) + .map(Payload::getData) + .map(buf -> buf.getFloat()) + .onErrorReturn(null); + } + + public void dispose() { + this.socket.dispose(); + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/Server.java b/rsocket/src/main/java/com/baeldung/rsocket/Server.java new file mode 100644 index 0000000000..9cec3c69c8 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/Server.java @@ -0,0 +1,107 @@ +package com.baeldung.rsocket; + +import com.baeldung.rsocket.support.WindDataPublisher; +import static com.baeldung.rsocket.support.Constants.*; +import com.baeldung.rsocket.support.GameController; +import io.rsocket.AbstractRSocket; +import io.rsocket.Payload; +import io.rsocket.RSocketFactory; +import io.rsocket.transport.netty.server.TcpServerTransport; +import org.reactivestreams.Publisher; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.Disposable; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public class Server { + + private static final Logger LOG = LoggerFactory.getLogger(Server.class); + + private final Disposable server; + private final WindDataPublisher windDataPublisher = new WindDataPublisher(); + private final GameController gameController; + + public Server() { + this.server = RSocketFactory.receive() + .acceptor((setupPayload, reactiveSocket) -> Mono.just(new RSocketImpl())) + .transport(TcpServerTransport.create("localhost", TCP_PORT)) + .start() + .doOnNext(x -> LOG.info("Server started")) + .subscribe(); + + this.gameController = new GameController("Server Player"); + } + + public void dispose() { + windDataPublisher.complete(); + this.server.dispose(); + } + + /** + * RSocket implementation + */ + private class RSocketImpl extends AbstractRSocket { + + /** + * Handle Request/Response messages + * + * @param payload Message payload + * @return payload response + */ + @Override + public Mono requestResponse(Payload payload) { + try { + return Mono.just(payload); // reflect the payload back to the sender + } catch (Exception x) { + return Mono.error(x); + } + } + + /** + * Handle Fire-and-Forget messages + * + * @param payload Message payload + * @return nothing + */ + @Override + public Mono fireAndForget(Payload payload) { + try { + windDataPublisher.publish(payload); // forward the payload + return Mono.empty(); + } catch (Exception x) { + return Mono.error(x); + } + } + + /** + * Handle Request/Stream messages. Each request returns a new stream. + * + * @param payload Payload that can be used to determine which stream to return + * @return Flux stream containing simulated wind speed data + */ + @Override + public Flux requestStream(Payload payload) { + String streamName = payload.getDataUtf8(); + if (WIND_DATA_STREAM_NAME.equals(streamName)) { + return Flux.from(windDataPublisher); + } + return Flux.error(new IllegalArgumentException(streamName)); + } + + /** + * Handle request for bidirectional channel + * + * @param payloads Stream of payloads delivered from the client + * @return + */ + @Override + public Flux requestChannel(Publisher payloads) { + Flux.from(payloads) + .subscribe(gameController::processPayload); + Flux channel = Flux.from(gameController); + return channel; + } + } + +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java b/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java new file mode 100644 index 0000000000..01bb374b4e --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java @@ -0,0 +1,10 @@ +package com.baeldung.rsocket.support; + +public interface Constants { + + int TCP_PORT = 7101; + String ERROR_MSG = "error"; + int WIND_DATA_LENGTH = 30; + String WIND_DATA_STREAM_NAME = "wind-data"; + int SHOT_COUNT = 10; +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java b/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java new file mode 100644 index 0000000000..35b6fe4b95 --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java @@ -0,0 +1,84 @@ +package com.baeldung.rsocket.support; + +import static com.baeldung.rsocket.support.Constants.*; +import io.rsocket.Payload; +import io.rsocket.util.DefaultPayload; +import java.util.List; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.publisher.Flux; + +public class GameController implements Publisher { + + private static final Logger LOG = LoggerFactory.getLogger(GameController.class); + + private final String playerName; + private final List shots; + private Subscriber subscriber; + private boolean truce = false; + + public GameController(String playerName) { + this.playerName = playerName; + this.shots = generateShotList(); + } + + /** + * Create a random list of time intervals, 0-1000ms + * + * @return List of time intervals + */ + private List generateShotList() { + return Flux.range(1, SHOT_COUNT) + .map(x -> (long) Math.ceil(Math.random() * 1000)) + .collectList() + .block(); + } + + @Override + public void subscribe(Subscriber subscriber) { + this.subscriber = subscriber; + fireAtWill(); + } + + /** + * Publish game events asynchronously + */ + private void fireAtWill() { + new Thread(() -> { + for (Long shotDelay : shots) { + try { Thread.sleep(shotDelay); } catch (Exception x) {} + if (truce) { + break; + } + LOG.info("{}: bang!", playerName); + subscriber.onNext(DefaultPayload.create("bang!")); + } + if (!truce) { + LOG.info("{}: I give up!", playerName); + subscriber.onNext(DefaultPayload.create("I give up")); + } + subscriber.onComplete(); + }).start(); + } + + /** + * Process events from the opponent + * + * @param payload Payload received from the rSocket + */ + public void processPayload(Payload payload) { + String message = payload.getDataUtf8(); + switch (message) { + case "bang!": + String result = Math.random() < 0.5 ? "Haha missed!" : "Ow!"; + LOG.info("{}: {}", playerName, result); + break; + case "I give up": + truce = true; + LOG.info("{}: OK, truce", playerName); + break; + } + } +} diff --git a/rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java b/rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java new file mode 100644 index 0000000000..2ad5b5144b --- /dev/null +++ b/rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java @@ -0,0 +1,31 @@ +package com.baeldung.rsocket.support; + +import io.rsocket.Payload; +import org.reactivestreams.Publisher; +import org.reactivestreams.Subscriber; + +/** + * Simple PUblisher to provide async data to Flux stream + */ +public class WindDataPublisher implements Publisher { + + private Subscriber subscriber; + + @Override + public void subscribe(Subscriber subscriber) { + this.subscriber = subscriber; + } + + public void publish(Payload payload) { + if (subscriber != null) { + subscriber.onNext(payload); + } + } + + public void complete() { + if (subscriber != null) { + subscriber.onComplete(); + } + } + +} diff --git a/rsocket/src/main/resources/logback.xml b/rsocket/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/rsocket/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/rsocket/src/test/java/com/baeldung/rsocket/RSocketIntegrationTest.java b/rsocket/src/test/java/com/baeldung/rsocket/RSocketIntegrationTest.java new file mode 100644 index 0000000000..8f2d4a9ffd --- /dev/null +++ b/rsocket/src/test/java/com/baeldung/rsocket/RSocketIntegrationTest.java @@ -0,0 +1,71 @@ +package com.baeldung.rsocket; + +import java.util.List; +import org.junit.AfterClass; +import org.junit.BeforeClass; +import org.junit.Test; +import static org.junit.Assert.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import reactor.core.Disposable; + +public class RSocketIntegrationTest { + + private static final Logger LOG = LoggerFactory.getLogger(RSocketIntegrationTest.class); + + private static Server server; + + public RSocketIntegrationTest() { + } + + @BeforeClass + public static void setUpClass() { + server = new Server(); + } + + @AfterClass + public static void tearDownClass() { + server.dispose(); + } + + @Test + public void testRequestResponse() { + ReqResClient client = new ReqResClient(); + String string = "Hello RSocket"; + assertEquals(string, client.callBlocking(string)); + client.dispose(); + } + + @Test + public void testFNFAndRequestStream() { + // create the client that pushes data to the server and start sending + FireNForgetClient fnfClient = new FireNForgetClient(); + // get the data that is used by the client + List data = fnfClient.getData(); + + // create a client to read a stream from the server and subscribe to events + ReqStreamClient streamClient = new ReqStreamClient(); + // assert that the data received is the same as the data sent + Disposable subscription = streamClient.getDataStream() + .index() + .doOnNext(element -> assertEquals(data.get(element.getT1().intValue()), element.getT2())) + .count() + .subscribe(count -> assertEquals(data.size(), count.intValue())); + + // start sending the data + fnfClient.sendData(); + + // wait a short time for the data to complete then dispose everything + try { Thread.sleep(500); } catch (Exception x) {} + subscription.dispose(); + fnfClient.dispose(); + } + + @Test + public void testChannel() { + ChannelClient client = new ChannelClient(); + client.playGame(); + client.dispose(); + } + +} From 31741530ddc52b3df9754ae6a0552c19c10af84c Mon Sep 17 00:00:00 2001 From: clininger Date: Thu, 6 Dec 2018 23:48:18 +0700 Subject: [PATCH 205/429] Indentation changes --- .../java/com/baeldung/rsocket/ChannelClient.java | 10 +++++----- .../com/baeldung/rsocket/FireNForgetClient.java | 16 ++++++++-------- .../java/com/baeldung/rsocket/ReqResClient.java | 14 +++++++------- .../com/baeldung/rsocket/ReqStreamClient.java | 14 +++++++------- .../main/java/com/baeldung/rsocket/Server.java | 12 ++++++------ .../baeldung/rsocket/support/GameController.java | 6 +++--- 6 files changed, 36 insertions(+), 36 deletions(-) diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java index 9f26384c95..f35d337427 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/ChannelClient.java @@ -14,17 +14,17 @@ public class ChannelClient { public ChannelClient() { this.socket = RSocketFactory.connect() - .transport(TcpClientTransport.create("localhost", TCP_PORT)) - .start() - .block(); + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); this.gameController = new GameController("Client Player"); } public void playGame() { socket.requestChannel(Flux.from(gameController)) - .doOnNext(gameController::processPayload) - .blockLast(); + .doOnNext(gameController::processPayload) + .blockLast(); } public void dispose() { diff --git a/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java b/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java index 61d6173b23..6c7362a008 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java @@ -25,9 +25,9 @@ public class FireNForgetClient { public FireNForgetClient() { this.socket = RSocketFactory.connect() - .transport(TcpClientTransport.create("localhost", TCP_PORT)) - .start() - .block(); + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); this.data = Collections.unmodifiableList(generateData()); } @@ -36,11 +36,11 @@ public class FireNForgetClient { */ public void sendData() { Flux.interval(Duration.ofMillis(50)) - .take(data.size()) - .map(this::createFloatPayload) - .map(socket::fireAndForget) - .flatMap(Function.identity()) - .blockLast(); + .take(data.size()) + .map(this::createFloatPayload) + .map(socket::fireAndForget) + .flatMap(Function.identity()) + .blockLast(); } /** diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java index 8865acd995..fff196a580 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/ReqResClient.java @@ -13,17 +13,17 @@ public class ReqResClient { public ReqResClient() { this.socket = RSocketFactory.connect() - .transport(TcpClientTransport.create("localhost", TCP_PORT)) - .start() - .block(); + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); } public String callBlocking(String string) { return socket - .requestResponse(DefaultPayload.create(string)) - .map(Payload::getDataUtf8) - .onErrorReturn(ERROR_MSG) - .block(); + .requestResponse(DefaultPayload.create(string)) + .map(Payload::getDataUtf8) + .onErrorReturn(ERROR_MSG) + .block(); } public void dispose() { diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java index eaab777c15..e97192bdf0 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java @@ -14,17 +14,17 @@ public class ReqStreamClient { public ReqStreamClient() { this.socket = RSocketFactory.connect() - .transport(TcpClientTransport.create("localhost", TCP_PORT)) - .start() - .block(); + .transport(TcpClientTransport.create("localhost", TCP_PORT)) + .start() + .block(); } public Flux getDataStream() { return socket - .requestStream(DefaultPayload.create(WIND_DATA_STREAM_NAME)) - .map(Payload::getData) - .map(buf -> buf.getFloat()) - .onErrorReturn(null); + .requestStream(DefaultPayload.create(WIND_DATA_STREAM_NAME)) + .map(Payload::getData) + .map(buf -> buf.getFloat()) + .onErrorReturn(null); } public void dispose() { diff --git a/rsocket/src/main/java/com/baeldung/rsocket/Server.java b/rsocket/src/main/java/com/baeldung/rsocket/Server.java index 9cec3c69c8..b5718ab36d 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/Server.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/Server.java @@ -24,11 +24,11 @@ public class Server { public Server() { this.server = RSocketFactory.receive() - .acceptor((setupPayload, reactiveSocket) -> Mono.just(new RSocketImpl())) - .transport(TcpServerTransport.create("localhost", TCP_PORT)) - .start() - .doOnNext(x -> LOG.info("Server started")) - .subscribe(); + .acceptor((setupPayload, reactiveSocket) -> Mono.just(new RSocketImpl())) + .transport(TcpServerTransport.create("localhost", TCP_PORT)) + .start() + .doOnNext(x -> LOG.info("Server started")) + .subscribe(); this.gameController = new GameController("Server Player"); } @@ -98,7 +98,7 @@ public class Server { @Override public Flux requestChannel(Publisher payloads) { Flux.from(payloads) - .subscribe(gameController::processPayload); + .subscribe(gameController::processPayload); Flux channel = Flux.from(gameController); return channel; } diff --git a/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java b/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java index 35b6fe4b95..bc1bc0f861 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/support/GameController.java @@ -31,9 +31,9 @@ public class GameController implements Publisher { */ private List generateShotList() { return Flux.range(1, SHOT_COUNT) - .map(x -> (long) Math.ceil(Math.random() * 1000)) - .collectList() - .block(); + .map(x -> (long) Math.ceil(Math.random() * 1000)) + .collectList() + .block(); } @Override From 7a7561fb7647306f02a260dcfc1bd416174066fa Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Dec 2018 22:32:30 +0530 Subject: [PATCH 206/429] Remove corrupted/invalid/stray projects - Removed ethereumj, events, spring-boot-h2, spring-hibernate3 corrupted projects - Moved files from spring-hibernate3 folder to spring-hibernate-3 --- ethereumj/src/main/resources/logback.xml | 13 ------------- ...0638124c-9a1b-4d25-8fce-cc223d472e77.events | Bin 663 -> 0 bytes ...d2ba9cbe-1a44-428e-a710-13b1bdc67c4b.events | Bin 675 -> 0 bytes events/README.md | 1 - ...bf420ffc-0c3b-403e-bb8c-66cf499c773e.events | Bin 714 -> 0 bytes ...e72a057b-adea-4c69-83a0-0431318823e7.events | Bin 714 -> 0 bytes .../baeldung/SpringContextIntegrationTest.java | 17 ----------------- .../spring-hibernate-3/README.md | 1 + .../spring/PersistenceConfigHibernate3.java | 0 ...rnateExceptionScen1MainIntegrationTest.java | 2 -- ...rnateExceptionScen2MainIntegrationTest.java | 2 -- .../spring-hibernate3/README.md | 2 -- .../src/main/resources/logback.xml | 13 ------------- .../src/main/resources/logback.xml | 13 ------------- 14 files changed, 1 insertion(+), 63 deletions(-) delete mode 100644 ethereumj/src/main/resources/logback.xml delete mode 100644 events/MessagesAggregate/0638124c-9a1b-4d25-8fce-cc223d472e77.events delete mode 100644 events/MessagesAggregate/d2ba9cbe-1a44-428e-a710-13b1bdc67c4b.events delete mode 100644 events/README.md delete mode 100644 events/ToDoItem/bf420ffc-0c3b-403e-bb8c-66cf499c773e.events delete mode 100644 events/ToDoItem/e72a057b-adea-4c69-83a0-0431318823e7.events delete mode 100644 persistence-modules/spring-boot-h2/spring-boot-h2-remote-app/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename persistence-modules/{spring-hibernate3 => spring-hibernate-3}/src/main/java/org/baeldung/spring/PersistenceConfigHibernate3.java (100%) rename persistence-modules/{spring-hibernate3 => spring-hibernate-3}/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen1MainIntegrationTest.java (98%) rename persistence-modules/{spring-hibernate3 => spring-hibernate-3}/src/test/java/org/baeldung/persistence/service/HibernateExceptionScen2MainIntegrationTest.java (98%) delete mode 100644 persistence-modules/spring-hibernate3/README.md delete mode 100644 persistence-modules/spring-hibernate3/src/main/resources/logback.xml delete mode 100644 spring-5-reactive-functional/src/main/resources/logback.xml diff --git a/ethereumj/src/main/resources/logback.xml b/ethereumj/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/ethereumj/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/events/MessagesAggregate/0638124c-9a1b-4d25-8fce-cc223d472e77.events b/events/MessagesAggregate/0638124c-9a1b-4d25-8fce-cc223d472e77.events deleted file mode 100644 index d3ce8b9cea0dd432ac369a37c2281c78d9b98a7e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 663 zcmbV|O-jT-5QW>lR}iwuMzoUZpQL+2la094g?NEVcV!%K5-_dI0X&Q6bPV`|2s5#k zkM~|ZJ|S`wRy{gK;D8;Ns1!I899XF=>B?F{Db5s13#b9>d#M{$Hxi55sSA`1qR6q< zPAU^%MRG2w!1aM41f_H|R^De`pnD?D4^6&f`hoWKAlfhgLaqndeHZ@*_YUaJ B!ZiQ@ diff --git a/events/MessagesAggregate/d2ba9cbe-1a44-428e-a710-13b1bdc67c4b.events b/events/MessagesAggregate/d2ba9cbe-1a44-428e-a710-13b1bdc67c4b.events deleted file mode 100644 index 2ab0ec469f90efe0f09ac43380e620738125a0ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 675 zcmbV|%}T>S6otpVuOMX6O|dtbJ2TECVTcP6+_;gxz@3@fT4)<+Qf>D>kxytW_=5Zfq;`tB*0x5>wYHZMYbnJj zsX$c>3`oX+Q6&R8lz=*5NYT1zg7~;eY*%?8UZ(AOp3|;f=lsO$zRT~q>uAn58>XJq z?R$6_z4}uojbEhZFGRi=ioWMv-`w$X*-o;@_BmU0*}mOwvPApqtcI~K4h>(N#4vE5 z`xW;DiFzs;Ax2t87g9)2&YT7lm4b>Z1IcKL<)Ar*@VjYa^gm3WiSaSy2c~bDUyf@2 P?4RiPsJpMnKgGQPZ1>2E diff --git a/events/README.md b/events/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/events/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: diff --git a/events/ToDoItem/bf420ffc-0c3b-403e-bb8c-66cf499c773e.events b/events/ToDoItem/bf420ffc-0c3b-403e-bb8c-66cf499c773e.events deleted file mode 100644 index d805fc253e397456a33c8b6b1d5de5b42af14043..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmbV|zfQw25QojqD0Xq?%h7JV7VWa4wZIZDKbZ8x1G`)uw4yLanf^6zW@SR)}or zljN9E01U!|L_y$v7eJ|yq%lEjLF~66b z`0zFTPJP(3GQBN1=5_2(;j;D5v5j;H`(amxJoS%6aZ&Oj=0$lP4z~WgwDoy7^AFc{ zq~ajD;_9BUWowLYNlS==&&Fbh(3#YL);uXqE^5>LuU(_KK>HOtfjN)6Eggw}KSBIa O>O%GB!p#bgm3{(Qui1M5 diff --git a/events/ToDoItem/e72a057b-adea-4c69-83a0-0431318823e7.events b/events/ToDoItem/e72a057b-adea-4c69-83a0-0431318823e7.events deleted file mode 100644 index 3d67b74ced4494b9f3af4f38b6bef9622c565329..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 714 zcmbWzJx&8L5CveCo(s|90)j+6E}nP~`%%_5>nj*HK~+N8vP_jRk>3B#IU(=vG1IB*R{7Y%t8QQRn$EuaQ$R#GmsTG+NS5^qs15XGEZ zMQGa|C^3PFjR&U*0gaYgI;S+Z;&&kCq3VgZ>1BMX=q-;Gzw%fP)hgfTW#Qp&&r~=) ze7%0BKEhd - - - - %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n - - - - - - - - \ No newline at end of file diff --git a/spring-5-reactive-functional/src/main/resources/logback.xml b/spring-5-reactive-functional/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-5-reactive-functional/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 d78915cddac3970edf56f3e504fdefa72620d7ef Mon Sep 17 00:00:00 2001 From: collaboratewithakash <38683470+collaboratewithakash@users.noreply.github.com> Date: Thu, 6 Dec 2018 22:57:24 +0530 Subject: [PATCH 207/429] Back-links added - Akash (#5846) * Back-link formatting issue resolved * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added (please fix the formatting too) * Back-link added * Back-link added * Back-link added * back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added * Back-link added --- core-java-arrays/README.md | 2 +- core-java-collections/README.md | 1 + core-java-concurrency/README.md | 1 + core-java-lang/README.md | 2 +- core-java/README.md | 3 +++ core-kotlin/README.md | 1 + java-dates/README.md | 3 ++- java-strings/README.md | 4 ++++ kotlin-libraries/README.md | 1 + libraries-data/README.md | 1 + persistence-modules/README.md | 1 + persistence-modules/hibernate5/README.md | 2 ++ persistence-modules/java-jpa/README.md | 3 ++- persistence-modules/spring-data-jpa/README.md | 1 + persistence-modules/spring-jpa/README.md | 1 + spring-boot-bootstrap/README.md | 1 + spring-integration/README.md | 1 + spring-mvc-simple/README.md | 1 + testing-modules/README.md | 1 + testing-modules/spring-testing/README.md | 1 + 20 files changed, 28 insertions(+), 4 deletions(-) diff --git a/core-java-arrays/README.md b/core-java-arrays/README.md index bda2cf90bf..56110585ac 100644 --- a/core-java-arrays/README.md +++ b/core-java-arrays/README.md @@ -12,4 +12,4 @@ - [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) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 858dbef0b3..4c0b24cd5d 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -51,3 +51,4 @@ - [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) - [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist) - [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) +- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list) diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md index fbe50c2dfa..682c9b8ef0 100644 --- a/core-java-concurrency/README.md +++ b/core-java-concurrency/README.md @@ -31,3 +31,4 @@ - [Runnable vs. Callable in Java](http://www.baeldung.com/java-runnable-callable) - [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield) - [Print Even and Odd Numbers Using 2 Threads](https://www.baeldung.com/java-even-odd-numbers-with-2-threads) +- [Java CyclicBarrier vs CountDownLatch](https://www.baeldung.com/java-cyclicbarrier-countdownlatch) diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 79d2375c24..69209bb193 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -58,4 +58,4 @@ - [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) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) - +- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) diff --git a/core-java/README.md b/core-java/README.md index b8ad28cc0c..20f6ef5ea7 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -89,3 +89,6 @@ - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) - [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding) +- [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) +- [Graphs in Java](https://www.baeldung.com/java-graphs) diff --git a/core-kotlin/README.md b/core-kotlin/README.md index 1b04b71228..828293ec90 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -47,3 +47,4 @@ - [Guide to Sorting in Kotlin](https://www.baeldung.com/kotlin-sort) - [Dependency Injection for Kotlin with Injekt](https://www.baeldung.com/kotlin-dependency-injection-with-injekt) - [Implementing a Binary Tree in Kotlin](https://www.baeldung.com/kotlin-binary-tree) +- [Generate a Random Alphanumeric String in Kotlin](https://www.baeldung.com/kotlin-random-alphanumeric-string) diff --git a/java-dates/README.md b/java-dates/README.md index 3f6d7998b8..21e54082f4 100644 --- a/java-dates/README.md +++ b/java-dates/README.md @@ -24,4 +24,5 @@ - [Add Hours To a Date In Java](http://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](Convert Between java.time.Instant and java.sql.Timestamp) +- [Convert Between java.time.Instant and java.sql.Timestamp](https://www.baeldung.com/java-time-instant-to-java-sql-timestamp) +- [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp) diff --git a/java-strings/README.md b/java-strings/README.md index 11893e68a2..240acd663b 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -39,3 +39,7 @@ - [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) - [Join Array of Primitives with Separator in Java](https://www.baeldung.com/java-join-primitive-array) +- [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array) +- [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string) +- [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) diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md index b9611043c8..d1ef77aa46 100644 --- a/kotlin-libraries/README.md +++ b/kotlin-libraries/README.md @@ -8,3 +8,4 @@ - [Kotlin with Ktor](http://www.baeldung.com/kotlin-ktor) - [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) diff --git a/libraries-data/README.md b/libraries-data/README.md index 7e40a4a2e2..69856af66b 100644 --- a/libraries-data/README.md +++ b/libraries-data/README.md @@ -14,3 +14,4 @@ - [Building a Data Pipeline with Flink and Kafka](https://www.baeldung.com/kafka-flink-data-pipeline) - [Intro to Apache Storm](https://www.baeldung.com/apache-storm) - [Guide to Ebean ORM](https://www.baeldung.com/ebean-orm) +- [Introduction to Kafka Connectors](https://www.baeldung.com/kafka-connectors-guide) diff --git a/persistence-modules/README.md b/persistence-modules/README.md index 75ccc749e5..87dc9522fd 100644 --- a/persistence-modules/README.md +++ b/persistence-modules/README.md @@ -10,3 +10,4 @@ - [A Guide to Jdbi](http://www.baeldung.com/jdbi) - [Pessimistic Locking in JPA](http://www.baeldung.com/jpa-pessimistic-locking) - [Get All Data from a Table with Hibernate](https://www.baeldung.com/hibernate-select-all) +- [Spring Data with Reactive Cassandra](https://www.baeldung.com/spring-data-cassandra-reactive) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index a94379b5cb..b6e112b5fc 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -19,3 +19,5 @@ - [Hibernate 5 Naming Strategy Configuration](https://www.baeldung.com/hibernate-naming-strategy) - [Proxy in Hibernate load() Method](https://www.baeldung.com/hibernate-proxy-load-method) - [Custom Types in Hibernate](https://www.baeldung.com/hibernate-custom-types) +- [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions) +- [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) diff --git a/persistence-modules/java-jpa/README.md b/persistence-modules/java-jpa/README.md index 418e0a67e2..9a90216519 100644 --- a/persistence-modules/java-jpa/README.md +++ b/persistence-modules/java-jpa/README.md @@ -1,4 +1,5 @@ # 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) \ No newline at end of file +- [A Guide to Stored Procedures with JPA](http://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) diff --git a/persistence-modules/spring-data-jpa/README.md b/persistence-modules/spring-data-jpa/README.md index a65b744944..e240ae6d33 100644 --- a/persistence-modules/spring-data-jpa/README.md +++ b/persistence-modules/spring-data-jpa/README.md @@ -16,6 +16,7 @@ - [DDD Aggregates and @DomainEvents](https://www.baeldung.com/spring-data-ddd) - [Spring Data – CrudRepository save() Method](https://www.baeldung.com/spring-data-crud-repository-save) - [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results) +- [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/persistence-modules/spring-jpa/README.md b/persistence-modules/spring-jpa/README.md index 299a5a1e51..e6f91ac016 100644 --- a/persistence-modules/spring-jpa/README.md +++ b/persistence-modules/spring-jpa/README.md @@ -19,6 +19,7 @@ - [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) +- [Many-To-Many Relationship in JPA](https://www.baeldung.com/jpa-many-to-many) ### Eclipse Config After importing the project into Eclipse, you may see the following error: diff --git a/spring-boot-bootstrap/README.md b/spring-boot-bootstrap/README.md index 08fdb1bdc9..76b977c129 100644 --- a/spring-boot-bootstrap/README.md +++ b/spring-boot-bootstrap/README.md @@ -4,3 +4,4 @@ - [Thin JARs with Spring Boot](http://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-integration/README.md b/spring-integration/README.md index e116f934c8..244cf1fb14 100644 --- a/spring-integration/README.md +++ b/spring-integration/README.md @@ -2,6 +2,7 @@ - [Introduction to Spring Integration](http://www.baeldung.com/spring-integration) - [Security In Spring Integration](http://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) ### Running the Sample Executing the `mvn exec:java` maven command (either from the command line or from an IDE) will start up the application. Follow the command prompt for further instructions. diff --git a/spring-mvc-simple/README.md b/spring-mvc-simple/README.md index a9b002afd7..755e0932fc 100644 --- a/spring-mvc-simple/README.md +++ b/spring-mvc-simple/README.md @@ -7,3 +7,4 @@ - [Apache Tiles Integration with Spring MVC](http://www.baeldung.com/spring-mvc-apache-tiles) - [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) diff --git a/testing-modules/README.md b/testing-modules/README.md index b189b9819e..d69f07215e 100644 --- a/testing-modules/README.md +++ b/testing-modules/README.md @@ -14,3 +14,4 @@ - [JSON Schema Validation with REST-assured](http://www.baeldung.com/rest-assured-json-schema) - [Testing Callbacks with Mockito](http://www.baeldung.com/mockito-callbacks) - [Running JUnit Tests in Parallel with Maven](https://www.baeldung.com/maven-junit-parallel-tests) +- [Gatling vs JMeter vs The Grinder: Comparing Load Test Tools](https://www.baeldung.com/gatling-jmeter-grinder-comparison) diff --git a/testing-modules/spring-testing/README.md b/testing-modules/spring-testing/README.md index e22c3e84e7..02ab7b24bd 100644 --- a/testing-modules/spring-testing/README.md +++ b/testing-modules/spring-testing/README.md @@ -2,3 +2,4 @@ - [Mockito.mock() vs @Mock vs @MockBean](http://www.baeldung.com/java-spring-mockito-mock-mockbean) - [A Quick Guide to @TestPropertySource](https://www.baeldung.com/spring-test-property-source) +- [Guide to ReflectionTestUtils for Unit Testing](https://www.baeldung.com/spring-reflection-test-utils) From ddeb2dd5abd0862b299b4bfc7984b5002e844e74 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 6 Dec 2018 23:54:56 +0530 Subject: [PATCH 208/429] BAEL-10877 Fix build of micronaut project - Version upgraded, now using the standard maven central - API changes per the new library in ConcreteGreetingClient and GreetingClient --- micronaut/pom.xml | 11 +++-------- .../helloworld/client/ConcreteGreetingClient.java | 2 +- .../micronaut/helloworld/client/GreetingClient.java | 5 +---- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/micronaut/pom.xml b/micronaut/pom.xml index 7b722306b6..aa69c77f73 100644 --- a/micronaut/pom.xml +++ b/micronaut/pom.xml @@ -7,15 +7,10 @@ com.baeldung.micronaut.helloworld.server.ServerApplication - 1.0.0.M2 - 9 + 1.0.0.RC2 + 1.8 - - - jcenter.bintray.com - http://jcenter.bintray.com - - + diff --git a/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClient.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClient.java index d4051cef52..96bc51f235 100644 --- a/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClient.java +++ b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/ConcreteGreetingClient.java @@ -1,7 +1,7 @@ package com.baeldung.micronaut.helloworld.client; import io.micronaut.http.HttpRequest; -import io.micronaut.http.client.Client; +import io.micronaut.http.client.annotation.Client; import io.micronaut.http.client.RxHttpClient; import io.reactivex.Single; diff --git a/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/GreetingClient.java b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/GreetingClient.java index 8a691d5b06..d29a97fd50 100644 --- a/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/GreetingClient.java +++ b/micronaut/src/main/java/com/baeldung/micronaut/helloworld/client/GreetingClient.java @@ -1,10 +1,7 @@ package com.baeldung.micronaut.helloworld.client; import io.micronaut.http.annotation.Get; -import io.micronaut.http.client.Client; -import io.micronaut.http.client.RxHttpClient; - -import javax.inject.Inject; +import io.micronaut.http.client.annotation.Client; @Client("/greet") public interface GreetingClient { From e2eeb795cd2b5ea4cc45f8ad7df049fb48940a54 Mon Sep 17 00:00:00 2001 From: Priyesh Mashelkar Date: Thu, 6 Dec 2018 20:03:26 +0000 Subject: [PATCH 209/429] BAEL-2344 Moved files to new hibernate5 module (#5854) * Added writer * Added implementation and test class * Added more details * Updated tests * Updated code as per review comments * Added test class and one named query * Updated test class * Added update HQL * Added new initialisation script and new queries * Corrected queries * Removed commented code * Added implementation and test class * Added more details * Updated tests * Updated code as per review comments * Added test class and one named query * Updated test class * Added update HQL * Added new initialisation script and new queries * Corrected queries * Removed commented code * BAEL-2344 Moved classes to new hibernate5 module * BAEL-2344 Moved files to new hibernate5 module --- .../src/main/resources/init_database.sql | 10 ++ .../hibernate/NamedQueryIntegrationTest.java | 98 +++++++++++++++++++ .../resources/hibernate-namedquery.properties | 9 ++ .../hibernate5/transaction.log | 0 4 files changed, 117 insertions(+) create mode 100644 persistence-modules/hibernate5/src/main/resources/init_database.sql create mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java create mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-namedquery.properties create mode 100644 persistence-modules/hibernate5/transaction.log diff --git a/persistence-modules/hibernate5/src/main/resources/init_database.sql b/persistence-modules/hibernate5/src/main/resources/init_database.sql new file mode 100644 index 0000000000..b2848aa256 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/resources/init_database.sql @@ -0,0 +1,10 @@ +CREATE ALIAS UPDATE_EMPLOYEE_DESIGNATION AS $$ +import java.sql.CallableStatement; +import java.sql.Connection; +import java.sql.SQLException; +@CODE +void updateEmployeeDesignation(final Connection conn, final String employeeNumber, final String title) throws SQLException { + CallableStatement updateStatement = conn.prepareCall("update deptemployee set title = '" + title + "' where employeeNumber = '" + employeeNumber + "'"); + updateStatement.execute(); +} +$$; \ No newline at end of file diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java new file mode 100644 index 0000000000..cb73fe348c --- /dev/null +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java @@ -0,0 +1,98 @@ +package com.baeldung.hibernate; + +import com.baeldung.hibernate.entities.Department; +import com.baeldung.hibernate.entities.DeptEmployee; +import org.hibernate.Session; +import org.hibernate.Transaction; +import org.hibernate.query.NativeQuery; +import org.hibernate.query.Query; +import org.junit.*; + +import java.io.IOException; + +public class NamedQueryIntegrationTest { + private static Session session; + + private Transaction transaction; + + private Long purchaseDeptId; + + @BeforeClass + public static void setUpClass() throws IOException { + session = HibernateUtil.getSessionFactory("hibernate-namedquery.properties").openSession(); + } + + @Before + public void setUp() throws IOException { + transaction = session.beginTransaction(); + session.createNativeQuery("delete from deptemployee").executeUpdate(); + session.createNativeQuery("delete from department").executeUpdate(); + Department salesDepartment = new Department("Sales"); + Department purchaseDepartment = new Department("Purchase"); + DeptEmployee employee1 = new DeptEmployee("John Wayne", "001", salesDepartment); + DeptEmployee employee2 = new DeptEmployee("Sarah Vinton", "002", salesDepartment); + DeptEmployee employee3 = new DeptEmployee("Lisa Carter", "003", salesDepartment); + session.persist(salesDepartment); + session.persist(purchaseDepartment); + purchaseDeptId = purchaseDepartment.getId(); + session.persist(employee1); + session.persist(employee2); + session.persist(employee3); + transaction.commit(); + transaction = session.beginTransaction(); + } + + @After + public void tearDown() { + if(transaction.isActive()) { + transaction.rollback(); + } + } + + @Test + public void whenNamedQueryIsCalledUsingCreateNamedQuery_ThenOk() { + Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeNumber", DeptEmployee.class); + query.setParameter("employeeNo", "001"); + DeptEmployee result = query.getSingleResult(); + Assert.assertNotNull(result); + Assert.assertEquals("John Wayne", result.getName()); + } + + @Test + public void whenNamedNativeQueryIsCalledUsingCreateNamedQuery_ThenOk() { + Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeName", DeptEmployee.class); + query.setParameter("name", "John Wayne"); + DeptEmployee result = query.getSingleResult(); + Assert.assertNotNull(result); + Assert.assertEquals("001", result.getEmployeeNumber()); + } + + @Test + public void whenNamedNativeQueryIsCalledUsingGetNamedNativeQuery_ThenOk() { + @SuppressWarnings("rawtypes") + NativeQuery query = session.getNamedNativeQuery("DeptEmployee_FindByEmployeeName"); + query.setParameter("name", "John Wayne"); + DeptEmployee result = (DeptEmployee) query.getSingleResult(); + Assert.assertNotNull(result); + Assert.assertEquals("001", result.getEmployeeNumber()); + } + + @Test + public void whenUpdateQueryIsCalledWithCreateNamedQuery_ThenOk() { + Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDepartment"); + spQuery.setParameter("employeeNo", "001"); + Department newDepartment = session.find(Department.class, purchaseDeptId); + spQuery.setParameter("newDepartment", newDepartment); + spQuery.executeUpdate(); + transaction.commit(); + } + + @Test + public void whenNamedStoredProcedureIsCalledWithCreateNamedQuery_ThenOk() { + Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDesignation"); + spQuery.setParameter("employeeNumber", "002"); + spQuery.setParameter("newDesignation", "Supervisor"); + spQuery.executeUpdate(); + transaction.commit(); + } +} diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-namedquery.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-namedquery.properties new file mode 100644 index 0000000000..457f965347 --- /dev/null +++ b/persistence-modules/hibernate5/src/test/resources/hibernate-namedquery.properties @@ -0,0 +1,9 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'src/main/resources/init_database.sql' +hibernate.connection.username=sa +hibernate.connection.autocommit=true +jdbc.password= + +hibernate.dialect=org.hibernate.dialect.H2Dialect +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file diff --git a/persistence-modules/hibernate5/transaction.log b/persistence-modules/hibernate5/transaction.log new file mode 100644 index 0000000000..e69de29bb2 From 80ea4f2e763d1d6e4e6011087142fac251f405b0 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 6 Dec 2018 23:04:24 +0200 Subject: [PATCH 210/429] Update README.md --- parent-boot-2.0-temp/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/parent-boot-2.0-temp/README.md b/parent-boot-2.0-temp/README.md index 740848a470..8134c8eafe 100644 --- a/parent-boot-2.0-temp/README.md +++ b/parent-boot-2.0-temp/README.md @@ -1 +1,2 @@ This pom will be ued only temporary until we migrate parent-boot-2 to 2.1.0 for ticket BAEL-10354 + From cdd6968c318d3aedbb5a0715a465ce93b53ed64b Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 7 Dec 2018 10:57:30 +0100 Subject: [PATCH 211/429] BAEL-2412 Changes PR. --- .../{GsonBoolean.java => BooleanExample.java} | 2 +- .../{GsonBitString.java => ByteExample.java} | 2 +- .../{GsonChar.java => CharExample.java} | 2 +- .../{GsonFloat.java => FloatExample.java} | 2 +- .../baeldung/gson/primitives/UnitTest.java | 56 +++++++++---------- 5 files changed, 32 insertions(+), 32 deletions(-) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonBoolean.java => BooleanExample.java} (83%) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonBitString.java => ByteExample.java} (84%) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonChar.java => CharExample.java} (84%) rename gson/src/main/java/org/baeldung/gson/primitives/models/{GsonFloat.java => FloatExample.java} (84%) diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java b/gson/src/main/java/org/baeldung/gson/primitives/models/BooleanExample.java similarity index 83% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/BooleanExample.java index 228f89fa3b..1fe87650de 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBoolean.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/BooleanExample.java @@ -1,6 +1,6 @@ package org.baeldung.gson.primitives.models; -public class GsonBoolean { +public class BooleanExample { public boolean value; public String toString() { diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java b/gson/src/main/java/org/baeldung/gson/primitives/models/ByteExample.java similarity index 84% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/ByteExample.java index f84a7f82f2..2e1c68ee51 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonBitString.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/ByteExample.java @@ -1,6 +1,6 @@ package org.baeldung.gson.primitives.models; -public class GsonBitString { +public class ByteExample { public byte value = (byte) 1; public String toString() { diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java b/gson/src/main/java/org/baeldung/gson/primitives/models/CharExample.java similarity index 84% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/CharExample.java index 6983f7bfff..ccac913f23 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonChar.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/CharExample.java @@ -1,6 +1,6 @@ package org.baeldung.gson.primitives.models; -public class GsonChar { +public class CharExample { public char value; public String toString() { diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java b/gson/src/main/java/org/baeldung/gson/primitives/models/FloatExample.java similarity index 84% rename from gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java rename to gson/src/main/java/org/baeldung/gson/primitives/models/FloatExample.java index 43d1d9af16..00a97f68fc 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/GsonFloat.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/FloatExample.java @@ -1,6 +1,6 @@ package org.baeldung.gson.primitives.models; -public class GsonFloat { +public class FloatExample { public float value; public String toString() { diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 890e6eefd7..87d5cbbb60 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -50,10 +50,10 @@ public class UnitTest { @Test public void toJsonByteToBitString() { GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(GsonBitString.class, new GsonBitStringSerializer()); + builder.registerTypeAdapter(ByteExample.class, new GsonBitStringSerializer()); Gson gson = builder.create(); - GsonBitString model = new GsonBitString(); + ByteExample model = new ByteExample(); model.value = (byte) 0b1111; assertEquals("{\"value\":\"1111\"}", gson.toJson(model)); @@ -62,11 +62,11 @@ public class UnitTest { @Test public void fromJsonByteFromBitString() { String json = "{\"value\": \"1111\"}"; GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(GsonBitString.class, new GsonBitStringDeserializer()); + gsonBuilder.registerTypeAdapter(ByteExample.class, new GsonBitStringDeserializer()); Gson gson = gsonBuilder.create(); - GsonBitString model = gson.fromJson(json, GsonBitString.class); + ByteExample model = gson.fromJson(json, ByteExample.class); assertEquals(15, model.value); } @@ -74,14 +74,14 @@ public class UnitTest { @Test public void fromJsonPrecissionMismatch() { String json = "{\"value\": 12.123456789123456}"; Gson gson = new Gson(); - GsonFloat model = gson.fromJson(json, GsonFloat.class); + FloatExample model = gson.fromJson(json, FloatExample.class); assertEquals(12.123457f, model.value, 0.000001); } @Test public void fromJsonOverflow() { Gson gson = new Gson(); String json = "{\"value\": \"300\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); + ByteExample model = gson.fromJson(json, ByteExample.class); assertEquals(44, model.value); } @@ -90,7 +90,7 @@ public class UnitTest { Gson gson = new Gson(); String json = "{\"value\": 2.3}"; try { - gson.fromJson(json, GsonBitString.class); + gson.fromJson(json, ByteExample.class); } catch (Exception ex) { assertTrue(ex instanceof JsonSyntaxException); assertTrue(ex.getCause() instanceof NumberFormatException); @@ -103,7 +103,7 @@ public class UnitTest { @Test public void fromJsonUnicodeChar() { Gson gson = new Gson(); String json = "{\"value\": \"\\u00AE\"}"; - GsonChar model = gson.fromJson(json, GsonChar.class); + CharExample model = gson.fromJson(json, CharExample.class); assertEquals('\u00AE', model.value); } @@ -111,7 +111,7 @@ public class UnitTest { @Test public void fromJsonNull() { Gson gson = new Gson(); String json = "{\"value\": null}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); + ByteExample model = gson.fromJson(json, ByteExample.class); assertEquals(1, model.value); } @@ -119,13 +119,13 @@ public class UnitTest { @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { Gson gson = new Gson(); String json = "{\"value\": \"\"}"; - gson.fromJson(json, GsonBitString.class); + gson.fromJson(json, ByteExample.class); } @Test public void fromJsonValidValueWithinString() { Gson gson = new Gson(); String json = "{\"value\": \"15\"}"; - GsonBitString model = gson.fromJson(json, GsonBitString.class); + ByteExample model = gson.fromJson(json, ByteExample.class); assertEquals(15, model.value); } @@ -133,13 +133,13 @@ public class UnitTest { @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueWithinString() { Gson gson = new Gson(); String json = "{\"value\": \"15x\"}"; - gson.fromJson(json, GsonBitString.class); + gson.fromJson(json, ByteExample.class); } @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueNotInAString() { Gson gson = new Gson(); String json = "{\"value\": s15s}"; - gson.fromJson(json, GsonBitString.class); + gson.fromJson(json, ByteExample.class); } @Test public void fromJsonBooleanFrom2ValueInteger() { @@ -147,7 +147,7 @@ public class UnitTest { Gson gson = new Gson(); try { - gson.fromJson(json, GsonBoolean.class); + gson.fromJson(json, BooleanExample.class); } catch (Exception ex) { assertTrue(ex instanceof JsonSyntaxException); assertTrue(ex.getCause() instanceof IllegalStateException); @@ -160,11 +160,11 @@ public class UnitTest { @Test public void fromJsonBooleanFrom2ValueIntegerSolution() { String json = "{\"value\": 1}"; GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(GsonBoolean.class, new GsonBoolean2ValueIntegerDeserializer()); + builder.registerTypeAdapter(BooleanExample.class, new BooleanAs2ValueIntegerDeserializer()); Gson gson = builder.create(); - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + BooleanExample model = gson.fromJson(json, BooleanExample.class); assertTrue(model.value); } @@ -173,7 +173,7 @@ public class UnitTest { String json = "{\"value\": yes}"; Gson gson = new Gson(); - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + BooleanExample model = gson.fromJson(json, BooleanExample.class); // pay attention here that we are deserializing yes. assertFalse(model.value); @@ -183,31 +183,31 @@ public class UnitTest { String json = "{\"value\": \"15x\"}"; Gson gson = new Gson(); - GsonBoolean model = gson.fromJson(json, GsonBoolean.class); + BooleanExample model = gson.fromJson(json, BooleanExample.class); assertFalse(model.value); } // @formatter:off - static class GsonBitStringDeserializer implements JsonDeserializer { - @Override public GsonBitString deserialize( + static class GsonBitStringDeserializer implements JsonDeserializer { + @Override public ByteExample deserialize( JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - GsonBitString gsonBitString = new GsonBitString(); - gsonBitString.value = (byte) Integer.parseInt( + ByteExample byteExample = new ByteExample(); + byteExample.value = (byte) Integer.parseInt( jsonElement.getAsJsonObject() .getAsJsonPrimitive("value") .getAsString() , 2); - return gsonBitString; + return byteExample; } } - static class GsonBitStringSerializer implements JsonSerializer { + static class GsonBitStringSerializer implements JsonSerializer { @Override public JsonElement serialize( - GsonBitString model, + ByteExample model, Type type, JsonSerializationContext jsonSerializationContext) { @@ -217,13 +217,13 @@ public class UnitTest { } } - static class GsonBoolean2ValueIntegerDeserializer implements JsonDeserializer { - @Override public GsonBoolean deserialize( + static class BooleanAs2ValueIntegerDeserializer implements JsonDeserializer { + @Override public BooleanExample deserialize( JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - GsonBoolean model = new GsonBoolean(); + BooleanExample model = new BooleanExample(); int value = jsonElement.getAsJsonObject().getAsJsonPrimitive("value").getAsInt(); if (value == 0) { model.value = false; From 5a87e036faafdedb6315980eaa1d76f077d0c2ae Mon Sep 17 00:00:00 2001 From: Priyesh Mashelkar Date: Fri, 7 Dec 2018 15:04:39 +0000 Subject: [PATCH 212/429] BAEL-2344 Removed unused code (#5860) * Added implementation and test class * Added more details * Updated tests * Added implementation and test class * Added more details * Updated tests * Updated code as per review comments * BAEL-2344 Moved files to new hibernate5 module --- .../hibernate/entities/DeptEmployee.java | 75 ------------- .../src/main/resources/init_database.sql | 10 -- .../hibernate/NamedQueryIntegrationTest.java | 103 ------------------ .../resources/hibernate-namedquery.properties | 9 -- 4 files changed, 197 deletions(-) delete mode 100644 hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java delete mode 100644 hibernate5/src/main/resources/init_database.sql delete mode 100644 hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java delete mode 100644 hibernate5/src/test/resources/hibernate-namedquery.properties diff --git a/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java b/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java deleted file mode 100644 index 7813e89a48..0000000000 --- a/hibernate5/src/main/java/com/baeldung/hibernate/entities/DeptEmployee.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.baeldung.hibernate.entities; - -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.ManyToOne; - -@org.hibernate.annotations.NamedQueries({ @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindByEmployeeNumber", query = "from DeptEmployee where employeeNumber = :employeeNo"), - @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindAllByDesgination", query = "from DeptEmployee where designation = :designation"), - @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_UpdateEmployeeDepartment", query = "Update DeptEmployee set department = :newDepartment where employeeNumber = :employeeNo"), - @org.hibernate.annotations.NamedQuery(name = "DeptEmployee_FindAllByDepartment", query = "from DeptEmployee where department = :department", timeout = 1, fetchSize = 10) }) -@org.hibernate.annotations.NamedNativeQueries({ @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_FindByEmployeeName", query = "select * from deptemployee emp where name=:name", resultClass = DeptEmployee.class), - @org.hibernate.annotations.NamedNativeQuery(name = "DeptEmployee_UpdateEmployeeDesignation", query = "call UPDATE_EMPLOYEE_DESIGNATION(:employeeNumber, :newDesignation)", resultClass = DeptEmployee.class) }) -@Entity -public class DeptEmployee { - @Id - @GeneratedValue(strategy = GenerationType.SEQUENCE) - private long id; - - private String employeeNumber; - - private String designation; - - private String name; - - @ManyToOne - private Department department; - - public DeptEmployee(String name, String employeeNumber, Department department) { - this.name = name; - this.employeeNumber = employeeNumber; - this.department = department; - } - - public long getId() { - return id; - } - - public void setId(long id) { - this.id = id; - } - - public String getEmployeeNumber() { - return employeeNumber; - } - - public void setEmployeeNumber(String employeeNumber) { - this.employeeNumber = employeeNumber; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public Department getDepartment() { - return department; - } - - public void setDepartment(Department department) { - this.department = department; - } - - public String getDesignation() { - return designation; - } - - public void setDesignation(String designation) { - this.designation = designation; - } -} diff --git a/hibernate5/src/main/resources/init_database.sql b/hibernate5/src/main/resources/init_database.sql deleted file mode 100644 index 154a5a0bc0..0000000000 --- a/hibernate5/src/main/resources/init_database.sql +++ /dev/null @@ -1,10 +0,0 @@ -CREATE ALIAS UPDATE_EMPLOYEE_DESIGNATION AS $$ -import java.sql.CallableStatement; -import java.sql.Connection; -import java.sql.SQLException; -@CODE -void updateEmployeeDesignation(final Connection conn, final String employeeNumber, final String designation) throws SQLException { - CallableStatement updateStatement = conn.prepareCall("update deptemployee set designation = '" + designation + "' where employeeNumber = '" + employeeNumber + "'"); - updateStatement.execute(); -} -$$; \ No newline at end of file diff --git a/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java b/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java deleted file mode 100644 index ef6ec89bc4..0000000000 --- a/hibernate5/src/test/java/com/baeldung/hibernate/NamedQueryIntegrationTest.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.baeldung.hibernate; - -import java.io.IOException; - -import org.hibernate.Session; -import org.hibernate.Transaction; -import org.hibernate.query.NativeQuery; -import org.hibernate.query.Query; -import org.junit.After; -import org.junit.Assert; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.baeldung.hibernate.entities.Department; -import com.baeldung.hibernate.entities.DeptEmployee; - -public class NamedQueryIntegrationTest { - private static Session session; - - private Transaction transaction; - - private Long purchaseDeptId; - - @BeforeClass - public static void setUpClass() throws IOException { - session = HibernateUtil.getSessionFactory("hibernate-namedquery.properties").openSession(); - } - - @Before - public void setUp() throws IOException { - transaction = session.beginTransaction(); - session.createNativeQuery("delete from deptemployee").executeUpdate(); - session.createNativeQuery("delete from department").executeUpdate(); - Department salesDepartment = new Department("Sales"); - Department purchaseDepartment = new Department("Purchase"); - DeptEmployee employee1 = new DeptEmployee("John Wayne", "001", salesDepartment); - DeptEmployee employee2 = new DeptEmployee("Sarah Vinton", "002", salesDepartment); - DeptEmployee employee3 = new DeptEmployee("Lisa Carter", "003", salesDepartment); - session.persist(salesDepartment); - session.persist(purchaseDepartment); - purchaseDeptId = purchaseDepartment.getId(); - session.persist(employee1); - session.persist(employee2); - session.persist(employee3); - transaction.commit(); - transaction = session.beginTransaction(); - } - - @After - public void tearDown() { - if(transaction.isActive()) { - transaction.rollback(); - } - } - - @Test - public void whenNamedQueryIsCalledUsingCreateNamedQuery_ThenOk() { - Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeNumber", DeptEmployee.class); - query.setParameter("employeeNo", "001"); - DeptEmployee result = query.getSingleResult(); - Assert.assertNotNull(result); - Assert.assertEquals("John Wayne", result.getName()); - } - - @Test - public void whenNamedNativeQueryIsCalledUsingCreateNamedQuery_ThenOk() { - Query query = session.createNamedQuery("DeptEmployee_FindByEmployeeName", DeptEmployee.class); - query.setParameter("name", "John Wayne"); - DeptEmployee result = query.getSingleResult(); - Assert.assertNotNull(result); - Assert.assertEquals("001", result.getEmployeeNumber()); - } - - @Test - public void whenNamedNativeQueryIsCalledUsingGetNamedNativeQuery_ThenOk() { - @SuppressWarnings("rawtypes") - NativeQuery query = session.getNamedNativeQuery("DeptEmployee_FindByEmployeeName"); - query.setParameter("name", "John Wayne"); - DeptEmployee result = (DeptEmployee) query.getSingleResult(); - Assert.assertNotNull(result); - Assert.assertEquals("001", result.getEmployeeNumber()); - } - - @Test - public void whenUpdateQueryIsCalledWithCreateNamedQuery_ThenOk() { - Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDepartment"); - spQuery.setParameter("employeeNo", "001"); - Department newDepartment = session.find(Department.class, purchaseDeptId); - spQuery.setParameter("newDepartment", newDepartment); - spQuery.executeUpdate(); - transaction.commit(); - } - - @Test - public void whenNamedStoredProcedureIsCalledWithCreateNamedQuery_ThenOk() { - Query spQuery = session.createNamedQuery("DeptEmployee_UpdateEmployeeDesignation"); - spQuery.setParameter("employeeNumber", "002"); - spQuery.setParameter("newDesignation", "Supervisor"); - spQuery.executeUpdate(); - transaction.commit(); - } -} diff --git a/hibernate5/src/test/resources/hibernate-namedquery.properties b/hibernate5/src/test/resources/hibernate-namedquery.properties deleted file mode 100644 index 457f965347..0000000000 --- a/hibernate5/src/test/resources/hibernate-namedquery.properties +++ /dev/null @@ -1,9 +0,0 @@ -hibernate.connection.driver_class=org.h2.Driver -hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1;INIT=RUNSCRIPT FROM 'src/main/resources/init_database.sql' -hibernate.connection.username=sa -hibernate.connection.autocommit=true -jdbc.password= - -hibernate.dialect=org.hibernate.dialect.H2Dialect -hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop \ No newline at end of file From e3b698620c557b51c205f13b3e12fca59c0a7c78 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 7 Dec 2018 23:42:35 +0100 Subject: [PATCH 213/429] BAEL-2412 Add tests with all the primitive values. Remove those that weren't expected to work. --- .../primitives/models/PrimitiveBundle.java | 6 +- .../models/PrimitiveBundleInitialized.java | 21 ++++++ .../baeldung/gson/primitives/UnitTest.java | 73 ++++++++++++------- 3 files changed, 72 insertions(+), 28 deletions(-) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java index 30bc4d0d9f..ad7309a2f7 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundle.java @@ -12,8 +12,8 @@ public class PrimitiveBundle { public String toString() { return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " - + "int: " + intValue + ", " + "long: " + longValue + ", " + "float: " - + floatValue + ", " + "double: " + doubleValue + ", " + "boolean: " - + booleanValue + ", " + "char: " + charValue + "}"; + + "int: " + intValue + ", " + "long: " + longValue + ", " + + "float: " + floatValue + ", " + "double: " + doubleValue + ", " + + "boolean: " + booleanValue + ", " + "char: " + charValue + "}"; } } diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java new file mode 100644 index 0000000000..6fa99f4e3d --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java @@ -0,0 +1,21 @@ +package org.baeldung.gson.primitives.models; + +public class PrimitiveBundleInitialized { + // @formatter:off + public byte byteValue = (byte) 1; + public short shortValue = (short) 1; + public int intValue = 1; + public long longValue = 1L; + public float floatValue = 1.0f; + public double doubleValue = 1; + public boolean booleanValue = true; + public char charValue = 'a'; + // @formatter:on + + public String toString() { + return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " + + "int: " + intValue + ", " + "long: " + longValue + ", " + + "float: " + floatValue + ", " + "double: " + doubleValue + ", " + + "boolean: " + booleanValue + ", " + "char: " + charValue + "}"; + } +} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 87d5cbbb60..475eb42fc0 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -25,13 +25,17 @@ public class UnitTest { Gson gson = new Gson(); - String expected = "{\"byteValue\":17,\"shortValue\":3,\"intValue\":3," + "\"longValue\":3,\"floatValue\":3.5" + ",\"doubleValue\":3.5" + ",\"booleanValue\":true,\"charValue\":\"a\"}"; + String expected = "{\"byteValue\":17,\"shortValue\":3,\"intValue\":3," + + "\"longValue\":3,\"floatValue\":3.5" + ",\"doubleValue\":3.5" + + ",\"booleanValue\":true,\"charValue\":\"a\"}"; assertEquals(expected, gson.toJson(primitiveBundle)); } @Test public void fromJsonAllPrimitives() { - String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + ", \"booleanValue\": true, \"charValue\": \"a\"}"; + String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + + ", \"booleanValue\": true, \"charValue\": \"a\"}"; Gson gson = new Gson(); PrimitiveBundle model = gson.fromJson(json, PrimitiveBundle.class); @@ -50,7 +54,8 @@ public class UnitTest { @Test public void toJsonByteToBitString() { GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(ByteExample.class, new GsonBitStringSerializer()); + builder.registerTypeAdapter(ByteExample.class, + new GsonBitStringSerializer()); Gson gson = builder.create(); ByteExample model = new ByteExample(); @@ -62,7 +67,8 @@ public class UnitTest { @Test public void fromJsonByteFromBitString() { String json = "{\"value\": \"1111\"}"; GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(ByteExample.class, new GsonBitStringDeserializer()); + gsonBuilder.registerTypeAdapter(ByteExample.class, + new GsonBitStringDeserializer()); Gson gson = gsonBuilder.create(); @@ -110,36 +116,52 @@ public class UnitTest { @Test public void fromJsonNull() { Gson gson = new Gson(); - String json = "{\"value\": null}"; - ByteExample model = gson.fromJson(json, ByteExample.class); + // @formatter:off + String json = "{\"byteValue\": null, \"shortValue\": null, " + + "\"intValue\": null, " + "\"longValue\": null, \"floatValue\": null" + + ", \"doubleValue\": null" + ", \"booleanValue\": null, \"charValue\": null}"; + // @formatter:on + PrimitiveBundleInitialized model = gson.fromJson(json, + PrimitiveBundleInitialized.class); - assertEquals(1, model.value); + assertEquals(1, model.byteValue); + assertEquals(1, model.shortValue); + assertEquals(1, model.intValue); + assertEquals(1, model.longValue); + assertEquals(1, model.floatValue, 0.0001); + assertEquals(1, model.doubleValue, 0.0001); + assertTrue(model.booleanValue); + assertEquals('a', model.charValue); } @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { Gson gson = new Gson(); - String json = "{\"value\": \"\"}"; - gson.fromJson(json, ByteExample.class); + // @formatter:off + String json = "{\"byteValue\": \"\", \"shortValue\": \"\", " + + "\"intValue\": \"\", " + "\"longValue\": \"\", \"floatValue\": \"\"" + + ", \"doubleValue\": \"\"" + ", \"booleanValue\": \"\", \"charValue\": \"\"}"; + // @formatter:on + gson.fromJson(json, PrimitiveBundleInitialized.class); } @Test public void fromJsonValidValueWithinString() { Gson gson = new Gson(); - String json = "{\"value\": \"15\"}"; - ByteExample model = gson.fromJson(json, ByteExample.class); + // @formatter:off + String json = "{\"byteValue\": \"15\", \"shortValue\": \"15\", " + + "\"intValue\": \"15\", " + "\"longValue\": \"15\", \"floatValue\": \"15.0\"" + + ", \"doubleValue\": \"15.0\"" + ", \"booleanValue\": \"false\", \"charValue\": \"z\"}"; + // @formatter:on + PrimitiveBundleInitialized model = gson.fromJson(json, + PrimitiveBundleInitialized.class); - assertEquals(15, model.value); - } - - @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueWithinString() { - Gson gson = new Gson(); - String json = "{\"value\": \"15x\"}"; - gson.fromJson(json, ByteExample.class); - } - - @Test(expected = JsonSyntaxException.class) public void fromJsonInvalidValueNotInAString() { - Gson gson = new Gson(); - String json = "{\"value\": s15s}"; - gson.fromJson(json, ByteExample.class); + assertEquals(15, model.byteValue); + assertEquals(15, model.shortValue); + assertEquals(15, model.intValue); + assertEquals(15, model.longValue); + assertEquals(15, model.floatValue, 0.0001); + assertEquals(15, model.doubleValue, 0.0001); + assertFalse(model.booleanValue); + assertEquals('z', model.charValue); } @Test public void fromJsonBooleanFrom2ValueInteger() { @@ -160,7 +182,8 @@ public class UnitTest { @Test public void fromJsonBooleanFrom2ValueIntegerSolution() { String json = "{\"value\": 1}"; GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(BooleanExample.class, new BooleanAs2ValueIntegerDeserializer()); + builder.registerTypeAdapter(BooleanExample.class, + new BooleanAs2ValueIntegerDeserializer()); Gson gson = builder.create(); From 5072291b3283bf4c867abee046dc2bbe02d285f8 Mon Sep 17 00:00:00 2001 From: PranayVJain Date: Sat, 8 Dec 2018 08:46:28 +0530 Subject: [PATCH 214/429] BAEL-2337: Find Substring which are palindromes (#5766) * BAEL-2337: Added test cases to find substring which are palindromes * BAEL-2337: Changed the names of the variables * BAEL-2237: Formatted code using formatter.xml * BAEL-2237: Renamed method and added variety of test cases * BAEL-2337: Renamed unit test cases name according to BBD style naming convention --- .../baeldung/string/SubstringPalindrome.java | 90 +++++++++++++++++++ .../string/SubstringPalindromeUnitTest.java | 83 +++++++++++++++++ 2 files changed, 173 insertions(+) create mode 100644 java-strings/src/main/java/com/baeldung/string/SubstringPalindrome.java create mode 100644 java-strings/src/test/java/com/baeldung/string/SubstringPalindromeUnitTest.java diff --git a/java-strings/src/main/java/com/baeldung/string/SubstringPalindrome.java b/java-strings/src/main/java/com/baeldung/string/SubstringPalindrome.java new file mode 100644 index 0000000000..688bf43b3c --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/SubstringPalindrome.java @@ -0,0 +1,90 @@ +package com.baeldung.string; + +import java.util.HashSet; +import java.util.Set; + +public class SubstringPalindrome { + + public Set findAllPalindromesUsingCenter(String input) { + final Set palindromes = new HashSet<>(); + if (input == null || input.isEmpty()) { + return palindromes; + } + if (input.length() == 1) { + palindromes.add(input); + return palindromes; + } + for (int i = 0; i < input.length(); i++) { + palindromes.addAll(findPalindromes(input, i, i + 1)); + palindromes.addAll(findPalindromes(input, i, i)); + } + return palindromes; + } + + private Set findPalindromes(String input, int low, int high) { + Set result = new HashSet<>(); + while (low >= 0 && high < input.length() && input.charAt(low) == input.charAt(high)) { + result.add(input.substring(low, high + 1)); + low--; + high++; + } + return result; + } + + public Set findAllPalindromesUsingBruteForceApproach(String input) { + Set palindromes = new HashSet<>(); + if (input == null || input.isEmpty()) { + return palindromes; + } + if (input.length() == 1) { + palindromes.add(input); + return palindromes; + } + for (int i = 0; i < input.length(); i++) { + for (int j = i + 1; j <= input.length(); j++) + if (isPalindrome(input.substring(i, j))) { + palindromes.add(input.substring(i, j)); + } + } + return palindromes; + } + + private boolean isPalindrome(String input) { + StringBuilder plain = new StringBuilder(input); + StringBuilder reverse = plain.reverse(); + return (reverse.toString()).equals(input); + } + + public Set findAllPalindromesUsingManachersAlgorithm(String input) { + Set palindromes = new HashSet<>(); + String formattedInput = "@" + input + "#"; + char inputCharArr[] = formattedInput.toCharArray(); + int max; + int radius[][] = new int[2][input.length() + 1]; + for (int j = 0; j <= 1; j++) { + radius[j][0] = max = 0; + int i = 1; + while (i <= input.length()) { + palindromes.add(Character.toString(inputCharArr[i])); + while (inputCharArr[i - max - 1] == inputCharArr[i + j + max]) + max++; + radius[j][i] = max; + int k = 1; + while ((radius[j][i - k] != max - k) && (k < max)) { + radius[j][i + k] = Math.min(radius[j][i - k], max - k); + k++; + } + max = Math.max(max - k, 0); + i += k; + } + } + for (int i = 1; i <= input.length(); i++) { + for (int j = 0; j <= 1; j++) { + for (max = radius[j][i]; max > 0; max--) { + palindromes.add(input.substring(i - max - 1, max + j + i - 1)); + } + } + } + return palindromes; + } +} diff --git a/java-strings/src/test/java/com/baeldung/string/SubstringPalindromeUnitTest.java b/java-strings/src/test/java/com/baeldung/string/SubstringPalindromeUnitTest.java new file mode 100644 index 0000000000..b18a8d4a5f --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/SubstringPalindromeUnitTest.java @@ -0,0 +1,83 @@ +package com.baeldung.string; + +import static org.junit.Assert.assertEquals; +import java.util.HashSet; +import java.util.Set; +import org.junit.Test; + +public class SubstringPalindromeUnitTest { + + private static final String INPUT_BUBBLE = "bubble"; + private static final String INPUT_CIVIC = "civic"; + private static final String INPUT_INDEED = "indeed"; + private static final String INPUT_ABABAC = "ababac"; + + Set EXPECTED_PALINDROME_BUBBLE = new HashSet() { + { + add("b"); + add("u"); + add("l"); + add("e"); + add("bb"); + add("bub"); + } + }; + + Set EXPECTED_PALINDROME_CIVIC = new HashSet() { + { + add("civic"); + add("ivi"); + add("i"); + add("c"); + add("v"); + } + }; + + Set EXPECTED_PALINDROME_INDEED = new HashSet() { + { + add("i"); + add("n"); + add("d"); + add("e"); + add("ee"); + add("deed"); + } + }; + + Set EXPECTED_PALINDROME_ABABAC = new HashSet() { + { + add("a"); + add("b"); + add("c"); + add("aba"); + add("bab"); + add("ababa"); + } + }; + + private SubstringPalindrome palindrome = new SubstringPalindrome(); + + @Test + public void whenUsingManachersAlgorithm_thenFindsAllPalindromes() { + assertEquals(EXPECTED_PALINDROME_BUBBLE, palindrome.findAllPalindromesUsingManachersAlgorithm(INPUT_BUBBLE)); + assertEquals(EXPECTED_PALINDROME_INDEED, palindrome.findAllPalindromesUsingManachersAlgorithm(INPUT_INDEED)); + assertEquals(EXPECTED_PALINDROME_CIVIC, palindrome.findAllPalindromesUsingManachersAlgorithm(INPUT_CIVIC)); + assertEquals(EXPECTED_PALINDROME_ABABAC, palindrome.findAllPalindromesUsingManachersAlgorithm(INPUT_ABABAC)); + } + + @Test + public void whenUsingCenterApproach_thenFindsAllPalindromes() { + assertEquals(EXPECTED_PALINDROME_BUBBLE, palindrome.findAllPalindromesUsingCenter(INPUT_BUBBLE)); + assertEquals(EXPECTED_PALINDROME_INDEED, palindrome.findAllPalindromesUsingCenter(INPUT_INDEED)); + assertEquals(EXPECTED_PALINDROME_CIVIC, palindrome.findAllPalindromesUsingCenter(INPUT_CIVIC)); + assertEquals(EXPECTED_PALINDROME_ABABAC, palindrome.findAllPalindromesUsingCenter(INPUT_ABABAC)); + } + + @Test + public void whenUsingBruteForceApproach_thenFindsAllPalindromes() { + assertEquals(EXPECTED_PALINDROME_BUBBLE, palindrome.findAllPalindromesUsingBruteForceApproach(INPUT_BUBBLE)); + assertEquals(EXPECTED_PALINDROME_INDEED, palindrome.findAllPalindromesUsingBruteForceApproach(INPUT_INDEED)); + assertEquals(EXPECTED_PALINDROME_CIVIC, palindrome.findAllPalindromesUsingBruteForceApproach(INPUT_CIVIC)); + assertEquals(EXPECTED_PALINDROME_ABABAC, palindrome.findAllPalindromesUsingBruteForceApproach(INPUT_ABABAC)); + } +} From 84ea0625b1c59d25fc8d1bb8445ec7456a36a8e4 Mon Sep 17 00:00:00 2001 From: Emily Millard Date: Fri, 7 Dec 2018 19:25:42 -0800 Subject: [PATCH 215/429] BAEL-2324 sorting arrays --- .../com/baeldung/sort/ArraySortUnitTest.java | 118 ++++++++++++++++++ 1 file changed, 118 insertions(+) create mode 100644 core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java diff --git a/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java new file mode 100644 index 0000000000..489f1848e9 --- /dev/null +++ b/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java @@ -0,0 +1,118 @@ +package com.baeldung.sort; + +import com.baeldung.arraycopy.model.Employee; +import org.junit.Before; +import org.junit.Test; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; +import java.util.stream.IntStream; + +import static org.junit.Assert.assertArrayEquals; +import static org.junit.Assert.assertEquals; + +public class ArraySortUnitTest { + private Employee[] employees; + private int[] numbers; + private String[] strings; + + @Before + public void setup() { + createEmployeesArray(); + createNumbersArray(); + createStringArray(); + } + + private void createEmployeesArray() { + employees = new Employee[5]; + Employee employee; + for (int i = 1; i <= employees.length; i++) { + employee = new Employee(i, "Emp" + i); + employees[i - 1] = employee; + } + Collections.shuffle(Arrays.asList(employees)); + } + + private void createNumbersArray() { + numbers = new int[]{-8, 7, 5, 9, 10, -2, 3}; + } + + private void createStringArray() { + strings = new String[]{"learning", "java", "with", "baeldung"}; + } + + @Test + public void givenIntArray_whenSortingAscending_thenCorrectlySorted() { + Arrays.sort(numbers); + + assertArrayEquals(new int[]{-8, -2, 3, 5, 7, 9, 10}, numbers); + } + + @Test + public void givenIntArray_whenSortingDescending_thenCorrectlySorted() { + numbers = IntStream.of(numbers).boxed().sorted(Comparator.reverseOrder()).mapToInt(i -> i).toArray(); + + assertArrayEquals(new int[]{10, 9, 7, 5, 3, -2, -8}, numbers); + } + + @Test + public void givenStringArray_whenSortingAscending_thenCorrectlySorted() { + Arrays.sort(strings); + + assertArrayEquals(new String[]{"baeldung", "java", "learning", "with"}, strings); + } + + @Test + public void givenStringArray_whenSortingDescending_thenCorrectlySorted() { + Arrays.sort(strings, Comparator.reverseOrder()); + + assertArrayEquals(new String[]{"with", "learning", "java", "baeldung"}, strings); + } + + @Test + public void givenObjectArray_whenSortingAscending_thenCorrectlySorted() { + Arrays.sort(employees, Comparator.comparing(Employee::getName)); + + Employee[] sorted = new Employee[]{ + new Employee(1, "Emp1"), + new Employee(2, "Emp2"), + new Employee(3, "Emp3"), + new Employee(4, "Emp4"), + new Employee(5, "Emp5") + }; + + assertEquals(sorted[0].getId(), employees[0].getId()); + } + + @Test + public void givenObjectArray_whenSortingDescending_thenCorrectlySorted() { + Arrays.sort(employees, Comparator.comparing(Employee::getName).reversed()); + + Employee[] sorted = new Employee[]{ + new Employee(5, "Emp5"), + new Employee(4, "Emp4"), + new Employee(3, "Emp3"), + new Employee(2, "Emp2"), + new Employee(1, "Emp1") + }; + + assertEquals(sorted[0].getId(), employees[0].getId()); + } + + @Test + public void givenObjectArray_whenSortingMultipleAttributesAscending_thenCorrectlySorted() { + Arrays.sort(employees, Comparator.comparing(Employee::getName).thenComparing(Employee::getId)); + + Employee[] sorted = new Employee[]{ + new Employee(1, "Emp1"), + new Employee(2, "Emp2"), + new Employee(3, "Emp3"), + new Employee(4, "Emp4"), + new Employee(5, "Emp5") + }; + + assertEquals(sorted[0].getId(), employees[0].getId()); + } + +} From 183c7a0fe330d1210ea10a101ef96f0ed49a19c7 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sat, 8 Dec 2018 11:22:54 +0530 Subject: [PATCH 216/429] BAEL-10876 Removed corrupted RMI module --- rmi/README.md | 1 - rmi/client.policy | 3 --- rmi/server.policy | 3 --- rmi/src/org/baeldung/Client.java | 20 ----------------- .../org/baeldung/RandomNumberGenerator.java | 8 ------- .../baeldung/RandomNumberGeneratorEngine.java | 10 --------- rmi/src/org/baeldung/Server.java | 22 ------------------- 7 files changed, 67 deletions(-) delete mode 100644 rmi/README.md delete mode 100644 rmi/client.policy delete mode 100644 rmi/server.policy delete mode 100644 rmi/src/org/baeldung/Client.java delete mode 100644 rmi/src/org/baeldung/RandomNumberGenerator.java delete mode 100644 rmi/src/org/baeldung/RandomNumberGeneratorEngine.java delete mode 100644 rmi/src/org/baeldung/Server.java diff --git a/rmi/README.md b/rmi/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/rmi/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: diff --git a/rmi/client.policy b/rmi/client.policy deleted file mode 100644 index 5d74bde76d..0000000000 --- a/rmi/client.policy +++ /dev/null @@ -1,3 +0,0 @@ -grant { - permission java.security.AllPermission; -}; \ No newline at end of file diff --git a/rmi/server.policy b/rmi/server.policy deleted file mode 100644 index 5d74bde76d..0000000000 --- a/rmi/server.policy +++ /dev/null @@ -1,3 +0,0 @@ -grant { - permission java.security.AllPermission; -}; \ No newline at end of file diff --git a/rmi/src/org/baeldung/Client.java b/rmi/src/org/baeldung/Client.java deleted file mode 100644 index 0376952bab..0000000000 --- a/rmi/src/org/baeldung/Client.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.baeldung; - -import java.rmi.NotBoundException; -import java.rmi.RemoteException; -import java.rmi.registry.LocateRegistry; -import java.rmi.registry.Registry; - -public class Client { - public static void main(String[] args) throws RemoteException, NotBoundException { - System.setProperty("java.security.policy", "file:./client.policy"); - if (System.getSecurityManager() == null) { - System.setSecurityManager(new SecurityManager()); - } - String name = "RandomNumberGenerator"; - Registry registry = LocateRegistry.getRegistry(); - RandomNumberGenerator randomNumberGenerator = (RandomNumberGenerator) registry.lookup(name); - int number = randomNumberGenerator.get(); - System.out.println("Received random number:" + number); - } -} diff --git a/rmi/src/org/baeldung/RandomNumberGenerator.java b/rmi/src/org/baeldung/RandomNumberGenerator.java deleted file mode 100644 index 50e49d2652..0000000000 --- a/rmi/src/org/baeldung/RandomNumberGenerator.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.baeldung; - -import java.rmi.Remote; -import java.rmi.RemoteException; - -public interface RandomNumberGenerator extends Remote{ - int get() throws RemoteException; -} diff --git a/rmi/src/org/baeldung/RandomNumberGeneratorEngine.java b/rmi/src/org/baeldung/RandomNumberGeneratorEngine.java deleted file mode 100644 index 04d90b2ff9..0000000000 --- a/rmi/src/org/baeldung/RandomNumberGeneratorEngine.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.baeldung; - -import java.rmi.RemoteException; - -public class RandomNumberGeneratorEngine implements RandomNumberGenerator { - @Override - public int get() throws RemoteException { - return (int) (100 * Math.random()); - } -} diff --git a/rmi/src/org/baeldung/Server.java b/rmi/src/org/baeldung/Server.java deleted file mode 100644 index 8e613cb6bb..0000000000 --- a/rmi/src/org/baeldung/Server.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.baeldung; - -import java.rmi.RemoteException; -import java.rmi.registry.LocateRegistry; -import java.rmi.registry.Registry; -import java.rmi.server.UnicastRemoteObject; - -public class Server { - public static void main(String[] args) throws RemoteException { - System.setProperty("java.security.policy", "file:./server.policy"); - if (System.getSecurityManager() == null) { - System.setSecurityManager(new SecurityManager()); - } - String name = "RandomNumberGenerator"; - RandomNumberGenerator randomNumberGenerator = new RandomNumberGeneratorEngine(); - RandomNumberGenerator stub = - (RandomNumberGenerator) UnicastRemoteObject.exportObject(randomNumberGenerator, 0); - Registry registry = LocateRegistry.getRegistry(); - registry.rebind(name, stub); - System.out.println("RandomNumberGenerator bound"); - } -} From d737e15c6b4db542cd4e5ff42d4ffc327f470c29 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 8 Dec 2018 15:29:38 +0530 Subject: [PATCH 217/429] [BAEL-10840] - Create a libraries-apache-commons module --- libraries-apache-commons/.gitignore | 9 ++ libraries-apache-commons/README.md | 21 ++++ libraries-apache-commons/log4j.properties | 1 + libraries-apache-commons/pom.xml | 116 ++++++++++++++++++ .../baeldung/commons/beanutils/Course.java | 0 .../commons/beanutils/CourseEntity.java | 0 .../commons/beanutils/CourseService.java | 0 .../baeldung/commons/beanutils/Student.java | 0 .../chain/AbstractDenominationDispenser.java | 0 .../baeldung/commons/chain/AtmCatalog.java | 0 .../baeldung/commons/chain/AtmConstants.java | 0 .../commons/chain/AtmRequestContext.java | 0 .../commons/chain/AtmWithdrawalChain.java | 0 .../baeldung/commons/chain/AuditFilter.java | 0 .../chain/FiftyDenominationDispenser.java | 0 .../chain/HundredDenominationDispenser.java | 0 .../chain/TenDenominationDispenser.java | 0 .../commons/collectionutil/Address.java | 0 .../commons/collectionutil/Customer.java | 0 .../com/baeldung/commons/dbutils/Email.java | 0 .../baeldung/commons/dbutils/Employee.java | 0 .../commons/dbutils/EmployeeHandler.java | 0 .../com/baeldung/commons/io/FileMonitor.java | 0 .../commons/lang3/BuilderMethods.java | 0 .../commons/lang3/SampleLazyInitializer.java | 0 .../baeldung/commons/lang3/SampleObject.java | 0 .../lang3/application/Application.java | 0 .../baeldung/commons/lang3/beans/User.java | 0 .../commons/lang3/beans/UserInitializer.java | 0 .../com/baeldung/commons/math3/Histogram.java | 0 .../main/java/com/baeldung/ftp/FtpClient.java | 0 .../src/main/resources/logback.xml | 13 ++ .../CircularFifoQueueUnitTest.java | 0 .../beanutils/CourseServiceUnitTest.java | 0 .../commons/chain/AtmChainUnitTest.java | 0 .../commons/collections/BidiMapUnitTest.java | 0 .../CollectionUtilsGuideUnitTest.java | 0 .../commons/collections/MapUtilsUnitTest.java | 0 .../commons/collections/SetUtilsUnitTest.java | 0 .../orderedmap/OrderedMapUnitTest.java | 0 .../commons/collections4/BagUnitTest.java | 0 .../commons/csv/CSVReaderWriterUnitTest.java | 0 .../commons/dbutils/DbUtilsUnitTest.java | 0 .../commons/io/CommonsIOUnitTest.java | 0 .../commons/lang3/ArrayUtilsUnitTest.java | 0 .../commons/lang3/Lang3UtilsUnitTest.java | 0 .../commons/lang3/StringUtilsUnitTest.java | 0 .../lang3/test/ArrayUtilsUnitTest.java | 0 .../test/BasicThreadFactoryUnitTest.java | 0 .../lang3/test/ConstructorUtilsUnitTest.java | 0 .../lang3/test/FieldUtilsUnitTest.java | 0 .../commons/lang3/test/FractionUnitTest.java | 0 .../lang3/test/HashCodeBuilderUnitTest.java | 0 .../lang3/test/ImmutablePairUnitTest.java | 0 .../lang3/test/ImmutableTripleUnitTest.java | 0 .../lang3/test/LazyInitializerUnitTest.java | 0 .../lang3/test/MethodUtilsUnitTest.java | 0 .../lang3/test/MutableObjectUnitTest.java | 0 .../lang3/test/MutablePairUnitTest.java | 0 .../lang3/test/NumberUtilsUnitTest.java | 0 .../lang3/test/StringUtilsUnitTest.java | 0 .../lang3/test/SystemsUtilsManualTest.java | 0 .../commons/lang3/test/TripleUnitTest.java | 0 .../commons/math/ComplexUnitTest.java | 0 .../commons/math/FractionUnitTest.java | 0 .../commons/math/GeometryUnitTest.java | 0 .../commons/math/LinearAlgebraUnitTest.java | 0 .../commons/math/ProbabilitiesUnitTest.java | 0 .../commons/math/RootFindingUnitTest.java | 0 .../math/SimpsonIntegratorUnitTest.java | 0 .../commons/math/StatisticsUnitTest.java | 0 .../ftp/FtpClientIntegrationTest.java | 0 .../ftp/JdkFtpClientIntegrationTest.java | 0 .../java/com/baeldung/text/DiffUnitTest.java | 0 .../LongestCommonSubsequenceUnitTest.java | 0 .../com/baeldung/text/StrBuilderUnitTest.java | 0 .../baeldung/text/StrSubstitutorUnitTest.java | 0 .../baeldung/text/UnicodeEscaperUnitTest.java | 0 .../com/baeldung/text/WordUtilsUnitTest.java | 0 .../src/test/resources/aaa.txt | 0 .../src/test/resources/book.csv | 0 .../src/test/resources/employees.sql | 0 .../src/test/resources/fileTest.txt | 0 .../src/test/resources/ftp/baz.txt | 0 .../src/test/resources/sample.txt | 0 libraries/README.md | 19 --- libraries/pom.xml | 71 ----------- pom.xml | 1 + 88 files changed, 161 insertions(+), 90 deletions(-) create mode 100644 libraries-apache-commons/.gitignore create mode 100644 libraries-apache-commons/README.md create mode 100644 libraries-apache-commons/log4j.properties create mode 100644 libraries-apache-commons/pom.xml rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/beanutils/Course.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/beanutils/CourseService.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/beanutils/Student.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AtmCatalog.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AtmConstants.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/AuditFilter.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/collectionutil/Address.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/collectionutil/Customer.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/dbutils/Email.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/dbutils/Employee.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/io/FileMonitor.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/SampleObject.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/application/Application.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/beans/User.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/commons/math3/Histogram.java (100%) rename {libraries => libraries-apache-commons}/src/main/java/com/baeldung/ftp/FtpClient.java (100%) create mode 100644 libraries-apache-commons/src/main/resources/logback.xml rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/FractionUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/DiffUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/StrBuilderUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/java/com/baeldung/text/WordUtilsUnitTest.java (100%) rename {libraries => libraries-apache-commons}/src/test/resources/aaa.txt (100%) rename {libraries => libraries-apache-commons}/src/test/resources/book.csv (100%) rename {libraries => libraries-apache-commons}/src/test/resources/employees.sql (100%) rename {libraries => libraries-apache-commons}/src/test/resources/fileTest.txt (100%) rename {libraries => libraries-apache-commons}/src/test/resources/ftp/baz.txt (100%) rename {libraries => libraries-apache-commons}/src/test/resources/sample.txt (100%) diff --git a/libraries-apache-commons/.gitignore b/libraries-apache-commons/.gitignore new file mode 100644 index 0000000000..e594daf27a --- /dev/null +++ b/libraries-apache-commons/.gitignore @@ -0,0 +1,9 @@ +*.class + +# Folders # +/gensrc +/target + +# Packaged files # +*.jar +/bin/ diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md new file mode 100644 index 0000000000..66090e3709 --- /dev/null +++ b/libraries-apache-commons/README.md @@ -0,0 +1,21 @@ +### 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) +- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) +- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) \ No newline at end of file diff --git a/libraries-apache-commons/log4j.properties b/libraries-apache-commons/log4j.properties new file mode 100644 index 0000000000..2173c5d96f --- /dev/null +++ b/libraries-apache-commons/log4j.properties @@ -0,0 +1 @@ +log4j.rootLogger=INFO, stdout diff --git a/libraries-apache-commons/pom.xml b/libraries-apache-commons/pom.xml new file mode 100644 index 0000000000..f61a7a4a9a --- /dev/null +++ b/libraries-apache-commons/pom.xml @@ -0,0 +1,116 @@ + + + 4.0.0 + libraries-apache-commons + libraries-apache-commons + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + + + org.assertj + assertj-core + ${assertj.version} + + + commons-beanutils + commons-beanutils + ${commons-beanutils.version} + + + org.apache.commons + commons-lang3 + ${commons-lang.version} + + + org.apache.commons + 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 + ${commons.dbutils.version} + + + org.apache.commons + commons-math3 + ${common-math3.version} + + + commons-net + commons-net + ${commons-net.version} + + + com.h2database + h2 + ${h2.version} + + + org.knowm.xchart + xchart + ${xchart-version} + + + org.apache.commons + commons-collections4 + ${commons.collections.version} + + + org.hamcrest + java-hamcrest + ${org.hamcrest.java-hamcrest.version} + test + + + org.mockftpserver + MockFtpServer + ${mockftpserver.version} + test + + + + + + 3.6 + 1.1 + 1.9.3 + 1.2 + 1.4 + 3.6.2 + 2.5 + 1.6 + 1.4.196 + 4.1 + 4.12 + 2.0.0.0 + 1.10.L001 + 3.5.2 + 3.6 + 1.3 + 3.6.1 + 2.7.1 + + + diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/Course.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/Course.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/beanutils/Course.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/Course.java diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseEntity.java diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseService.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/beanutils/CourseService.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/CourseService.java diff --git a/libraries/src/main/java/com/baeldung/commons/beanutils/Student.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/Student.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/beanutils/Student.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/beanutils/Student.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AbstractDenominationDispenser.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AtmCatalog.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmCatalog.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AtmCatalog.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmCatalog.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AtmConstants.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmConstants.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AtmConstants.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmConstants.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmRequestContext.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AtmWithdrawalChain.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/AuditFilter.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AuditFilter.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/AuditFilter.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/AuditFilter.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/FiftyDenominationDispenser.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/HundredDenominationDispenser.java diff --git a/libraries/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/chain/TenDenominationDispenser.java diff --git a/libraries/src/main/java/com/baeldung/commons/collectionutil/Address.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/collectionutil/Address.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Address.java diff --git a/libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/collectionutil/Customer.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/collectionutil/Customer.java diff --git a/libraries/src/main/java/com/baeldung/commons/dbutils/Email.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/Email.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/dbutils/Email.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/Email.java diff --git a/libraries/src/main/java/com/baeldung/commons/dbutils/Employee.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/Employee.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/dbutils/Employee.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/Employee.java diff --git a/libraries/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/dbutils/EmployeeHandler.java diff --git a/libraries/src/main/java/com/baeldung/commons/io/FileMonitor.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/io/FileMonitor.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/io/FileMonitor.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/io/FileMonitor.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/BuilderMethods.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/SampleLazyInitializer.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/SampleObject.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/SampleObject.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/SampleObject.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/SampleObject.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/application/Application.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/application/Application.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/application/Application.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/application/Application.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/beans/User.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/beans/User.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/beans/User.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/beans/User.java diff --git a/libraries/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/lang3/beans/UserInitializer.java diff --git a/libraries/src/main/java/com/baeldung/commons/math3/Histogram.java b/libraries-apache-commons/src/main/java/com/baeldung/commons/math3/Histogram.java similarity index 100% rename from libraries/src/main/java/com/baeldung/commons/math3/Histogram.java rename to libraries-apache-commons/src/main/java/com/baeldung/commons/math3/Histogram.java diff --git a/libraries/src/main/java/com/baeldung/ftp/FtpClient.java b/libraries-apache-commons/src/main/java/com/baeldung/ftp/FtpClient.java similarity index 100% rename from libraries/src/main/java/com/baeldung/ftp/FtpClient.java rename to libraries-apache-commons/src/main/java/com/baeldung/ftp/FtpClient.java diff --git a/libraries-apache-commons/src/main/resources/logback.xml b/libraries-apache-commons/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/libraries-apache-commons/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/libraries/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/circularfifoqueue/CircularFifoQueueUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/beanutils/CourseServiceUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/chain/AtmChainUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/BidiMapUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/CollectionUtilsGuideUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/MapUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/SetUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections/orderedmap/OrderedMapUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/collections4/BagUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/csv/CSVReaderWriterUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/dbutils/DbUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/io/CommonsIOUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/ArrayUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/Lang3UtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/StringUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ArrayUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/BasicThreadFactoryUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ConstructorUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/FieldUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/FractionUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/HashCodeBuilderUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ImmutablePairUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/ImmutableTripleUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/LazyInitializerUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MethodUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MutableObjectUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/MutablePairUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/NumberUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/StringUtilsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/SystemsUtilsManualTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/lang3/test/TripleUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/ComplexUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/FractionUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/FractionUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/FractionUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/FractionUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/GeometryUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/LinearAlgebraUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/ProbabilitiesUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/RootFindingUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/SimpsonIntegratorUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/commons/math/StatisticsUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java b/libraries-apache-commons/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java diff --git a/libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java b/libraries-apache-commons/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java diff --git a/libraries/src/test/java/com/baeldung/text/DiffUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/DiffUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/DiffUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/DiffUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/LongestCommonSubsequenceUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/StrBuilderUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/StrBuilderUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/StrBuilderUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/StrBuilderUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/StrSubstitutorUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/UnicodeEscaperUnitTest.java diff --git a/libraries/src/test/java/com/baeldung/text/WordUtilsUnitTest.java b/libraries-apache-commons/src/test/java/com/baeldung/text/WordUtilsUnitTest.java similarity index 100% rename from libraries/src/test/java/com/baeldung/text/WordUtilsUnitTest.java rename to libraries-apache-commons/src/test/java/com/baeldung/text/WordUtilsUnitTest.java diff --git a/libraries/src/test/resources/aaa.txt b/libraries-apache-commons/src/test/resources/aaa.txt similarity index 100% rename from libraries/src/test/resources/aaa.txt rename to libraries-apache-commons/src/test/resources/aaa.txt diff --git a/libraries/src/test/resources/book.csv b/libraries-apache-commons/src/test/resources/book.csv similarity index 100% rename from libraries/src/test/resources/book.csv rename to libraries-apache-commons/src/test/resources/book.csv diff --git a/libraries/src/test/resources/employees.sql b/libraries-apache-commons/src/test/resources/employees.sql similarity index 100% rename from libraries/src/test/resources/employees.sql rename to libraries-apache-commons/src/test/resources/employees.sql diff --git a/libraries/src/test/resources/fileTest.txt b/libraries-apache-commons/src/test/resources/fileTest.txt similarity index 100% rename from libraries/src/test/resources/fileTest.txt rename to libraries-apache-commons/src/test/resources/fileTest.txt diff --git a/libraries/src/test/resources/ftp/baz.txt b/libraries-apache-commons/src/test/resources/ftp/baz.txt similarity index 100% rename from libraries/src/test/resources/ftp/baz.txt rename to libraries-apache-commons/src/test/resources/ftp/baz.txt diff --git a/libraries/src/test/resources/sample.txt b/libraries-apache-commons/src/test/resources/sample.txt similarity index 100% rename from libraries/src/test/resources/sample.txt rename to libraries-apache-commons/src/test/resources/sample.txt diff --git a/libraries/README.md b/libraries/README.md index 851e3a3d17..28184c161b 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -1,40 +1,29 @@ ### Relevant articles - [Intro to Jasypt](http://www.baeldung.com/jasypt) -- [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 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) - [Introduction to JSONassert](http://www.baeldung.com/jsonassert) - [Intro to JaVers](http://www.baeldung.com/javers) -- [Introduction to Apache Commons Math](http://www.baeldung.com/apache-commons-math) - [Intro to Serenity BDD](http://www.baeldung.com/serenity-bdd) - [Merging Streams in Java](http://www.baeldung.com/java-merge-streams) - [Serenity BDD and Screenplay](http://www.baeldung.com/serenity-screenplay) - [Introduction to Quartz](http://www.baeldung.com/quartz) - [How to Warm Up the JVM](http://www.baeldung.com/java-jvm-warmup) -- [Apache Commons Collections SetUtils](http://www.baeldung.com/apache-commons-setutils) - [Software Transactional Memory in Java Using Multiverse](http://www.baeldung.com/java-multiverse-stm) - [Serenity BDD with Spring and JBehave](http://www.baeldung.com/serenity-spring-jbehave) - [Locality-Sensitive Hashing in Java Using Java-LSH](http://www.baeldung.com/locality-sensitive-hashing) -- [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) - [Introduction to Awaitility](http://www.baeldung.com/awaitlity-testing) - [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog) - [Introduction to Neuroph](http://www.baeldung.com/neuroph) -- [Guide to Apache Commons CircularFifoQueue](http://www.baeldung.com/commons-circular-fifo-queue) - [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss) - [Introduction to NoException](http://www.baeldung.com/introduction-to-noexception) - [Introduction to PCollections](http://www.baeldung.com/java-pcollections) - [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) -- [Apache Commons Chain](http://www.baeldung.com/apache-commons-chain) - [Introduction to Eclipse Collections](http://www.baeldung.com/eclipse-collections) - [DistinctBy in Java Stream API](http://www.baeldung.com/java-streams-distinct-by) -- [Introduction to Apache Commons CSV](http://www.baeldung.com/apache-commons-csv) - [Introduction to NoException](http://www.baeldung.com/no-exception) -- [Apache Commons IO](http://www.baeldung.com/apache-commons-io) - [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) - [Spring Yarg Integration](http://www.baeldung.com/spring-yarg) @@ -44,7 +33,6 @@ - [Introduction to MBassador](http://www.baeldung.com/mbassador) - [Introduction to Retrofit](http://www.baeldung.com/retrofit) - [Using Pairs in Java](http://www.baeldung.com/java-pairs) -- [Apache Commons Collections Bag](http://www.baeldung.com/apache-commons-bag) - [Introduction to Caffeine](http://www.baeldung.com/java-caching-caffeine) - [Introduction to Chronicle Queue](http://www.baeldung.com/java-chronicle-queue) - [Introduction To Docx4J](http://www.baeldung.com/docx4j) @@ -62,26 +50,19 @@ - [Introduction to OpenCSV](http://www.baeldung.com/opencsv) - [A Guide to Unirest](http://www.baeldung.com/unirest) - [Introduction to Akka Actors in Java](http://www.baeldung.com/akka-actors-java) -- [A Guide to Apache Commons Collections CollectionUtils](http://www.baeldung.com/apache-commons-collection-utils) - [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) -- [Apache Commons BeanUtils](http://www.baeldung.com/apache-commons-beanutils) -- [Apache Commons Collections BidiMap](http://www.baeldung.com/commons-collections-bidi-map) - [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) -- [Apache Commons Collections MapUtils](http://www.baeldung.com/apache-commons-map-utils) - [Creating REST Microservices with Javalin](http://www.baeldung.com/javalin-rest-microservices) - [Introduction to JavaPoet](http://www.baeldung.com/java-poet) - [Introduction to Joda-Time](http://www.baeldung.com/joda-time) -- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) - [Convert String to Date in Java](http://www.baeldung.com/java-string-to-date) -- [Histograms with Apache Commons Frequency](http://www.baeldung.com/apache-commons-frequency) - [Guide to Resilience4j](http://www.baeldung.com/resilience4j) - [Parsing YAML with SnakeYAML](http://www.baeldung.com/java-snake-yaml) - [Guide to JMapper](http://www.baeldung.com/jmapper) -- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) - [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once) - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) diff --git a/libraries/pom.xml b/libraries/pom.xml index fb1f1cd1b6..eb0bc58225 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -50,31 +50,16 @@ opencsv ${opencsv.version} - - commons-beanutils - commons-beanutils - ${commons-beanutils.version} - org.apache.commons commons-lang3 ${commons-lang.version} - - org.apache.commons - commons-text - ${commons-text.version} - tec.units unit-ri ${unit-ri.version} - - org.apache.commons - commons-collections4 - ${commons.collections.version} - org.jasypt jasypt @@ -134,32 +119,6 @@ - - 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 - ${commons.dbutils.version} - - - - org.apache.commons - commons-math3 - ${common-math3.version} - net.serenity-bdd serenity-core @@ -675,24 +634,6 @@ resilience4j-timelimiter ${resilience4j.version} - - org.knowm.xchart - xchart - ${xchart-version} - - - - commons-net - commons-net - ${commons-net.version} - - - org.mockftpserver - MockFtpServer - ${mockftpserver.version} - test - - com.squareup javapoet @@ -854,10 +795,6 @@ 0.7.0 3.2.7 3.6 - 1.1 - 1.9.3 - 1.2 - 1.4 1.9.2 1.2 3.21.0-GA @@ -865,13 +802,10 @@ 1.5.0 3.1.0 4.5.3 - 2.5 - 1.6 1.4.196 1.0 4.5.3 - 2.5 2.8.5 2.92 1.9.26 @@ -879,7 +813,6 @@ 1.9.0 1.9.27 1.1.0 - 4.1 4.12 0.10 3.5.0 @@ -917,13 +850,9 @@ 2.1.2 2.5.11 0.12.1 - 3.5.2 - 3.6 - 2.7.1 1.10.0 1.3 0.8.1 - 3.6.1 3.2.0-m7 5.1.1 5.0.2 diff --git a/pom.xml b/pom.xml index 4a1db4a937..44a844b6ee 100644 --- a/pom.xml +++ b/pom.xml @@ -982,6 +982,7 @@ libraries-data + libraries-apache-commons linkrest logging-modules/log-mdc logging-modules/log4j From 03e852e74753f9eccb3f53dba106a8dfcddb21b1 Mon Sep 17 00:00:00 2001 From: DOHA Date: Sat, 8 Dec 2018 13:27:17 +0200 Subject: [PATCH 218/429] compare hashmap --- .../compare/HashMapComparisonUnitTest.java | 227 ++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java 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/java/map/compare/HashMapComparisonUnitTest.java new file mode 100644 index 0000000000..c9a6b953ef --- /dev/null +++ b/java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java @@ -0,0 +1,227 @@ +package com.baeldung.java.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 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; + +public class HashMapComparisonUnitTest { + + Map asiaCapital1; + Map asiaCapital2; + Map asiaCapital3; + + Map asiaCity1; + Map asiaCity2; + Map asiaCity3; + + @Before + public void setup(){ + asiaCapital1 = new HashMap(); + asiaCapital1.put("Japan", "Tokyo"); + asiaCapital1.put("South Korea", "Seoul"); + + asiaCapital2 = new HashMap(); + asiaCapital2.put("South Korea", "Seoul"); + asiaCapital2.put("Japan", "Tokyo"); + + asiaCapital3 = new HashMap(); + asiaCapital3.put("Japan", "Tokyo"); + asiaCapital3.put("China", "Beijing"); + + asiaCity1 = new HashMap(); + asiaCity1.put("Japan", new String[] { "Tokyo", "Osaka" }); + asiaCity1.put("South Korea", new String[] { "Seoul", "Busan" }); + + asiaCity2 = new HashMap(); + asiaCity2.put("South Korea", new String[] { "Seoul", "Busan" }); + asiaCity2.put("Japan", new String[] { "Tokyo", "Osaka" }); + + asiaCity3 = new HashMap(); + asiaCity3.put("Japan", new String[] { "Tokyo", "Osaka" }); + asiaCity3.put("China", new String[] { "Beijing", "Hong Kong" }); + } + + @Test + public void whenCompareTwoHashMapsUsingEquals_thenSuccess() { + assertTrue(asiaCapital1.equals(asiaCapital2)); + assertFalse(asiaCapital1.equals(asiaCapital3)); + } + + @Test + public void whenCompareTwoHashMapsWithArrayValuesUsingEquals_thenFail() { + assertFalse(asiaCity1.equals(asiaCity2)); + } + + @Test + public void whenCompareTwoHashMapsUsingStreamAPI_thenSuccess() { + assertTrue(areEqual(asiaCapital1, asiaCapital2)); + assertFalse(areEqual(asiaCapital1, asiaCapital3)); + } + + @Test + public void whenCompareTwoHashMapsWithArrayValuesUsingStreamAPI_thenSuccess() { + assertTrue(areEqualWithArrayValue(asiaCity1, asiaCity2)); + assertFalse(areEqualWithArrayValue(asiaCity1, asiaCity3)); + } + + @Test + public void whenCompareTwoHashMapKeys_thenSuccess() { + assertTrue(asiaCapital1.keySet().equals(asiaCapital2.keySet())); + assertFalse(asiaCapital1.keySet().equals(asiaCapital3.keySet())); + } + + @Test + public void whenCompareTwoHashMapKeyValuesUsingStreamAPI_thenSuccess() { + Map asiaCapital3 = new HashMap(); + asiaCapital3.put("Japan", "Tokyo"); + asiaCapital3.put("South Korea", "Seoul"); + asiaCapital3.put("China", "Beijing"); + + Map asiaCapital4 = new HashMap(); + asiaCapital4.put("South Korea", "Seoul"); + asiaCapital4.put("Japan", "Osaka"); + asiaCapital4.put("China", "Beijing"); + + Map result = areEqualKeys(asiaCapital3, asiaCapital4); + assertEquals(3, result.size()); + assertThat(result, hasEntry("Japan", false)); + assertThat(result, hasEntry("South Korea", true)); + assertThat(result, hasEntry("China", true)); + } + + @Test + public void givenDifferentMaps_whenGetDiffUsingGuava_thenSuccess() { + Map asia1 = new HashMap(); + asia1.put("Japan", "Tokyo"); + asia1.put("South Korea", "Seoul"); + asia1.put("India", "New Delhi"); + + Map asia2 = new HashMap(); + asia2.put("Japan", "Tokyo"); + asia2.put("China", "Beijing"); + asia2.put("India", "Delhi"); + + MapDifference diff = Maps.difference(asia1, asia2); + Map> entriesDiffering = diff.entriesDiffering(); + + assertFalse(diff.areEqual()); + assertEquals(1, entriesDiffering.size()); + assertThat(entriesDiffering, hasKey("India")); + assertEquals("New Delhi", entriesDiffering.get("India").leftValue()); + assertEquals("Delhi", entriesDiffering.get("India").rightValue()); + } + + @Test + public void givenDifferentMaps_whenGetEntriesOnOneSideUsingGuava_thenSuccess() { + Map asia1 = new HashMap(); + asia1.put("Japan", "Tokyo"); + asia1.put("South Korea", "Seoul"); + asia1.put("India", "New Delhi"); + + Map asia2 = new HashMap(); + asia2.put("Japan", "Tokyo"); + asia2.put("China", "Beijing"); + asia2.put("India", "Delhi"); + + MapDifference diff = Maps.difference(asia1, asia2); + Map entriesOnlyOnRight = diff.entriesOnlyOnRight(); + assertEquals(1, entriesOnlyOnRight.size()); + assertThat(entriesOnlyOnRight, hasEntry("China", "Beijing")); + + Map entriesOnlyOnLeft = diff.entriesOnlyOnLeft(); + assertEquals(1, entriesOnlyOnLeft.size()); + assertThat(entriesOnlyOnLeft, hasEntry("South Korea", "Seoul")); + } + + @Test + public void givenDifferentMaps_whenGetCommonEntriesUsingGuava_thenSuccess() { + Map asia1 = new HashMap(); + asia1.put("Japan", "Tokyo"); + asia1.put("South Korea", "Seoul"); + asia1.put("India", "New Delhi"); + + Map asia2 = new HashMap(); + asia2.put("Japan", "Tokyo"); + asia2.put("China", "Beijing"); + asia2.put("India", "Delhi"); + + MapDifference diff = Maps.difference(asia1, asia2); + Map entriesInCommon = diff.entriesInCommon(); + + assertEquals(1, entriesInCommon.size()); + assertThat(entriesInCommon, hasEntry("Japan", "Tokyo")); + } + + @Test + public void givenSimilarMapsWithArrayValue_whenCompareUsingGuava_thenFail() { + MapDifference diff = Maps.difference(asiaCity1, asiaCity2); + assertFalse(diff.areEqual()); + } + + @Test + public void givenSimilarMapsWithArrayValue_whenCompareUsingGuavaEquivalence_thenSuccess() { + Equivalence eq = new Equivalence() { + @Override + protected boolean doEquivalent(String[] a, String[] b) { + return Arrays.equals(a, b); + } + + @Override + protected int doHash(String[] value) { + return value.hashCode(); + } + }; + + MapDifference diff = Maps.difference(asiaCity1, asiaCity2, eq); + assertTrue(diff.areEqual()); + + diff = Maps.difference(asiaCity1, asiaCity3, eq); + assertFalse(diff.areEqual()); + } + + // =========================================================================== + + private boolean areEqual(Map first, Map second) { + if (first.size() != second.size()) { + return false; + } + + return first.entrySet() + .stream() + .allMatch(e -> e.getValue() + .equals(second.get(e.getKey()))); + } + + private boolean areEqualWithArrayValue(Map first, Map second) { + if (first.size() != second.size()) { + return false; + } + + return first.entrySet() + .stream() + .allMatch(e -> Arrays.equals(e.getValue(), second.get(e.getKey()))); + } + + private Map areEqualKeys(Map first, Map second) { + return first.entrySet() + .stream() + .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().equals(second.get(e.getKey())))); + } + +} From 670e4f348d7178242f900fef958c38b25c8c4df9 Mon Sep 17 00:00:00 2001 From: DOHA Date: Sat, 8 Dec 2018 14:02:10 +0200 Subject: [PATCH 219/429] minor cleanup --- .../java/map/compare/HashMapComparisonUnitTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) 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/java/map/compare/HashMapComparisonUnitTest.java index c9a6b953ef..e8aa12d4bd 100644 --- a/java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java +++ b/java-collections-maps/src/test/java/com/baeldung/java/map/compare/HashMapComparisonUnitTest.java @@ -98,7 +98,8 @@ public class HashMapComparisonUnitTest { asiaCapital4.put("Japan", "Osaka"); asiaCapital4.put("China", "Beijing"); - Map result = areEqualKeys(asiaCapital3, asiaCapital4); + Map result = areEqualKeyValues(asiaCapital3, asiaCapital4); + assertEquals(3, result.size()); assertThat(result, hasEntry("Japan", false)); assertThat(result, hasEntry("South Korea", true)); @@ -141,10 +142,10 @@ public class HashMapComparisonUnitTest { MapDifference diff = Maps.difference(asia1, asia2); Map entriesOnlyOnRight = diff.entriesOnlyOnRight(); + Map entriesOnlyOnLeft = diff.entriesOnlyOnLeft(); + assertEquals(1, entriesOnlyOnRight.size()); assertThat(entriesOnlyOnRight, hasEntry("China", "Beijing")); - - Map entriesOnlyOnLeft = diff.entriesOnlyOnLeft(); assertEquals(1, entriesOnlyOnLeft.size()); assertThat(entriesOnlyOnLeft, hasEntry("South Korea", "Seoul")); } @@ -218,7 +219,7 @@ public class HashMapComparisonUnitTest { .allMatch(e -> Arrays.equals(e.getValue(), second.get(e.getKey()))); } - private Map areEqualKeys(Map first, Map second) { + private Map areEqualKeyValues(Map first, Map second) { return first.entrySet() .stream() .collect(Collectors.toMap(e -> e.getKey(), e -> e.getValue().equals(second.get(e.getKey())))); From 9eff0c662b61595d1c7386acdfa609c821a119c2 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 8 Dec 2018 18:37:08 +0530 Subject: [PATCH 220/429] [BAEL-9710] - Standardized packages for spring-rest module --- .../baeldung/resttemplate/lists/EmployeeApplication.java | 2 +- .../resttemplate/lists/client/EmployeeClient.java | 7 ++++--- .../resttemplate/lists/controller/EmployeeResource.java | 9 +++++---- .../baeldung/resttemplate/lists/dto/Employee.java | 2 +- .../baeldung/resttemplate/lists/dto/EmployeeList.java | 2 +- .../resttemplate/lists/service/EmployeeService.java | 5 +++-- .../baeldung/sampleapp}/config/MainApplication.java | 4 ++-- .../baeldung/sampleapp}/config/RestClientConfig.java | 5 +++-- .../baeldung/sampleapp}/config/WebConfig.java | 4 ++-- .../RestTemplateHeaderModifierInterceptor.java | 2 +- .../sampleapp}/repository/HeavyResourceRepository.java | 8 ++++---- .../web/controller/BarMappingExamplesController.java | 2 +- .../sampleapp}/web/controller/CompanyController.java | 5 +++-- .../web/controller/DeferredResultController.java | 2 +- .../web/controller/HeavyResourceController.java | 9 +++++---- .../sampleapp}/web/controller/ItemController.java | 8 ++++---- .../sampleapp}/web/controller/MyFooController.java | 7 ++++--- .../sampleapp}/web/controller/PactController.java | 5 +++-- .../sampleapp}/web/controller/SimplePostController.java | 5 +++-- .../web/controller/advice/JsonpControllerAdvice.java | 2 +- .../controller/mediatypes/CustomMediaTypeController.java | 7 ++++--- .../web/controller/redirect/RedirectController.java | 2 +- .../baeldung/sampleapp}/web/dto/BaeldungItem.java | 2 +- .../baeldung/sampleapp}/web/dto/BaeldungItemV2.java | 2 +- .../baeldung/sampleapp}/web/dto/Company.java | 2 +- .../baeldung => com/baeldung/sampleapp}/web/dto/Foo.java | 2 +- .../baeldung/sampleapp}/web/dto/HeavyResource.java | 2 +- .../sampleapp}/web/dto/HeavyResourceAddressOnly.java | 2 +- .../web/dto/HeavyResourceAddressPartialUpdate.java | 2 +- .../baeldung/sampleapp}/web/dto/Item.java | 2 +- .../baeldung/sampleapp}/web/dto/ItemManager.java | 2 +- .../baeldung/sampleapp}/web/dto/PactDto.java | 2 +- .../baeldung/sampleapp}/web/dto/Views.java | 2 +- .../web/exception/ResourceNotFoundException.java | 2 +- .../baeldung/SpringContextIntegrationTest.java | 4 ++-- .../test/java/{org => com}/baeldung/client/Consts.java | 2 +- .../ExamplePostControllerRequestIntegrationTest.java | 2 +- .../ExamplePostControllerResponseIntegrationTest.java | 2 +- .../baeldung/okhttp/DefaultContentTypeInterceptor.java | 2 +- .../baeldung/okhttp/OkHttpFileUploadingLiveTest.java | 4 ++-- .../{org => com}/baeldung/okhttp/OkHttpGetLiveTest.java | 4 ++-- .../baeldung/okhttp/OkHttpHeaderLiveTest.java | 2 +- .../{org => com}/baeldung/okhttp/OkHttpMiscLiveTest.java | 4 ++-- .../baeldung/okhttp/OkHttpPostingLiveTest.java | 4 ++-- .../baeldung/okhttp/OkHttpRedirectLiveTest.java | 2 +- .../baeldung/okhttp/ProgressRequestWrapper.java | 2 +- .../{org => com}/baeldung/pact/PactProviderLiveTest.java | 5 +++-- .../baeldung/resttemplate/RestTemplateLiveTest.java | 4 ++-- .../uribuilder/SpringUriBuilderIntegrationTest.java | 2 +- .../HeavyResourceControllerIntegrationTest.java | 8 ++++---- .../CustomMediaTypeControllerIntegrationTest.java | 5 +++-- .../mediatypes/CustomMediaTypeControllerLiveTest.java | 2 +- .../baeldung/web/controller/mediatypes/TestConfig.java | 2 +- .../redirect/RedirectControllerIntegrationTest.java | 2 +- .../resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 | 2 +- .../resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 | 6 +++--- spring-rest/src/test/resources/cache/journal | 6 ++++++ 57 files changed, 112 insertions(+), 94 deletions(-) rename spring-rest/src/main/java/{org => com}/baeldung/resttemplate/lists/EmployeeApplication.java (90%) rename spring-rest/src/main/java/{org => com}/baeldung/resttemplate/lists/client/EmployeeClient.java (94%) rename spring-rest/src/main/java/{org => com}/baeldung/resttemplate/lists/controller/EmployeeResource.java (85%) rename spring-rest/src/main/java/{org => com}/baeldung/resttemplate/lists/dto/Employee.java (92%) rename spring-rest/src/main/java/{org => com}/baeldung/resttemplate/lists/dto/EmployeeList.java (91%) rename spring-rest/src/main/java/{org => com}/baeldung/resttemplate/lists/service/EmployeeService.java (83%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/config/MainApplication.java (85%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/config/RestClientConfig.java (85%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/config/WebConfig.java (95%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/interceptors/RestTemplateHeaderModifierInterceptor.java (91%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/repository/HeavyResourceRepository.java (72%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/BarMappingExamplesController.java (96%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/CompanyController.java (82%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/DeferredResultController.java (98%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/HeavyResourceController.java (88%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/ItemController.java (83%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/MyFooController.java (94%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/PactController.java (90%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/SimplePostController.java (97%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/advice/JsonpControllerAdvice.java (85%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/mediatypes/CustomMediaTypeController.java (85%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/controller/redirect/RedirectController.java (98%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/BaeldungItem.java (83%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/BaeldungItemV2.java (84%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/Company.java (93%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/Foo.java (94%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/HeavyResource.java (96%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/HeavyResourceAddressOnly.java (93%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/HeavyResourceAddressPartialUpdate.java (93%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/Item.java (94%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/ItemManager.java (80%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/PactDto.java (93%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/dto/Views.java (75%) rename spring-rest/src/main/java/{org/baeldung => com/baeldung/sampleapp}/web/exception/ResourceNotFoundException.java (82%) rename spring-rest/src/test/java/{org => com}/baeldung/SpringContextIntegrationTest.java (91%) rename spring-rest/src/test/java/{org => com}/baeldung/client/Consts.java (68%) rename spring-rest/src/test/java/{org => com}/baeldung/okhttp/DefaultContentTypeInterceptor.java (92%) rename spring-rest/src/test/java/{org => com}/baeldung/okhttp/OkHttpFileUploadingLiveTest.java (93%) rename spring-rest/src/test/java/{org => com}/baeldung/okhttp/OkHttpGetLiveTest.java (92%) rename spring-rest/src/test/java/{org => com}/baeldung/okhttp/OkHttpHeaderLiveTest.java (93%) rename spring-rest/src/test/java/{org => com}/baeldung/okhttp/OkHttpMiscLiveTest.java (94%) rename spring-rest/src/test/java/{org => com}/baeldung/okhttp/OkHttpPostingLiveTest.java (94%) rename spring-rest/src/test/java/{org => com}/baeldung/okhttp/OkHttpRedirectLiveTest.java (92%) rename spring-rest/src/test/java/{org => com}/baeldung/okhttp/ProgressRequestWrapper.java (94%) rename spring-rest/src/test/java/{org => com}/baeldung/pact/PactProviderLiveTest.java (93%) rename spring-rest/src/test/java/{org => com}/baeldung/resttemplate/RestTemplateLiveTest.java (94%) rename spring-rest/src/test/java/{org => com}/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java (98%) rename spring-rest/src/test/java/{org => com}/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java (92%) rename spring-rest/src/test/java/{org => com}/baeldung/web/controller/mediatypes/CustomMediaTypeControllerIntegrationTest.java (94%) rename spring-rest/src/test/java/{org => com}/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java (96%) rename spring-rest/src/test/java/{org => com}/baeldung/web/controller/mediatypes/TestConfig.java (81%) rename spring-rest/src/test/java/{org => com}/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java (98%) diff --git a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/EmployeeApplication.java b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/EmployeeApplication.java similarity index 90% rename from spring-rest/src/main/java/org/baeldung/resttemplate/lists/EmployeeApplication.java rename to spring-rest/src/main/java/com/baeldung/resttemplate/lists/EmployeeApplication.java index baaa4c4d80..1967d4f2aa 100644 --- a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/EmployeeApplication.java +++ b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/EmployeeApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.lists; +package com.baeldung.resttemplate.lists; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; diff --git a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/client/EmployeeClient.java b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java similarity index 94% rename from spring-rest/src/main/java/org/baeldung/resttemplate/lists/client/EmployeeClient.java rename to spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java index 729fa3ca3e..d811045733 100644 --- a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/client/EmployeeClient.java +++ b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java @@ -1,11 +1,12 @@ -package org.baeldung.resttemplate.lists.client; +package com.baeldung.resttemplate.lists.client; -import org.baeldung.resttemplate.lists.dto.Employee; -import org.baeldung.resttemplate.lists.dto.EmployeeList; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; import org.springframework.web.client.RestTemplate; +import com.baeldung.resttemplate.lists.dto.Employee; +import com.baeldung.resttemplate.lists.dto.EmployeeList; + import java.util.ArrayList; import java.util.List; diff --git a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/controller/EmployeeResource.java b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java similarity index 85% rename from spring-rest/src/main/java/org/baeldung/resttemplate/lists/controller/EmployeeResource.java rename to spring-rest/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java index f051c6a78b..8a4d510f63 100644 --- a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/controller/EmployeeResource.java +++ b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/controller/EmployeeResource.java @@ -1,14 +1,15 @@ -package org.baeldung.resttemplate.lists.controller; +package com.baeldung.resttemplate.lists.controller; -import org.baeldung.resttemplate.lists.dto.Employee; -import org.baeldung.resttemplate.lists.dto.EmployeeList; -import org.baeldung.resttemplate.lists.service.EmployeeService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.resttemplate.lists.dto.Employee; +import com.baeldung.resttemplate.lists.dto.EmployeeList; +import com.baeldung.resttemplate.lists.service.EmployeeService; + import java.util.List; @RestController diff --git a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/dto/Employee.java b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/dto/Employee.java similarity index 92% rename from spring-rest/src/main/java/org/baeldung/resttemplate/lists/dto/Employee.java rename to spring-rest/src/main/java/com/baeldung/resttemplate/lists/dto/Employee.java index bd8ebbf969..0754c13c5b 100644 --- a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/dto/Employee.java +++ b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/dto/Employee.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.lists.dto; +package com.baeldung.resttemplate.lists.dto; public class Employee { diff --git a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/dto/EmployeeList.java b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/dto/EmployeeList.java similarity index 91% rename from spring-rest/src/main/java/org/baeldung/resttemplate/lists/dto/EmployeeList.java rename to spring-rest/src/main/java/com/baeldung/resttemplate/lists/dto/EmployeeList.java index 2bb86ac5b4..eeabbfe450 100644 --- a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/dto/EmployeeList.java +++ b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/dto/EmployeeList.java @@ -1,4 +1,4 @@ -package org.baeldung.resttemplate.lists.dto; +package com.baeldung.resttemplate.lists.dto; import java.util.ArrayList; import java.util.List; diff --git a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/service/EmployeeService.java b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java similarity index 83% rename from spring-rest/src/main/java/org/baeldung/resttemplate/lists/service/EmployeeService.java rename to spring-rest/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java index 08196dda77..226134787f 100644 --- a/spring-rest/src/main/java/org/baeldung/resttemplate/lists/service/EmployeeService.java +++ b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/service/EmployeeService.java @@ -1,8 +1,9 @@ -package org.baeldung.resttemplate.lists.service; +package com.baeldung.resttemplate.lists.service; -import org.baeldung.resttemplate.lists.dto.Employee; import org.springframework.stereotype.Service; +import com.baeldung.resttemplate.lists.dto.Employee; + import java.util.ArrayList; import java.util.List; diff --git a/spring-rest/src/main/java/org/baeldung/config/MainApplication.java b/spring-rest/src/main/java/com/baeldung/sampleapp/config/MainApplication.java similarity index 85% rename from spring-rest/src/main/java/org/baeldung/config/MainApplication.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/config/MainApplication.java index 6a7fdc041a..507f340e9d 100644 --- a/spring-rest/src/main/java/org/baeldung/config/MainApplication.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/config/MainApplication.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.sampleapp.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; @@ -6,7 +6,7 @@ import org.springframework.context.annotation.ComponentScan; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @EnableAutoConfiguration -@ComponentScan("org.baeldung") +@ComponentScan("com.baeldung.sampleapp") public class MainApplication implements WebMvcConfigurer { public static void main(final String[] args) { diff --git a/spring-rest/src/main/java/org/baeldung/config/RestClientConfig.java b/spring-rest/src/main/java/com/baeldung/sampleapp/config/RestClientConfig.java similarity index 85% rename from spring-rest/src/main/java/org/baeldung/config/RestClientConfig.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/config/RestClientConfig.java index 8743af20fe..8abc368bdb 100644 --- a/spring-rest/src/main/java/org/baeldung/config/RestClientConfig.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/config/RestClientConfig.java @@ -1,15 +1,16 @@ -package org.baeldung.config; +package com.baeldung.sampleapp.config; import java.util.ArrayList; import java.util.List; -import org.baeldung.interceptors.RestTemplateHeaderModifierInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.util.CollectionUtils; import org.springframework.web.client.RestTemplate; +import com.baeldung.sampleapp.interceptors.RestTemplateHeaderModifierInterceptor; + @Configuration public class RestClientConfig { diff --git a/spring-rest/src/main/java/org/baeldung/config/WebConfig.java b/spring-rest/src/main/java/com/baeldung/sampleapp/config/WebConfig.java similarity index 95% rename from spring-rest/src/main/java/org/baeldung/config/WebConfig.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/config/WebConfig.java index b3e3cd179a..d5209a520b 100644 --- a/spring-rest/src/main/java/org/baeldung/config/WebConfig.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/config/WebConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.sampleapp.config; import java.text.SimpleDateFormat; import java.util.List; @@ -18,7 +18,7 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; */ @Configuration @EnableWebMvc -@ComponentScan({ "org.baeldung.web" }) +@ComponentScan({ "com.baeldung.sampleapp.web" }) public class WebConfig implements WebMvcConfigurer { public WebConfig() { diff --git a/spring-rest/src/main/java/org/baeldung/interceptors/RestTemplateHeaderModifierInterceptor.java b/spring-rest/src/main/java/com/baeldung/sampleapp/interceptors/RestTemplateHeaderModifierInterceptor.java similarity index 91% rename from spring-rest/src/main/java/org/baeldung/interceptors/RestTemplateHeaderModifierInterceptor.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/interceptors/RestTemplateHeaderModifierInterceptor.java index fabb904634..519e5ebf0d 100644 --- a/spring-rest/src/main/java/org/baeldung/interceptors/RestTemplateHeaderModifierInterceptor.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/interceptors/RestTemplateHeaderModifierInterceptor.java @@ -1,4 +1,4 @@ -package org.baeldung.interceptors; +package com.baeldung.sampleapp.interceptors; import java.io.IOException; diff --git a/spring-rest/src/main/java/org/baeldung/repository/HeavyResourceRepository.java b/spring-rest/src/main/java/com/baeldung/sampleapp/repository/HeavyResourceRepository.java similarity index 72% rename from spring-rest/src/main/java/org/baeldung/repository/HeavyResourceRepository.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/repository/HeavyResourceRepository.java index e4eb6d8875..ea9541c31a 100644 --- a/spring-rest/src/main/java/org/baeldung/repository/HeavyResourceRepository.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/repository/HeavyResourceRepository.java @@ -1,10 +1,10 @@ -package org.baeldung.repository; - -import org.baeldung.web.dto.HeavyResource; -import org.baeldung.web.dto.HeavyResourceAddressOnly; +package com.baeldung.sampleapp.repository; import java.util.Map; +import com.baeldung.sampleapp.web.dto.HeavyResource; +import com.baeldung.sampleapp.web.dto.HeavyResourceAddressOnly; + public class HeavyResourceRepository { public void save(HeavyResource heavyResource) { diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/BarMappingExamplesController.java similarity index 96% rename from spring-rest/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/BarMappingExamplesController.java index 1c3a1086ca..c6b8d23944 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/BarMappingExamplesController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/BarMappingExamplesController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.sampleapp.web.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/CompanyController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/CompanyController.java similarity index 82% rename from spring-rest/src/main/java/org/baeldung/web/controller/CompanyController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/CompanyController.java index aa694c08ed..bfda2fe0d6 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/CompanyController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/CompanyController.java @@ -1,10 +1,11 @@ -package org.baeldung.web.controller; +package com.baeldung.sampleapp.web.controller; -import org.baeldung.web.dto.Company; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.sampleapp.web.dto.Company; + @RestController public class CompanyController { diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/DeferredResultController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/DeferredResultController.java similarity index 98% rename from spring-rest/src/main/java/org/baeldung/web/controller/DeferredResultController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/DeferredResultController.java index 5d039d2d02..8f4eb3218a 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/DeferredResultController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/DeferredResultController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.sampleapp.web.controller; import java.util.concurrent.CompletableFuture; import java.util.function.Consumer; diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/HeavyResourceController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/HeavyResourceController.java similarity index 88% rename from spring-rest/src/main/java/org/baeldung/web/controller/HeavyResourceController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/HeavyResourceController.java index fed45066bd..8156fc14a9 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/HeavyResourceController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/HeavyResourceController.java @@ -1,11 +1,8 @@ -package org.baeldung.web.controller; +package com.baeldung.sampleapp.web.controller; import java.util.Map; -import org.baeldung.repository.HeavyResourceRepository; -import org.baeldung.web.dto.HeavyResource; -import org.baeldung.web.dto.HeavyResourceAddressOnly; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PathVariable; @@ -14,6 +11,10 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.sampleapp.repository.HeavyResourceRepository; +import com.baeldung.sampleapp.web.dto.HeavyResource; +import com.baeldung.sampleapp.web.dto.HeavyResourceAddressOnly; + @RestController public class HeavyResourceController { diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/ItemController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/ItemController.java similarity index 83% rename from spring-rest/src/main/java/org/baeldung/web/controller/ItemController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/ItemController.java index 1cc3eae432..69bd458968 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/ItemController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/ItemController.java @@ -1,14 +1,14 @@ -package org.baeldung.web.controller; +package com.baeldung.sampleapp.web.controller; import java.util.Date; -import org.baeldung.web.dto.Item; -import org.baeldung.web.dto.ItemManager; -import org.baeldung.web.dto.Views; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.sampleapp.web.dto.Item; +import com.baeldung.sampleapp.web.dto.ItemManager; +import com.baeldung.sampleapp.web.dto.Views; import com.fasterxml.jackson.annotation.JsonView; @RestController diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/MyFooController.java similarity index 94% rename from spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/MyFooController.java index 251e0b23e7..11ea5b70c9 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/MyFooController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/MyFooController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.sampleapp.web.controller; import java.util.Collection; import java.util.HashMap; @@ -6,8 +6,6 @@ import java.util.Map; import javax.servlet.http.HttpServletResponse; -import org.baeldung.web.dto.Foo; -import org.baeldung.web.exception.ResourceNotFoundException; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; @@ -18,6 +16,9 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.servlet.support.ServletUriComponentsBuilder; +import com.baeldung.sampleapp.web.dto.Foo; +import com.baeldung.sampleapp.web.exception.ResourceNotFoundException; + @Controller @RequestMapping(value = "/foos") public class MyFooController { diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/PactController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/PactController.java similarity index 90% rename from spring-rest/src/main/java/org/baeldung/web/controller/PactController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/PactController.java index 4f586479ef..0f5d7f1acb 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/PactController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/PactController.java @@ -1,9 +1,8 @@ -package org.baeldung.web.controller; +package com.baeldung.sampleapp.web.controller; import java.util.ArrayList; import java.util.List; -import org.baeldung.web.dto.PactDto; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.GetMapping; @@ -12,6 +11,8 @@ import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.sampleapp.web.dto.PactDto; + @RestController public class PactController { diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/SimplePostController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/SimplePostController.java similarity index 97% rename from spring-rest/src/main/java/org/baeldung/web/controller/SimplePostController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/SimplePostController.java index f8407acb47..7b57d35088 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/SimplePostController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/SimplePostController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.sampleapp.web.controller; import java.io.BufferedOutputStream; import java.io.File; @@ -7,7 +7,6 @@ import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.Date; -import org.baeldung.web.dto.Foo; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @@ -15,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import com.baeldung.sampleapp.web.dto.Foo; + // used to test HttpClientPostingTest @RestController public class SimplePostController { diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java similarity index 85% rename from spring-rest/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java index 996f229128..853e417d46 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/advice/JsonpControllerAdvice.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller.advice; +package com.baeldung.sampleapp.web.controller.advice; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice; diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/mediatypes/CustomMediaTypeController.java similarity index 85% rename from spring-rest/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/mediatypes/CustomMediaTypeController.java index a0a6c6341e..fc73bade87 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/mediatypes/CustomMediaTypeController.java @@ -1,13 +1,14 @@ -package org.baeldung.web.controller.mediatypes; +package com.baeldung.sampleapp.web.controller.mediatypes; -import org.baeldung.web.dto.BaeldungItem; -import org.baeldung.web.dto.BaeldungItemV2; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.RestController; +import com.baeldung.sampleapp.web.dto.BaeldungItem; +import com.baeldung.sampleapp.web.dto.BaeldungItemV2; + @RestController @RequestMapping(value = "/", produces = "application/vnd.baeldung.api.v1+json") public class CustomMediaTypeController { diff --git a/spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectController.java similarity index 98% rename from spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectController.java index 59868593a3..321f3be3ef 100644 --- a/spring-rest/src/main/java/org/baeldung/web/controller/redirect/RedirectController.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/redirect/RedirectController.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller.redirect; +package com.baeldung.sampleapp.web.controller.redirect; import javax.servlet.http.HttpServletRequest; diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/BaeldungItem.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/BaeldungItem.java similarity index 83% rename from spring-rest/src/main/java/org/baeldung/web/dto/BaeldungItem.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/BaeldungItem.java index 9b3ecd33b9..807a254cfc 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/BaeldungItem.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/BaeldungItem.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; public class BaeldungItem { private final String itemId; diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/BaeldungItemV2.java similarity index 84% rename from spring-rest/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/BaeldungItemV2.java index 64df20a14e..f84591ea43 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/BaeldungItemV2.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/BaeldungItemV2.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; public class BaeldungItemV2 { diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/Company.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Company.java similarity index 93% rename from spring-rest/src/main/java/org/baeldung/web/dto/Company.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Company.java index 3164d604ad..6cfcc079d9 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/Company.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Company.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; public class Company { diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/Foo.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Foo.java similarity index 94% rename from spring-rest/src/main/java/org/baeldung/web/dto/Foo.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Foo.java index 240b368b50..186df8e678 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/Foo.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Foo.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; import com.thoughtworks.xstream.annotations.XStreamAlias; diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/HeavyResource.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/HeavyResource.java similarity index 96% rename from spring-rest/src/main/java/org/baeldung/web/dto/HeavyResource.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/HeavyResource.java index 934e76606f..2821341888 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/HeavyResource.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/HeavyResource.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; public class HeavyResource { diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/HeavyResourceAddressOnly.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/HeavyResourceAddressOnly.java similarity index 93% rename from spring-rest/src/main/java/org/baeldung/web/dto/HeavyResourceAddressOnly.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/HeavyResourceAddressOnly.java index f96347d60c..01ee6e7dd4 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/HeavyResourceAddressOnly.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/HeavyResourceAddressOnly.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; public class HeavyResourceAddressOnly { diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/HeavyResourceAddressPartialUpdate.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/HeavyResourceAddressPartialUpdate.java similarity index 93% rename from spring-rest/src/main/java/org/baeldung/web/dto/HeavyResourceAddressPartialUpdate.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/HeavyResourceAddressPartialUpdate.java index f90f02ea08..1832a1a58b 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/HeavyResourceAddressPartialUpdate.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/HeavyResourceAddressPartialUpdate.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; public class HeavyResourceAddressPartialUpdate { diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/Item.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Item.java similarity index 94% rename from spring-rest/src/main/java/org/baeldung/web/dto/Item.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Item.java index 536c72020f..a4fcef5dce 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/Item.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Item.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; import com.fasterxml.jackson.annotation.JsonView; diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/ItemManager.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/ItemManager.java similarity index 80% rename from spring-rest/src/main/java/org/baeldung/web/dto/ItemManager.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/ItemManager.java index 74ffada300..0009c0180b 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/ItemManager.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/ItemManager.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; public class ItemManager { diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/PactDto.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/PactDto.java similarity index 93% rename from spring-rest/src/main/java/org/baeldung/web/dto/PactDto.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/PactDto.java index e34e2bdf3b..e184119611 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/PactDto.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/PactDto.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; public class PactDto { diff --git a/spring-rest/src/main/java/org/baeldung/web/dto/Views.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Views.java similarity index 75% rename from spring-rest/src/main/java/org/baeldung/web/dto/Views.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Views.java index 6231e12bcc..e2d83fda22 100644 --- a/spring-rest/src/main/java/org/baeldung/web/dto/Views.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/dto/Views.java @@ -1,4 +1,4 @@ -package org.baeldung.web.dto; +package com.baeldung.sampleapp.web.dto; public class Views { public static class Public { diff --git a/spring-rest/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/exception/ResourceNotFoundException.java similarity index 82% rename from spring-rest/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java rename to spring-rest/src/main/java/com/baeldung/sampleapp/web/exception/ResourceNotFoundException.java index aab737b6ec..69532f196d 100644 --- a/spring-rest/src/main/java/org/baeldung/web/exception/ResourceNotFoundException.java +++ b/spring-rest/src/main/java/com/baeldung/sampleapp/web/exception/ResourceNotFoundException.java @@ -1,4 +1,4 @@ -package org.baeldung.web.exception; +package com.baeldung.sampleapp.web.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; diff --git a/spring-rest/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java similarity index 91% rename from spring-rest/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java index d99dacd331..e659897303 100644 --- a/spring-rest/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -1,6 +1,5 @@ -package org.baeldung; +package com.baeldung; -import org.baeldung.config.MainApplication; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; @@ -10,6 +9,7 @@ import com.baeldung.custom.CustomApplication; import com.baeldung.produceimage.ImageApplication; import com.baeldung.propertyeditor.PropertyEditorApplication; import com.baeldung.responseheaders.ResponseHeadersApplication; +import com.baeldung.sampleapp.config.MainApplication; import com.baeldung.web.log.app.Application; @RunWith(SpringRunner.class) diff --git a/spring-rest/src/test/java/org/baeldung/client/Consts.java b/spring-rest/src/test/java/com/baeldung/client/Consts.java similarity index 68% rename from spring-rest/src/test/java/org/baeldung/client/Consts.java rename to spring-rest/src/test/java/com/baeldung/client/Consts.java index b40561d9c3..b392c4d199 100644 --- a/spring-rest/src/test/java/org/baeldung/client/Consts.java +++ b/spring-rest/src/test/java/com/baeldung/client/Consts.java @@ -1,4 +1,4 @@ -package org.baeldung.client; +package com.baeldung.client; public interface Consts { int APPLICATION_PORT = 8082; diff --git a/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java index 33926d6200..94b8bf40e7 100644 --- a/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerRequestIntegrationTest.java @@ -1,5 +1,6 @@ package com.baeldung.controllers; +import com.baeldung.sampleapp.config.MainApplication; import com.baeldung.services.ExampleService; import com.baeldung.transfer.LoginForm; import org.junit.Before; @@ -12,7 +13,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.baeldung.config.MainApplication; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; diff --git a/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java index 5c5e5c0a64..5743ad450b 100644 --- a/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/controllers/ExamplePostControllerResponseIntegrationTest.java @@ -1,5 +1,6 @@ package com.baeldung.controllers; +import com.baeldung.sampleapp.config.MainApplication; import com.baeldung.services.ExampleService; import com.baeldung.transfer.LoginForm; import org.junit.Before; @@ -19,7 +20,6 @@ import static org.springframework.test.web.servlet.request.MockMvcRequestBuilder import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import org.baeldung.config.MainApplication; @RunWith(SpringRunner.class) @SpringBootTest(classes = MainApplication.class) diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java b/spring-rest/src/test/java/com/baeldung/okhttp/DefaultContentTypeInterceptor.java similarity index 92% rename from spring-rest/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java rename to spring-rest/src/test/java/com/baeldung/okhttp/DefaultContentTypeInterceptor.java index f49d7668e8..0450c1d6ba 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/DefaultContentTypeInterceptor.java +++ b/spring-rest/src/test/java/com/baeldung/okhttp/DefaultContentTypeInterceptor.java @@ -1,4 +1,4 @@ -package org.baeldung.okhttp; +package com.baeldung.okhttp; import java.io.IOException; diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpFileUploadingLiveTest.java similarity index 93% rename from spring-rest/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java rename to spring-rest/src/test/java/com/baeldung/okhttp/OkHttpFileUploadingLiveTest.java index 71fc755321..75980a5360 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpFileUploadingLiveTest.java +++ b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpFileUploadingLiveTest.java @@ -1,6 +1,6 @@ -package org.baeldung.okhttp; +package com.baeldung.okhttp; -import static org.baeldung.client.Consts.APPLICATION_PORT; +import static com.baeldung.client.Consts.APPLICATION_PORT; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpGetLiveTest.java similarity index 92% rename from spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java rename to spring-rest/src/test/java/com/baeldung/okhttp/OkHttpGetLiveTest.java index fc78899da1..3edd2eab06 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpGetLiveTest.java +++ b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpGetLiveTest.java @@ -1,6 +1,6 @@ -package org.baeldung.okhttp; +package com.baeldung.okhttp; -import static org.baeldung.client.Consts.APPLICATION_PORT; +import static com.baeldung.client.Consts.APPLICATION_PORT; import static org.hamcrest.CoreMatchers.equalTo; import static org.junit.Assert.assertThat; import static org.junit.Assert.fail; diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpHeaderLiveTest.java similarity index 93% rename from spring-rest/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java rename to spring-rest/src/test/java/com/baeldung/okhttp/OkHttpHeaderLiveTest.java index c3dddc69e1..305c86d8c5 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpHeaderLiveTest.java +++ b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpHeaderLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.okhttp; +package com.baeldung.okhttp; import java.io.IOException; diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpMiscLiveTest.java similarity index 94% rename from spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java rename to spring-rest/src/test/java/com/baeldung/okhttp/OkHttpMiscLiveTest.java index 6ab485ee14..207ad14e71 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpMiscLiveTest.java +++ b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpMiscLiveTest.java @@ -1,6 +1,6 @@ -package org.baeldung.okhttp; +package com.baeldung.okhttp; -import static org.baeldung.client.Consts.APPLICATION_PORT; +import static com.baeldung.client.Consts.APPLICATION_PORT; import java.io.File; import java.io.IOException; diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpPostingLiveTest.java similarity index 94% rename from spring-rest/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java rename to spring-rest/src/test/java/com/baeldung/okhttp/OkHttpPostingLiveTest.java index d681a56822..66fee0b626 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpPostingLiveTest.java +++ b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpPostingLiveTest.java @@ -1,6 +1,6 @@ -package org.baeldung.okhttp; +package com.baeldung.okhttp; -import static org.baeldung.client.Consts.APPLICATION_PORT; +import static com.baeldung.client.Consts.APPLICATION_PORT; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpRedirectLiveTest.java similarity index 92% rename from spring-rest/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java rename to spring-rest/src/test/java/com/baeldung/okhttp/OkHttpRedirectLiveTest.java index e3f567a693..5dd159c372 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/OkHttpRedirectLiveTest.java +++ b/spring-rest/src/test/java/com/baeldung/okhttp/OkHttpRedirectLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.okhttp; +package com.baeldung.okhttp; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertThat; diff --git a/spring-rest/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java b/spring-rest/src/test/java/com/baeldung/okhttp/ProgressRequestWrapper.java similarity index 94% rename from spring-rest/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java rename to spring-rest/src/test/java/com/baeldung/okhttp/ProgressRequestWrapper.java index 04a2fcc6e7..6f0ebce1e1 100644 --- a/spring-rest/src/test/java/org/baeldung/okhttp/ProgressRequestWrapper.java +++ b/spring-rest/src/test/java/com/baeldung/okhttp/ProgressRequestWrapper.java @@ -1,4 +1,4 @@ -package org.baeldung.okhttp; +package com.baeldung.okhttp; import okhttp3.RequestBody; import okhttp3.MediaType; diff --git a/spring-rest/src/test/java/org/baeldung/pact/PactProviderLiveTest.java b/spring-rest/src/test/java/com/baeldung/pact/PactProviderLiveTest.java similarity index 93% rename from spring-rest/src/test/java/org/baeldung/pact/PactProviderLiveTest.java rename to spring-rest/src/test/java/com/baeldung/pact/PactProviderLiveTest.java index f020fb88db..7ac9c1d9ce 100644 --- a/spring-rest/src/test/java/org/baeldung/pact/PactProviderLiveTest.java +++ b/spring-rest/src/test/java/com/baeldung/pact/PactProviderLiveTest.java @@ -1,11 +1,12 @@ -package org.baeldung.pact; +package com.baeldung.pact; -import org.baeldung.config.MainApplication; import org.junit.BeforeClass; import org.junit.runner.RunWith; import org.springframework.boot.SpringApplication; import org.springframework.web.context.ConfigurableWebApplicationContext; +import com.baeldung.sampleapp.config.MainApplication; + import au.com.dius.pact.provider.junit.PactRunner; import au.com.dius.pact.provider.junit.Provider; import au.com.dius.pact.provider.junit.State; diff --git a/spring-rest/src/test/java/org/baeldung/resttemplate/RestTemplateLiveTest.java b/spring-rest/src/test/java/com/baeldung/resttemplate/RestTemplateLiveTest.java similarity index 94% rename from spring-rest/src/test/java/org/baeldung/resttemplate/RestTemplateLiveTest.java rename to spring-rest/src/test/java/com/baeldung/resttemplate/RestTemplateLiveTest.java index 4f00bebdf4..8db31fd0a7 100644 --- a/spring-rest/src/test/java/org/baeldung/resttemplate/RestTemplateLiveTest.java +++ b/spring-rest/src/test/java/com/baeldung/resttemplate/RestTemplateLiveTest.java @@ -1,10 +1,9 @@ -package org.baeldung.resttemplate; +package com.baeldung.resttemplate; import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; -import org.baeldung.config.RestClientConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -17,6 +16,7 @@ import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; +import com.baeldung.sampleapp.config.RestClientConfig; import com.baeldung.transfer.LoginForm; @RunWith(SpringJUnit4ClassRunner.class) diff --git a/spring-rest/src/test/java/org/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java similarity index 98% rename from spring-rest/src/test/java/org/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java rename to spring-rest/src/test/java/com/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java index bdc24f7f34..0af5cb1e1a 100644 --- a/spring-rest/src/test/java/org/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/uribuilder/SpringUriBuilderIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.uribuilder; +package com.baeldung.uribuilder; import static org.junit.Assert.assertEquals; diff --git a/spring-rest/src/test/java/org/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java similarity index 92% rename from spring-rest/src/test/java/org/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java rename to spring-rest/src/test/java/com/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java index 478e4948dc..5a0b08958e 100644 --- a/spring-rest/src/test/java/org/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/web/controller/HeavyResourceControllerIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller; +package com.baeldung.web.controller; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; @@ -6,9 +6,6 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers. import java.util.HashMap; -import org.baeldung.config.WebConfig; -import org.baeldung.web.dto.HeavyResource; -import org.baeldung.web.dto.HeavyResourceAddressOnly; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -21,6 +18,9 @@ import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.setup.MockMvcBuilders; import org.springframework.web.context.WebApplicationContext; +import com.baeldung.sampleapp.config.WebConfig; +import com.baeldung.sampleapp.web.dto.HeavyResource; +import com.baeldung.sampleapp.web.dto.HeavyResourceAddressOnly; import com.fasterxml.jackson.databind.ObjectMapper; diff --git a/spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/web/controller/mediatypes/CustomMediaTypeControllerIntegrationTest.java similarity index 94% rename from spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerIntegrationTest.java rename to spring-rest/src/test/java/com/baeldung/web/controller/mediatypes/CustomMediaTypeControllerIntegrationTest.java index 9ef2dfa215..7b695cd23b 100644 --- a/spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/web/controller/mediatypes/CustomMediaTypeControllerIntegrationTest.java @@ -1,6 +1,5 @@ -package org.baeldung.web.controller.mediatypes; +package com.baeldung.web.controller.mediatypes; -import org.baeldung.config.WebConfig; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -12,6 +11,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.sampleapp.config.WebConfig; + import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; diff --git a/spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java b/spring-rest/src/test/java/com/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java similarity index 96% rename from spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java rename to spring-rest/src/test/java/com/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java index 2b57e7049c..e48edc723c 100644 --- a/spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java +++ b/spring-rest/src/test/java/com/baeldung/web/controller/mediatypes/CustomMediaTypeControllerLiveTest.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller.mediatypes; +package com.baeldung.web.controller.mediatypes; import io.restassured.http.ContentType; import org.junit.Test; diff --git a/spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java b/spring-rest/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java similarity index 81% rename from spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java rename to spring-rest/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java index 66ffe4947d..7fc7f17e50 100644 --- a/spring-rest/src/test/java/org/baeldung/web/controller/mediatypes/TestConfig.java +++ b/spring-rest/src/test/java/com/baeldung/web/controller/mediatypes/TestConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller.mediatypes; +package com.baeldung.web.controller.mediatypes; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; diff --git a/spring-rest/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java similarity index 98% rename from spring-rest/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java rename to spring-rest/src/test/java/com/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java index c604db596a..745f7d5a31 100644 --- a/spring-rest/src/test/java/org/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/web/controller/redirect/RedirectControllerIntegrationTest.java @@ -1,4 +1,4 @@ -package org.baeldung.web.controller.redirect; +package com.baeldung.web.controller.redirect; import static org.hamcrest.CoreMatchers.equalTo; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; diff --git a/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 b/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 index bc64f40e5d..e6cfcabe71 100644 --- a/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 +++ b/spring-rest/src/test/resources/cache/2d9345a30d2cc31bb3091d70a8ef6c18.0 @@ -8,7 +8,7 @@ Content-Length: 1759 Connection: keep-alive Accept-Ranges: bytes Server: nginx/1.10.0 (Ubuntu) -Date: Sat, 28 Apr 2018 20:53:35 GMT +Date: Sat, 08 Dec 2018 13:02:07 GMT Last-Modified: Tue, 27 May 2014 02:35:47 GMT ETag: "5383fa03-6df" OkHttp-Sent-Millis: 1489054646765 diff --git a/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 b/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 index bbd34c75f6..85fc22d658 100644 --- a/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 +++ b/spring-rest/src/test/resources/cache/4b217e04ba52215f3a6b64d28f6729c6.0 @@ -4,10 +4,10 @@ GET HTTP/1.1 301 Moved Permanently 8 Server: nginx/1.10.0 (Ubuntu) -Date: Sat, 28 Apr 2018 20:53:33 GMT +Date: Sat, 08 Dec 2018 13:02:04 GMT Content-Type: text/html Content-Length: 194 Connection: keep-alive Location: https://publicobject.com/helloworld.txt -OkHttp-Sent-Millis: 1524948815122 -OkHttp-Received-Millis: 1524948815342 +OkHttp-Sent-Millis: 1544274128028 +OkHttp-Received-Millis: 1544274128386 diff --git a/spring-rest/src/test/resources/cache/journal b/spring-rest/src/test/resources/cache/journal index eed030a85d..a139399103 100644 --- a/spring-rest/src/test/resources/cache/journal +++ b/spring-rest/src/test/resources/cache/journal @@ -67,3 +67,9 @@ CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 READ 2d9345a30d2cc31bb3091d70a8ef6c18 DIRTY 2d9345a30d2cc31bb3091d70a8ef6c18 CLEAN 2d9345a30d2cc31bb3091d70a8ef6c18 7618 1759 +READ 4b217e04ba52215f3a6b64d28f6729c6 +DIRTY 4b217e04ba52215f3a6b64d28f6729c6 +CLEAN 4b217e04ba52215f3a6b64d28f6729c6 333 194 +READ 2d9345a30d2cc31bb3091d70a8ef6c18 +DIRTY 2d9345a30d2cc31bb3091d70a8ef6c18 +CLEAN 2d9345a30d2cc31bb3091d70a8ef6c18 7618 1759 From 0b0aedc2873f7de8d71e6fe04d0fdd8c8ec762d8 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 8 Dec 2018 08:58:16 -0600 Subject: [PATCH 221/429] BAEL-2174: rename core-java-net module to core-java-networking (#5837) * BAEL-2246: add link back to article * BAEL-2174: rename core-java-net module to core-java-networking --- {core-java-net => core-java-networking}/.gitignore | 0 {core-java-net => core-java-networking}/README.md | 0 {core-java-net => core-java-networking}/pom.xml | 6 +++--- .../baeldung/networking/proxies/CommandLineProxyDemo.java | 0 .../com/baeldung/networking/proxies/DirectProxyDemo.java | 0 .../com/baeldung/networking/proxies/SocksProxyDemo.java | 0 .../networking/proxies/SystemPropertyProxyDemo.java | 0 .../com/baeldung/networking/proxies/UrlConnectionUtils.java | 0 .../java/com/baeldung/networking/proxies/WebProxyDemo.java | 0 .../src/test/resources/.gitignore | 0 pom.xml | 4 ++-- 11 files changed, 5 insertions(+), 5 deletions(-) rename {core-java-net => core-java-networking}/.gitignore (100%) rename {core-java-net => core-java-networking}/README.md (100%) rename {core-java-net => core-java-networking}/pom.xml (80%) rename {core-java-net => core-java-networking}/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java (100%) rename {core-java-net => core-java-networking}/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java (100%) rename {core-java-net => core-java-networking}/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java (100%) rename {core-java-net => core-java-networking}/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java (100%) rename {core-java-net => core-java-networking}/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java (100%) rename {core-java-net => core-java-networking}/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java (100%) rename {core-java-net => core-java-networking}/src/test/resources/.gitignore (100%) diff --git a/core-java-net/.gitignore b/core-java-networking/.gitignore similarity index 100% rename from core-java-net/.gitignore rename to core-java-networking/.gitignore diff --git a/core-java-net/README.md b/core-java-networking/README.md similarity index 100% rename from core-java-net/README.md rename to core-java-networking/README.md diff --git a/core-java-net/pom.xml b/core-java-networking/pom.xml similarity index 80% rename from core-java-net/pom.xml rename to core-java-networking/pom.xml index 28d5766a9a..178295e1ec 100644 --- a/core-java-net/pom.xml +++ b/core-java-networking/pom.xml @@ -1,10 +1,10 @@ 4.0.0 - core-java-net + core-java-networking 0.1.0-SNAPSHOT jar - core-java-net + core-java-networking com.baeldung @@ -14,6 +14,6 @@ - core-java-net + core-java-networking diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java similarity index 100% rename from core-java-net/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java rename to core-java-networking/src/main/java/com/baeldung/networking/proxies/CommandLineProxyDemo.java diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java similarity index 100% rename from core-java-net/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java rename to core-java-networking/src/main/java/com/baeldung/networking/proxies/DirectProxyDemo.java diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java similarity index 100% rename from core-java-net/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java rename to core-java-networking/src/main/java/com/baeldung/networking/proxies/SocksProxyDemo.java diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java similarity index 100% rename from core-java-net/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java rename to core-java-networking/src/main/java/com/baeldung/networking/proxies/SystemPropertyProxyDemo.java diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java similarity index 100% rename from core-java-net/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java rename to core-java-networking/src/main/java/com/baeldung/networking/proxies/UrlConnectionUtils.java diff --git a/core-java-net/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java similarity index 100% rename from core-java-net/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java rename to core-java-networking/src/main/java/com/baeldung/networking/proxies/WebProxyDemo.java diff --git a/core-java-net/src/test/resources/.gitignore b/core-java-networking/src/test/resources/.gitignore similarity index 100% rename from core-java-net/src/test/resources/.gitignore rename to core-java-networking/src/test/resources/.gitignore diff --git a/pom.xml b/pom.xml index 4a1db4a937..78ce1821fa 100644 --- a/pom.xml +++ b/pom.xml @@ -367,7 +367,7 @@ core-java - core-java-net + core-java-networking dozer disruptor @@ -923,7 +923,7 @@ core-java - core-java-net + core-java-networking dozer disruptor From 0abf2d243aebf58ebaaced42eaea45b0ee723605 Mon Sep 17 00:00:00 2001 From: Mikhail Chugunov Date: Sat, 8 Dec 2018 17:59:10 +0300 Subject: [PATCH 222/429] BAEL-2327: Implement simple escaping and tests (#5745) * BAEL-2327: Implement simple escaping and tests * BAEL-2327: Rename test to comply with CI rules --- json/pom.xml | 10 +++++ .../java/com/baeldung/escape/JsonEscape.java | 41 +++++++++++++++++++ .../baeldung/escape/JsonEscapeUnitTest.java | 36 ++++++++++++++++ 3 files changed, 87 insertions(+) create mode 100644 json/src/main/java/com/baeldung/escape/JsonEscape.java create mode 100644 json/src/test/java/com/baeldung/escape/JsonEscapeUnitTest.java diff --git a/json/pom.xml b/json/pom.xml index db98ec437e..fce2d26db5 100644 --- a/json/pom.xml +++ b/json/pom.xml @@ -33,6 +33,16 @@ org.json json 20171018 + + + com.google.code.gson + gson + 2.8.5 + + + com.fasterxml.jackson.core + jackson-databind + 2.9.7 javax.json.bind diff --git a/json/src/main/java/com/baeldung/escape/JsonEscape.java b/json/src/main/java/com/baeldung/escape/JsonEscape.java new file mode 100644 index 0000000000..1e5f0d87cb --- /dev/null +++ b/json/src/main/java/com/baeldung/escape/JsonEscape.java @@ -0,0 +1,41 @@ +package com.baeldung.escape; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.JsonObject; +import org.json.JSONObject; + +class JsonEscape { + + String escapeJson(String input) { + JSONObject jsonObject = new JSONObject(); + jsonObject.put("message", input); + return jsonObject.toString(); + } + + String escapeGson(String input) { + JsonObject gsonObject = new JsonObject(); + gsonObject.addProperty("message", input); + return gsonObject.toString(); + } + + String escapeJackson(String input) throws JsonProcessingException { + return new ObjectMapper().writeValueAsString(new Payload(input)); + } + + static class Payload { + String message; + + Payload(String message) { + this.message = message; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + } +} diff --git a/json/src/test/java/com/baeldung/escape/JsonEscapeUnitTest.java b/json/src/test/java/com/baeldung/escape/JsonEscapeUnitTest.java new file mode 100644 index 0000000000..e959fa227b --- /dev/null +++ b/json/src/test/java/com/baeldung/escape/JsonEscapeUnitTest.java @@ -0,0 +1,36 @@ +package com.baeldung.escape; + +import com.fasterxml.jackson.core.JsonProcessingException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.*; + +class JsonEscapeUnitTest { + + private JsonEscape testedInstance; + private static final String EXPECTED = "{\"message\":\"Hello \\\"World\\\"\"}"; + + @BeforeEach + void setUp() { + testedInstance = new JsonEscape(); + } + + @Test + void escapeJson() { + String actual = testedInstance.escapeJson("Hello \"World\""); + assertEquals(EXPECTED, actual); + } + + @Test + void escapeGson() { + String actual = testedInstance.escapeGson("Hello \"World\""); + assertEquals(EXPECTED, actual); + } + + @Test + void escapeJackson() throws JsonProcessingException { + String actual = testedInstance.escapeJackson("Hello \"World\""); + assertEquals(EXPECTED, actual); + } +} \ No newline at end of file From ea70595615dbecc4a2b169563d4aea431e863981 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 9 Dec 2018 00:36:34 +0530 Subject: [PATCH 223/429] [BAEL-9643] - Create code for Properties article --- .../java/properties/PropertiesUnitTest.java | 146 ++++++++++++++++++ core-java/src/test/resources/app.properties | 3 + core-java/src/test/resources/catalog | 3 + .../src/test/resources/default.properties | 4 + core-java/src/test/resources/icons.xml | 8 + 5 files changed, 164 insertions(+) create mode 100644 core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java create mode 100644 core-java/src/test/resources/app.properties create mode 100644 core-java/src/test/resources/catalog create mode 100644 core-java/src/test/resources/default.properties create mode 100644 core-java/src/test/resources/icons.xml diff --git a/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java b/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java new file mode 100644 index 0000000000..a5c3890edb --- /dev/null +++ b/core-java/src/test/java/com/baeldung/java/properties/PropertiesUnitTest.java @@ -0,0 +1,146 @@ +package com.baeldung.java.properties; + +import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.util.Properties; + +import org.junit.Test; + +public class PropertiesUnitTest { + + @Test + public void givenPropertyValue_whenPropertiesFileLoaded_thenCorrect() throws IOException { + + String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); + String appConfigPath = rootPath + "app.properties"; + String catalogConfigPath = rootPath + "catalog"; + + Properties appProps = new Properties(); + appProps.load(new FileInputStream(appConfigPath)); + + Properties catalogProps = new Properties(); + catalogProps.load(new FileInputStream(catalogConfigPath)); + + String appVersion = appProps.getProperty("version"); + assertEquals("1.0", appVersion); + + assertEquals("files", catalogProps.getProperty("c1")); + } + + @Test + public void givenPropertyValue_whenXMLPropertiesFileLoaded_thenCorrect() throws IOException { + + String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); + String iconConfigPath = rootPath + "icons.xml"; + Properties iconProps = new Properties(); + iconProps.loadFromXML(new FileInputStream(iconConfigPath)); + + assertEquals("icon1.jpg", iconProps.getProperty("fileIcon")); + } + + @Test + public void givenAbsentProperty_whenPropertiesFileLoaded_thenReturnsDefault() throws IOException { + + String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); + String appConfigPath = rootPath + "app.properties"; + Properties appProps = new Properties(); + appProps.load(new FileInputStream(appConfigPath)); + + String appVersion = appProps.getProperty("version"); + String appName = appProps.getProperty("name", "defaultName"); + String appGroup = appProps.getProperty("group", "baeldung"); + String appDownloadAddr = appProps.getProperty("downloadAddr"); + + assertEquals("1.0", appVersion); + assertEquals("TestApp", appName); + assertEquals("baeldung", appGroup); + assertNull(appDownloadAddr); + } + + @Test(expected = Exception.class) + public void givenImproperObjectCasting_whenPropertiesFileLoaded_thenThrowsException() throws IOException { + + String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); + String appConfigPath = rootPath + "app.properties"; + Properties appProps = new Properties(); + appProps.load(new FileInputStream(appConfigPath)); + + float appVerFloat = (float) appProps.get("version"); + } + + @Test + public void givenPropertyValue_whenPropertiesSet_thenCorrect() throws IOException { + + String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); + String appConfigPath = rootPath + "app.properties"; + Properties appProps = new Properties(); + appProps.load(new FileInputStream(appConfigPath)); + + appProps.setProperty("name", "NewAppName"); + appProps.setProperty("downloadAddr", "www.baeldung.com/downloads"); + + String newAppName = appProps.getProperty("name"); + assertEquals("NewAppName", newAppName); + + String newAppDownloadAddr = appProps.getProperty("downloadAddr"); + assertEquals("www.baeldung.com/downloads", newAppDownloadAddr); + } + + @Test + public void givenPropertyValueNull_whenPropertiesRemoved_thenCorrect() throws IOException { + + String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); + String appConfigPath = rootPath + "app.properties"; + Properties appProps = new Properties(); + appProps.load(new FileInputStream(appConfigPath)); + + String versionBeforeRemoval = appProps.getProperty("version"); + assertEquals("1.0", versionBeforeRemoval); + + appProps.remove("version"); + String versionAfterRemoval = appProps.getProperty("version"); + assertNull(versionAfterRemoval); + } + + @Test + public void whenPropertiesStoredInFile_thenCorrect() throws IOException { + + String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); + String appConfigPath = rootPath + "app.properties"; + Properties appProps = new Properties(); + appProps.load(new FileInputStream(appConfigPath)); + + String newAppConfigPropertiesFile = rootPath + "newApp.properties"; + appProps.store(new FileWriter(newAppConfigPropertiesFile), "store to properties file"); + + String newAppConfigXmlFile = rootPath + "newApp.xml"; + appProps.storeToXML(new FileOutputStream(newAppConfigXmlFile), "store to xml file"); + } + + @Test + public void givenPropertyValueAbsent_LoadsValuesFromDefaultProperties() throws IOException { + + String rootPath = Thread.currentThread().getContextClassLoader().getResource("").getPath(); + + String defaultConfigPath = rootPath + "default.properties"; + Properties defaultProps = new Properties(); + defaultProps.load(new FileInputStream(defaultConfigPath)); + + String appConfigPath = rootPath + "app.properties"; + Properties appProps = new Properties(defaultProps); + appProps.load(new FileInputStream(appConfigPath)); + + String appName = appProps.getProperty("name"); + String appVersion = appProps.getProperty("version"); + String defaultSite = appProps.getProperty("site"); + + assertEquals("1.0", appVersion); + assertEquals("TestApp", appName); + assertEquals("www.google.com", defaultSite); + } +} diff --git a/core-java/src/test/resources/app.properties b/core-java/src/test/resources/app.properties new file mode 100644 index 0000000000..ff6174ec2a --- /dev/null +++ b/core-java/src/test/resources/app.properties @@ -0,0 +1,3 @@ +version=1.0 +name=TestApp +date=2016-11-12 \ No newline at end of file diff --git a/core-java/src/test/resources/catalog b/core-java/src/test/resources/catalog new file mode 100644 index 0000000000..488513d0ce --- /dev/null +++ b/core-java/src/test/resources/catalog @@ -0,0 +1,3 @@ +c1=files +c2=images +c3=videos \ No newline at end of file diff --git a/core-java/src/test/resources/default.properties b/core-java/src/test/resources/default.properties new file mode 100644 index 0000000000..df1bab371c --- /dev/null +++ b/core-java/src/test/resources/default.properties @@ -0,0 +1,4 @@ +site=www.google.com +name=DefaultAppName +topic=Properties +category=core-java \ No newline at end of file diff --git a/core-java/src/test/resources/icons.xml b/core-java/src/test/resources/icons.xml new file mode 100644 index 0000000000..0db7b2699a --- /dev/null +++ b/core-java/src/test/resources/icons.xml @@ -0,0 +1,8 @@ + + + + xml example + icon1.jpg + icon2.jpg + icon3.jpg + \ No newline at end of file From be16616bb82749212e259b4d0e44d3f28601a9f4 Mon Sep 17 00:00:00 2001 From: Juan Moreno Date: Sat, 8 Dec 2018 16:21:30 -0300 Subject: [PATCH 224/429] Added new samples --- java-streams/.attach_pid12113 | 0 .../stream/filter/StreamFilterUnitTest.java | 94 ++++++++++++++----- 2 files changed, 69 insertions(+), 25 deletions(-) create mode 100644 java-streams/.attach_pid12113 diff --git a/java-streams/.attach_pid12113 b/java-streams/.attach_pid12113 new file mode 100644 index 0000000000..e69de29bb2 diff --git a/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java b/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java index c89a27cdf1..cf82802940 100644 --- a/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java +++ b/java-streams/src/test/java/com/baeldung/stream/filter/StreamFilterUnitTest.java @@ -8,56 +8,93 @@ import java.io.IOException; import java.util.Arrays; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import java.util.stream.Stream; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; +import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; public class StreamFilterUnitTest { @Test - public void givenListOfCustomers_whenFilterByLambda_thenGetTwo() { - List customers = Arrays.asList(new Customer("John P.", 15), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), new Customer("Mary T.", 1)); + public void givenListOfCustomers_whenFilterByPoints_thenGetTwo() { + Customer john = new Customer("John P.", 15); + Customer sarah = new Customer("Sarah M.", 200); + Customer charles = new Customer("Charles B.", 150); + Customer mary = new Customer("Mary T.", 1); + List customers = Arrays.asList(john, sarah, charles, mary); - long customersWithMoreThan100Points = customers + List customersWithMoreThan100Points = customers .stream() .filter(c -> c.getPoints() > 100) - .count(); + .collect(Collectors.toList()); - assertThat(customersWithMoreThan100Points).isEqualTo(2); + assertThat(customersWithMoreThan100Points).hasSize(2); + assertThat(customersWithMoreThan100Points).contains(sarah, charles); + } + + @Test + public void givenListOfCustomers_whenFilterByPointsAndName_thenGetOne() { + Customer john = new Customer("John P.", 15); + Customer sarah = new Customer("Sarah M.", 200); + Customer charles = new Customer("Charles B.", 150); + Customer mary = new Customer("Mary T.", 1); + List customers = Arrays.asList(john, sarah, charles, mary); + + List charlesWithMoreThan100Points = customers + .stream() + .filter(c -> c.getPoints() > 100 && c + .getName() + .startsWith("Charles")) + .collect(Collectors.toList()); + + assertThat(charlesWithMoreThan100Points).hasSize(1); + assertThat(charlesWithMoreThan100Points).contains(charles); } @Test public void givenListOfCustomers_whenFilterByMethodReference_thenGetTwo() { - List customers = Arrays.asList(new Customer("John P.", 15), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), new Customer("Mary T.", 1)); + Customer john = new Customer("John P.", 15); + Customer sarah = new Customer("Sarah M.", 200); + Customer charles = new Customer("Charles B.", 150); + Customer mary = new Customer("Mary T.", 1); + List customers = Arrays.asList(john, sarah, charles, mary); - long customersWithMoreThan100Points = customers + List customersWithMoreThan100Points = customers .stream() .filter(Customer::hasOverThousandPoints) - .count(); + .collect(Collectors.toList()); - assertThat(customersWithMoreThan100Points).isEqualTo(2); + assertThat(customersWithMoreThan100Points).hasSize(2); + assertThat(customersWithMoreThan100Points).contains(sarah, charles); } @Test public void givenListOfCustomersWithOptional_whenFilterBy100Points_thenGetTwo() { - List> customers = Arrays.asList(Optional.of(new Customer("John P.", 15)), Optional.of(new Customer("Sarah M.", 200)), Optional.empty(), Optional.of(new Customer("Mary T.", 300)), Optional.empty()); + Optional john = Optional.of(new Customer("John P.", 15)); + Optional sarah = Optional.of(new Customer("Sarah M.", 200)); + Optional mary = Optional.of(new Customer("Mary T.", 300)); + List> customers = Arrays.asList(john, sarah, Optional.empty(), mary, Optional.empty()); - long customersWithMoreThan100Points = customers + List customersWithMoreThan100Points = customers .stream() .flatMap(c -> c .map(Stream::of) .orElseGet(Stream::empty)) .filter(Customer::hasOverThousandPoints) - .count(); + .collect(Collectors.toList()); - assertThat(customersWithMoreThan100Points).isEqualTo(2); + assertThat(customersWithMoreThan100Points).hasSize(2); + assertThat(customersWithMoreThan100Points).contains(sarah.get(), mary.get()); } @Test public void givenListOfCustomers_whenFilterWithCustomHandling_thenThrowException() { - List customers = Arrays.asList(new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), - new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e")); + Customer john = new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"); + Customer sarah = new Customer("Sarah M.", 200); + Customer charles = new Customer("Charles B.", 150); + Customer mary = new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e"); + List customers = Arrays.asList(john, sarah, charles, mary); assertThatThrownBy(() -> customers .stream() @@ -67,21 +104,27 @@ public class StreamFilterUnitTest { @Test public void givenListOfCustomers_whenFilterWithThrowingFunction_thenThrowException() { - List customers = Arrays.asList(new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), - new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e")); + Customer john = new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"); + Customer sarah = new Customer("Sarah M.", 200); + Customer charles = new Customer("Charles B.", 150); + Customer mary = new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e"); + List customers = Arrays.asList(john, sarah, charles, mary); assertThatThrownBy(() -> customers .stream() .filter((ThrowingPredicate.unchecked(Customer::hasValidProfilePhoto))) - .count()).isInstanceOf(WrappedException.class); + .collect(Collectors.toList())).isInstanceOf(WrappedException.class); } @Test public void givenListOfCustomers_whenFilterWithTryCatch_thenGetTwo() { - List customers = Arrays.asList(new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"), new Customer("Sarah M.", 200), new Customer("Charles B.", 150), - new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e")); + Customer john = new Customer("John P.", 15, "https://images.unsplash.com/photo-1543320485-d0d5a49c2b2e"); + Customer sarah = new Customer("Sarah M.", 200); + Customer charles = new Customer("Charles B.", 150); + Customer mary = new Customer("Mary T.", 1, "https://images.unsplash.com/photo-1543297057-25167dfc180e"); + List customers = Arrays.asList(john, sarah, charles, mary); - long customersWithValidProfilePhoto = customers + List customersWithValidProfilePhoto = customers .stream() .filter(c -> { try { @@ -91,9 +134,10 @@ public class StreamFilterUnitTest { } return false; }) - .count(); + .collect(Collectors.toList()); - assertThat(customersWithValidProfilePhoto).isEqualTo(2); + assertThat(customersWithValidProfilePhoto).hasSize(2); + assertThat(customersWithValidProfilePhoto).contains(john, mary); } @Test @@ -110,6 +154,6 @@ public class StreamFilterUnitTest { throw new RuntimeException(e); } }) - .count()).isInstanceOf(RuntimeException.class); + .collect(Collectors.toList())).isInstanceOf(RuntimeException.class); } } From dfca36b9addbd24a123ca250d40a3c8dfda75258 Mon Sep 17 00:00:00 2001 From: Juan Moreno Date: Sat, 8 Dec 2018 16:31:20 -0300 Subject: [PATCH 225/429] Removed .attach_pid12113 file --- java-streams/.attach_pid12113 | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 java-streams/.attach_pid12113 diff --git a/java-streams/.attach_pid12113 b/java-streams/.attach_pid12113 deleted file mode 100644 index e69de29bb2..0000000000 From b51ae5b065521814e8d84fcc05f9e7c340968e4e Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 8 Dec 2018 22:16:52 +0200 Subject: [PATCH 226/429] fix package name, start class --- spring-rest/pom.xml | 4 +--- spring-rest/src/main/webapp/WEB-INF/api-servlet.xml | 2 +- spring-rest/src/main/webapp/WEB-INF/web.xml | 2 +- .../com/baeldung/web/controller/mediatypes/TestConfig.java | 2 +- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index 1a4ad2fbb6..ea4cfc26d7 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -183,9 +183,6 @@ org.springframework.boot spring-boot-maven-plugin - - true - org.apache.maven.plugins @@ -300,6 +297,7 @@ 2.2.0 3.5.11 3.1.0 + com.baeldung.sampleapp.config.MainApplication diff --git a/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml b/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml index 7e7d820836..ddb9c91792 100644 --- a/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml +++ b/spring-rest/src/main/webapp/WEB-INF/api-servlet.xml @@ -6,7 +6,7 @@ http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd" > - + diff --git a/spring-rest/src/main/webapp/WEB-INF/web.xml b/spring-rest/src/main/webapp/WEB-INF/web.xml index 1b8b767ae3..20a11f3422 100644 --- a/spring-rest/src/main/webapp/WEB-INF/web.xml +++ b/spring-rest/src/main/webapp/WEB-INF/web.xml @@ -16,7 +16,7 @@ contextConfigLocation - org.baeldung.config + com.baeldung.sampleapp.config + + diff --git a/spring-boot/src/main/resources/templates/displayallbeans.html b/spring-boot/src/main/resources/templates/displayallbeans.html new file mode 100644 index 0000000000..5fc78a7fca --- /dev/null +++ b/spring-boot/src/main/resources/templates/displayallbeans.html @@ -0,0 +1,10 @@ + + + + Baeldung + + +

+

+ + diff --git a/spring-boot/src/main/resources/templates/error-404.html b/spring-boot/src/main/resources/templates/error-404.html new file mode 100644 index 0000000000..cf68032596 --- /dev/null +++ b/spring-boot/src/main/resources/templates/error-404.html @@ -0,0 +1,14 @@ + + + + + + + +
+
+

Sorry, we couldn't find the page you were looking for.

+

Go Home

+
+ + \ No newline at end of file diff --git a/spring-boot/src/main/resources/templates/error-500.html b/spring-boot/src/main/resources/templates/error-500.html new file mode 100644 index 0000000000..5ddf458229 --- /dev/null +++ b/spring-boot/src/main/resources/templates/error-500.html @@ -0,0 +1,16 @@ + + + + + + + +
+
+

Sorry, something went wrong!

+ +

We're fixing it.

+

Go Home

+
+ + \ No newline at end of file diff --git a/spring-boot/src/main/resources/templates/error.html b/spring-boot/src/main/resources/templates/error.html new file mode 100644 index 0000000000..bc517913b2 --- /dev/null +++ b/spring-boot/src/main/resources/templates/error.html @@ -0,0 +1,16 @@ + + + + + + + +
+
+

Something went wrong!

+ +

Our Engineers are on it.

+

Go Home

+
+ + diff --git a/spring-boot/src/main/resources/templates/error/404.html b/spring-boot/src/main/resources/templates/error/404.html new file mode 100644 index 0000000000..df83ce219b --- /dev/null +++ b/spring-boot/src/main/resources/templates/error/404.html @@ -0,0 +1,8 @@ + + + RESOURCE NOT FOUND + + +

404 RESOURCE NOT FOUND

+ + \ No newline at end of file diff --git a/spring-boot/src/main/resources/templates/external.html b/spring-boot/src/main/resources/templates/external.html new file mode 100644 index 0000000000..2f9cc76961 --- /dev/null +++ b/spring-boot/src/main/resources/templates/external.html @@ -0,0 +1,31 @@ + + + + + +
+
+

Customer Portal

+
+
+

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam + erat lectus, vehicula feugiat ultricies at, tempus sed ante. Cras + arcu erat, lobortis vitae quam et, mollis pharetra odio. Nullam sit + amet congue ipsum. Nunc dapibus odio ut ligula venenatis porta non + id dui. Duis nec tempor tellus. Suspendisse id blandit ligula, sit + amet varius mauris. Nulla eu eros pharetra, tristique dui quis, + vehicula libero. Aenean a neque sit amet tellus porttitor rutrum nec + at leo.

+ +

Existing Customers

+
+ Enter the intranet: customers +
+
+ +
+ + + + diff --git a/spring-boot/src/main/resources/templates/index.html b/spring-boot/src/main/resources/templates/index.html new file mode 100644 index 0000000000..c1314558f6 --- /dev/null +++ b/spring-boot/src/main/resources/templates/index.html @@ -0,0 +1,19 @@ + + + WebJars Demo + + + +

Welcome Home

+

+
+ × + Success! It is working as we expected. +
+
+ + + + + + diff --git a/spring-boot/src/main/resources/templates/international.html b/spring-boot/src/main/resources/templates/international.html new file mode 100644 index 0000000000..e0cfb5143b --- /dev/null +++ b/spring-boot/src/main/resources/templates/international.html @@ -0,0 +1,20 @@ + + + + +Home + + + + +

+ +

+: + + + \ No newline at end of file diff --git a/spring-boot/src/main/resources/templates/layout.html b/spring-boot/src/main/resources/templates/layout.html new file mode 100644 index 0000000000..bab0c2982b --- /dev/null +++ b/spring-boot/src/main/resources/templates/layout.html @@ -0,0 +1,18 @@ + + + +Customer Portal + + + + + \ No newline at end of file diff --git a/spring-boot/src/main/resources/templates/other.html b/spring-boot/src/main/resources/templates/other.html new file mode 100644 index 0000000000..d13373f9fe --- /dev/null +++ b/spring-boot/src/main/resources/templates/other.html @@ -0,0 +1,16 @@ + + + + +Spring Utils Demo + + + + Parameter set by you:

+ + \ No newline at end of file diff --git a/spring-boot/src/main/resources/templates/utils.html b/spring-boot/src/main/resources/templates/utils.html new file mode 100644 index 0000000000..93030f424f --- /dev/null +++ b/spring-boot/src/main/resources/templates/utils.html @@ -0,0 +1,23 @@ + + + + +Spring Utils Demo + + + +

+

Set Parameter:

+

+ + +

+
+Another Page + + \ No newline at end of file From 22d22c7c4e832acf2956f402ddfdc3adbff071e3 Mon Sep 17 00:00:00 2001 From: Wosin Date: Sun, 9 Dec 2018 22:26:28 +0100 Subject: [PATCH 237/429] BAEL-1039: Introduction to Derive4J (#5845) --- libraries/pom.xml | 7 ++++ .../com/baeldung/derive4j/adt/Either.java | 10 ++++++ .../baeldung/derive4j/lazy/LazyRequest.java | 21 ++++++++++++ .../derive4j/pattern/HTTPRequest.java | 15 +++++++++ .../derive4j/pattern/HTTPResponse.java | 19 +++++++++++ .../baeldung/derive4j/pattern/HTTPServer.java | 17 ++++++++++ .../baeldung/derive4j/adt/EitherUnitTest.java | 33 +++++++++++++++++++ .../derive4j/lazy/LazyRequestUnitTest.java | 28 ++++++++++++++++ .../derive4j/pattern/HTTPRequestUnitTest.java | 22 +++++++++++++ 9 files changed, 172 insertions(+) create mode 100644 libraries/src/main/java/com/baeldung/derive4j/adt/Either.java create mode 100644 libraries/src/main/java/com/baeldung/derive4j/lazy/LazyRequest.java create mode 100644 libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPRequest.java create mode 100644 libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPResponse.java create mode 100644 libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPServer.java create mode 100644 libraries/src/test/java/com/baeldung/derive4j/adt/EitherUnitTest.java create mode 100644 libraries/src/test/java/com/baeldung/derive4j/lazy/LazyRequestUnitTest.java create mode 100644 libraries/src/test/java/com/baeldung/derive4j/pattern/HTTPRequestUnitTest.java diff --git a/libraries/pom.xml b/libraries/pom.xml index fb1f1cd1b6..cb85a57304 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -717,6 +717,12 @@ ${suanshu.version} + + org.derive4j + derive4j + ${derive4j.version} + true + @@ -952,6 +958,7 @@ 4.5.1 3.3.0 3.0.2 + 1.1.0
diff --git a/libraries/src/main/java/com/baeldung/derive4j/adt/Either.java b/libraries/src/main/java/com/baeldung/derive4j/adt/Either.java new file mode 100644 index 0000000000..d22bb89fe2 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/derive4j/adt/Either.java @@ -0,0 +1,10 @@ +package com.baeldung.derive4j.adt; + +import org.derive4j.Data; + +import java.util.function.Function; + +@Data +interface Either{ + X match(Function left, Function right); +} diff --git a/libraries/src/main/java/com/baeldung/derive4j/lazy/LazyRequest.java b/libraries/src/main/java/com/baeldung/derive4j/lazy/LazyRequest.java new file mode 100644 index 0000000000..9f53f3d25b --- /dev/null +++ b/libraries/src/main/java/com/baeldung/derive4j/lazy/LazyRequest.java @@ -0,0 +1,21 @@ +package com.baeldung.derive4j.lazy; + +import org.derive4j.Data; +import org.derive4j.Derive; +import org.derive4j.Make; + +@Data(value = @Derive( + inClass = "{ClassName}Impl", + make = {Make.lazyConstructor, Make.constructors} +)) +public interface LazyRequest { + interface Cases{ + R GET(String path); + R POST(String path, String body); + R PUT(String path, String body); + R DELETE(String path); + } + + R match(LazyRequest.Cases method); +} + diff --git a/libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPRequest.java b/libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPRequest.java new file mode 100644 index 0000000000..04d630f1ef --- /dev/null +++ b/libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPRequest.java @@ -0,0 +1,15 @@ +package com.baeldung.derive4j.pattern; + +import org.derive4j.Data; + +@Data +interface HTTPRequest { + interface Cases{ + R GET(String path); + R POST(String path, String body); + R PUT(String path, String body); + R DELETE(String path); + } + + R match(Cases method); +} diff --git a/libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPResponse.java b/libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPResponse.java new file mode 100644 index 0000000000..593f94a8b7 --- /dev/null +++ b/libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPResponse.java @@ -0,0 +1,19 @@ +package com.baeldung.derive4j.pattern; + +public class HTTPResponse { + private int statusCode; + private String responseBody; + + public int getStatusCode() { + return statusCode; + } + + public String getResponseBody() { + return responseBody; + } + + public HTTPResponse(int statusCode, String responseBody) { + this.statusCode = statusCode; + this.responseBody = responseBody; + } +} diff --git a/libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPServer.java b/libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPServer.java new file mode 100644 index 0000000000..53f4af628c --- /dev/null +++ b/libraries/src/main/java/com/baeldung/derive4j/pattern/HTTPServer.java @@ -0,0 +1,17 @@ +package com.baeldung.derive4j.pattern; + + +public class HTTPServer { + public static String GET_RESPONSE_BODY = "Success!"; + public static String PUT_RESPONSE_BODY = "Resource Created!"; + public static String POST_RESPONSE_BODY = "Resource Updated!"; + public static String DELETE_RESPONSE_BODY = "Resource Deleted!"; + + public HTTPResponse acceptRequest(HTTPRequest request) { + return HTTPRequests.caseOf(request) + .GET((path) -> new HTTPResponse(200, GET_RESPONSE_BODY)) + .POST((path,body) -> new HTTPResponse(201, POST_RESPONSE_BODY)) + .PUT((path,body) -> new HTTPResponse(200, PUT_RESPONSE_BODY)) + .DELETE(path -> new HTTPResponse(200, DELETE_RESPONSE_BODY)); + } +} diff --git a/libraries/src/test/java/com/baeldung/derive4j/adt/EitherUnitTest.java b/libraries/src/test/java/com/baeldung/derive4j/adt/EitherUnitTest.java new file mode 100644 index 0000000000..511e24961f --- /dev/null +++ b/libraries/src/test/java/com/baeldung/derive4j/adt/EitherUnitTest.java @@ -0,0 +1,33 @@ +package com.baeldung.derive4j.adt; + +import org.assertj.core.api.Assertions; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnitRunner; + +import java.util.Optional; +import java.util.function.Function; +@RunWith(MockitoJUnitRunner.class) +public class EitherUnitTest { + @Test + public void testEitherIsCreatedFromRight() { + Either either = Eithers.right("Okay"); + Optional leftOptional = Eithers.getLeft(either); + Optional rightOptional = Eithers.getRight(either); + Assertions.assertThat(leftOptional).isEmpty(); + Assertions.assertThat(rightOptional).hasValue("Okay"); + + } + + @Test + public void testEitherIsMatchedWithRight() { + Either either = Eithers.right("Okay"); + Function leftFunction = Mockito.mock(Function.class); + Function rightFunction = Mockito.mock(Function.class); + either.match(leftFunction, rightFunction); + Mockito.verify(rightFunction, Mockito.times(1)).apply("Okay"); + Mockito.verify(leftFunction, Mockito.times(0)).apply(Mockito.any(Exception.class)); + } + +} diff --git a/libraries/src/test/java/com/baeldung/derive4j/lazy/LazyRequestUnitTest.java b/libraries/src/test/java/com/baeldung/derive4j/lazy/LazyRequestUnitTest.java new file mode 100644 index 0000000000..3830bc52d0 --- /dev/null +++ b/libraries/src/test/java/com/baeldung/derive4j/lazy/LazyRequestUnitTest.java @@ -0,0 +1,28 @@ +package com.baeldung.derive4j.lazy; + +import org.junit.Assert; +import org.junit.Test; +import org.mockito.Mockito; + +import java.util.function.Supplier; + +public class LazyRequestUnitTest { + + @Test + public void givenLazyContstructedRequest_whenRequestIsReferenced_thenRequestIsLazilyContructed() { + LazyRequestSupplier mockSupplier = Mockito.spy(new LazyRequestSupplier()); + + LazyRequest request = LazyRequestImpl.lazy(() -> mockSupplier.get()); + Mockito.verify(mockSupplier, Mockito.times(0)).get(); + Assert.assertEquals(LazyRequestImpl.getPath(request), "http://test.com/get"); + Mockito.verify(mockSupplier, Mockito.times(1)).get(); + + } + + class LazyRequestSupplier implements Supplier { + @Override + public LazyRequest get() { + return LazyRequestImpl.GET("http://test.com/get"); + } + } +} diff --git a/libraries/src/test/java/com/baeldung/derive4j/pattern/HTTPRequestUnitTest.java b/libraries/src/test/java/com/baeldung/derive4j/pattern/HTTPRequestUnitTest.java new file mode 100644 index 0000000000..0fc257742a --- /dev/null +++ b/libraries/src/test/java/com/baeldung/derive4j/pattern/HTTPRequestUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.derive4j.pattern; + +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; + +public class HTTPRequestUnitTest { + public static HTTPServer server; + + @BeforeClass + public static void setUp() { + server = new HTTPServer(); + } + + @Test + public void givenHttpGETRequest_whenRequestReachesServer_thenProperResponseIsReturned() { + HTTPRequest postRequest = HTTPRequests.POST("http://test.com/post", "Resource"); + HTTPResponse response = server.acceptRequest(postRequest); + Assert.assertEquals(201, response.getStatusCode()); + Assert.assertEquals(HTTPServer.POST_RESPONSE_BODY, response.getResponseBody()); + } +} From 36decb42b9fd72460e62e76739bcfa285e87af09 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Mon, 10 Dec 2018 23:07:46 +0530 Subject: [PATCH 238/429] Task/bael 10829 (#5844) * BAEL-10829 Clean up the parent pom of the tutorials project - Cleaned up projects list for default-first and integration-lite-first profiles * BAEL-10829 Fixing unit test in JGit * BAEL-10829 Clean up the parent pom of the tutorials project -Updated modules list for default-second and integration-lite-second profiles * BAEL-10829 Fixed repository for structurizr libraries and api changes done in StructurizrSimple to incorporate new version --- .../java/com/baeldung/jgit/porcelain/Log.java | 4 +- .../baeldung/jgit/JGitBugIntegrationTest.java | 2 + pom.xml | 920 ++++++++++++------ spring-cloud/pom.xml | 2 +- structurizr/pom.xml | 29 +- .../structurizr/StructurizrSimple.java | 15 +- 6 files changed, 617 insertions(+), 355 deletions(-) diff --git a/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java b/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java index cb476b9d9e..a50028a9ae 100644 --- a/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java +++ b/JGit/src/main/java/com/baeldung/jgit/porcelain/Log.java @@ -28,14 +28,14 @@ public class Log { System.out.println("Had " + count + " commits overall on current branch"); logs = git.log() - .add(repository.resolve("remotes/origin/testbranch")) + .add(repository.resolve(git.getRepository().getFullBranch())) .call(); count = 0; for (RevCommit rev : logs) { System.out.println("Commit: " + rev /* + ", name: " + rev.getName() + ", id: " + rev.getId().getName() */); count++; } - System.out.println("Had " + count + " commits overall on test-branch"); + System.out.println("Had " + count + " commits overall on "+git.getRepository().getFullBranch()); logs = git.log() .all() diff --git a/JGit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java b/JGit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java index ed7168b2c2..ad34890996 100644 --- a/JGit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java +++ b/JGit/src/test/java/com/baeldung/jgit/JGitBugIntegrationTest.java @@ -1,3 +1,5 @@ +package com.baeldung.jgit; + import com.baeldung.jgit.helper.Helper; import org.eclipse.jgit.lib.ObjectLoader; import org.eclipse.jgit.lib.ObjectReader; diff --git a/pom.xml b/pom.xml index eb60cb2e45..4e1e61961e 100644 --- a/pom.xml +++ b/pom.xml @@ -330,165 +330,235 @@ parent-java parent-kotlin - asm - atomix - aws - aws-lambda akka-streams algorithms-genetic algorithms-miscellaneous-1 algorithms-miscellaneous-2 algorithms-sorting + animal-sniffer-mvn-plugin annotations + antlr + apache-avro + apache-bval + apache-curator apache-cxf apache-fop - apache-poi - apache-tika - apache-thrift - apache-curator - apache-zookeeper + apache-geode + apache-meecrowave apache-opennlp + apache-poi + apache-pulsar + apache-shiro + apache-solrj + apache-spark + apache-thrift + apache-tika + apache-velocity + apache-zookeeper + asciidoctor + asm + atomix autovalue + aws + aws-lambda axon azure - apache-velocity - apache-solrj - apache-meecrowave - antlr - - bootique - - cdi - core-java-collections - core-java-io - core-java-8 - core-groovy - couchbase - - - core-java - core-java-networking - dozer - disruptor - drools + bootique + + cas/cas-secured-app + cas/cas-server + cdi + checker-plugin + core-groovy + + + core-java-8 + + core-java-arrays + core-java-collections + core-java-concurrency-collections + core-java-io + core-java-lang + core-java-networking + core-java-sun + core-scala + couchbase + custom-pmd + + dagger + data-structures + ddd deeplearning4j + disruptor + dozer + drools + dubbo ethereum feign flips + flyway-cdi-extension + geotools google-cloud + google-web-toolkit + + + graphql/graphql-java + grpc gson guava guava-collections guava-modules/guava-18 guava-modules/guava-19 guava-modules/guava-21 + guice hazelcast - hystrix + helidon httpclient + hystrix image-processing immutables - + jackson - java-strings - java-collections-conversions java-collections-maps - java-streams + + java-ee-8-security-api java-lite java-numbers java-rmi + java-spi + java-streams + java-strings java-vavr-stream + java-websocket + javafx javax-servlets javaxval jaxb - javafx - jgroups jee-7-security + jersey + JGit + jgroups + jhipster + jib jjwt + jmeter + jmh + jni + jooby jsf - json-path json + json-path jsoup jta - jws - jersey - java-spi - java-ee-8-security-api + + + kotlin-libraries - + libraries-data + libraries-security + libraries-server linkrest - logging-modules/log-mdc logging-modules/log4j + logging-modules/log4j2 logging-modules/logback + logging-modules/log-mdc lombok lucene - + mapstruct maven + maven-archetype + + maven-polyglot/maven-polyglot-json-extension + mesos-marathon + metrics + + microprofile msf4j + mustache mvn-wrapper mybatis - metrics - maven-archetype noexception - osgi + optaplanner orika - + osgi + patterns pdf - protobuffer performance-tests + + protobuffer + persistence-modules/activejdbc + persistence-modules/apache-cayenne + persistence-modules/core-java-persistence + persistence-modules/deltaspike + persistence-modules/flyway + persistence-modules/hbase + persistence-modules/hibernate5 + persistence-modules/influxdb + persistence-modules/java-cassandra + persistence-modules/java-cockroachdb persistence-modules/java-jdbi - persistence-modules/redis + persistence-modules/java-jpa + persistence-modules/java-mongodb + persistence-modules/jnosql + persistence-modules/liquibase persistence-modules/orientdb persistence-modules/querydsl - persistence-modules/apache-cayenne + persistence-modules/redis persistence-modules/solr - persistence-modules/spring-data-dynamodb - persistence-modules/spring-data-keyvalue - persistence-modules/spring-data-neo4j - persistence-modules/spring-data-solr - persistence-modules/spring-hibernate-5 - persistence-modules/spring-data-eclipselink - persistence-modules/spring-jpa - persistence-modules/spring-hibernate-3 - persistence-modules/spring-data-gemfire + persistence-modules/spring-boot-h2/spring-boot-h2-database persistence-modules/spring-boot-persistence - persistence-modules/liquibase - persistence-modules/java-cockroachdb - persistence-modules/deltaspike - persistence-modules/hbase - persistence-modules/influxdb - persistence-modules/spring-hibernate4 - persistence-modules/spring-data-mongodb - persistence-modules/java-cassandra + persistence-modules/spring-boot-persistence-mongodb persistence-modules/spring-data-cassandra + persistence-modules/spring-data-cassandra-reactive persistence-modules/spring-data-couchbase-2 + persistence-modules/spring-data-dynamodb + persistence-modules/spring-data-eclipselink + persistence-modules/spring-data-elasticsearch + persistence-modules/spring-data-gemfire + persistence-modules/spring-data-jpa + persistence-modules/spring-data-keyvalue + persistence-modules/spring-data-mongodb + persistence-modules/spring-data-neo4j persistence-modules/spring-data-redis - persistence-modules/spring-boot-persistence-mongodb - - reactor-core - resteasy - rsocket - rxjava - rxjava-2 + persistence-modules/spring-data-solr + persistence-modules/spring-hibernate-3 + persistence-modules/spring-hibernate-5 + persistence-modules/spring-hibernate4 + persistence-modules/spring-jpa + rabbitmq - + + ratpack + reactor-core + rest-with-spark-java + resteasy + restx + + rule-engines/easy-rules + rule-engines/openl-tablets + rule-engines/rulebook + rsocket + rxjava + rxjava-2 + @@ -528,98 +598,120 @@ parent-java parent-kotlin - spring-4 - spring-5 - spring-5-reactive - spring-5-reactive-security - spring-5-reactive-client - spring-5-mvc - spring-5-security - spring-5-security-oauth + saas + spark-java + + spring-4 + + spring-5 + spring-5-mvc + spring-5-reactive + spring-5-reactive-client + spring-5-reactive-oauth + spring-5-reactive-security + spring-5-security + spring-5-security-oauth - spring-aop spring-activiti spring-akka - spring-amqp spring-all + spring-amqp + spring-aop spring-apache-camel spring-batch spring-bom - spring-boot-keycloak - spring-boot-bootstrap - spring-boot-admin - spring-boot-camel - spring-boot-security - spring-boot-mvc - spring-boot-logging-log4j2 - spring-boot-disable-console-logging - spring-boot-property-exp - spring-boot-ctx-fluent - spring-boot - spring-boot-ops - spring-cloud-data-flow + spring-boot + spring-boot-admin + spring-boot-angular-ecommerce + spring-boot-autoconfiguration + spring-boot-bootstrap + spring-boot-camel + + spring-boot-client + 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-mvc + spring-boot-ops + spring-boot-property-exp + spring-boot-security + spring-boot-vue + spring-cloud spring-cloud-bus + + spring-cloud-data-flow + spring-core spring-cucumber + spring-data-rest - spring-drools + spring-data-rest-querydsl spring-dispatcher-servlet + spring-drools + spring-ejb spring-exceptions spring-freemarker + + spring-groovy + spring-integration - spring-jinq spring-jenkins-pipeline spring-jersey + spring-jinq spring-jms spring-jooq + spring-kafka spring-katharsis + spring-ldap + spring-mobile spring-mockito + spring-mustache spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java + spring-mvc-kotlin + spring-mvc-simple spring-mvc-velocity spring-mvc-webflow spring-mvc-xml - spring-mvc-kotlin + spring-mybatis spring-protobuf + spring-quartz - spring-rest-angular - spring-rest-full - spring-rest-query-language - spring-rest - spring-resttemplate - spring-rest-simple - spring-remoting - spring-session - spring-sleuth - spring-social-login - spring-spel - spring-state-machine - spring-thymeleaf - spring-userservice - - spring-zuul + spring-reactive-kotlin spring-reactor - spring-vertx - spring-vault + spring-remoting + spring-rest + spring-rest-angular spring-rest-embedded-tomcat - spring-swagger-codegen - spring-webflux-amqp + spring-rest-full + spring-rest-hal-browser + spring-rest-query-language + spring-rest-shell + spring-rest-simple + spring-rest-template + spring-resttemplate + spring-roo - spring-static-resources - spring-security-thymeleaf spring-security-acl + spring-security-angular/server spring-security-cache-control + spring-security-client/spring-security-jsp-authentication spring-security-client/spring-security-jsp-authorize spring-security-client/spring-security-jsp-config @@ -627,8 +719,10 @@ spring-security-client/spring-security-thymeleaf-authentication spring-security-client/spring-security-thymeleaf-authorize spring-security-client/spring-security-thymeleaf-config + spring-security-core spring-security-mvc-boot + spring-security-mvc-custom spring-security-mvc-digest-auth spring-security-mvc-ldap spring-security-mvc-login @@ -637,65 +731,73 @@ spring-security-mvc-socket spring-security-openid + spring-security-rest spring-security-rest-basic-auth spring-security-rest-custom - spring-security-rest spring-security-sso + spring-security-stormpath + spring-security-thymeleaf spring-security-x509 - spring-security-mvc-custom + spring-session + spring-sleuth + spring-social-login + spring-spel + spring-state-machine + spring-static-resources + spring-swagger-codegen - spark-java - saas + spring-thymeleaf + + spring-userservice + + spring-vault + spring-vertx + + spring-webflux-amqp + + spring-zuul + + sse-jaxrs + static-analysis + stripe + structurizr struts-2 - testing-modules/selenium-junit-testng + testing-modules/gatling testing-modules/groovy-spock + testing-modules/junit-5 + testing-modules/junit5-migration + testing-modules/load-testing-comparison testing-modules/mockito testing-modules/mockito-2 testing-modules/mocks + testing-modules/mockserver + testing-modules/parallel-tests-junit testing-modules/rest-assured testing-modules/rest-testing - testing-modules/junit-5 - testing-modules/junit5-migration + + testing-modules/selenium-junit-testng + testing-modules/spring-testing + testing-modules/test-containers testing-modules/testing testing-modules/testng - testing-modules/mockserver - testing-modules/test-containers + twilio + Twitter4J undertow - video-tutorials - vaadin - vertx-and-rxjava - vraptor - vertx vavr + vertx + vertx-and-rxjava + video-tutorials + vraptor + + wicket - xmlunit-2 xml - - - - - - - - - + xmlunit-2 + xstream @@ -845,7 +947,7 @@ spring-swagger-codegen/spring-swagger-codegen-app spring-thymeleaf spring-userservice - spring-vault + spring-vault spring-vertx spring-zuul/spring-zuul-foos-resource persistence-modules/spring-data-dynamodb @@ -856,6 +958,61 @@ + + default-heavy + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + 3 + true + + **/*IntegrationTest.java + **/*IntTest.java + **/*LongRunningUnitTest.java + **/*ManualTest.java + **/*JdbcTest.java + **/*LiveTest.java + + + + + + + + + parent-boot-1 + parent-boot-2 + parent-boot-2.0-temp + parent-spring-4 + parent-spring-5 + parent-java + parent-kotlin + + core-java + core-java-concurrency + core-kotlin + + jenkins/hello-world + jws + + libraries + + persistence-modules/hibernate5 + persistence-modules/java-jpa + persistence-modules/jnosql + + spring-5-data-reactive + spring-amqp-simple + + vaadin + + + integration-lite-first @@ -887,165 +1044,236 @@ parent-java parent-kotlin - asm - atomix - aws - aws-lambda akka-streams algorithms-genetic algorithms-miscellaneous-1 algorithms-miscellaneous-2 algorithms-sorting + animal-sniffer-mvn-plugin annotations + antlr + apache-avro + apache-bval + apache-curator apache-cxf apache-fop - apache-poi - apache-tika - apache-thrift - apache-curator - apache-zookeeper + apache-geode + apache-meecrowave apache-opennlp + apache-poi + apache-pulsar + apache-shiro + apache-solrj + apache-spark + apache-thrift + apache-tika + apache-velocity + apache-zookeeper + asciidoctor + asm + atomix autovalue + aws + aws-lambda axon azure - apache-velocity - apache-solrj - apache-meecrowave - antlr - + bootique - + + cas/cas-secured-app + cas/cas-server cdi - core-java-collections - core-java-io - core-java-8 + checker-plugin core-groovy - couchbase - - - core-java + + + core-java-8 + + core-java-arrays + core-java-collections + core-java-concurrency-collections + core-java-io + core-java-lang core-java-networking - - dozer - disruptor - drools + core-java-sun + core-scala + couchbase + custom-pmd + + dagger + data-structures + ddd deeplearning4j + disruptor + dozer + drools + dubbo ethereum feign flips + flyway-cdi-extension + geotools google-cloud + google-web-toolkit + + + graphql/graphql-java + grpc gson guava guava-collections guava-modules/guava-18 guava-modules/guava-19 guava-modules/guava-21 + guice hazelcast - hystrix + helidon httpclient + hystrix image-processing immutables - + jackson - java-strings - java-collections-conversions java-collections-maps - java-streams + + java-ee-8-security-api java-lite java-numbers java-rmi + java-spi + java-streams + java-strings java-vavr-stream + java-websocket + javafx javax-servlets javaxval jaxb - javafx - jgroups jee-7-security + jersey + JGit + jgroups + jhipster + jib jjwt + jmeter + jmh + jni + jooby jsf - json-path json + json-path jsoup jta - jws - jersey - java-spi - java-ee-8-security-api + + + kotlin-libraries - + libraries-data + libraries-security + libraries-server linkrest - logging-modules/log-mdc logging-modules/log4j + logging-modules/log4j2 logging-modules/logback + logging-modules/log-mdc lombok lucene - + mapstruct maven + maven-archetype + + maven-polyglot/maven-polyglot-json-extension + mesos-marathon + metrics + + microprofile msf4j + mustache mvn-wrapper mybatis - metrics - maven-archetype noexception - osgi + optaplanner orika - + osgi + patterns pdf - protobuffer performance-tests + + protobuffer + persistence-modules/activejdbc + persistence-modules/apache-cayenne + persistence-modules/core-java-persistence + persistence-modules/deltaspike + persistence-modules/flyway + persistence-modules/hbase + persistence-modules/hibernate5 + persistence-modules/influxdb + persistence-modules/java-cassandra + persistence-modules/java-cockroachdb persistence-modules/java-jdbi - persistence-modules/redis + persistence-modules/java-jpa + persistence-modules/java-mongodb + persistence-modules/jnosql + persistence-modules/liquibase persistence-modules/orientdb persistence-modules/querydsl - persistence-modules/apache-cayenne + persistence-modules/redis persistence-modules/solr - persistence-modules/spring-data-dynamodb - persistence-modules/spring-data-keyvalue - persistence-modules/spring-data-neo4j - persistence-modules/spring-data-solr - persistence-modules/spring-hibernate-5 - persistence-modules/spring-data-eclipselink - persistence-modules/spring-jpa - persistence-modules/spring-hibernate-3 - persistence-modules/spring-data-gemfire + persistence-modules/spring-boot-h2/spring-boot-h2-database persistence-modules/spring-boot-persistence - persistence-modules/liquibase - persistence-modules/java-cockroachdb - persistence-modules/deltaspike - persistence-modules/hbase - persistence-modules/influxdb - persistence-modules/spring-hibernate4 - persistence-modules/spring-data-mongodb - persistence-modules/java-cassandra + persistence-modules/spring-boot-persistence-mongodb persistence-modules/spring-data-cassandra + persistence-modules/spring-data-cassandra-reactive persistence-modules/spring-data-couchbase-2 + persistence-modules/spring-data-dynamodb + persistence-modules/spring-data-eclipselink + persistence-modules/spring-data-elasticsearch + persistence-modules/spring-data-gemfire + persistence-modules/spring-data-jpa + persistence-modules/spring-data-keyvalue + persistence-modules/spring-data-mongodb + persistence-modules/spring-data-neo4j persistence-modules/spring-data-redis - - reactor-core - resteasy - rsocket - rxjava - rxjava-2 + persistence-modules/spring-data-solr + persistence-modules/spring-hibernate-3 + persistence-modules/spring-hibernate-5 + persistence-modules/spring-hibernate4 + persistence-modules/spring-jpa + rabbitmq - - + + ratpack + reactor-core + rest-with-spark-java + resteasy + restx + + rule-engines/easy-rules + rule-engines/openl-tablets + rule-engines/rulebook + rsocket + rxjava + rxjava-2 + + @@ -1080,98 +1308,120 @@ parent-java parent-kotlin - spring-4 - spring-5 - spring-5-reactive - spring-5-reactive-security - spring-5-reactive-client - spring-5-mvc - spring-5-security - spring-5-security-oauth + saas + spark-java + + spring-4 + + spring-5 + spring-5-mvc + spring-5-reactive + spring-5-reactive-client + spring-5-reactive-oauth + spring-5-reactive-security + spring-5-security + spring-5-security-oauth - spring-aop spring-activiti spring-akka - spring-amqp spring-all + spring-amqp + spring-aop spring-apache-camel spring-batch spring-bom - spring-boot-keycloak - spring-boot-bootstrap - spring-boot-admin - spring-boot-camel - spring-boot-security - spring-boot-mvc - spring-boot-logging-log4j2 - spring-boot-disable-console-logging - spring-boot-property-exp - spring-boot-ctx-fluent - spring-boot - spring-boot-ops - spring-cloud-data-flow + spring-boot + spring-boot-admin + spring-boot-angular-ecommerce + spring-boot-autoconfiguration + spring-boot-bootstrap + spring-boot-camel + + spring-boot-client + 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-mvc + spring-boot-ops + spring-boot-property-exp + spring-boot-security + spring-boot-vue + spring-cloud spring-cloud-bus + + spring-cloud-data-flow + spring-core spring-cucumber + spring-data-rest - spring-drools + spring-data-rest-querydsl spring-dispatcher-servlet + spring-drools + spring-ejb spring-exceptions spring-freemarker + + spring-groovy + spring-integration - spring-jinq spring-jenkins-pipeline spring-jersey + spring-jinq spring-jms spring-jooq + spring-kafka spring-katharsis + spring-ldap + spring-mobile spring-mockito + spring-mustache spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java + spring-mvc-kotlin + spring-mvc-simple spring-mvc-velocity spring-mvc-webflow spring-mvc-xml - spring-mvc-kotlin + spring-mybatis spring-protobuf + spring-quartz - spring-rest-angular - spring-rest-full - spring-rest-query-language - spring-rest - spring-resttemplate - spring-rest-simple - spring-remoting - spring-session - spring-sleuth - spring-social-login - spring-spel - spring-state-machine - spring-thymeleaf - spring-userservice - - spring-zuul + spring-reactive-kotlin spring-reactor - spring-vertx - spring-vault + spring-remoting + spring-rest + spring-rest-angular spring-rest-embedded-tomcat - spring-swagger-codegen - spring-webflux-amqp + spring-rest-full + spring-rest-hal-browser + spring-rest-query-language + spring-rest-shell + spring-rest-simple + spring-rest-template + spring-resttemplate + spring-roo - spring-static-resources - spring-security-thymeleaf spring-security-acl + spring-security-angular/server spring-security-cache-control + spring-security-client/spring-security-jsp-authentication spring-security-client/spring-security-jsp-authorize spring-security-client/spring-security-jsp-config @@ -1179,8 +1429,10 @@ spring-security-client/spring-security-thymeleaf-authentication spring-security-client/spring-security-thymeleaf-authorize spring-security-client/spring-security-thymeleaf-config + spring-security-core spring-security-mvc-boot + spring-security-mvc-custom spring-security-mvc-digest-auth spring-security-mvc-ldap spring-security-mvc-login @@ -1189,65 +1441,73 @@ spring-security-mvc-socket spring-security-openid + spring-security-rest spring-security-rest-basic-auth spring-security-rest-custom - spring-security-rest spring-security-sso + spring-security-stormpath + spring-security-thymeleaf spring-security-x509 - spring-security-mvc-custom + spring-session + spring-sleuth + spring-social-login + spring-spel + spring-state-machine + spring-static-resources + spring-swagger-codegen - spark-java - saas + spring-thymeleaf + + spring-userservice + + spring-vault + spring-vertx + + spring-webflux-amqp + + spring-zuul + + sse-jaxrs + static-analysis + stripe + structurizr struts-2 - testing-modules/selenium-junit-testng + testing-modules/gatling testing-modules/groovy-spock + testing-modules/junit-5 + testing-modules/junit5-migration + testing-modules/load-testing-comparison testing-modules/mockito testing-modules/mockito-2 testing-modules/mocks + testing-modules/mockserver + testing-modules/parallel-tests-junit testing-modules/rest-assured testing-modules/rest-testing - testing-modules/junit-5 - testing-modules/junit5-migration + + testing-modules/selenium-junit-testng + testing-modules/spring-testing + testing-modules/test-containers testing-modules/testing testing-modules/testng - testing-modules/mockserver - testing-modules/test-containers + twilio + Twitter4J undertow - video-tutorials - vaadin - vertx-and-rxjava - vraptor - vertx vavr + vertx + vertx-and-rxjava + video-tutorials + vraptor + + wicket - xmlunit-2 xml - - - - - - - - - + xmlunit-2 + xstream @@ -1282,9 +1542,25 @@ parent-spring-4 parent-spring-5 parent-java - parent-kotlin + parent-kotlin - + core-java + core-java-concurrency + core-kotlin + + jenkins/hello-world + jws + + libraries + + persistence-modules/hibernate5 + persistence-modules/java-jpa + persistence-modules/jnosql + + spring-5-data-reactive + spring-amqp-simple + + vaadin diff --git a/spring-cloud/pom.xml b/spring-cloud/pom.xml index 28db4a7a3d..39cda888c5 100644 --- a/spring-cloud/pom.xml +++ b/spring-cloud/pom.xml @@ -35,7 +35,7 @@ spring-cloud-archaius spring-cloud-functions spring-cloud-vault - spring-cloud-security + spring-cloud-task spring-cloud-zuul diff --git a/structurizr/pom.xml b/structurizr/pom.xml index 76b1e355f1..b9f9b68717 100644 --- a/structurizr/pom.xml +++ b/structurizr/pom.xml @@ -2,7 +2,6 @@ 4.0.0 - com.baeldung structurizr structurizr @@ -26,32 +25,24 @@ com.structurizr structurizr-client - ${structurizr-client.version} + ${structurizr.version} - org.springframework - spring-context - ${spring.version} + com.structurizr + structurizr-analysis + ${structurizr.version} + + + com.structurizr + structurizr-plantuml + ${structurizr.version} - - - - false - - central - bintray - http://jcenter.bintray.com - - - 1.8 1.8 - 1.0.0-RC3 - 0.6.0 - 4.3.8.RELEASE + 1.0.0-RC5 \ No newline at end of file diff --git a/structurizr/src/main/java/com/baeldung/structurizr/StructurizrSimple.java b/structurizr/src/main/java/com/baeldung/structurizr/StructurizrSimple.java index 6eb0c7de73..b33a1d9a77 100644 --- a/structurizr/src/main/java/com/baeldung/structurizr/StructurizrSimple.java +++ b/structurizr/src/main/java/com/baeldung/structurizr/StructurizrSimple.java @@ -4,12 +4,10 @@ import java.io.File; import java.io.StringWriter; import com.structurizr.Workspace; -import com.structurizr.api.StructurizrClient; -import com.structurizr.api.StructurizrClientException; -import com.structurizr.componentfinder.ComponentFinder; -import com.structurizr.componentfinder.ReferencedTypesSupportingTypesStrategy; -import com.structurizr.componentfinder.SourceCodeComponentFinderStrategy; -import com.structurizr.componentfinder.SpringComponentFinderStrategy; +import com.structurizr.analysis.ComponentFinder; +import com.structurizr.analysis.ReferencedTypesSupportingTypesStrategy; +import com.structurizr.analysis.SourceCodeComponentFinderStrategy; +import com.structurizr.analysis.SpringComponentFinderStrategy; import com.structurizr.io.WorkspaceWriterException; import com.structurizr.io.plantuml.PlantUMLWriter; import com.structurizr.model.Component; @@ -112,11 +110,6 @@ public class StructurizrSimple { view.addAllContainers(); } - private static void uploadToExternal(Workspace workspace) throws StructurizrClientException { - StructurizrClient client = new StructurizrClient("e94bc0c9-76ef-41b0-8de7-82afc1010d04", "78d555dd-2a31-487c-952c-50508f1da495"); - client.putWorkspace(32961L, workspace); - } - private static void exportToPlantUml(View view) throws WorkspaceWriterException { StringWriter stringWriter = new StringWriter(); PlantUMLWriter plantUMLWriter = new PlantUMLWriter(); From 5dec6f7006df5049355998bb111384968e50e227 Mon Sep 17 00:00:00 2001 From: Seun Matt Date: Mon, 10 Dec 2018 19:07:29 +0100 Subject: [PATCH 239/429] added example code for BAEL-2418 (#5882) * added example code for BAEL-2366 * moved example code for BAEL-2366 * example code for BAEL-1961 * moved example code into integration test * updated the test assertions * refactor the spring boot persistence mongodb module * remove redundant example code * declared the spring boot persistence module in the root pom * fixed issue with non-imported file * added example code for BAEL-2418 --- .../java/com/baeldung/basicsyntax/SimpleAddition.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/basicsyntax/SimpleAddition.java diff --git a/core-java/src/main/java/com/baeldung/basicsyntax/SimpleAddition.java b/core-java/src/main/java/com/baeldung/basicsyntax/SimpleAddition.java new file mode 100644 index 0000000000..20a13178cc --- /dev/null +++ b/core-java/src/main/java/com/baeldung/basicsyntax/SimpleAddition.java @@ -0,0 +1,11 @@ +package com.baeldung.basicsyntax; + +public class SimpleAddition { + + public static void main(String[] args) { + int a = 10; + int b = 5; + double c = a + b; + System.out.println( a + " + " + b + " = " + c); + } +} From e51a0d042807edc5af3cc8a42d9e2e6dab95a71a Mon Sep 17 00:00:00 2001 From: Daniel Barrigas Date: Mon, 10 Dec 2018 21:42:28 +0000 Subject: [PATCH 240/429] Spring Boot Actuator + Kubernetes Issue: BAEL-2356 --- .../liveness-example/Dockerfile | 11 ++++ .../liveness-example/pom.xml | 51 ++++++++++++++++++ .../com/baeldung/liveness/Application.java | 12 +++++ .../health/CustomHealthIndicator.java | 27 ++++++++++ .../resources/application.properties | 1 + .../src/main/resources/resources/logback.xml | 13 +++++ .../SpringContextIntegrationTest.java | 17 ++++++ .../liveness-example-k8s-template.yaml | 54 +++++++++++++++++++ .../readiness-example-k8s-template.yaml | 54 +++++++++++++++++++ spring-cloud/spring-cloud-kubernetes/pom.xml | 2 + .../readiness-example/Dockerfile | 11 ++++ .../readiness-example/pom.xml | 49 +++++++++++++++++ .../com/baeldung/readiness/Application.java | 12 +++++ .../health/CustomHealthIndicator.java | 27 ++++++++++ .../resources/application.properties | 1 + .../src/main/resources/resources/logback.xml | 13 +++++ .../SpringContextIntegrationTest.java | 17 ++++++ 17 files changed, 372 insertions(+) create mode 100644 spring-cloud/spring-cloud-kubernetes/liveness-example/Dockerfile create mode 100644 spring-cloud/spring-cloud-kubernetes/liveness-example/pom.xml create mode 100644 spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/Application.java create mode 100644 spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/health/CustomHealthIndicator.java create mode 100644 spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/application.properties create mode 100644 spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/logback.xml create mode 100644 spring-cloud/spring-cloud-kubernetes/liveness-example/src/test/java/com/baeldung/SpringContextIntegrationTest.java create mode 100644 spring-cloud/spring-cloud-kubernetes/object-configurations/liveness-example-k8s-template.yaml create mode 100644 spring-cloud/spring-cloud-kubernetes/object-configurations/readiness-example-k8s-template.yaml create mode 100644 spring-cloud/spring-cloud-kubernetes/readiness-example/Dockerfile create mode 100644 spring-cloud/spring-cloud-kubernetes/readiness-example/pom.xml create mode 100644 spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/Application.java create mode 100644 spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/health/CustomHealthIndicator.java create mode 100644 spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/application.properties create mode 100644 spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/logback.xml create mode 100644 spring-cloud/spring-cloud-kubernetes/readiness-example/src/test/java/com/baeldung/SpringContextIntegrationTest.java diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/Dockerfile b/spring-cloud/spring-cloud-kubernetes/liveness-example/Dockerfile new file mode 100644 index 0000000000..0fc0a9bd64 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/liveness-example/Dockerfile @@ -0,0 +1,11 @@ +FROM openjdk:8-jdk-alpine + +# Create app directory +RUN mkdir -p /usr/opt/service + +# Copy app +COPY target/*.jar /usr/opt/service/service.jar + +EXPOSE 8080 + +ENTRYPOINT exec java -jar /usr/opt/service/service.jar \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/pom.xml b/spring-cloud/spring-cloud-kubernetes/liveness-example/pom.xml new file mode 100644 index 0000000000..e963dafe67 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/liveness-example/pom.xml @@ -0,0 +1,51 @@ + + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.17.RELEASE + + + + 4.0.0 + + liveness-example + 1.0-SNAPSHOT + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/Application.java b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/Application.java new file mode 100644 index 0000000000..2cfa242965 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.liveness; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/health/CustomHealthIndicator.java b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/health/CustomHealthIndicator.java new file mode 100644 index 0000000000..715c4cb178 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/java/com/baeldung/liveness/health/CustomHealthIndicator.java @@ -0,0 +1,27 @@ +package com.baeldung.liveness.health; + +import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.actuate.health.HealthIndicator; +import org.springframework.stereotype.Component; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Component +public class CustomHealthIndicator implements HealthIndicator { + + private boolean isHealthy = true; + + public CustomHealthIndicator() { + ScheduledExecutorService scheduled = Executors.newSingleThreadScheduledExecutor(); + scheduled.schedule(() -> { + isHealthy = false; + }, 30, TimeUnit.SECONDS); + } + + @Override + public Health health() { + return isHealthy ? Health.up().build() : Health.down().build(); + } +} diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/application.properties b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/application.properties new file mode 100644 index 0000000000..a3ac65cee5 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/application.properties @@ -0,0 +1 @@ +server.port=8080 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/logback.xml b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/main/resources/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-cloud/spring-cloud-kubernetes/liveness-example/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/test/java/com/baeldung/SpringContextIntegrationTest.java new file mode 100644 index 0000000000..60b4a28aa6 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/liveness-example/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -0,0 +1,17 @@ +package com.baeldung; + +import com.baeldung.liveness.Application; +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 = Application.class) +public class SpringContextIntegrationTest { + + @Test + public void contextLoads() { + } + +} diff --git a/spring-cloud/spring-cloud-kubernetes/object-configurations/liveness-example-k8s-template.yaml b/spring-cloud/spring-cloud-kubernetes/object-configurations/liveness-example-k8s-template.yaml new file mode 100644 index 0000000000..9fd3fd5674 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/object-configurations/liveness-example-k8s-template.yaml @@ -0,0 +1,54 @@ +apiVersion: v1 +kind: Service +metadata: + name: liveness-example +spec: + selector: + app: liveness-example + ports: + - port: 8080 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: liveness-example +spec: + selector: + matchLabels: + app: liveness-example + replicas: 1 + strategy: + rollingUpdate: + maxUnavailable: 0 + template: + metadata: + labels: + app: liveness-example + spec: + containers: + - name: liveness-example + image: dbdock/liveness-example:1.0.0 + imagePullPolicy: IfNotPresent + resources: + requests: + memory: 400Mi + cpu: 400m + ports: + - containerPort: 8080 + readinessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 10 + timeoutSeconds: 2 + periodSeconds: 3 + failureThreshold: 1 + livenessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 20 + timeoutSeconds: 2 + periodSeconds: 8 + failureThreshold: 1 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/object-configurations/readiness-example-k8s-template.yaml b/spring-cloud/spring-cloud-kubernetes/object-configurations/readiness-example-k8s-template.yaml new file mode 100644 index 0000000000..010c468107 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/object-configurations/readiness-example-k8s-template.yaml @@ -0,0 +1,54 @@ +apiVersion: v1 +kind: Service +metadata: + name: readiness-example +spec: + selector: + app: readiness-example + ports: + - port: 8080 + +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: readiness-example +spec: + selector: + matchLabels: + app: readiness-example + replicas: 1 + strategy: + rollingUpdate: + maxUnavailable: 0 + template: + metadata: + labels: + app: readiness-example + spec: + containers: + - name: readiness-example + image: dbdock/readiness-example:1.0.0 + imagePullPolicy: IfNotPresent + resources: + requests: + memory: 400Mi + cpu: 400m + ports: + - containerPort: 8080 + readinessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 40 + timeoutSeconds: 2 + periodSeconds: 3 + failureThreshold: 5 + livenessProbe: + httpGet: + path: /health + port: 8080 + initialDelaySeconds: 100 + timeoutSeconds: 2 + periodSeconds: 8 + failureThreshold: 1 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/pom.xml b/spring-cloud/spring-cloud-kubernetes/pom.xml index 984b3811dd..de0718633e 100644 --- a/spring-cloud/spring-cloud-kubernetes/pom.xml +++ b/spring-cloud/spring-cloud-kubernetes/pom.xml @@ -11,6 +11,8 @@ demo-frontend demo-backend + liveness-example + readiness-example diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/Dockerfile b/spring-cloud/spring-cloud-kubernetes/readiness-example/Dockerfile new file mode 100644 index 0000000000..0fc0a9bd64 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/readiness-example/Dockerfile @@ -0,0 +1,11 @@ +FROM openjdk:8-jdk-alpine + +# Create app directory +RUN mkdir -p /usr/opt/service + +# Copy app +COPY target/*.jar /usr/opt/service/service.jar + +EXPOSE 8080 + +ENTRYPOINT exec java -jar /usr/opt/service/service.jar \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/pom.xml b/spring-cloud/spring-cloud-kubernetes/readiness-example/pom.xml new file mode 100644 index 0000000000..fa85120d21 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/readiness-example/pom.xml @@ -0,0 +1,49 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 1.5.17.RELEASE + + + 4.0.0 + + readiness-example + 1.0-SNAPSHOT + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/Application.java b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/Application.java new file mode 100644 index 0000000000..11ffe577c3 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.readiness; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/health/CustomHealthIndicator.java b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/health/CustomHealthIndicator.java new file mode 100644 index 0000000000..d37a1905f6 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/java/com/baeldung/readiness/health/CustomHealthIndicator.java @@ -0,0 +1,27 @@ +package com.baeldung.readiness.health; + +import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.actuate.health.HealthIndicator; +import org.springframework.stereotype.Component; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; + +@Component +public class CustomHealthIndicator implements HealthIndicator { + + private boolean isHealthy = false; + + public CustomHealthIndicator() { + ScheduledExecutorService scheduled = Executors.newSingleThreadScheduledExecutor(); + scheduled.schedule(() -> { + isHealthy = true; + }, 40, TimeUnit.SECONDS); + } + + @Override + public Health health() { + return isHealthy ? Health.up().build() : Health.down().build(); + } +} diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/application.properties b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/application.properties new file mode 100644 index 0000000000..a3ac65cee5 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/application.properties @@ -0,0 +1 @@ +server.port=8080 \ No newline at end of file diff --git a/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/logback.xml b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/main/resources/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-cloud/spring-cloud-kubernetes/readiness-example/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/test/java/com/baeldung/SpringContextIntegrationTest.java new file mode 100644 index 0000000000..18458182c7 --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/readiness-example/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -0,0 +1,17 @@ +package com.baeldung; + +import com.baeldung.readiness.Application; +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 = Application.class) +public class SpringContextIntegrationTest { + + @Test + public void contextLoads() { + } + +} From 7ddcb76c093d93394af403bd6ccf29a5906300a9 Mon Sep 17 00:00:00 2001 From: j-bennett Date: Mon, 10 Dec 2018 18:27:48 -0500 Subject: [PATCH 241/429] Persist a JSON object using Hibernate Issue: BAEL-2353 --- persistence-modules/hibernate5/pom.xml | 6 + .../hibernate/persistjson/Customer.java | 80 +++++++++++++ .../persistjson/HashMapConverter.java | 47 ++++++++ .../persistjson/PersistJSONUnitTest.java | 111 ++++++++++++++++++ .../hibernate-persistjson.properties | 7 ++ 5 files changed, 251 insertions(+) create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/Customer.java create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/HashMapConverter.java create mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/persistjson/PersistJSONUnitTest.java create mode 100644 persistence-modules/hibernate5/src/test/resources/hibernate-persistjson.properties diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 363e2153b6..7e9a0ddb29 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -51,6 +51,11 @@ hibernate-testing 5.2.2.Final + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + @@ -69,6 +74,7 @@ 2.2.3 1.4.196 3.8.0 + 2.8.11.3
diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/Customer.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/Customer.java new file mode 100644 index 0000000000..6bd1c24869 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/Customer.java @@ -0,0 +1,80 @@ +package com.baeldung.hibernate.persistjson; + +import java.io.IOException; +import java.util.Map; + +import javax.persistence.Convert; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +@Entity +@Table(name = "Customers") +public class Customer { + + @Id + private int id; + + private String firstName; + + private String lastName; + + private String customerAttributeJSON; + + @Convert(converter = HashMapConverter.class) + private Map customerAttributes; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public String getCustomerAttributeJSON() { + return customerAttributeJSON; + } + + public void setCustomerAttributeJSON(String customerAttributeJSON) { + this.customerAttributeJSON = customerAttributeJSON; + } + + public Map getCustomerAttributes() { + return customerAttributes; + } + + public void setCustomerAttributes(Map customerAttributes) { + this.customerAttributes = customerAttributes; + } + + private static final ObjectMapper objectMapper = new ObjectMapper(); + + public void serializeCustomerAttributes() throws JsonProcessingException { + this.customerAttributeJSON = objectMapper.writeValueAsString(customerAttributes); + } + + public void deserializeCustomerAttributes() throws IOException { + this.customerAttributes = objectMapper.readValue(customerAttributeJSON, Map.class); + } + +} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/HashMapConverter.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/HashMapConverter.java new file mode 100644 index 0000000000..b1c2d50480 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/persistjson/HashMapConverter.java @@ -0,0 +1,47 @@ +package com.baeldung.hibernate.persistjson; + +import java.io.IOException; +import java.util.Map; + +import javax.persistence.AttributeConverter; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.baeldung.hibernate.interceptors.CustomInterceptor; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class HashMapConverter implements AttributeConverter, String> { + + private static final Logger logger = LoggerFactory.getLogger(CustomInterceptor.class); + + private final ObjectMapper objectMapper = new ObjectMapper(); + + @Override + public String convertToDatabaseColumn(Map customerInfo) { + + String customerInfoJson = null; + try { + customerInfoJson = objectMapper.writeValueAsString(customerInfo); + } catch (final JsonProcessingException e) { + logger.error("JSON writing error", e); + } + + return customerInfoJson; + } + + @Override + public Map convertToEntityAttribute(String customerInfoJSON) { + + Map customerInfo = null; + try { + customerInfo = objectMapper.readValue(customerInfoJSON, Map.class); + } catch (final IOException e) { + logger.error("JSON reading error", e); + } + + return customerInfo; + } + +} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/persistjson/PersistJSONUnitTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/persistjson/PersistJSONUnitTest.java new file mode 100644 index 0000000000..ecbb073e89 --- /dev/null +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/persistjson/PersistJSONUnitTest.java @@ -0,0 +1,111 @@ +package com.baeldung.hibernate.persistjson; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.fail; + +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.Configuration; +import org.hibernate.service.ServiceRegistry; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class PersistJSONUnitTest { + + private Session session; + + @Before + public void init() { + try { + Configuration configuration = new Configuration(); + + Properties properties = new Properties(); + properties.load(Thread.currentThread() + .getContextClassLoader() + .getResourceAsStream("hibernate-persistjson.properties")); + + configuration.setProperties(properties); + + ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties()) + .build(); + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + metadataSources.addAnnotatedClass(Customer.class); + + SessionFactory factory = metadataSources.buildMetadata() + .buildSessionFactory(); + + session = factory.openSession(); + } catch (HibernateException | IOException e) { + fail("Failed to initiate Hibernate Session [Exception:" + e.toString() + "]"); + } + } + + @After + public void close() { + if (session != null) + session.close(); + } + + @Test + public void givenCustomer_whenCallingSerializeCustomerAttributes_thenAttributesAreConverted() throws IOException { + + Customer customer = new Customer(); + customer.setFirstName("first name"); + customer.setLastName("last name"); + + Map attributes = new HashMap<>(); + attributes.put("address", "123 Main Street"); + attributes.put("zipcode", 12345); + + customer.setCustomerAttributes(attributes); + + customer.serializeCustomerAttributes(); + + String serialized = customer.getCustomerAttributeJSON(); + + customer.setCustomerAttributeJSON(serialized); + customer.deserializeCustomerAttributes(); + + Map deserialized = customer.getCustomerAttributes(); + + assertEquals("123 Main Street", deserialized.get("address")); + } + + @Test + public void givenCustomer_whenSaving_thenAttributesAreConverted() { + + Customer customer = new Customer(); + customer.setFirstName("first name"); + customer.setLastName("last name"); + + Map attributes = new HashMap<>(); + attributes.put("address", "123 Main Street"); + attributes.put("zipcode", 12345); + + customer.setCustomerAttributes(attributes); + + session.beginTransaction(); + + int id = (int) session.save(customer); + + session.flush(); + session.clear(); + + Customer result = session.createNativeQuery("select * from Customers where Customers.id = :id", Customer.class) + .setParameter("id", id) + .getSingleResult(); + + assertEquals(2, result.getCustomerAttributes() + .size()); + } + +} diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate-persistjson.properties b/persistence-modules/hibernate5/src/test/resources/hibernate-persistjson.properties new file mode 100644 index 0000000000..2cf8ac5b63 --- /dev/null +++ b/persistence-modules/hibernate5/src/test/resources/hibernate-persistjson.properties @@ -0,0 +1,7 @@ +hibernate.connection.driver_class=org.h2.Driver +hibernate.connection.url=jdbc:h2:mem:mydb1;DB_CLOSE_DELAY=-1 +hibernate.connection.username=sa +hibernate.dialect=org.hibernate.dialect.H2Dialect + +hibernate.show_sql=true +hibernate.hbm2ddl.auto=create-drop \ No newline at end of file From 3e685aa12d47f428a3dcb11bb6073d297078dd5c Mon Sep 17 00:00:00 2001 From: mprevisic Date: Tue, 11 Dec 2018 01:30:10 +0100 Subject: [PATCH 242/429] BAEL-2351 programmatically restart spring boot application --- spring-boot-ops/pom.xml | 7 + spring-boot-ops/pom.xml~ | 164 ++++++++++++++++++ .../com/baeldung/restart/Application.java | 30 ++++ .../baeldung/restart/RestartController.java | 23 +++ .../com/baeldung/restart/RestartService.java | 17 ++ .../src/main/resources/application.properties | 3 +- .../RestartApplicationIntegrationTest.java | 34 ++++ .../src/test/resources/application.properties | 4 +- 8 files changed, 280 insertions(+), 2 deletions(-) create mode 100644 spring-boot-ops/pom.xml~ create mode 100644 spring-boot-ops/src/main/java/com/baeldung/restart/Application.java create mode 100644 spring-boot-ops/src/main/java/com/baeldung/restart/RestartController.java create mode 100644 spring-boot-ops/src/main/java/com/baeldung/restart/RestartService.java create mode 100644 spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java diff --git a/spring-boot-ops/pom.xml b/spring-boot-ops/pom.xml index 57779c3f8e..9717a352d3 100644 --- a/spring-boot-ops/pom.xml +++ b/spring-boot-ops/pom.xml @@ -86,6 +86,12 @@ ${jquery.version} + + org.springframework.cloud + spring-cloud-context + ${springcloud.version} + + @@ -153,6 +159,7 @@ 2.2 18.0 3.1.7 + 2.0.2.RELEASE
diff --git a/spring-boot-ops/pom.xml~ b/spring-boot-ops/pom.xml~ new file mode 100644 index 0000000000..2c3b650c30 --- /dev/null +++ b/spring-boot-ops/pom.xml~ @@ -0,0 +1,164 @@ + + + 4.0.0 + + spring-boot-ops + war + spring-boot-ops + 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} + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + com.baeldung.webjar.WebjarsdemoApplication + + + + + + + + + + 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 + + + diff --git a/spring-boot-ops/src/main/java/com/baeldung/restart/Application.java b/spring-boot-ops/src/main/java/com/baeldung/restart/Application.java new file mode 100644 index 0000000000..a6605a0baa --- /dev/null +++ b/spring-boot-ops/src/main/java/com/baeldung/restart/Application.java @@ -0,0 +1,30 @@ +package com.baeldung.restart; + +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.ConfigurableApplicationContext; + +@SpringBootApplication +public class Application extends SpringBootServletInitializer { + + private static ConfigurableApplicationContext context; + + public static void main(String[] args) { + context = SpringApplication.run(Application.class, args); + } + + public static void restart() { + ApplicationArguments args = context.getBean(ApplicationArguments.class); + + Thread thread = new Thread(() -> { + context.close(); + context = SpringApplication.run(Application.class, args.getSourceArgs()); + }); + + thread.setDaemon(false); + thread.start(); + } + +} \ No newline at end of file diff --git a/spring-boot-ops/src/main/java/com/baeldung/restart/RestartController.java b/spring-boot-ops/src/main/java/com/baeldung/restart/RestartController.java new file mode 100644 index 0000000000..68a8dc7073 --- /dev/null +++ b/spring-boot-ops/src/main/java/com/baeldung/restart/RestartController.java @@ -0,0 +1,23 @@ +package com.baeldung.restart; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class RestartController { + + @Autowired + private RestartService restartService; + + @PostMapping("/restart") + public void restart() { + Application.restart(); + } + + @PostMapping("/restartApp") + public void restartUsingActuator() { + restartService.restartApp(); + } + +} diff --git a/spring-boot-ops/src/main/java/com/baeldung/restart/RestartService.java b/spring-boot-ops/src/main/java/com/baeldung/restart/RestartService.java new file mode 100644 index 0000000000..9883ec653b --- /dev/null +++ b/spring-boot-ops/src/main/java/com/baeldung/restart/RestartService.java @@ -0,0 +1,17 @@ +package com.baeldung.restart; + +import org.springframework.stereotype.Service; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.context.restart.RestartEndpoint; + +@Service +public class RestartService { + + @Autowired + private RestartEndpoint restartEndpoint; + + public void restartApp() { + restartEndpoint.restart(); + } + +} \ No newline at end of file diff --git a/spring-boot-ops/src/main/resources/application.properties b/spring-boot-ops/src/main/resources/application.properties index a86bd3052e..644a3edabc 100644 --- a/spring-boot-ops/src/main/resources/application.properties +++ b/spring-boot-ops/src/main/resources/application.properties @@ -1,3 +1,4 @@ management.endpoints.web.exposure.include=* management.metrics.enable.root=true -management.metrics.enable.jvm=true \ No newline at end of file +management.metrics.enable.jvm=true +management.endpoint.restart.enabled=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 new file mode 100644 index 0000000000..1bec3c6a90 --- /dev/null +++ b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java @@ -0,0 +1,34 @@ +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; + +public class RestartApplicationIntegrationTest { + + private TestRestTemplate template = new TestRestTemplate(); + + @Test + public void givenBootApp_whenRestart_thenOk() throws Exception { + Application.main(new String[0]); + + ResponseEntity response = template.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 = template.exchange("http://localhost:8090/restartApp", + HttpMethod.POST, null, Object.class); + + assertEquals(200, response.getStatusCode().value()); + } + +} diff --git a/spring-boot-ops/src/test/resources/application.properties b/spring-boot-ops/src/test/resources/application.properties index 2095a82a14..0adf2998d7 100644 --- a/spring-boot-ops/src/test/resources/application.properties +++ b/spring-boot-ops/src/test/resources/application.properties @@ -4,4 +4,6 @@ spring.mail.properties.mail.smtp.auth=false management.endpoints.web.exposure.include=* management.endpoint.shutdown.enabled=true -endpoints.shutdown.enabled=true \ No newline at end of file +endpoints.shutdown.enabled=true + +management.endpoint.restart.enabled=true \ No newline at end of file From 5afdce78ead6d1854ef6d787cb70b10f9527a6b5 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 11 Dec 2018 09:52:10 +0200 Subject: [PATCH 243/429] quick compilation fix --- .../com/baeldung/jpa/stringcast/QueryExecutor.java | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java index 6f1e2ee5ca..2cb5679d4d 100644 --- a/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java +++ b/persistence-modules/java-jpa/src/main/java/com/baeldung/jpa/stringcast/QueryExecutor.java @@ -1,13 +1,12 @@ package com.baeldung.jpa.stringcast; -import com.sun.istack.internal.Nullable; - -import javax.persistence.EntityManager; -import javax.persistence.Query; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import javax.persistence.EntityManager; +import javax.persistence.Query; + public class QueryExecutor { public static List executeNativeQueryNoCastCheck(String statement, EntityManager em) { @@ -24,10 +23,7 @@ public class QueryExecutor { } if (results.get(0) instanceof String) { - return ((List) results) - .stream() - .map(s -> new String[] { s }) - .collect(Collectors.toList()); + return ((List) results).stream().map(s -> new String[] { s }).collect(Collectors.toList()); } else { return (List) results; } From 98d74af44ab4a338e6ea6dde074781080bab403f Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Tue, 11 Dec 2018 22:47:56 +0530 Subject: [PATCH 244/429] added shebang file --- core-java-11/src/main/java/com/baeldung/add | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100755 core-java-11/src/main/java/com/baeldung/add diff --git a/core-java-11/src/main/java/com/baeldung/add b/core-java-11/src/main/java/com/baeldung/add new file mode 100755 index 0000000000..539c1a43d4 --- /dev/null +++ b/core-java-11/src/main/java/com/baeldung/add @@ -0,0 +1,12 @@ +#!/usr/local/bin/java --source 11 + +import java.util.Arrays; + +public class Addition +{ + public static void main(String[] args) { + System.out.println(Arrays.stream(args) + .mapToInt(Integer::parseInt) + .sum()); + } +} \ No newline at end of file From cfab18ae96ef8342001466d541e4c04da5c952e2 Mon Sep 17 00:00:00 2001 From: Loredana Date: Tue, 11 Dec 2018 22:46:08 +0200 Subject: [PATCH 245/429] add code for jgrapht image gen --- algorithms-miscellaneous-2/pom.xml | 6 +++ .../jgrapht/GraphImageGenerationUnitTest.java | 47 ++++++++++++++++++ .../src/test/resources/graph.png | Bin 0 -> 9365 bytes 3 files changed, 53 insertions(+) create mode 100644 algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java create mode 100644 algorithms-miscellaneous-2/src/test/resources/graph.png diff --git a/algorithms-miscellaneous-2/pom.xml b/algorithms-miscellaneous-2/pom.xml index 25472d4888..5461f4ebe1 100644 --- a/algorithms-miscellaneous-2/pom.xml +++ b/algorithms-miscellaneous-2/pom.xml @@ -33,6 +33,11 @@ jgrapht-core ${org.jgrapht.core.version} + + org.jgrapht + jgrapht-ext + ${org.jgrapht.ext.version} + pl.allegro.finance tradukisto @@ -83,6 +88,7 @@ 3.6.1 1.0.1 1.0.1 + 1.0.1 3.9.0 1.11 diff --git a/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java b/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java new file mode 100644 index 0000000000..3b841d574a --- /dev/null +++ b/algorithms-miscellaneous-2/src/test/java/com/baeldung/jgrapht/GraphImageGenerationUnitTest.java @@ -0,0 +1,47 @@ +package com.baeldung.jgrapht; + +import static org.junit.Assert.assertTrue; +import java.awt.Color; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import javax.imageio.ImageIO; +import org.jgrapht.ext.JGraphXAdapter; +import org.jgrapht.graph.DefaultDirectedGraph; +import org.jgrapht.graph.DefaultEdge; +import org.junit.Before; +import org.junit.Test; +import com.mxgraph.layout.mxCircleLayout; +import com.mxgraph.layout.mxIGraphLayout; +import com.mxgraph.util.mxCellRenderer; + +public class GraphImageGenerationUnitTest { + static DefaultDirectedGraph g; + + @Before + public void createGraph() throws IOException { + File imgFile = new File("src/test/resources/graph.png"); + imgFile.createNewFile(); + g = new DefaultDirectedGraph(DefaultEdge.class); + String x1 = "x1"; + String x2 = "x2"; + String x3 = "x3"; + g.addVertex(x1); + g.addVertex(x2); + g.addVertex(x3); + g.addEdge(x1, x2); + g.addEdge(x2, x3); + g.addEdge(x3, x1); + } + + @Test + public void givenAdaptedGraph_whenWriteBufferedImage_ThenFileShouldExist() throws IOException { + JGraphXAdapter graphAdapter = new JGraphXAdapter(g); + mxIGraphLayout layout = new mxCircleLayout(graphAdapter); + layout.execute(graphAdapter.getDefaultParent()); + File imgFile = new File("src/test/resources/graph.png"); + BufferedImage image = mxCellRenderer.createBufferedImage(graphAdapter, null, 2, Color.WHITE, true, null); + ImageIO.write(image, "PNG", imgFile); + assertTrue(imgFile.exists()); + } +} \ No newline at end of file diff --git a/algorithms-miscellaneous-2/src/test/resources/graph.png b/algorithms-miscellaneous-2/src/test/resources/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..56995b8dd9be23e173c365a616ac64123004d81c GIT binary patch literal 9365 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 literal 0 HcmV?d00001 From 652a7a3f46d4cb0e2a197ff5bdb6ffb9c0e7d79e Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Tue, 11 Dec 2018 20:43:13 -0600 Subject: [PATCH 246/429] BAEL-2174 update README.md (#5901) * 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 --- core-java-networking/README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/core-java-networking/README.md b/core-java-networking/README.md index b7a142ea27..626ea794e6 100644 --- a/core-java-networking/README.md +++ b/core-java-networking/README.md @@ -1,3 +1,7 @@ ========= -## Core Java Net +## Core Java Networking + +### Relevant Articles + +- [Connecting Through Proxy Servers in Core Java](https://www.baeldung.com/java-connect-via-proxy-server) From 9c9e32aa7c55afcc69ba6ebcacce59eb8a54d050 Mon Sep 17 00:00:00 2001 From: Krzysztof Majewski Date: Wed, 12 Dec 2018 04:44:11 +0000 Subject: [PATCH 247/429] Guide to ShedLock with Spring Issue: BAEL-2360 --- spring-all/pom.xml | 12 ++++++++++++ .../shedlock/SchedulerConfiguration.java | 12 ++++++++++++ .../scheduling/shedlock/TaskScheduler.java | 15 +++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 spring-all/src/main/java/org/baeldung/scheduling/shedlock/SchedulerConfiguration.java create mode 100644 spring-all/src/main/java/org/baeldung/scheduling/shedlock/TaskScheduler.java diff --git a/spring-all/pom.xml b/spring-all/pom.xml index 2dc4915bab..77c7e74e08 100644 --- a/spring-all/pom.xml +++ b/spring-all/pom.xml @@ -155,6 +155,18 @@ org.apache.logging.log4j log4j-core + + + + net.javacrumbs.shedlock + shedlock-spring + 2.1.0 + + + net.javacrumbs.shedlock + shedlock-provider-jdbc-template + 2.1.0 + diff --git a/spring-all/src/main/java/org/baeldung/scheduling/shedlock/SchedulerConfiguration.java b/spring-all/src/main/java/org/baeldung/scheduling/shedlock/SchedulerConfiguration.java new file mode 100644 index 0000000000..74ea39683d --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/scheduling/shedlock/SchedulerConfiguration.java @@ -0,0 +1,12 @@ +package com.baeldung.scheduling.shedlock; + +import org.springframework.context.annotation.Configuration; +import net.javacrumbs.shedlock.spring.annotation.EnableSchedulerLock; +import org.springframework.scheduling.annotation.EnableScheduling; + +@Configuration +@EnableScheduling +@EnableSchedulerLock(defaultLockAtMostFor = "PT30S") +public class SchedulerConfiguration { + +} \ No newline at end of file diff --git a/spring-all/src/main/java/org/baeldung/scheduling/shedlock/TaskScheduler.java b/spring-all/src/main/java/org/baeldung/scheduling/shedlock/TaskScheduler.java new file mode 100644 index 0000000000..b1b1ad921f --- /dev/null +++ b/spring-all/src/main/java/org/baeldung/scheduling/shedlock/TaskScheduler.java @@ -0,0 +1,15 @@ +package com.baeldung.scheduling.shedlock; + +import net.javacrumbs.shedlock.core.SchedulerLock; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +@Component +class TaskScheduler { + + @Scheduled(cron = "*/15 * * * * *") + @SchedulerLock(name = "TaskScheduler_scheduledTask", lockAtLeastForString = "PT5M", lockAtMostForString = "PT14M") + public void scheduledTask() { + System.out.println("Running ShedLock task"); + } +} \ No newline at end of file From bc1a22babc5496e9ca115af4eda30908f3424431 Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 05:46:16 +0100 Subject: [PATCH 248/429] BAEL-2412 Remove custom serializer and deserializer for converting byte into a string of bits. --- .../baeldung/gson/primitives/UnitTest.java | 53 ------------------- 1 file changed, 53 deletions(-) diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 475eb42fc0..2189e990ba 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -52,31 +52,6 @@ public class UnitTest { // @formatter:on } - @Test public void toJsonByteToBitString() { - GsonBuilder builder = new GsonBuilder(); - builder.registerTypeAdapter(ByteExample.class, - new GsonBitStringSerializer()); - - Gson gson = builder.create(); - ByteExample model = new ByteExample(); - model.value = (byte) 0b1111; - - assertEquals("{\"value\":\"1111\"}", gson.toJson(model)); - } - - @Test public void fromJsonByteFromBitString() { - String json = "{\"value\": \"1111\"}"; - GsonBuilder gsonBuilder = new GsonBuilder(); - gsonBuilder.registerTypeAdapter(ByteExample.class, - new GsonBitStringDeserializer()); - - Gson gson = gsonBuilder.create(); - - ByteExample model = gson.fromJson(json, ByteExample.class); - - assertEquals(15, model.value); - } - @Test public void fromJsonPrecissionMismatch() { String json = "{\"value\": 12.123456789123456}"; Gson gson = new Gson(); @@ -212,34 +187,6 @@ public class UnitTest { } // @formatter:off - static class GsonBitStringDeserializer implements JsonDeserializer { - @Override public ByteExample deserialize( - JsonElement jsonElement, - Type type, - JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { - - ByteExample byteExample = new ByteExample(); - byteExample.value = (byte) Integer.parseInt( - jsonElement.getAsJsonObject() - .getAsJsonPrimitive("value") - .getAsString() - , 2); - return byteExample; - } - } - - static class GsonBitStringSerializer implements JsonSerializer { - @Override public JsonElement serialize( - ByteExample model, - Type type, - JsonSerializationContext jsonSerializationContext) { - - JsonObject jsonObject = new JsonObject(); - jsonObject.addProperty("value", Integer.toBinaryString(model.value)); - return jsonObject; - } - } - static class BooleanAs2ValueIntegerDeserializer implements JsonDeserializer { @Override public BooleanExample deserialize( JsonElement jsonElement, From 24bd4644ff64f5c00bc6ef1b6db2773ec3ff9bf8 Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 06:00:53 +0100 Subject: [PATCH 249/429] BAEL-2412 Add example of deserialization of a double whose precission is too high. --- .../gson/primitives/models/DoubleExample.java | 9 +++++++++ .../java/org/baeldung/gson/primitives/UnitTest.java | 12 ++++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/DoubleExample.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/DoubleExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/DoubleExample.java new file mode 100644 index 0000000000..5022b6a11e --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/DoubleExample.java @@ -0,0 +1,9 @@ +package org.baeldung.gson.primitives.models; + +public class DoubleExample { + public double value; + + public String toString() { + return "{float: " + value + "}"; + } +} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 2189e990ba..4ee1e67c8e 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -53,12 +53,20 @@ public class UnitTest { } @Test public void fromJsonPrecissionMismatch() { - String json = "{\"value\": 12.123456789123456}"; + String json = "{\"value\": 12.123425589123456}"; Gson gson = new Gson(); FloatExample model = gson.fromJson(json, FloatExample.class); - assertEquals(12.123457f, model.value, 0.000001); + assertEquals(12.123426f, model.value, 0.000001); } + @Test public void fromJsonPrecissionMismatchForDouble() { + String json = "{\"value\": 12.123425589123556}"; + Gson gson = new Gson(); + DoubleExample model = gson.fromJson(json, DoubleExample.class); + assertEquals(12.123425589124f, model.value, 0.000001); + } + + @Test public void fromJsonOverflow() { Gson gson = new Gson(); String json = "{\"value\": \"300\"}"; From 089162e91c9b820cad6bbd87a8eb1601a19d785e Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 06:12:12 +0100 Subject: [PATCH 250/429] BAEL-2412 Add new code examples when deserializing real numbers to discrete number types. --- .../gson/primitives/models/LongExample.java | 9 ++++++++ .../baeldung/gson/primitives/UnitTest.java | 23 ++++++++++++++++++- 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/LongExample.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/LongExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/LongExample.java new file mode 100644 index 0000000000..e709650789 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/LongExample.java @@ -0,0 +1,9 @@ +package org.baeldung.gson.primitives.models; + +public class LongExample { + public long value = 1; + + public String toString() { + return "{byte: " + value + "}"; + } +} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 4ee1e67c8e..335b844214 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -75,7 +75,7 @@ public class UnitTest { assertEquals(44, model.value); } - @Test public void fromJsonNonCompatibleNumberTypes() { + @Test public void fromJsonRealToByte() { Gson gson = new Gson(); String json = "{\"value\": 2.3}"; try { @@ -89,6 +89,27 @@ public class UnitTest { fail(); } + @Test public void fromJsonRealToLong() { + Gson gson = new Gson(); + String json = "{\"value\": 2.3}"; + try { + gson.fromJson(json, LongExample.class); + } catch (Exception ex) { + assertTrue(ex instanceof JsonSyntaxException); + assertTrue(ex.getCause() instanceof NumberFormatException); + return; + } + + fail(); + } + + @Test public void fromJsonRealToLongEndingIn0() { + Gson gson = new Gson(); + String json = "{\"value\": 2.0}"; + LongExample model = gson.fromJson(json, LongExample.class); + assertEquals(2, model.value); + } + @Test public void fromJsonUnicodeChar() { Gson gson = new Gson(); String json = "{\"value\": \"\\u00AE\"}"; From f69d154862bed3ebd5a47e1873b4f03a94bfddfb Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 06:27:36 +0100 Subject: [PATCH 251/429] BAEL-2412 New example showing that the empty string can be deserialized into a char. --- .../java/org/baeldung/gson/primitives/UnitTest.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 335b844214..8581f07a65 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -143,11 +143,21 @@ public class UnitTest { // @formatter:off String json = "{\"byteValue\": \"\", \"shortValue\": \"\", " + "\"intValue\": \"\", " + "\"longValue\": \"\", \"floatValue\": \"\"" - + ", \"doubleValue\": \"\"" + ", \"booleanValue\": \"\", \"charValue\": \"\"}"; + + ", \"doubleValue\": \"\"" + ", \"booleanValue\": \"\"}"; // @formatter:on gson.fromJson(json, PrimitiveBundleInitialized.class); } + @Test public void fromJsonEmptyStringToChar() { + Gson gson = new Gson(); + // @formatter:off + String json = "{\"charValue\": \"\"}"; + // @formatter:on + CharExample model = gson.fromJson(json, CharExample.class); + + assertEquals(Character.MIN_VALUE, model.value); + } + @Test public void fromJsonValidValueWithinString() { Gson gson = new Gson(); // @formatter:off From 366cb9a0bc8cc91d23f24e25e19d09d8e071805a Mon Sep 17 00:00:00 2001 From: Javier Date: Wed, 12 Dec 2018 06:41:39 +0100 Subject: [PATCH 252/429] BAEL-2412 Add limit values when dealing with floats (min, max, NaN). --- .../primitives/models/LimitValuesExample.java | 6 ++++++ .../baeldung/gson/primitives/UnitTest.java | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java new file mode 100644 index 0000000000..4960a98834 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java @@ -0,0 +1,6 @@ +package org.baeldung.gson.primitives.models; + +public class LimitValuesExample { + public float minValue; + public float maxValue; +} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 8581f07a65..95314d4d43 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -32,6 +32,25 @@ public class UnitTest { assertEquals(expected, gson.toJson(primitiveBundle)); } + @Test public void toJsonLimitValues() { + LimitValuesExample model = new LimitValuesExample(); + model.minValue = Float.MIN_VALUE; + model.maxValue = Float.MAX_VALUE; + + Gson gson = new Gson(); + + String expected = "{\"minValue\":1.4E-45,\"maxValue\":3.4028235E38}"; + assertEquals(expected, gson.toJson(model)); + } + + @Test(expected = IllegalArgumentException.class) public void toJsonNaN() { + FloatExample model = new FloatExample(); + model.value = Float.NaN; + + Gson gson = new Gson(); + gson.toJson(model); + } + @Test public void fromJsonAllPrimitives() { String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" From 7e3e9db288d8d02a11b437b1cbf80a6df0248af3 Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Wed, 12 Dec 2018 08:17:25 +0100 Subject: [PATCH 253/429] BAEL-2351 cleanup --- spring-boot-ops/pom.xml~ | 164 --------------------------------------- 1 file changed, 164 deletions(-) delete mode 100644 spring-boot-ops/pom.xml~ diff --git a/spring-boot-ops/pom.xml~ b/spring-boot-ops/pom.xml~ deleted file mode 100644 index 2c3b650c30..0000000000 --- a/spring-boot-ops/pom.xml~ +++ /dev/null @@ -1,164 +0,0 @@ - - - 4.0.0 - - spring-boot-ops - war - spring-boot-ops - 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} - - - - - - ${project.artifactId} - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - com.baeldung.webjar.WebjarsdemoApplication - - - - - - - - - - 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 - - - From 743949afe69b1dfc995b387ff1c8ebd195733cd0 Mon Sep 17 00:00:00 2001 From: Kacper Date: Wed, 12 Dec 2018 11:15:04 +0100 Subject: [PATCH 254/429] testing with StepVerifier (#5673) * testing with StepVerifier * Test publisher --- spring-5-reactive/pom.xml | 2 +- .../stepverifier/PostExecutionUnitTest.java | 34 +++++++++++++ .../stepverifier/StepByStepUnitTest.java | 39 ++++++++++++++ .../TestingTestPublisherUnitTest.java | 51 +++++++++++++++++++ .../stepverifier/TimeBasedUnitTest.java | 22 ++++++++ 5 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 spring-5-reactive/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java create mode 100644 spring-5-reactive/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java diff --git a/spring-5-reactive/pom.xml b/spring-5-reactive/pom.xml index ab64d1e2fa..63cc185afe 100644 --- a/spring-5-reactive/pom.xml +++ b/spring-5-reactive/pom.xml @@ -143,7 +143,7 @@ 1.0 1.0 4.1 - 3.1.6.RELEASE + 3.2.3.RELEASE diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java b/spring-5-reactive/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java new file mode 100644 index 0000000000..17fea6b50b --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/stepverifier/PostExecutionUnitTest.java @@ -0,0 +1,34 @@ +package com.baeldung.stepverifier; + +import org.junit.Test; +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +import java.time.Duration; + +public class PostExecutionUnitTest { + + Flux source = Flux.create(emitter -> { + emitter.next(1); + emitter.next(2); + emitter.next(3); + emitter.complete(); + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + emitter.next(4); + }).filter(number -> number % 2 == 0); + + @Test + public void droppedElements() { + StepVerifier.create(source) + .expectNext(2) + .expectComplete() + .verifyThenAssertThat() + .hasDropped(4) + .tookLessThan(Duration.ofMillis(1050)); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java b/spring-5-reactive/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java new file mode 100644 index 0000000000..c7196d6b6c --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/stepverifier/StepByStepUnitTest.java @@ -0,0 +1,39 @@ +package com.baeldung.stepverifier; + +import org.junit.Test; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; + +public class StepByStepUnitTest { + + Flux source = Flux.just("John", "Monica", "Mark", "Cloe", "Frank", "Casper", "Olivia", "Emily", "Cate") + .filter(name -> name.length() == 4) + .map(String::toUpperCase); + + @Test + public void shouldReturnForLettersUpperCaseStrings() { + StepVerifier + .create(source) + .expectNext("JOHN") + .expectNextMatches(name -> name.startsWith("MA")) + .expectNext("CLOE", "CATE") + .expectComplete() + .verify(); + } + + @Test + public void shouldThrowExceptionAfterFourElements() { + Flux error = source.concatWith( + Mono.error(new IllegalArgumentException("Our message")) + ); + + StepVerifier + .create(error) + .expectNextCount(4) + .expectErrorMatches(throwable -> throwable instanceof IllegalArgumentException && + throwable.getMessage().equals("Our message") + ).verify(); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java b/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java new file mode 100644 index 0000000000..fb65e2d315 --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TestingTestPublisherUnitTest.java @@ -0,0 +1,51 @@ +package com.baeldung.stepverifier; + +import org.junit.Test; +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; +import reactor.test.publisher.TestPublisher; + +public class TestingTestPublisherUnitTest { + + @Test + public void testPublisher() { + TestPublisher + .create() + .next("First", "Second", "Third") + .error(new RuntimeException("Message")); + } + + @Test + public void nonCompliant() { + TestPublisher + .createNoncompliant(TestPublisher.Violation.ALLOW_NULL) + .emit("1", "2", null, "3"); + } + + @Test + public void testPublisherInAction() { + final TestPublisher testPublisher = TestPublisher.create(); + + UppercaseConverter uppercaseConverter = new UppercaseConverter(testPublisher.flux()); + + StepVerifier.create(uppercaseConverter.getUpperCase()) + .then(() -> testPublisher.emit("aA", "bb", "ccc")) + .expectNext("AA", "BB", "CCC") + .verifyComplete(); + } + +} + +class UppercaseConverter { + private final Flux source; + + UppercaseConverter(Flux source) { + this.source = source; + } + + Flux getUpperCase() { + return source + .map(String::toUpperCase); + } + +} diff --git a/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java b/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java new file mode 100644 index 0000000000..54e5e7882a --- /dev/null +++ b/spring-5-reactive/src/test/java/com/baeldung/stepverifier/TimeBasedUnitTest.java @@ -0,0 +1,22 @@ +package com.baeldung.stepverifier; + +import org.junit.Test; +import reactor.core.publisher.Flux; +import reactor.test.StepVerifier; + +import java.time.Duration; + +public class TimeBasedUnitTest { + + @Test + public void simpleExample() { + StepVerifier + .withVirtualTime(() -> Flux.interval(Duration.ofSeconds(1)).take(2)) + .expectSubscription() + .expectNoEvent(Duration.ofSeconds(1)) + .expectNext(0L) + .thenAwait(Duration.ofSeconds(1)) + .expectNext(1L) + .verifyComplete(); + } +} From 99dd82d2ff8f307fe4cf2bd7ae6b3c7c78b25e52 Mon Sep 17 00:00:00 2001 From: geroza Date: Tue, 11 Dec 2018 12:17:29 -0200 Subject: [PATCH 255/429] Migrated modules to parent-boot-2 usign spring-boot 2.1: spring-mvc-forms-thymeleaf spring-rest spring-rest-angular spring-rest-query-language spring-rest-shell spring-rest-simple spring-rest-template spring-resttemplate spring-security-mvc-boot spring-security-openid spring-security-sso spring-security-thymeleaf --- spring-mvc-forms-thymeleaf/pom.xml | 4 +-- spring-rest-angular/pom.xml | 4 +-- .../org/baeldung/web/main/Application.java | 4 +-- .../StudentServiceIntegrationTest.java | 34 +++++++++++-------- spring-rest-query-language/pom.xml | 4 +-- spring-rest-shell/pom.xml | 4 +-- spring-rest-simple/pom.xml | 4 +-- spring-rest-template/pom.xml | 4 +-- spring-rest/pom.xml | 4 +-- .../lists/client/EmployeeClient.java | 8 ++--- .../advice/JsonpControllerAdvice.java | 13 ------- ...pplication.java => UploadApplication.java} | 4 +-- .../SpringContextIntegrationTest.java | 2 +- spring-resttemplate/pom.xml | 4 +-- spring-security-mvc-boot/pom.xml | 6 ++-- .../src/main/resources/templates/private.html | 2 +- spring-security-openid/pom.xml | 4 +-- ...mple.properties => application.properties} | 0 spring-security-sso/pom.xml | 6 ++-- .../spring-security-sso-ui-2/pom.xml | 2 +- .../spring-security-sso-ui/pom.xml | 2 +- spring-security-thymeleaf/pom.xml | 6 ++-- 22 files changed, 58 insertions(+), 67 deletions(-) delete mode 100644 spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java rename spring-rest/src/main/java/com/baeldung/web/upload/app/{Application.java => UploadApplication.java} (79%) rename spring-security-openid/src/main/resources/{application.properties.sample.properties => application.properties} (100%) diff --git a/spring-mvc-forms-thymeleaf/pom.xml b/spring-mvc-forms-thymeleaf/pom.xml index 67a2696c8a..504ad1dcb2 100644 --- a/spring-mvc-forms-thymeleaf/pom.xml +++ b/spring-mvc-forms-thymeleaf/pom.xml @@ -9,10 +9,10 @@ spring forms examples using thymeleaf - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-angular/pom.xml b/spring-rest-angular/pom.xml index 22ddabb4ea..5240ae24e7 100644 --- a/spring-rest-angular/pom.xml +++ b/spring-rest-angular/pom.xml @@ -8,10 +8,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-angular/src/main/java/org/baeldung/web/main/Application.java b/spring-rest-angular/src/main/java/org/baeldung/web/main/Application.java index d6fe719311..fd10643c53 100644 --- a/spring-rest-angular/src/main/java/org/baeldung/web/main/Application.java +++ b/spring-rest-angular/src/main/java/org/baeldung/web/main/Application.java @@ -6,12 +6,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Import; import org.springframework.web.filter.ShallowEtagHeaderFilter; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @SpringBootApplication @EnableAutoConfiguration @Import(PersistenceConfig.class) -public class Application extends WebMvcConfigurerAdapter { +public class Application implements WebMvcConfigurer { public static void main(String[] args) { SpringApplication.run(Application.class, args); diff --git a/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java b/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java index 4d65c02fff..1473d44b92 100644 --- a/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java +++ b/spring-rest-angular/src/test/java/org/baeldung/web/service/StudentServiceIntegrationTest.java @@ -1,62 +1,66 @@ package org.baeldung.web.service; +import static io.restassured.RestAssured.given; +import static org.hamcrest.core.Is.is; +import static org.hamcrest.core.IsCollectionContaining.hasItems; +import static org.hamcrest.core.IsEqual.equalTo; + import org.apache.commons.lang3.RandomStringUtils; import org.baeldung.web.main.Application; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; +import org.springframework.boot.web.server.LocalServerPort; import org.springframework.test.context.junit4.SpringRunner; -import static io.restassured.RestAssured.given; -import static org.hamcrest.core.Is.is; -import static org.hamcrest.core.IsCollectionContaining.hasItems; -import static org.hamcrest.core.IsEqual.equalTo; - @RunWith(SpringRunner.class) -@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) +@SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.RANDOM_PORT) public class StudentServiceIntegrationTest { + + @LocalServerPort + int port; - private static final String ENDPOINT = "http://localhost:8080/student/get"; + private static final String ENDPOINT = "http://localhost:%s/student/get"; @Test public void givenRequestForStudents_whenPageIsOne_expectContainsNames() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().assertThat() + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().assertThat() .body("content.name", hasItems("Bryan", "Ben")); } @Test public void givenRequestForStudents_whenSizeIsTwo_expectTwoItems() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().assertThat().body("size", equalTo(2)); + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().assertThat().body("size", equalTo(2)); } @Test public void givenRequestForStudents_whenSizeIsTwo_expectNumberOfElementsTwo() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().assertThat().body("numberOfElements", equalTo(2)); + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().assertThat().body("numberOfElements", equalTo(2)); } @Test public void givenRequestForStudents_whenResourcesAreRetrievedPaged_thenExpect200() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().statusCode(200); + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().statusCode(200); } @Test public void givenRequestForStudents_whenPageOfResourcesAreRetrievedOutOfBounds_thenExpect500() { - given().params("page", "1000", "size", "2").get(ENDPOINT).then().statusCode(500); + given().params("page", "1000", "size", "2").get(String.format(ENDPOINT, port)).then().statusCode(500); } @Test public void givenRequestForStudents_whenPageNotValid_thenExpect500() { - given().params("page", RandomStringUtils.randomNumeric(5), "size", "2").get(ENDPOINT).then().statusCode(500); + given().params("page", RandomStringUtils.randomNumeric(5), "size", "2").get(String.format(ENDPOINT, port)).then().statusCode(500); } @Test public void givenRequestForStudents_whenPageSizeIsFive_expectFiveItems() { - given().params("page", "0", "size", "5").get(ENDPOINT).then().body("content.size()", is(5)); + given().params("page", "0", "size", "5").get(String.format(ENDPOINT, port)).then().body("content.size()", is(5)); } @Test public void givenResourcesExist_whenFirstPageIsRetrieved_thenPageContainsResources() { - given().params("page", "0", "size", "2").get(ENDPOINT).then().assertThat().body("first", equalTo(true)); + given().params("page", "0", "size", "2").get(String.format(ENDPOINT, port)).then().assertThat().body("first", equalTo(true)); } } diff --git a/spring-rest-query-language/pom.xml b/spring-rest-query-language/pom.xml index 6f790f1f48..70fea91f31 100644 --- a/spring-rest-query-language/pom.xml +++ b/spring-rest-query-language/pom.xml @@ -7,10 +7,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-shell/pom.xml b/spring-rest-shell/pom.xml index 8b7ce1770d..540b3d08eb 100644 --- a/spring-rest-shell/pom.xml +++ b/spring-rest-shell/pom.xml @@ -8,10 +8,10 @@ A simple project to demonstrate Spring REST Shell features. - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-simple/pom.xml b/spring-rest-simple/pom.xml index e5de463999..d301957eb9 100644 --- a/spring-rest-simple/pom.xml +++ b/spring-rest-simple/pom.xml @@ -8,10 +8,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest-template/pom.xml b/spring-rest-template/pom.xml index d86e208987..fa93308cf5 100644 --- a/spring-rest-template/pom.xml +++ b/spring-rest-template/pom.xml @@ -8,10 +8,10 @@ jar - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest/pom.xml b/spring-rest/pom.xml index ea4cfc26d7..5c88697cef 100644 --- a/spring-rest/pom.xml +++ b/spring-rest/pom.xml @@ -7,10 +7,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java index d811045733..191719b084 100644 --- a/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java +++ b/spring-rest/src/main/java/com/baeldung/resttemplate/lists/client/EmployeeClient.java @@ -43,7 +43,7 @@ public class EmployeeClient ResponseEntity> response = restTemplate.exchange( - "http://localhost:8080/spring-rest/employees/", + "http://localhost:8082/spring-rest/employees/", HttpMethod.GET, null, new ParameterizedTypeReference>(){}); @@ -61,7 +61,7 @@ public class EmployeeClient EmployeeList response = restTemplate.getForObject( - "http://localhost:8080/spring-rest/employees/v2", + "http://localhost:8082/spring-rest/employees/v2", EmployeeList.class); List employees = response.getEmployees(); @@ -80,7 +80,7 @@ public class EmployeeClient newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( - "http://localhost:8080/spring-rest/employees/", + "http://localhost:8082/spring-rest/employees/", newEmployees, ResponseEntity.class); } @@ -94,7 +94,7 @@ public class EmployeeClient newEmployees.add(new Employee(4, "CEO")); restTemplate.postForObject( - "http://localhost:8080/spring-rest/employees/v2/", + "http://localhost:8082/spring-rest/employees/v2/", new EmployeeList(newEmployees), ResponseEntity.class); } diff --git a/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java b/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java deleted file mode 100644 index 853e417d46..0000000000 --- a/spring-rest/src/main/java/com/baeldung/sampleapp/web/controller/advice/JsonpControllerAdvice.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.sampleapp.web.controller.advice; - -import org.springframework.web.bind.annotation.ControllerAdvice; -import org.springframework.web.servlet.mvc.method.annotation.AbstractJsonpResponseBodyAdvice; - -@ControllerAdvice -public class JsonpControllerAdvice extends AbstractJsonpResponseBodyAdvice { - - public JsonpControllerAdvice() { - super("callback"); - } - -} diff --git a/spring-rest/src/main/java/com/baeldung/web/upload/app/Application.java b/spring-rest/src/main/java/com/baeldung/web/upload/app/UploadApplication.java similarity index 79% rename from spring-rest/src/main/java/com/baeldung/web/upload/app/Application.java rename to spring-rest/src/main/java/com/baeldung/web/upload/app/UploadApplication.java index d6821196eb..f3b1c0dc6f 100644 --- a/spring-rest/src/main/java/com/baeldung/web/upload/app/Application.java +++ b/spring-rest/src/main/java/com/baeldung/web/upload/app/UploadApplication.java @@ -9,9 +9,9 @@ import org.springframework.context.annotation.ComponentScan; @EnableAutoConfiguration @ComponentScan("com.baeldung.web.upload") @SpringBootApplication -public class Application extends SpringBootServletInitializer { +public class UploadApplication extends SpringBootServletInitializer { public static void main(final String[] args) { - SpringApplication.run(Application.class, args); + SpringApplication.run(UploadApplication.class, args); } } \ No newline at end of file diff --git a/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java index e659897303..f04106c1e1 100644 --- a/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java +++ b/spring-rest/src/test/java/com/baeldung/SpringContextIntegrationTest.java @@ -14,7 +14,7 @@ import com.baeldung.web.log.app.Application; @RunWith(SpringRunner.class) @SpringBootTest(classes = { CustomApplication.class, ImageApplication.class, PropertyEditorApplication.class, - ResponseHeadersApplication.class, Application.class, com.baeldung.web.upload.app.Application.class, + ResponseHeadersApplication.class, Application.class, com.baeldung.web.upload.app.UploadApplication.class, MainApplication.class}) public class SpringContextIntegrationTest { diff --git a/spring-resttemplate/pom.xml b/spring-resttemplate/pom.xml index 2c404a7e8c..9a0978f120 100644 --- a/spring-resttemplate/pom.xml +++ b/spring-resttemplate/pom.xml @@ -8,10 +8,10 @@ war - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-security-mvc-boot/pom.xml b/spring-security-mvc-boot/pom.xml index c072bf0f99..0a40b0b324 100644 --- a/spring-security-mvc-boot/pom.xml +++ b/spring-security-mvc-boot/pom.xml @@ -11,10 +11,10 @@ Spring Security MVC Boot - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -36,7 +36,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 org.springframework.boot diff --git a/spring-security-mvc-boot/src/main/resources/templates/private.html b/spring-security-mvc-boot/src/main/resources/templates/private.html index 5af8c7a13e..035d84bbbd 100644 --- a/spring-security-mvc-boot/src/main/resources/templates/private.html +++ b/spring-security-mvc-boot/src/main/resources/templates/private.html @@ -1,6 +1,6 @@ + xmlns:sec="http://www.thymeleaf.org/extras/spring-security"> Private diff --git a/spring-security-openid/pom.xml b/spring-security-openid/pom.xml index 6a946792ba..4343996e02 100644 --- a/spring-security-openid/pom.xml +++ b/spring-security-openid/pom.xml @@ -9,10 +9,10 @@ Spring OpenID sample project - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/spring-security-openid/src/main/resources/application.properties.sample.properties b/spring-security-openid/src/main/resources/application.properties similarity index 100% rename from spring-security-openid/src/main/resources/application.properties.sample.properties rename to spring-security-openid/src/main/resources/application.properties diff --git a/spring-security-sso/pom.xml b/spring-security-sso/pom.xml index 4deab01464..4b297a91b5 100644 --- a/spring-security-sso/pom.xml +++ b/spring-security-sso/pom.xml @@ -9,10 +9,10 @@ pom - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -24,7 +24,7 @@ 3.1.0 2.3.3.RELEASE - 2.0.1.RELEASE + 2.1.1.RELEASE diff --git a/spring-security-sso/spring-security-sso-ui-2/pom.xml b/spring-security-sso/spring-security-sso-ui-2/pom.xml index 1f9a5754ae..e4ccb82fea 100644 --- a/spring-security-sso/spring-security-sso-ui-2/pom.xml +++ b/spring-security-sso/spring-security-sso-ui-2/pom.xml @@ -37,7 +37,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 diff --git a/spring-security-sso/spring-security-sso-ui/pom.xml b/spring-security-sso/spring-security-sso-ui/pom.xml index 56131749ba..a946db4c3b 100644 --- a/spring-security-sso/spring-security-sso-ui/pom.xml +++ b/spring-security-sso/spring-security-sso-ui/pom.xml @@ -38,7 +38,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 diff --git a/spring-security-thymeleaf/pom.xml b/spring-security-thymeleaf/pom.xml index 314783ebf2..d8b476683a 100644 --- a/spring-security-thymeleaf/pom.xml +++ b/spring-security-thymeleaf/pom.xml @@ -11,10 +11,10 @@ Spring Security with Thymeleaf tutorial - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -43,7 +43,7 @@ org.thymeleaf.extras - thymeleaf-extras-springsecurity4 + thymeleaf-extras-springsecurity5 From 9ee33c151f8110c21027954deb50944f869ca030 Mon Sep 17 00:00:00 2001 From: geroza Date: Tue, 11 Dec 2018 20:39:09 -0200 Subject: [PATCH 256/429] migrated modules to parent-boot-2 with spring-boot 2.1: spring-session/spring-session-jdbc spring-vault spring-webflux-amqp vaadin vavr --- spring-session/spring-session-jdbc/pom.xml | 4 +-- spring-vault/pom.xml | 25 +++---------------- spring-webflux-amqp/pom.xml | 4 +-- .../src/main/resources/application.yml | 2 +- vaadin/pom.xml | 4 +-- .../src/main/resources/application.properties | 2 ++ vavr/pom.xml | 4 +-- 7 files changed, 14 insertions(+), 31 deletions(-) create mode 100644 vaadin/src/main/resources/application.properties diff --git a/spring-session/spring-session-jdbc/pom.xml b/spring-session/spring-session-jdbc/pom.xml index a595a94914..ce6b5f5908 100644 --- a/spring-session/spring-session-jdbc/pom.xml +++ b/spring-session/spring-session-jdbc/pom.xml @@ -15,10 +15,10 @@ - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../../parent-boot-2.0-temp + ../../parent-boot-2 diff --git a/spring-vault/pom.xml b/spring-vault/pom.xml index 6a7db5dd71..aad6da1cc3 100644 --- a/spring-vault/pom.xml +++ b/spring-vault/pom.xml @@ -13,10 +13,10 @@ Spring Vault sample project - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 @@ -41,27 +41,8 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - **/*IntegrationTest.java - - - - - - UTF-8 - 2.0.1.RELEASE + 2.1.1.RELEASE diff --git a/spring-webflux-amqp/pom.xml b/spring-webflux-amqp/pom.xml index e4e0d55ce3..4faa165c50 100755 --- a/spring-webflux-amqp/pom.xml +++ b/spring-webflux-amqp/pom.xml @@ -11,10 +11,10 @@ Spring WebFlux AMQP Sample - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 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/vaadin/pom.xml b/vaadin/pom.xml index 1111c0aa0c..c34ffa3636 100644 --- a/vaadin/pom.xml +++ b/vaadin/pom.xml @@ -10,10 +10,10 @@ Vaadin - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 diff --git a/vaadin/src/main/resources/application.properties b/vaadin/src/main/resources/application.properties new file mode 100644 index 0000000000..1cb7086b82 --- /dev/null +++ b/vaadin/src/main/resources/application.properties @@ -0,0 +1,2 @@ +#Vaadin supports spring-boot 2.1 properly from V8 onwards (according to this comment https://github.com/vaadin/spring/issues/331#issuecomment-435128475) +spring.main.allow-bean-definition-overriding=true \ No newline at end of file diff --git a/vavr/pom.xml b/vavr/pom.xml index fa8eff1ce7..ae495e9830 100644 --- a/vavr/pom.xml +++ b/vavr/pom.xml @@ -7,10 +7,10 @@ vavr - parent-boot-2.0-temp + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-2.0-temp + ../parent-boot-2 From 2e6a5a35106f15c17187f886c8db2b58f0e260c4 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Wed, 12 Dec 2018 06:32:57 -0500 Subject: [PATCH 257/429] removed eval article code --- hexagonal-architecture/.gitignore | 1 - hexagonal-architecture/pom.xml | 14 ----- .../com/baeldung/hexagonal/Application.java | 26 -------- .../baeldung/hexagonal/domain/Employee.java | 60 ------------------- .../hexagonal/domain/EmployeeService.java | 25 -------- .../hexagonal/output/EmployeeCsvWriter.java | 59 ------------------ .../hexagonal/output/EmployeeLogger.java | 17 ------ .../hexagonal/output/EmployeeOutput.java | 9 --- .../hexagonal/storage/EmployeeRepository.java | 13 ---- .../storage/InMemoryEmployeeRepository.java | 31 ---------- .../ui/EmployeeConsoleInputImpl.java | 43 ------------- .../baeldung/hexagonal/ui/EmployeeInput.java | 7 --- 12 files changed, 305 deletions(-) delete mode 100644 hexagonal-architecture/.gitignore delete mode 100644 hexagonal-architecture/pom.xml delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java delete mode 100644 hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java diff --git a/hexagonal-architecture/.gitignore b/hexagonal-architecture/.gitignore deleted file mode 100644 index ae3c172604..0000000000 --- a/hexagonal-architecture/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/bin/ diff --git a/hexagonal-architecture/pom.xml b/hexagonal-architecture/pom.xml deleted file mode 100644 index d184576705..0000000000 --- a/hexagonal-architecture/pom.xml +++ /dev/null @@ -1,14 +0,0 @@ - - 4.0.0 - com.baeldung.hexagonal - hexagonal-architecture - jar - hexagonal-architecture - - com.baeldung - parent-java - 0.0.1-SNAPSHOT - ../parent-java - - diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java deleted file mode 100644 index 237b664708..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/Application.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.baeldung.hexagonal; - -import java.io.File; - -import com.baeldung.hexagonal.domain.EmployeeService; -import com.baeldung.hexagonal.output.EmployeeCsvWriter; -import com.baeldung.hexagonal.output.EmployeeLogger; -import com.baeldung.hexagonal.output.EmployeeOutput; -import com.baeldung.hexagonal.storage.EmployeeRepository; -import com.baeldung.hexagonal.storage.InMemoryEmployeeRepository; -import com.baeldung.hexagonal.ui.EmployeeConsoleInputImpl; -import com.baeldung.hexagonal.ui.EmployeeInput; - -public class Application { - - public static void main(String[] args) { - EmployeeRepository repository = new InMemoryEmployeeRepository(); - EmployeeOutput output = new EmployeeLogger(); - EmployeeOutput csvOutput = new EmployeeCsvWriter(new File(".").getAbsolutePath(), "output.csv"); - EmployeeService service = new EmployeeService(repository, csvOutput); - EmployeeInput ui = new EmployeeConsoleInputImpl(); - ui.collectData(service); - service.generateOutput(); - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java deleted file mode 100644 index 0d883995b6..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/Employee.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.hexagonal.domain; - -public class Employee { - private Long id; - private String name; - - public Employee(Long id, String name) { - this.id = id; - this.name = name; - } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - @Override - public String toString() { - return "Employee [id=" + id + ", name=" + name + "]"; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + ((id == null) ? 0 : id.hashCode()); - result = prime * result + ((name == null) ? 0 : name.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Employee other = (Employee) obj; - if (id == null) { - if (other.id != null) { - return false; - } - } else if (!id.equals(other.id)) { - return false; - } - - return true; - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java deleted file mode 100644 index 2ab3ce9712..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/domain/EmployeeService.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.baeldung.hexagonal.domain; - -import java.util.List; - -import com.baeldung.hexagonal.output.EmployeeOutput; -import com.baeldung.hexagonal.storage.EmployeeRepository; - -public class EmployeeService { - private EmployeeRepository employeeRepository; - private EmployeeOutput employeeOutput; - - public EmployeeService(EmployeeRepository employeeRepository, EmployeeOutput employeeOutput) { - this.employeeRepository = employeeRepository; - this.employeeOutput = employeeOutput; - } - - public Long add(Employee employee) { - return employeeRepository.save(employee); - } - - public void generateOutput() { - List employees = employeeRepository.findAll(); - employeeOutput.writeAll(employees); - } -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java deleted file mode 100644 index 799fbc28ba..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeCsvWriter.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.baeldung.hexagonal.output; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.io.IOException; -import java.util.Iterator; -import java.util.List; - -import com.baeldung.hexagonal.domain.Employee; - -public class EmployeeCsvWriter implements EmployeeOutput { - private File outputFile; - - public EmployeeCsvWriter(String path, String fileName) throws IllegalArgumentException { - if (fileName == null || path == null || fileName.length() == 0 || path.length() == 0) { - throw new IllegalArgumentException("Path and FileName are required"); - } else if (!fileName.endsWith(".csv")) { - throw new IllegalArgumentException("File name must be a .csv file"); - } - - System.out.println(path); - if (!path.endsWith("/")) { - path += "/"; - } - - outputFile = new File(path, fileName); - } - - @Override - public void writeAll(List employees) { - BufferedWriter writer = null; - - try { - writer = new BufferedWriter(new FileWriter(outputFile)); - for (Iterator it = employees.iterator(); it.hasNext();) { - Employee emp = it.next(); - StringBuffer empLine = new StringBuffer(); - empLine.append(emp.getId()); - empLine.append(","); - empLine.append(emp.getName()); - writer.newLine(); - } - writer.flush(); - } catch (IOException ioe) { - // handle the exception - } finally { - if (writer != null) { - try { - writer.close(); - } catch (IOException e) { - // handle the exception - } - } - } - - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java deleted file mode 100644 index 5272d18961..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeLogger.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.baeldung.hexagonal.output; - -import java.util.List; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.baeldung.hexagonal.domain.Employee; - -public class EmployeeLogger implements EmployeeOutput { - private static final Logger LOG = LoggerFactory.getLogger(EmployeeLogger.class); - - @Override - public void writeAll(List employees) { - employees.forEach(employee -> LOG.info(employee.toString())); - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java deleted file mode 100644 index 979c06e1f4..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/output/EmployeeOutput.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.hexagonal.output; - -import java.util.List; - -import com.baeldung.hexagonal.domain.Employee; - -public interface EmployeeOutput { - public void writeAll(List employees); -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java deleted file mode 100644 index 2787601998..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/EmployeeRepository.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.hexagonal.storage; - -import java.util.List; - -import com.baeldung.hexagonal.domain.Employee; - -public interface EmployeeRepository { - public Long save(Employee employee); - - public Employee findById(Long id); - - public List findAll(); -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java deleted file mode 100644 index e860c16462..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/storage/InMemoryEmployeeRepository.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.baeldung.hexagonal.storage; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.baeldung.hexagonal.domain.Employee; - -public class InMemoryEmployeeRepository implements EmployeeRepository { - private static Map employees = new HashMap<>(); - - @Override - public Long save(Employee employee) { - Long id = employee.getId(); - employees.put(id, employee); - return id; - } - - @Override - public Employee findById(Long id) { - return employees.get(id); - } - - @Override - public List findAll() { - List all = new ArrayList(employees.values()); - return all; - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java deleted file mode 100644 index 77453da48f..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeConsoleInputImpl.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.hexagonal.ui; - -import java.util.Scanner; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.baeldung.hexagonal.domain.Employee; -import com.baeldung.hexagonal.domain.EmployeeService; - -public class EmployeeConsoleInputImpl implements EmployeeInput { - private static final Logger LOG = LoggerFactory.getLogger(EmployeeConsoleInputImpl.class); - - public void enterEmployee(EmployeeService service, Scanner scanner) { - LOG.info("ID: "); - System.out.print("> "); - Long id = scanner.nextLong(); - LOG.info("Name: "); - System.out.print("> "); - String name = scanner.next(); - - Employee employee = new Employee(id, name); - service.add(employee); - } - - @Override - public void collectData(EmployeeService service) { - try (final Scanner scanner = new Scanner(System.in)) { - String keepGoing = "Y"; - do { - LOG.info("Enter information for an employee"); - enterEmployee(service, scanner); - LOG.info("Do you want to enter another employee? (Y/N)"); - System.out.print("> "); - keepGoing = scanner.next(); - if (keepGoing.length() > 1) { - keepGoing = keepGoing.substring(0, 1); - } - } while (keepGoing.equalsIgnoreCase("Y")); - } - } - -} diff --git a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java b/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java deleted file mode 100644 index adec2852cd..0000000000 --- a/hexagonal-architecture/src/main/java/com/baeldung/hexagonal/ui/EmployeeInput.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.hexagonal.ui; - -import com.baeldung.hexagonal.domain.EmployeeService; - -public interface EmployeeInput { - void collectData(EmployeeService service); -} From 1ad6d9c8720e94d87fdc74617326da4c216acd19 Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 12 Dec 2018 10:26:07 -0200 Subject: [PATCH 258/429] Deleted temporary parent-boot module using spring-boot 2.0.x --- parent-boot-2.0-temp/README.md | 2 - parent-boot-2.0-temp/pom.xml | 85 ---------------------------------- pom.xml | 6 --- 3 files changed, 93 deletions(-) delete mode 100644 parent-boot-2.0-temp/README.md delete mode 100644 parent-boot-2.0-temp/pom.xml diff --git a/parent-boot-2.0-temp/README.md b/parent-boot-2.0-temp/README.md deleted file mode 100644 index 8134c8eafe..0000000000 --- a/parent-boot-2.0-temp/README.md +++ /dev/null @@ -1,2 +0,0 @@ -This pom will be ued only temporary until we migrate parent-boot-2 to 2.1.0 for ticket BAEL-10354 - diff --git a/parent-boot-2.0-temp/pom.xml b/parent-boot-2.0-temp/pom.xml deleted file mode 100644 index 9284e4af13..0000000000 --- a/parent-boot-2.0-temp/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - 4.0.0 - parent-boot-2.0-temp - 0.0.1-SNAPSHOT - pom - Temporary Parent for all Spring Boot 2.0.x modules - - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - - - - io.rest-assured - rest-assured - - - org.springframework.boot - spring-boot-starter-test - test - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot.version} - - ${start-class} - - - - - - - - - - thin-jar - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.springframework.boot.experimental - spring-boot-thin-layout - ${thin.version} - - - - - - - - - - 3.1.0 - - 1.0.11.RELEASE - 2.0.5.RELEASE - - - - diff --git a/pom.xml b/pom.xml index 4e1e61961e..f6a56c895d 100644 --- a/pom.xml +++ b/pom.xml @@ -324,7 +324,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -592,7 +591,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -987,7 +985,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -1038,7 +1035,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -1302,7 +1298,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java @@ -1538,7 +1533,6 @@ parent-boot-1 parent-boot-2 - parent-boot-2.0-temp parent-spring-4 parent-spring-5 parent-java From cb7e5157236c11d274a25fb434bb1b7f9dc28138 Mon Sep 17 00:00:00 2001 From: Surapaneni Venkata Kiran Date: Wed, 12 Dec 2018 14:19:45 -0500 Subject: [PATCH 259/429] BAEL-2421 * Changes for http://jira.baeldung.com/browse/BAEL-2421 * fixed formatting * Merged the test and main classes as per the suggestion. * Merged the source code with tests. --- .../baeldung/ConvertStringToListUnitTest.java | 135 ++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/ConvertStringToListUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/ConvertStringToListUnitTest.java b/java-strings/src/test/java/com/baeldung/ConvertStringToListUnitTest.java new file mode 100644 index 0000000000..47357a99cc --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/ConvertStringToListUnitTest.java @@ -0,0 +1,135 @@ +package com.baeldung; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +import org.apache.commons.lang3.StringUtils; +import org.junit.Test; + +import com.google.common.base.Function; +import com.google.common.base.Splitter; +import com.google.common.collect.Lists; + +public class ConvertStringToListUnitTest { + + private final String countries = "Russia,Germany,England,France,Italy"; + private final String ranks = "1,2,3,4,5, 6,7"; + private final String emptyStrings = ",,,,,"; + private final List expectedCountriesList = Arrays.asList("Russia", "Germany", "England", "France", "Italy"); + private final List expectedRanksList = Arrays.asList(1, 2, 3, 4, 5, 6, 7); + private final List expectedEmptyStringsList = Arrays.asList("", "", "", "", "", ""); + + @Test + public void givenString_thenGetListOfStringByJava() { + List convertedCountriesList = Arrays.asList(countries.split(",", -1)); + + assertEquals(expectedCountriesList, convertedCountriesList); + } + + @Test + public void givenString_thenGetListOfStringByApache() { + List convertedCountriesList = Arrays.asList(StringUtils.splitPreserveAllTokens(countries, ",")); + + assertEquals(expectedCountriesList, convertedCountriesList); + } + + @Test + public void givenString_thenGetListOfStringByGuava() { + List convertedCountriesList = Splitter.on(",") + .trimResults() + .splitToList(countries); + + assertEquals(expectedCountriesList, convertedCountriesList); + } + + @Test + public void givenString_thenGetListOfStringByJava8() { + List convertedCountriesList = Stream.of(countries.split(",", -1)) + .collect(Collectors.toList()); + + assertEquals(expectedCountriesList, convertedCountriesList); + } + + @Test + public void givenString_thenGetListOfIntegerByJava() { + String[] convertedRankArray = ranks.split(","); + List convertedRankList = new ArrayList(); + for (String number : convertedRankArray) { + convertedRankList.add(Integer.parseInt(number.trim())); + } + + assertEquals(expectedRanksList, convertedRankList); + } + + @Test + public void givenString_thenGetListOfIntegerByGuava() { + List convertedRankList = Lists.transform(Splitter.on(",") + .trimResults() + .splitToList(ranks), new Function() { + @Override + public Integer apply(String input) { + return Integer.parseInt(input.trim()); + } + }); + + assertEquals(expectedRanksList, convertedRankList); + } + + @Test + public void givenString_thenGetListOfIntegerByJava8() { + List convertedRankList = Stream.of(ranks.split(",")) + .map(String::trim) + .map(Integer::parseInt) + .collect(Collectors.toList()); + + assertEquals(expectedRanksList, convertedRankList); + } + + @Test + public void givenString_thenGetListOfIntegerByApache() { + String[] convertedRankArray = StringUtils.split(ranks, ","); + List convertedRankList = new ArrayList(); + for (String number : convertedRankArray) { + convertedRankList.add(Integer.parseInt(number.trim())); + } + + assertEquals(expectedRanksList, convertedRankList); + } + + @Test + public void givenEmptyStrings_thenGetListOfStringByJava() { + List convertedEmptyStringsList = Arrays.asList(emptyStrings.split(",", -1)); + + assertEquals(expectedEmptyStringsList, convertedEmptyStringsList); + } + + @Test + public void givenEmptyStrings_thenGetListOfStringByApache() { + List convertedEmptyStringsList = Arrays.asList(StringUtils.splitPreserveAllTokens(emptyStrings, ",")); + + assertEquals(expectedEmptyStringsList, convertedEmptyStringsList); + } + + @Test + public void givenEmptyStrings_thenGetListOfStringByGuava() { + List convertedEmptyStringsList = Splitter.on(",") + .trimResults() + .splitToList(emptyStrings); + + assertEquals(expectedEmptyStringsList, convertedEmptyStringsList); + } + + @Test + public void givenEmptyStrings_thenGetListOfStringByJava8() { + List convertedEmptyStringsList = Stream.of(emptyStrings.split(",", -1)) + .collect(Collectors.toList()); + + assertEquals(expectedEmptyStringsList, convertedEmptyStringsList); + } + +} From 5525c1277658edfd20de06e46a2dd61506484cf3 Mon Sep 17 00:00:00 2001 From: Paul van Gool Date: Wed, 12 Dec 2018 14:20:14 -0800 Subject: [PATCH 260/429] BAEL-1049: Re-merge changes. (#5895) * BAEL-1049: Re-merge changes. * Change to re-trigger build * Change to re-trigger the build * Change to re-trigger build * Change to re-trigger build --- .../baeldung/fj/FunctionalJavaUnitTest.java | 42 ++++++++----------- 1 file changed, 18 insertions(+), 24 deletions(-) diff --git a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java b/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java index aa06ba4eb9..97ead07470 100644 --- a/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java +++ b/libraries/src/test/java/com/baeldung/fj/FunctionalJavaUnitTest.java @@ -1,6 +1,8 @@ package com.baeldung.fj; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import org.junit.Test; @@ -30,7 +32,7 @@ public class FunctionalJavaUnitTest { List fList1 = fList.map(timesTwo); List fList2 = fList.map(i -> i * 2); - assertEquals(fList1.equals(fList2), true); + assertTrue(fList1.equals(fList2)); } @Test @@ -41,7 +43,7 @@ public class FunctionalJavaUnitTest { List fList2 = fList.map(plusOne).map(timesTwo); Show.listShow(Show.intShow).println(fList2); - assertEquals(fList1.equals(fList2), false); + assertFalse(fList1.equals(fList2)); } @Test @@ -49,10 +51,8 @@ public class FunctionalJavaUnitTest { List fList = List.list(3, 4, 5, 6); List evenList = fList.map(isEven); List evenListTrueResult = List.list(false, true, false, true); - List evenListFalseResult = List.list(true, false, false, true); - assertEquals(evenList.equals(evenListTrueResult), true); - assertEquals(evenList.equals(evenListFalseResult), false); + assertTrue(evenList.equals(evenListTrueResult)); } @Test @@ -60,10 +60,8 @@ public class FunctionalJavaUnitTest { List fList = List.list(3, 4, 5, 6); fList = fList.map(i -> i + 100); List resultList = List.list(103, 104, 105, 106); - List falseResultList = List.list(15, 504, 105, 106); - assertEquals(fList.equals(resultList), true); - assertEquals(fList.equals(falseResultList), false); + assertTrue(fList.equals(resultList)); } @Test @@ -71,23 +69,19 @@ public class FunctionalJavaUnitTest { Array array = Array.array(3, 4, 5, 6); Array filteredArray = array.filter(isEven); Array result = Array.array(4, 6); - Array wrongResult = Array.array(3, 5); - assertEquals(filteredArray.equals(result), true); - assertEquals(filteredArray.equals(wrongResult), false); + assertTrue(filteredArray.equals(result)); } @Test public void checkForLowerCase_givenStringArray_returnResult() { Array array = Array.array("Welcome", "To", "baeldung"); + assertTrue(array.exists(s -> List.fromString(s).forall(Characters.isLowerCase))); + Array array2 = Array.array("Welcome", "To", "Baeldung"); - Boolean isExist = array.exists(s -> List.fromString(s).forall(Characters.isLowerCase)); - Boolean isExist2 = array2.exists(s -> List.fromString(s).forall(Characters.isLowerCase)); - Boolean isAll = array.forall(s -> List.fromString(s).forall(Characters.isLowerCase)); - - assertEquals(isExist, true); - assertEquals(isExist2, false); - assertEquals(isAll, false); + assertFalse(array2.exists(s -> List.fromString(s).forall(Characters.isLowerCase))); + + assertFalse(array.forall(s -> List.fromString(s).forall(Characters.isLowerCase))); } @Test @@ -102,9 +96,9 @@ public class FunctionalJavaUnitTest { Option result2 = n2.bind(function); Option result3 = n3.bind(function); - assertEquals(result1, Option.none()); - assertEquals(result2, Option.some(102)); - assertEquals(result3, Option.none()); + assertEquals(Option.none(), result1); + assertEquals(Option.some(102), result2); + assertEquals(Option.none(), result3); } @Test @@ -112,11 +106,11 @@ public class FunctionalJavaUnitTest { Array intArray = Array.array(17, 44, 67, 2, 22, 80, 1, 27); int sumAll = intArray.foldLeft(Integers.add, 0); - assertEquals(sumAll, 260); + assertEquals(260, sumAll); int sumEven = intArray.filter(isEven).foldLeft(Integers.add, 0); - assertEquals(sumEven, 148); + assertEquals(148, sumEven); } - + } From 08eabaf2b8410c60a01c8beb1fdfdf12fbb3ed48 Mon Sep 17 00:00:00 2001 From: eric-martin Date: Wed, 12 Dec 2018 22:46:45 -0600 Subject: [PATCH 261/429] BAEL-2068: Using hibernate-c3p0 --- persistence-modules/hibernate5/pom.xml | 10 ++++++++++ .../hibernate5/src/test/resources/hibernate.properties | 7 ++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 7e9a0ddb29..f5a3a7e4c9 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -36,6 +36,11 @@ hibernate-spatial ${hibernate.version} + + org.hibernate + hibernate-c3p0 + ${hibernate.version} + mysql mysql-connector-java @@ -56,6 +61,11 @@ jackson-databind ${jackson.version} + + net.bytebuddy + byte-buddy + 1.9.5 + diff --git a/persistence-modules/hibernate5/src/test/resources/hibernate.properties b/persistence-modules/hibernate5/src/test/resources/hibernate.properties index 7b8764637b..c14782ce0f 100644 --- a/persistence-modules/hibernate5/src/test/resources/hibernate.properties +++ b/persistence-modules/hibernate5/src/test/resources/hibernate.properties @@ -6,4 +6,9 @@ jdbc.password= hibernate.dialect=org.hibernate.dialect.H2Dialect hibernate.show_sql=true -hibernate.hbm2ddl.auto=create-drop \ No newline at end of file +hibernate.hbm2ddl.auto=create-drop + +hibernate.c3p0.min_size=5 +hibernate.c3p0.max_size=20 +hibernate.c3p0.acquire_increment=5 +hibernate.c3p0.timeout=1800 From 25854b89a800341a04c45473fb0cb97ba21f3dc8 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Thu, 13 Dec 2018 13:45:02 +0530 Subject: [PATCH 262/429] BAEL-10829 Cleanup parent pom.xml (#5907) * BAEL-10829 Cleanup parent pom.xml - Removed geotools module causing build to hang - Removed -q parameter from travis to see full logs while building * BAEL-10829 reverting -q flag in travis * BAEL-10829 Commented restx module due to failing tests --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 4e1e61961e..43b53690e0 100644 --- a/pom.xml +++ b/pom.xml @@ -401,7 +401,7 @@ flips flyway-cdi-extension - geotools + google-cloud google-web-toolkit @@ -550,7 +550,7 @@ reactor-core rest-with-spark-java resteasy - restx + rule-engines/easy-rules rule-engines/openl-tablets @@ -1115,7 +1115,7 @@ flips flyway-cdi-extension - geotools + google-cloud google-web-toolkit @@ -1264,7 +1264,7 @@ reactor-core rest-with-spark-java resteasy - restx + rule-engines/easy-rules rule-engines/openl-tablets From ac049837d9483bec98a66c3c818d57c23c1279fd Mon Sep 17 00:00:00 2001 From: clininger Date: Thu, 13 Dec 2018 15:38:53 +0700 Subject: [PATCH 263/429] Removed references to "wind" in sample code --- .../com/baeldung/rsocket/FireNForgetClient.java | 4 ++-- .../java/com/baeldung/rsocket/ReqStreamClient.java | 2 +- .../src/main/java/com/baeldung/rsocket/Server.java | 14 +++++++------- .../com/baeldung/rsocket/support/Constants.java | 4 ++-- .../{WindDataPublisher.java => DataPublisher.java} | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) rename rsocket/src/main/java/com/baeldung/rsocket/support/{WindDataPublisher.java => DataPublisher.java} (91%) diff --git a/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java b/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java index 496b3fc5c9..a67078db06 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/FireNForgetClient.java @@ -61,9 +61,9 @@ public class FireNForgetClient { * @return List of random floats */ private List generateData() { - List dataList = new ArrayList<>(WIND_DATA_LENGTH); + List dataList = new ArrayList<>(DATA_LENGTH); float velocity = 0; - for (int i = 0; i < WIND_DATA_LENGTH; i++) { + for (int i = 0; i < DATA_LENGTH; i++) { velocity += Math.random(); dataList.add(velocity); } diff --git a/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java b/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java index e97192bdf0..085f9874fa 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/ReqStreamClient.java @@ -21,7 +21,7 @@ public class ReqStreamClient { public Flux getDataStream() { return socket - .requestStream(DefaultPayload.create(WIND_DATA_STREAM_NAME)) + .requestStream(DefaultPayload.create(DATA_STREAM_NAME)) .map(Payload::getData) .map(buf -> buf.getFloat()) .onErrorReturn(null); diff --git a/rsocket/src/main/java/com/baeldung/rsocket/Server.java b/rsocket/src/main/java/com/baeldung/rsocket/Server.java index b5718ab36d..42243da39f 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/Server.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/Server.java @@ -1,6 +1,6 @@ package com.baeldung.rsocket; -import com.baeldung.rsocket.support.WindDataPublisher; +import com.baeldung.rsocket.support.DataPublisher; import static com.baeldung.rsocket.support.Constants.*; import com.baeldung.rsocket.support.GameController; import io.rsocket.AbstractRSocket; @@ -19,7 +19,7 @@ public class Server { private static final Logger LOG = LoggerFactory.getLogger(Server.class); private final Disposable server; - private final WindDataPublisher windDataPublisher = new WindDataPublisher(); + private final DataPublisher dataPublisher = new DataPublisher(); private final GameController gameController; public Server() { @@ -34,7 +34,7 @@ public class Server { } public void dispose() { - windDataPublisher.complete(); + dataPublisher.complete(); this.server.dispose(); } @@ -67,7 +67,7 @@ public class Server { @Override public Mono fireAndForget(Payload payload) { try { - windDataPublisher.publish(payload); // forward the payload + dataPublisher.publish(payload); // forward the payload return Mono.empty(); } catch (Exception x) { return Mono.error(x); @@ -78,13 +78,13 @@ public class Server { * Handle Request/Stream messages. Each request returns a new stream. * * @param payload Payload that can be used to determine which stream to return - * @return Flux stream containing simulated wind speed data + * @return Flux stream containing simulated measurement data */ @Override public Flux requestStream(Payload payload) { String streamName = payload.getDataUtf8(); - if (WIND_DATA_STREAM_NAME.equals(streamName)) { - return Flux.from(windDataPublisher); + if (DATA_STREAM_NAME.equals(streamName)) { + return Flux.from(dataPublisher); } return Flux.error(new IllegalArgumentException(streamName)); } diff --git a/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java b/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java index 01bb374b4e..4ffc4f6483 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/support/Constants.java @@ -4,7 +4,7 @@ public interface Constants { int TCP_PORT = 7101; String ERROR_MSG = "error"; - int WIND_DATA_LENGTH = 30; - String WIND_DATA_STREAM_NAME = "wind-data"; + int DATA_LENGTH = 30; + String DATA_STREAM_NAME = "data"; int SHOT_COUNT = 10; } diff --git a/rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java b/rsocket/src/main/java/com/baeldung/rsocket/support/DataPublisher.java similarity index 91% rename from rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java rename to rsocket/src/main/java/com/baeldung/rsocket/support/DataPublisher.java index 2ad5b5144b..3e74da8317 100644 --- a/rsocket/src/main/java/com/baeldung/rsocket/support/WindDataPublisher.java +++ b/rsocket/src/main/java/com/baeldung/rsocket/support/DataPublisher.java @@ -7,7 +7,7 @@ import org.reactivestreams.Subscriber; /** * Simple PUblisher to provide async data to Flux stream */ -public class WindDataPublisher implements Publisher { +public class DataPublisher implements Publisher { private Subscriber subscriber; From 92c7248a57bd823fc7bcbb5afbde4c5c5f5fdb4f Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Tue, 11 Dec 2018 22:49:55 +0330 Subject: [PATCH 264/429] Added two tests for time difference calculation in terms of seconds! --- .../com/baeldung/date/DateDiffUnitTest.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java index 92da22cc95..1234a700de 100644 --- a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java @@ -8,6 +8,7 @@ import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Period; +import java.time.temporal.ChronoUnit; import java.util.Date; import java.util.Locale; import java.util.TimeZone; @@ -51,6 +52,16 @@ public class DateDiffUnitTest { assertEquals(diff, 6); } + @Test + public void givenTwoDateTimesInJava8_whenDifferentiatingInSeconds_thenWeGetTen() { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime tenSecondsLater = now.plusSeconds(10); + + long diff = ChronoUnit.SECONDS.between(now, tenSecondsLater); + + assertEquals(diff, 10); + } + @Test public void givenTwoZonedDateTimesInJava8_whenDifferentiating_thenWeGetSix() { LocalDateTime ldt = LocalDateTime.now(); @@ -60,6 +71,16 @@ public class DateDiffUnitTest { assertEquals(diff, 6); } + @Test + public void givenTwoDateTimesInJava8_whenDifferentiatingInSecondsUsingUntil_thenWeGetTen() { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime tenSecondsLater = now.plusSeconds(10); + + long diff = now.until(tenSecondsLater, ChronoUnit.SECONDS); + + assertEquals(diff, 10); + } + @Test public void givenTwoDatesInJodaTime_whenDifferentiating_thenWeGetSix() { org.joda.time.LocalDate now = org.joda.time.LocalDate.now(); From 7a23ac4f5301a45b74e992b8e730ff7c7dab1d89 Mon Sep 17 00:00:00 2001 From: markoprevisic Date: Thu, 13 Dec 2018 15:12:23 +0100 Subject: [PATCH 265/429] BAEL-2351 fixed integration tests --- .../src/main/resources/application.properties | 5 ++++- .../RestartApplicationIntegrationTest.java | 19 ++++++++++++------- .../src/test/resources/application.properties | 5 ++++- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/spring-boot-ops/src/main/resources/application.properties b/spring-boot-ops/src/main/resources/application.properties index 644a3edabc..27b7915cff 100644 --- a/spring-boot-ops/src/main/resources/application.properties +++ b/spring-boot-ops/src/main/resources/application.properties @@ -1,4 +1,7 @@ management.endpoints.web.exposure.include=* management.metrics.enable.root=true management.metrics.enable.jvm=true -management.endpoint.restart.enabled=true \ No newline at end of file +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-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java b/spring-boot-ops/src/test/java/com/baeldung/restart/RestartApplicationIntegrationTest.java index 1bec3c6a90..14e80c3ac7 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,20 +2,25 @@ package com.baeldung.restart; import static org.junit.Assert.assertEquals; +import org.junit.After; +import org.junit.Before; 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 template = new TestRestTemplate(); + + private TestRestTemplate restTemplate = new TestRestTemplate(); @Test public void givenBootApp_whenRestart_thenOk() throws Exception { Application.main(new String[0]); - - ResponseEntity response = template.exchange("http://localhost:8080/restart", + + ResponseEntity response = restTemplate.exchange("http://localhost:8080/restart", HttpMethod.POST, null, Object.class); assertEquals(200, response.getStatusCode().value()); @@ -24,11 +29,11 @@ public class RestartApplicationIntegrationTest { @Test public void givenBootApp_whenRestartUsingActuator_thenOk() throws Exception { Application.main(new String[] { "--server.port=8090" }); - - ResponseEntity response = template.exchange("http://localhost:8090/restartApp", + + ResponseEntity response = restTemplate.exchange("http://localhost:8090/restartApp", HttpMethod.POST, null, Object.class); assertEquals(200, response.getStatusCode().value()); } -} +} \ No newline at end of file diff --git a/spring-boot-ops/src/test/resources/application.properties b/spring-boot-ops/src/test/resources/application.properties index 0adf2998d7..cf0f0ab74c 100644 --- a/spring-boot-ops/src/test/resources/application.properties +++ b/spring-boot-ops/src/test/resources/application.properties @@ -6,4 +6,7 @@ management.endpoints.web.exposure.include=* management.endpoint.shutdown.enabled=true endpoints.shutdown.enabled=true -management.endpoint.restart.enabled=true \ No newline at end of file +management.endpoint.restart.enabled=true + +spring.main.allow-bean-definition-overriding=true +spring.jmx.unique-names=true \ No newline at end of file From 8b63e6d7f46b59b66c8611589ead7da1883e6e24 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Fri, 14 Dec 2018 00:53:14 +0530 Subject: [PATCH 266/429] BAEL-10829 Clean up the parent pom of the tutorials project (#5911) - Moved jhipster and java-mongodb modules to heavy profiles --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 43b53690e0..99dae9decb 100644 --- a/pom.xml +++ b/pom.xml @@ -448,7 +448,6 @@ jersey JGit jgroups - jhipster jib jjwt jmeter @@ -516,7 +515,6 @@ persistence-modules/java-cockroachdb persistence-modules/java-jdbi persistence-modules/java-jpa - persistence-modules/java-mongodb persistence-modules/jnosql persistence-modules/liquibase persistence-modules/orientdb @@ -998,12 +996,14 @@ core-kotlin jenkins/hello-world + jhipster jws libraries persistence-modules/hibernate5 persistence-modules/java-jpa + persistence-modules/java-mongodb persistence-modules/jnosql spring-5-data-reactive @@ -1162,7 +1162,6 @@ jersey JGit jgroups - jhipster jib jjwt jmeter @@ -1230,7 +1229,6 @@ persistence-modules/java-cockroachdb persistence-modules/java-jdbi persistence-modules/java-jpa - persistence-modules/java-mongodb persistence-modules/jnosql persistence-modules/liquibase persistence-modules/orientdb @@ -1549,18 +1547,20 @@ core-kotlin jenkins/hello-world + jhipster jws libraries persistence-modules/hibernate5 persistence-modules/java-jpa + persistence-modules/java-mongodb persistence-modules/jnosql spring-5-data-reactive spring-amqp-simple - vaadin + vaadin From 28de875e872e9cbfa6b4aec6bc9e9af4394be35c Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Thu, 13 Dec 2018 20:23:55 +0100 Subject: [PATCH 267/429] added link --- rxjava-2/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/rxjava-2/README.md b/rxjava-2/README.md index f9528bb1d5..d0bdeec684 100644 --- a/rxjava-2/README.md +++ b/rxjava-2/README.md @@ -6,3 +6,4 @@ - [RxJava Maybe](http://www.baeldung.com/rxjava-maybe) - [Introduction to RxRelay for RxJava](http://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) From 3235804ebfe0ed86ec71a69a5dcd0cebf0722d2f Mon Sep 17 00:00:00 2001 From: Loredana Date: Fri, 14 Dec 2018 00:01:53 +0200 Subject: [PATCH 268/429] small fix in merge sort --- .../main/java/com/baeldung/algorithms/mergesort/MergeSort.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java b/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java index 0deb48b6a0..945b4ffd7e 100644 --- a/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java +++ b/algorithms-sorting/src/main/java/com/baeldung/algorithms/mergesort/MergeSort.java @@ -34,7 +34,7 @@ public class MergeSort { while (i < left && j < right) { - if (l[i] < r[j]) + if (l[i] <= r[j]) a[k++] = l[i++]; else a[k++] = r[j++]; From 291abe3dee5284140df5a2c0ede606c2737d2b8a Mon Sep 17 00:00:00 2001 From: Ger Roza Date: Fri, 14 Dec 2018 09:02:17 -0200 Subject: [PATCH 269/429] change in README just to kick off a Travis build --- spring-mvc-forms-thymeleaf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/spring-mvc-forms-thymeleaf/README.md b/spring-mvc-forms-thymeleaf/README.md index f0f7e35a98..22f12afbca 100644 --- a/spring-mvc-forms-thymeleaf/README.md +++ b/spring-mvc-forms-thymeleaf/README.md @@ -2,3 +2,4 @@ - [Session Attributes in Spring MVC](http://www.baeldung.com/spring-mvc-session-attributes) - [Binding a List in Thymeleaf](http://www.baeldung.com/thymeleaf-list) + From 50f23889012685d6ca1820f414ebad2ad570ed30 Mon Sep 17 00:00:00 2001 From: Shubhra Srivastava Date: Fri, 14 Dec 2018 22:56:10 +0530 Subject: [PATCH 270/429] BAEL-2411 Spring Data Jpa Pagingg and Sorting (#5912) --- .../product/ProductRepository.java | 9 +- .../com/baeldung/domain/product/Product.java | 17 ++- .../ProductRepositoryIntegrationTest.java | 142 ++++++++++++++++++ 3 files changed, 165 insertions(+), 3 deletions(-) mode change 100644 => 100755 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java mode change 100644 => 100755 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java create mode 100644 persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/product/ProductRepositoryIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java old mode 100644 new mode 100755 index 7044d57e53..1f9f5f9195 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/product/ProductRepository.java @@ -1,8 +1,13 @@ package com.baeldung.dao.repositories.product; import com.baeldung.domain.product.Product; -import org.springframework.data.jpa.repository.JpaRepository; -public interface ProductRepository extends JpaRepository { +import java.util.List; +import org.springframework.data.domain.Pageable; +import org.springframework.data.repository.PagingAndSortingRepository; + +public interface ProductRepository extends PagingAndSortingRepository { + + List findAllByPrice(double price, Pageable pageable); } diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java old mode 100644 new mode 100755 index 42e6dd8f45..2f82e3e318 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/product/Product.java @@ -19,6 +19,17 @@ public class Product { super(); } + private Product(int id, String name, double price) { + super(); + this.id = id; + this.name = name; + this.price = price; + } + + public static Product from(int id, String name, double price) { + return new Product(id, name, price); + } + public int getId() { return id; } @@ -46,7 +57,11 @@ public class Product { @Override public String toString() { final StringBuilder builder = new StringBuilder(); - builder.append("Product [name=").append(name).append(", id=").append(id).append("]"); + builder.append("Product [name=") + .append(name) + .append(", id=") + .append(id) + .append("]"); return builder.toString(); } } diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/product/ProductRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/product/ProductRepositoryIntegrationTest.java new file mode 100644 index 0000000000..4caa0f0ca4 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/product/ProductRepositoryIntegrationTest.java @@ -0,0 +1,142 @@ +package com.baeldung.dao.repositories.product; + +import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.hasSize; +import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.transaction.annotation.Transactional; + +import com.baeldung.config.PersistenceProductConfiguration; +import com.baeldung.domain.product.Product; + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = { PersistenceProductConfiguration.class }) +@EnableTransactionManagement +public class ProductRepositoryIntegrationTest { + + @Autowired + private ProductRepository productRepository; + + @Before + @Transactional("productTransactionManager") + public void setUp() { + productRepository.save(Product.from(1001, "Book", 21)); + productRepository.save(Product.from(1002, "Coffee", 10)); + productRepository.save(Product.from(1003, "Jeans", 30)); + productRepository.save(Product.from(1004, "Shirt", 32)); + productRepository.save(Product.from(1005, "Bacon", 10)); + } + + @Test + public void whenRequestingFirstPageOfSizeTwo_ThenReturnFirstPage() { + Pageable pageRequest = PageRequest.of(0, 2); + + Page result = productRepository.findAll(pageRequest); + + assertThat(result.getContent(), hasSize(2)); + assertTrue(result.stream() + .map(Product::getId) + .allMatch(id -> Arrays.asList(1001, 1002) + .contains(id))); + } + + @Test + public void whenRequestingSecondPageOfSizeTwo_ThenReturnSecondPage() { + Pageable pageRequest = PageRequest.of(1, 2); + + Page result = productRepository.findAll(pageRequest); + + assertThat(result.getContent(), hasSize(2)); + assertTrue(result.stream() + .map(Product::getId) + .allMatch(id -> Arrays.asList(1003, 1004) + .contains(id))); + } + + @Test + public void whenRequestingLastPage_ThenReturnLastPageWithRemData() { + Pageable pageRequest = PageRequest.of(2, 2); + + Page result = productRepository.findAll(pageRequest); + + assertThat(result.getContent(), hasSize(1)); + assertTrue(result.stream() + .map(Product::getId) + .allMatch(id -> Arrays.asList(1005) + .contains(id))); + } + + @Test + public void whenSortingByNameAscAndPaging_ThenReturnSortedPagedResult() { + Pageable pageRequest = PageRequest.of(0, 3, Sort.by("name")); + + Page result = productRepository.findAll(pageRequest); + + assertThat(result.getContent(), hasSize(3)); + assertThat(result.getContent() + .stream() + .map(Product::getId) + .collect(Collectors.toList()), equalTo(Arrays.asList(1005, 1001, 1002))); + + } + + @Test + public void whenSortingByPriceDescAndPaging_ThenReturnSortedPagedResult() { + Pageable pageRequest = PageRequest.of(0, 3, Sort.by("price") + .descending()); + + Page result = productRepository.findAll(pageRequest); + + assertThat(result.getContent(), hasSize(3)); + assertThat(result.getContent() + .stream() + .map(Product::getId) + .collect(Collectors.toList()), equalTo(Arrays.asList(1004, 1003, 1001))); + + } + + @Test + public void whenSortingByPriceDescAndNameAscAndPaging_ThenReturnSortedPagedResult() { + Pageable pageRequest = PageRequest.of(0, 5, Sort.by("price") + .descending() + .and(Sort.by("name"))); + + Page result = productRepository.findAll(pageRequest); + + assertThat(result.getContent(), hasSize(5)); + assertThat(result.getContent() + .stream() + .map(Product::getId) + .collect(Collectors.toList()), equalTo(Arrays.asList(1004, 1003, 1001, 1005, 1002))); + + } + + @Test + public void whenRequestingFirstPageOfSizeTwoUsingCustomMethod_ThenReturnFirstPage() { + Pageable pageRequest = PageRequest.of(0, 2); + + List result = productRepository.findAllByPrice(10, pageRequest); + + assertThat(result, hasSize(2)); + assertTrue(result.stream() + .map(Product::getId) + .allMatch(id -> Arrays.asList(1002, 1005) + .contains(id))); + } +} From 78096d4712cc03256324557606137b0528ad854b Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 14 Dec 2018 20:21:50 +0100 Subject: [PATCH 271/429] BAEL-2412 Change test for min and max values by negative and positive infinity. --- .../gson/primitives/models/InfinityValuesExample.java | 6 ++++++ .../gson/primitives/models/LimitValuesExample.java | 6 ------ .../java/org/baeldung/gson/primitives/UnitTest.java | 11 +++++------ 3 files changed, 11 insertions(+), 12 deletions(-) create mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/InfinityValuesExample.java delete mode 100644 gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/InfinityValuesExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/InfinityValuesExample.java new file mode 100644 index 0000000000..163b0a3d95 --- /dev/null +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/InfinityValuesExample.java @@ -0,0 +1,6 @@ +package org.baeldung.gson.primitives.models; + +public class InfinityValuesExample { + public float negativeInfinity; + public float positiveInfinity; +} diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java b/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java deleted file mode 100644 index 4960a98834..0000000000 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/LimitValuesExample.java +++ /dev/null @@ -1,6 +0,0 @@ -package org.baeldung.gson.primitives.models; - -public class LimitValuesExample { - public float minValue; - public float maxValue; -} diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index 95314d4d43..d77476517d 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -32,15 +32,14 @@ public class UnitTest { assertEquals(expected, gson.toJson(primitiveBundle)); } - @Test public void toJsonLimitValues() { - LimitValuesExample model = new LimitValuesExample(); - model.minValue = Float.MIN_VALUE; - model.maxValue = Float.MAX_VALUE; + @Test(expected = IllegalArgumentException.class) public void toJsonInfinity() { + InfinityValuesExample model = new InfinityValuesExample(); + model.negativeInfinity = Float.NEGATIVE_INFINITY; + model.positiveInfinity = Float.POSITIVE_INFINITY; Gson gson = new Gson(); - String expected = "{\"minValue\":1.4E-45,\"maxValue\":3.4028235E38}"; - assertEquals(expected, gson.toJson(model)); + gson.toJson(model); } @Test(expected = IllegalArgumentException.class) public void toJsonNaN() { From bdc8b066a5f6d4ab53a4c5a1665cf9ffe8d2d026 Mon Sep 17 00:00:00 2001 From: Javier Date: Fri, 14 Dec 2018 20:29:48 +0100 Subject: [PATCH 272/429] BAEL-2412 Remove boolean and char fields from some of the examples. --- .../primitives/models/PrimitiveBundleInitialized.java | 5 +---- .../test/java/org/baeldung/gson/primitives/UnitTest.java | 8 ++------ 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java index 6fa99f4e3d..2780f7fd18 100644 --- a/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java +++ b/gson/src/main/java/org/baeldung/gson/primitives/models/PrimitiveBundleInitialized.java @@ -8,14 +8,11 @@ public class PrimitiveBundleInitialized { public long longValue = 1L; public float floatValue = 1.0f; public double doubleValue = 1; - public boolean booleanValue = true; - public char charValue = 'a'; // @formatter:on public String toString() { return "{" + "byte: " + byteValue + ", " + "short: " + shortValue + ", " + "int: " + intValue + ", " + "long: " + longValue + ", " - + "float: " + floatValue + ", " + "double: " + doubleValue + ", " - + "boolean: " + booleanValue + ", " + "char: " + charValue + "}"; + + "float: " + floatValue + ", " + "double: " + doubleValue + "}"; } } diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java index d77476517d..f952ae5b92 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java @@ -141,7 +141,7 @@ public class UnitTest { // @formatter:off String json = "{\"byteValue\": null, \"shortValue\": null, " + "\"intValue\": null, " + "\"longValue\": null, \"floatValue\": null" - + ", \"doubleValue\": null" + ", \"booleanValue\": null, \"charValue\": null}"; + + ", \"doubleValue\": null}"; // @formatter:on PrimitiveBundleInitialized model = gson.fromJson(json, PrimitiveBundleInitialized.class); @@ -152,8 +152,6 @@ public class UnitTest { assertEquals(1, model.longValue); assertEquals(1, model.floatValue, 0.0001); assertEquals(1, model.doubleValue, 0.0001); - assertTrue(model.booleanValue); - assertEquals('a', model.charValue); } @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { @@ -181,7 +179,7 @@ public class UnitTest { // @formatter:off String json = "{\"byteValue\": \"15\", \"shortValue\": \"15\", " + "\"intValue\": \"15\", " + "\"longValue\": \"15\", \"floatValue\": \"15.0\"" - + ", \"doubleValue\": \"15.0\"" + ", \"booleanValue\": \"false\", \"charValue\": \"z\"}"; + + ", \"doubleValue\": \"15.0\"}"; // @formatter:on PrimitiveBundleInitialized model = gson.fromJson(json, PrimitiveBundleInitialized.class); @@ -192,8 +190,6 @@ public class UnitTest { assertEquals(15, model.longValue); assertEquals(15, model.floatValue, 0.0001); assertEquals(15, model.doubleValue, 0.0001); - assertFalse(model.booleanValue); - assertEquals('z', model.charValue); } @Test public void fromJsonBooleanFrom2ValueInteger() { From dc46da61064f8bde322f1210790aee48875c0312 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:04:19 +0800 Subject: [PATCH 273/429] Update README.md --- spring-mvc-xml/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-mvc-xml/README.md b/spring-mvc-xml/README.md index 442a533d1b..3199118281 100644 --- a/spring-mvc-xml/README.md +++ b/spring-mvc-xml/README.md @@ -8,7 +8,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: -- [Spring MVC Tutorial](http://www.baeldung.com/spring-mvc-tutorial) - [Servlet 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) From 4b388e986ad0d76a440937bc4adc67dce0bde839 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:05:17 +0800 Subject: [PATCH 274/429] Update README.md --- deeplearning4j/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deeplearning4j/README.md b/deeplearning4j/README.md index 7f9c92ec73..14e585cd97 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](http://www.baeldung.com/deeplearning4j) From a7d6bb8e09738c5b11d3c2902e814d1243af1500 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:06:10 +0800 Subject: [PATCH 275/429] Update README.md --- persistence-modules/spring-hibernate-5/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md index b4d73708c3..75d23f7532 100644 --- a/persistence-modules/spring-hibernate-5/README.md +++ b/persistence-modules/spring-hibernate-5/README.md @@ -1,6 +1,6 @@ ### Relevant articles -- [Guide to @Immutable Annotation in Hibernate](http://www.baeldung.com/hibernate-immutable) +- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable) - [Hibernate Many to Many Annotation Tutorial](http://www.baeldung.com/hibernate-many-to-many) - [Programmatic Transactions in the Spring TestContext Framework](http://www.baeldung.com/spring-test-programmatic-transactions) - [Hibernate Criteria Queries](http://www.baeldung.com/hibernate-criteria-queries) From 4ecc955bd44fc4da4a10d1fbe1c50ebf57503248 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:08:04 +0800 Subject: [PATCH 276/429] Update README.md --- spring-4/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-4/README.md b/spring-4/README.md index 4600a603ef..402557eb41 100644 --- a/spring-4/README.md +++ b/spring-4/README.md @@ -1,4 +1,3 @@ ### Relevant Articles: -- [Guide to Flips For Spring](http://www.baeldung.com/guide-to-flips-for-spring/) - [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) From 5ec6c03d94d4400de44aad85e7f14d35be0b7134 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:08:41 +0800 Subject: [PATCH 277/429] Update README.md --- flips/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/flips/README.md b/flips/README.md index 0c62173b6a..7d843af9ea 100644 --- a/flips/README.md +++ b/flips/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [Guide to Flips For Spring](http://www.baeldung.com/guide-to-flips-for-spring/) From ac7af751a63529de7ede59a8bcfa3d535929100e Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:11:31 +0800 Subject: [PATCH 278/429] Update README.md --- spring-security-rest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index d9b6a760b2..e3124516ae 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -15,6 +15,5 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [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 Expressions - hasRole Example](http://www.baeldung.com/spring-security-expressions-basic) - [Error Handling for REST with Spring 3](http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/) - [Spring Security for a REST API](http://www.baeldung.com/securing-a-restful-web-service-with-spring-security) From cb055db7f6902a8153a1fd8cb6205c04ef39def2 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:12:54 +0800 Subject: [PATCH 279/429] Update README.md --- spring-rest-full/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-rest-full/README.md b/spring-rest-full/README.md index a5d72372f7..d429e17671 100644 --- a/spring-rest-full/README.md +++ b/spring-rest-full/README.md @@ -19,7 +19,7 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [Bootstrap a Web Application with Spring 4](http://www.baeldung.com/bootstraping-a-web-application-with-spring-and-java-based-configuration) - [Build a REST API with Spring and Java Config](http://www.baeldung.com/building-a-restful-web-service-with-spring-and-java-based-configuration) - [Error Handling for REST with Spring](http://www.baeldung.com/exception-handling-for-rest-with-spring) - +- [Spring Security Expressions - hasRole Example](https://www.baeldung.com/spring-security-expressions-basic) ### Build the Project From ac2ad2256ab6706dc8e1b1aa2dc676bbcc0af043 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:15:30 +0800 Subject: [PATCH 280/429] Update README.md --- spring-security-rest/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index e3124516ae..c396948a59 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -15,5 +15,5 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [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) -- [Error Handling for REST with Spring 3](http://www.baeldung.com/2013/01/31/exception-handling-for-rest-with-spring-3-2/) +- [Error Handling for REST with Spring](https://www.baeldung.com/exception-handling-for-rest-with-spring) - [Spring Security for a REST API](http://www.baeldung.com/securing-a-restful-web-service-with-spring-security) From c9539281107a0944aa553a3297dba93540f9a9f2 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:16:47 +0800 Subject: [PATCH 281/429] Update README.md --- spring-session/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-session/README.md b/spring-session/README.md index 30f70996cf..505d043e75 100644 --- a/spring-session/README.md +++ b/spring-session/README.md @@ -3,5 +3,5 @@ ## Spring Session Examples ### Relevant Articles: -- [Introduction to Spring Session](http://www.baeldung.com/spring-session) -- [Spring Session with JDBC](http://www.baeldung.com/spring-session-jdbc) +- [Guide to Spring Session](https://www.baeldung.com/spring-session) +- [Spring Session with JDBC](https://www.baeldung.com/spring-session-jdbc) From f74383407b6f3f332816a2c7da920f42b887a721 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:17:36 +0800 Subject: [PATCH 282/429] Update README.md --- core-java-concurrency/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md index 682c9b8ef0..2db7b91cde 100644 --- a/core-java-concurrency/README.md +++ b/core-java-concurrency/README.md @@ -26,7 +26,6 @@ - [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) - [Priority-based Job Scheduling in Java](http://www.baeldung.com/java-priority-job-schedule) -- [A Custom Spring SecurityConfigurer](http://www.baeldung.com/spring-security-custom-configurer) - [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) - [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield) From e117d81aa06a89b830bf10ab6f334ce1fdf7f759 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:18:38 +0800 Subject: [PATCH 283/429] Update README.md --- jhipster/jhipster-monolithic/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/jhipster/jhipster-monolithic/README.md b/jhipster/jhipster-monolithic/README.md index d321e9e81e..a2c267b74d 100644 --- a/jhipster/jhipster-monolithic/README.md +++ b/jhipster/jhipster-monolithic/README.md @@ -1,7 +1,5 @@ ### Relevant articles -- [Intro to JHipster](http://www.baeldung.com/jhipster) - # baeldung This application was generated using JHipster 4.0.8, you can find documentation and help at [https://jhipster.github.io/documentation-archive/v4.0.8](https://jhipster.github.io/documentation-archive/v4.0.8). From d8290433f871749a6b086375b0c249e4c236d7f0 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:23:51 +0800 Subject: [PATCH 284/429] Update README.md --- persistence-modules/java-jdbi/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/java-jdbi/README.md b/persistence-modules/java-jdbi/README.md index 3bab6faa29..7d843af9ea 100644 --- a/persistence-modules/java-jdbi/README.md +++ b/persistence-modules/java-jdbi/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [Guide to CockroachDB in Java](http://www.baeldung.com/cockroachdb-java) From 78d4c3d618776bb48f9bc122a6f7ef3fb0a913a1 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Sat, 15 Dec 2018 05:25:09 +0800 Subject: [PATCH 285/429] Update README.md --- persistence-modules/redis/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/persistence-modules/redis/README.md b/persistence-modules/redis/README.md index dd655ca7aa..21cd048693 100644 --- a/persistence-modules/redis/README.md +++ b/persistence-modules/redis/README.md @@ -1,5 +1,4 @@ ### Relevant Articles: - [Intro to Jedis – the Java Redis Client Library](http://www.baeldung.com/jedis-java-redis-client-library) - [A Guide to Redis with Redisson](http://www.baeldung.com/redis-redisson) -- [Intro to Lettuce – the Java Redis Client Library](http://www.baeldung.com/lettuce-java-redis-client-library) - +- [Introduction to Lettuce – the Java Redis Client](https://www.baeldung.com/java-redis-lettuce) From 6acf513fdbc447bd5e164802dcbdd483007cd620 Mon Sep 17 00:00:00 2001 From: rahusriv Date: Sat, 15 Dec 2018 09:36:42 +0530 Subject: [PATCH 286/429] Multidimentional ArrayList (#5795) * Multidimentional ArrayList * Adding code for 3-D ArrayList * Removing comment * Fixing indentation * Spellcheck --- .../ArrayListOfArrayList.java | 37 +++++++++++++++ .../ThreeDimensionalArrayList.java | 45 +++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java create mode 100644 core-java-collections/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java b/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java new file mode 100644 index 0000000000..72045d6761 --- /dev/null +++ b/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java @@ -0,0 +1,37 @@ +package com.baeldung.list.multidimensional; + +import java.util.ArrayList; + +public class ArrayListOfArrayList { + + public static void main(String args[]) { + + int vertex = 5; + ArrayList> graph = new ArrayList<>(vertex); + + //Initializing each element of ArrayList with ArrayList + for(int i=0; i< vertex; i++) { + graph.add(new ArrayList()); + } + + //We can add any number of columns to each row + graph.get(0).add(1); + graph.get(0).add(5); + graph.get(1).add(0); + graph.get(1).add(2); + graph.get(2).add(1); + graph.get(2).add(3); + graph.get(3).add(2); + graph.get(3).add(4); + graph.get(4).add(3); + graph.get(4).add(5); + + //Printing all the edges + for(int i=0; i > > space = new ArrayList<>(x_axis_length); + + //Initializing each element of ArrayList with ArrayList< ArrayList > + for(int i=0; i< x_axis_length; i++) { + space.add(new ArrayList< ArrayList >(y_axis_length)); + for(int j =0; j< y_axis_length; j++) { + space.get(i).add(new ArrayList(z_axis_length)); + } + } + + //Set Red color for points (0,0,0) and (0,0,1) + space.get(0).get(0).add("Red"); + space.get(0).get(0).add("Red"); + //Set Blue color for points (0,1,0) and (0,1,1) + space.get(0).get(1).add("Blue"); + space.get(0).get(1).add("Blue"); + //Set Green color for points (1,0,0) and (1,0,1) + space.get(1).get(0).add("Green"); + space.get(1).get(0).add("Green"); + //Set Yellow color for points (1,1,0) and (1,1,1) + space.get(1).get(1).add("Yellow"); + space.get(1).get(1).add("Yellow"); + + //Printing colors for all the points + for(int i=0; i Date: Sat, 15 Dec 2018 10:01:26 +0530 Subject: [PATCH 287/429] BAEL-2337: Moved code from java-strings to algorithm-miscellaneous-1 (#5905) --- .../com/baeldung/algorithms}/string/SubstringPalindrome.java | 2 +- .../algorithms}/string/SubstringPalindromeUnitTest.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename {java-strings/src/main/java/com/baeldung => algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms}/string/SubstringPalindrome.java (98%) rename {java-strings/src/test/java/com/baeldung => algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms}/string/SubstringPalindromeUnitTest.java (98%) diff --git a/java-strings/src/main/java/com/baeldung/string/SubstringPalindrome.java b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java similarity index 98% rename from java-strings/src/main/java/com/baeldung/string/SubstringPalindrome.java rename to algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java index 688bf43b3c..b3d142eb07 100644 --- a/java-strings/src/main/java/com/baeldung/string/SubstringPalindrome.java +++ b/algorithms-miscellaneous-1/src/main/java/com/baeldung/algorithms/string/SubstringPalindrome.java @@ -1,4 +1,4 @@ -package com.baeldung.string; +package com.baeldung.algorithms.string; import java.util.HashSet; import java.util.Set; diff --git a/java-strings/src/test/java/com/baeldung/string/SubstringPalindromeUnitTest.java b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java similarity index 98% rename from java-strings/src/test/java/com/baeldung/string/SubstringPalindromeUnitTest.java rename to algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java index b18a8d4a5f..8d225f67fa 100644 --- a/java-strings/src/test/java/com/baeldung/string/SubstringPalindromeUnitTest.java +++ b/algorithms-miscellaneous-1/src/test/java/com/baeldung/algorithms/string/SubstringPalindromeUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.string; +package com.baeldung.algorithms.string; import static org.junit.Assert.assertEquals; import java.util.HashSet; From 0ab513eb1d634a1c34d4cf0821b1fd073a6da53d Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 15 Dec 2018 18:45:17 +0200 Subject: [PATCH 288/429] small fixes for BAEL-10845 --- spring-rest-template/.gitignore | 14 ---- spring-rest-template/README.md | 8 -- spring-rest-template/checkstyle.xml | 11 --- spring-rest-template/pom.xml | 83 ------------------- .../client/MultipartFileUploadClient.java | 62 -------------- .../src/main/resources/logback.xml | 13 --- spring-rest/README.md | 1 + spring-resttemplate/README.md | 3 +- ...pringDataWithSecurityIntegrationTest.java} | 2 +- 9 files changed, 4 insertions(+), 193 deletions(-) delete mode 100644 spring-rest-template/.gitignore delete mode 100644 spring-rest-template/README.md delete mode 100644 spring-rest-template/checkstyle.xml delete mode 100644 spring-rest-template/pom.xml delete mode 100644 spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java delete mode 100644 spring-rest-template/src/main/resources/logback.xml rename spring-security-mvc-boot/src/test/java/com/baeldung/relationships/{SpringDataWithSecurityUnitTest.java => SpringDataWithSecurityIntegrationTest.java} (98%) diff --git a/spring-rest-template/.gitignore b/spring-rest-template/.gitignore deleted file mode 100644 index afdfaa6ded..0000000000 --- a/spring-rest-template/.gitignore +++ /dev/null @@ -1,14 +0,0 @@ -*.class - -#folders# -/target -/neoDb* -/data -/src/main/webapp/WEB-INF/classes -*/META-INF/* -*/.idea/* - -# Packaged files # -*.jar -*.war -*.ear \ No newline at end of file diff --git a/spring-rest-template/README.md b/spring-rest-template/README.md deleted file mode 100644 index 2c31796080..0000000000 --- a/spring-rest-template/README.md +++ /dev/null @@ -1,8 +0,0 @@ -## Spring REST Template Example Project - -### The Course -The "REST With Spring" Classes: http://bit.ly/restwithspring - -### Relevant Articles: -- [Uploading MultipartFile with Spring RestTemplate](http://www.baeldung.com/spring-rest-template-multipart-upload) -- [Mocking a RestTemplate in Spring](https://www.baeldung.com/spring-mock-rest-template) diff --git a/spring-rest-template/checkstyle.xml b/spring-rest-template/checkstyle.xml deleted file mode 100644 index 85063a7570..0000000000 --- a/spring-rest-template/checkstyle.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/spring-rest-template/pom.xml b/spring-rest-template/pom.xml deleted file mode 100644 index fa93308cf5..0000000000 --- a/spring-rest-template/pom.xml +++ /dev/null @@ -1,83 +0,0 @@ - - 4.0.0 - com.baeldung - spring-rest-template - 0.1-SNAPSHOT - spring-rest-template - jar - - - parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-2 - - - - - - - org.springframework - spring-web - - - commons-logging - commons-logging - - - - - - - spring-rest-template - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle-maven-plugin.version} - - checkstyle.xml - - - - - check - - - - - - org.apache.maven.plugins - maven-surefire-plugin - - 3 - true - - **/*IntegrationTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - **/*LiveTest.java - - - - - - - - - org.apache.maven.plugins - maven-checkstyle-plugin - ${checkstyle-maven-plugin.version} - - checkstyle.xml - - - - - - - - 3.0.0 - - diff --git a/spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java b/spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java deleted file mode 100644 index 804013d4dc..0000000000 --- a/spring-rest-template/src/main/java/com/baeldung/web/upload/client/MultipartFileUploadClient.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.baeldung.web.upload.client; - -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; -import org.springframework.util.LinkedMultiValueMap; -import org.springframework.util.MultiValueMap; -import org.springframework.web.client.RestTemplate; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; - -public class MultipartFileUploadClient { - - public static void main(String[] args) throws IOException { - uploadSingleFile(); - uploadMultipleFile(); - } - - private static void uploadSingleFile() throws IOException { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); - - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("file", getTestFile()); - - - HttpEntity> requestEntity = new HttpEntity<>(body, headers); - String serverUrl = "http://localhost:8082/spring-rest/fileserver/singlefileupload/"; - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = restTemplate.postForEntity(serverUrl, requestEntity, String.class); - System.out.println("Response code: " + response.getStatusCode()); - } - - private static void uploadMultipleFile() throws IOException { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.MULTIPART_FORM_DATA); - - MultiValueMap body = new LinkedMultiValueMap<>(); - body.add("files", getTestFile()); - body.add("files", getTestFile()); - body.add("files", getTestFile()); - - HttpEntity> requestEntity = new HttpEntity<>(body, headers); - String serverUrl = "http://localhost:8082/spring-rest/fileserver/multiplefileupload/"; - RestTemplate restTemplate = new RestTemplate(); - ResponseEntity response = restTemplate.postForEntity(serverUrl, requestEntity, String.class); - System.out.println("Response code: " + response.getStatusCode()); - } - - public static Resource getTestFile() throws IOException { - Path testFile = Files.createTempFile("test-file", ".txt"); - System.out.println("Creating and Uploading Test File: " + testFile); - Files.write(testFile, "Hello World !!, This is a test file.".getBytes()); - return new FileSystemResource(testFile.toFile()); - } - -} diff --git a/spring-rest-template/src/main/resources/logback.xml b/spring-rest-template/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-rest-template/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/spring-rest/README.md b/spring-rest/README.md index 5b8a35a4a5..efa0dbab60 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -24,3 +24,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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) - [Spring’s RequestBody and ResponseBody Annotations](https://www.baeldung.com/spring-request-response-body) +- [Uploading MultipartFile with Spring RestTemplate](http://www.baeldung.com/spring-rest-template-multipart-upload) diff --git a/spring-resttemplate/README.md b/spring-resttemplate/README.md index bf8c56e6ec..1c8ddf73f9 100644 --- a/spring-resttemplate/README.md +++ b/spring-resttemplate/README.md @@ -7,4 +7,5 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [Spring RestTemplate Tutorial](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) \ No newline at end of file +- [Configure a RestTemplate with RestTemplateBuilder](http://www.baeldung.com/spring-rest-template-builder) +- [Mocking a RestTemplate in Spring](https://www.baeldung.com/spring-mock-rest-template) diff --git a/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java b/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java similarity index 98% rename from spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java rename to spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java index 8207363a70..bd0c14ca1f 100644 --- a/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityUnitTest.java +++ b/spring-security-mvc-boot/src/test/java/com/baeldung/relationships/SpringDataWithSecurityIntegrationTest.java @@ -36,7 +36,7 @@ import com.baeldung.util.DummyContentUtil; @WebAppConfiguration @ContextConfiguration @DirtiesContext -public class SpringDataWithSecurityUnitTest { +public class SpringDataWithSecurityIntegrationTest { AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); @Autowired private ServletContext servletContext; From 7ae533c5eea6eef7860ee3cb358554e6f53c0d90 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 15 Dec 2018 18:49:49 +0200 Subject: [PATCH 289/429] fix main pom --- pom.xml | 2 -- 1 file changed, 2 deletions(-) diff --git a/pom.xml b/pom.xml index bab3fc2317..8705321be1 100644 --- a/pom.xml +++ b/pom.xml @@ -700,7 +700,6 @@ spring-rest-query-language spring-rest-shell spring-rest-simple - spring-rest-template spring-resttemplate spring-roo @@ -1407,7 +1406,6 @@ spring-rest-query-language spring-rest-shell spring-rest-simple - spring-rest-template spring-resttemplate spring-roo From 432643f115a4682c290ecd07b125e7b5c6045779 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 15 Dec 2018 18:59:23 +0200 Subject: [PATCH 290/429] remove flips module --- flips/README.md | 1 - flips/pom.xml | 65 ---------------- .../com/baeldung/flips/ApplicationConfig.java | 15 ---- .../flips/controller/FlipController.java | 65 ---------------- .../java/com/baeldung/flips/model/Foo.java | 12 --- .../baeldung/flips/service/FlipService.java | 50 ------------- .../flips/service/NewFlipService.java | 13 ---- .../src/main/resources/application.properties | 5 -- flips/src/main/resources/logback.xml | 13 ---- .../FlipControllerIntegrationTest.java | 74 ------------------- pom.xml | 2 - 11 files changed, 315 deletions(-) delete mode 100644 flips/README.md delete mode 100644 flips/pom.xml delete mode 100644 flips/src/main/java/com/baeldung/flips/ApplicationConfig.java delete mode 100644 flips/src/main/java/com/baeldung/flips/controller/FlipController.java delete mode 100644 flips/src/main/java/com/baeldung/flips/model/Foo.java delete mode 100644 flips/src/main/java/com/baeldung/flips/service/FlipService.java delete mode 100644 flips/src/main/java/com/baeldung/flips/service/NewFlipService.java delete mode 100644 flips/src/main/resources/application.properties delete mode 100644 flips/src/main/resources/logback.xml delete mode 100644 flips/src/test/java/com/baeldung/flips/controller/FlipControllerIntegrationTest.java diff --git a/flips/README.md b/flips/README.md deleted file mode 100644 index 7d843af9ea..0000000000 --- a/flips/README.md +++ /dev/null @@ -1 +0,0 @@ -### Relevant Articles: diff --git a/flips/pom.xml b/flips/pom.xml deleted file mode 100644 index 75dc8bb579..0000000000 --- a/flips/pom.xml +++ /dev/null @@ -1,65 +0,0 @@ - - 4.0.0 - flips - flips - 0.0.1-SNAPSHOT - jar - flips - - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - - - - - org.springframework.boot - spring-boot-starter-web - ${spring-boot-starter-web.version} - - - org.springframework.boot - spring-boot-starter-test - ${spring-boot-starter-test.version} - - - com.github.feature-flip - flips-web - ${flips-web.version} - - - org.projectlombok - lombok - - ${lombok.version} - provided - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - - - 1.5.10.RELEASE - 1.5.9.RELEASE - 1.0.1 - 1.16.18 - - - diff --git a/flips/src/main/java/com/baeldung/flips/ApplicationConfig.java b/flips/src/main/java/com/baeldung/flips/ApplicationConfig.java deleted file mode 100644 index 7001aeb991..0000000000 --- a/flips/src/main/java/com/baeldung/flips/ApplicationConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.baeldung.flips; - -import org.flips.describe.config.FlipWebContextConfiguration; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.Import; - -@SpringBootApplication -@Import(FlipWebContextConfiguration.class) -public class ApplicationConfig { - - public static void main(String[] args) { - SpringApplication.run(ApplicationConfig.class, args); - } -} \ No newline at end of file diff --git a/flips/src/main/java/com/baeldung/flips/controller/FlipController.java b/flips/src/main/java/com/baeldung/flips/controller/FlipController.java deleted file mode 100644 index 50458023b3..0000000000 --- a/flips/src/main/java/com/baeldung/flips/controller/FlipController.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.baeldung.flips.controller; - -import com.baeldung.flips.model.Foo; -import com.baeldung.flips.service.FlipService; -import org.flips.annotation.FlipOnDateTime; -import org.flips.annotation.FlipOnDaysOfWeek; -import org.flips.annotation.FlipOnEnvironmentProperty; -import org.flips.annotation.FlipOnProfiles; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -import java.time.DayOfWeek; -import java.util.List; - -@RestController -public class FlipController { - - private FlipService flipService; - - @Autowired - public FlipController(FlipService flipService) { - this.flipService = flipService; - } - - @RequestMapping(value = "/foos", method = RequestMethod.GET) - @FlipOnProfiles(activeProfiles = "dev") - public List getAllFoos() { - return flipService.getAllFoos(); - } - - @RequestMapping(value = "/foo/{id}", method = RequestMethod.GET) - @FlipOnDaysOfWeek(daysOfWeek = { - DayOfWeek.MONDAY, DayOfWeek.TUESDAY, DayOfWeek.WEDNESDAY, DayOfWeek.THURSDAY, - DayOfWeek.FRIDAY, DayOfWeek.SATURDAY, DayOfWeek.SUNDAY - }) - public Foo getFooByNewId(@PathVariable int id) { - return flipService.getFooById(id).orElse(new Foo("Not Found", -1)); - } - - @RequestMapping(value = "/foo/last", method = RequestMethod.GET) - @FlipOnDateTime(cutoffDateTimeProperty = "last.active.after") - public Foo getLastFoo() { - return flipService.getLastFoo(); - } - - @RequestMapping(value = "/foo/first", method = RequestMethod.GET) - @FlipOnDateTime(cutoffDateTimeProperty = "first.active.after") - public Foo getFirstFoo() { - return flipService.getLastFoo(); - } - - @RequestMapping(value = "/foos/{id}", method = RequestMethod.GET) - @FlipOnEnvironmentProperty(property = "feature.foo.by.id", expectedValue = "Y") - public Foo getFooById(@PathVariable int id) { - return flipService.getFooById(id).orElse(new Foo("Not Found", -1)); - } - - @RequestMapping(value = "/foo/new", method = RequestMethod.GET) - public Foo getNewThing() { - return flipService.getNewFoo(); - } -} \ No newline at end of file diff --git a/flips/src/main/java/com/baeldung/flips/model/Foo.java b/flips/src/main/java/com/baeldung/flips/model/Foo.java deleted file mode 100644 index be15bee15c..0000000000 --- a/flips/src/main/java/com/baeldung/flips/model/Foo.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.baeldung.flips.model; - -import lombok.Data; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -@Data -@RequiredArgsConstructor -public class Foo { - @NonNull private final String name; - @NonNull private final int id; -} diff --git a/flips/src/main/java/com/baeldung/flips/service/FlipService.java b/flips/src/main/java/com/baeldung/flips/service/FlipService.java deleted file mode 100644 index 9f7fb325a5..0000000000 --- a/flips/src/main/java/com/baeldung/flips/service/FlipService.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.flips.service; - -import com.baeldung.flips.model.Foo; -import org.flips.annotation.FlipBean; -import org.flips.annotation.FlipOnSpringExpression; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; - -@Service -public class FlipService { - - private final List foos; - - public FlipService() { - foos = new ArrayList<>(); - foos.add(new Foo("Foo1", 1)); - foos.add(new Foo("Foo2", 2)); - foos.add(new Foo("Foo3", 3)); - foos.add(new Foo("Foo4", 4)); - foos.add(new Foo("Foo5", 5)); - foos.add(new Foo("Foo6", 6)); - - } - - public List getAllFoos() { - return foos; - } - - public Optional getFooById(int id) { - return foos.stream().filter(foo -> (foo.getId() == id)).findFirst(); - } - - @FlipBean(with = NewFlipService.class) - @FlipOnSpringExpression(expression = "(2 + 2) == 4") - public Foo getNewFoo() { - return new Foo("New Foo!", 99); - } - - public Foo getLastFoo() { - return foos.get(foos.size() - 1); - } - - public Foo getFirstFoo() { - return foos.get(0); - } - -} \ No newline at end of file diff --git a/flips/src/main/java/com/baeldung/flips/service/NewFlipService.java b/flips/src/main/java/com/baeldung/flips/service/NewFlipService.java deleted file mode 100644 index 1dcda9b6ca..0000000000 --- a/flips/src/main/java/com/baeldung/flips/service/NewFlipService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.baeldung.flips.service; - -import com.baeldung.flips.model.Foo; -import org.springframework.stereotype.Service; - -@Service -public class NewFlipService { - - public Foo getNewFoo() { - return new Foo("Shiny New Foo!", 100); - } - -} \ No newline at end of file diff --git a/flips/src/main/resources/application.properties b/flips/src/main/resources/application.properties deleted file mode 100644 index 274896be15..0000000000 --- a/flips/src/main/resources/application.properties +++ /dev/null @@ -1,5 +0,0 @@ -feature.foo.by.id=Y -feature.new.foo=Y -last.active.after=2018-03-14T00:00:00Z -first.active.after=2999-03-15T00:00:00Z -logging.level.org.flips=info \ No newline at end of file diff --git a/flips/src/main/resources/logback.xml b/flips/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/flips/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/flips/src/test/java/com/baeldung/flips/controller/FlipControllerIntegrationTest.java b/flips/src/test/java/com/baeldung/flips/controller/FlipControllerIntegrationTest.java deleted file mode 100644 index 9dd4ef064a..0000000000 --- a/flips/src/test/java/com/baeldung/flips/controller/FlipControllerIntegrationTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.baeldung.flips.controller; - -import org.hamcrest.Matchers; -import org.junit.Test; -import org.junit.runner.RunWith; -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.ActiveProfiles; -import org.springframework.test.context.junit4.SpringRunner; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; -import org.springframework.test.web.servlet.result.MockMvcResultMatchers; - -@RunWith(SpringRunner.class) -@SpringBootTest(properties = { - "feature.foo.by.id=Y", - "feature.new.foo=Y", - "last.active.after=2018-03-14T00:00:00Z", - "first.active.after=2999-03-15T00:00:00Z", - "logging.level.org.flips=info" - -}, webEnvironment = SpringBootTest.WebEnvironment.MOCK) -@AutoConfigureMockMvc -@ActiveProfiles("dev") -public class FlipControllerIntegrationTest { - - @Autowired private MockMvc mvc; - - @Test - public void givenValidDayOfWeek_APIAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foo/1")) - .andExpect(MockMvcResultMatchers.status().is(200)) - .andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.equalTo("Foo1"))) - .andExpect(MockMvcResultMatchers.jsonPath("$.id", Matchers.equalTo(1))); - } - - @Test - public void givenValidDate_APIAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foo/last")) - .andExpect(MockMvcResultMatchers.status().is(200)) - .andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.equalTo("Foo6"))) - .andExpect(MockMvcResultMatchers.jsonPath("$.id", Matchers.equalTo(6))); - } - - @Test - public void givenInvalidDate_APINotAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foo/first")) - .andExpect(MockMvcResultMatchers.status().is(501)); - } - - @Test - public void givenCorrectProfile_APIAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foos")) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$", Matchers.hasSize(6))); - } - - @Test - public void givenPropertySet_APIAvailable() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foos/1")) - .andExpect(MockMvcResultMatchers.status().isOk()) - .andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.equalTo("Foo1"))) - .andExpect(MockMvcResultMatchers.jsonPath("$.id", Matchers.equalTo(1))); - } - - @Test - public void getValidExpression_FlipBean() throws Exception { - mvc.perform(MockMvcRequestBuilders.get("/foo/new")) - .andExpect(MockMvcResultMatchers.status().is(200)) - .andExpect(MockMvcResultMatchers.jsonPath("$.name", Matchers.equalTo("Shiny New Foo!"))) - .andExpect(MockMvcResultMatchers.jsonPath("$.id", Matchers.equalTo(100))); - } -} \ No newline at end of file diff --git a/pom.xml b/pom.xml index bab3fc2317..643496e482 100644 --- a/pom.xml +++ b/pom.xml @@ -397,7 +397,6 @@ ethereum feign - flips flyway-cdi-extension @@ -1108,7 +1107,6 @@ ethereum feign - flips flyway-cdi-extension From 9271f1094181278deb536dbbf6e01fabd220acfc Mon Sep 17 00:00:00 2001 From: Kumar Chandrakant Date: Sat, 15 Dec 2018 22:40:55 +0530 Subject: [PATCH 291/429] Adding files for the tutorial BAEL-1877: A Guide to Hibernate OGM (#5909) * Adding files for the tutorial BAEL-1877: A Guide to Hibernate OGM * Removing test for MongoDB as there may not be MongoDB running on integration platform. * Reapplied the standard Java formatter. * Incorporatd the review comments on the tutorial. * Commented out the integration test for MongoDB. * Removed implicit dependencies from pom.xml --- persistence-modules/hibernate-ogm/README.md | 4 + persistence-modules/hibernate-ogm/pom.xml | 60 ++++++++++++ .../com/baeldung/hibernate/ogm/Article.java | 54 +++++++++++ .../com/baeldung/hibernate/ogm/Author.java | 70 ++++++++++++++ .../com/baeldung/hibernate/ogm/Editor.java | 58 ++++++++++++ .../main/resources/META-INF/persistence.xml | 24 +++++ .../hibernate/ogm/EditorUnitTest.java | 92 +++++++++++++++++++ pom.xml | 2 + 8 files changed, 364 insertions(+) create mode 100644 persistence-modules/hibernate-ogm/README.md create mode 100644 persistence-modules/hibernate-ogm/pom.xml create mode 100644 persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Article.java create mode 100644 persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Author.java create mode 100644 persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Editor.java create mode 100644 persistence-modules/hibernate-ogm/src/main/resources/META-INF/persistence.xml create mode 100644 persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java diff --git a/persistence-modules/hibernate-ogm/README.md b/persistence-modules/hibernate-ogm/README.md new file mode 100644 index 0000000000..f4a5bb6c3b --- /dev/null +++ b/persistence-modules/hibernate-ogm/README.md @@ -0,0 +1,4 @@ +## Relevant articles: + +- [Guide to Hibernate OGM](http://www.baeldung.com/xxxx) + diff --git a/persistence-modules/hibernate-ogm/pom.xml b/persistence-modules/hibernate-ogm/pom.xml new file mode 100644 index 0000000000..2ccac03bd3 --- /dev/null +++ b/persistence-modules/hibernate-ogm/pom.xml @@ -0,0 +1,60 @@ + + + 4.0.0 + com.baeldung + hibernate-ogm + 0.0.1-SNAPSHOT + hibernate-ogm + + + com.baeldung + parent-modules + 1.0.0-SNAPSHOT + ../../ + + + + + + org.hibernate.ogm + hibernate-ogm-mongodb + 5.4.0.Final + + + + org.hibernate.ogm + hibernate-ogm-neo4j + 5.4.0.Final + + + + org.jboss.narayana.jta + narayana-jta + 5.5.23.Final + + + + junit + junit + 4.12 + test + + + org.easytesting + fest-assert + 1.4 + test + + + + + hibernate-ogm + + + src/main/resources + true + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Article.java b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Article.java new file mode 100644 index 0000000000..29f01ecde7 --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Article.java @@ -0,0 +1,54 @@ +package com.baeldung.hibernate.ogm; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; + +import org.hibernate.annotations.GenericGenerator; + +@Entity +public class Article { + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + private String articleId; + + private String articleTitle; + + @ManyToOne + private Author author; + + // constructors, getters and setters... + + Article() { + } + + public Article(String articleTitle) { + this.articleTitle = articleTitle; + } + + public String getArticleId() { + return articleId; + } + + public void setArticleId(String articleId) { + this.articleId = articleId; + } + + public String getArticleTitle() { + return articleTitle; + } + + public void setArticleTitle(String articleTitle) { + this.articleTitle = articleTitle; + } + + public Author getAuthor() { + return author; + } + + public void setAuthor(Author author) { + this.author = author; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Author.java b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Author.java new file mode 100644 index 0000000000..9e60c9f934 --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Author.java @@ -0,0 +1,70 @@ +package com.baeldung.hibernate.ogm; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; + +import org.hibernate.annotations.GenericGenerator; + +@Entity +public class Author { + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + private String authorId; + + private String authorName; + + @ManyToOne + private Editor editor; + + @OneToMany(mappedBy = "author", cascade = CascadeType.PERSIST) + private Set
authoredArticles = new HashSet<>(); + + // constructors, getters and setters... + + Author() { + } + + public Author(String authorName) { + this.authorName = authorName; + } + + public String getAuthorId() { + return authorId; + } + + public void setAuthorId(String authorId) { + this.authorId = authorId; + } + + public String getAuthorName() { + return authorName; + } + + public void setAuthorName(String authorName) { + this.authorName = authorName; + } + + public Editor getEditor() { + return editor; + } + + public void setEditor(Editor editor) { + this.editor = editor; + } + + public Set
getAuthoredArticles() { + return authoredArticles; + } + + public void setAuthoredArticles(Set
authoredArticles) { + this.authoredArticles = authoredArticles; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Editor.java b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Editor.java new file mode 100644 index 0000000000..2c3f720e91 --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/main/java/com/baeldung/hibernate/ogm/Editor.java @@ -0,0 +1,58 @@ +package com.baeldung.hibernate.ogm; + +import java.util.HashSet; +import java.util.Set; + +import javax.persistence.CascadeType; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.OneToMany; + +import org.hibernate.annotations.GenericGenerator; + +@Entity +public class Editor { + @Id + @GeneratedValue(generator = "uuid") + @GenericGenerator(name = "uuid", strategy = "uuid2") + private String editorId; + + private String editorName; + + @OneToMany(mappedBy = "editor", cascade = CascadeType.PERSIST) + private Set assignedAuthors = new HashSet<>(); + + // constructors, getters and setters... + + Editor() { + } + + public Editor(String editorName) { + this.editorName = editorName; + } + + public String getEditorId() { + return editorId; + } + + public void setEditorId(String editorId) { + this.editorId = editorId; + } + + public String getEditorName() { + return editorName; + } + + public void setEditorName(String editorName) { + this.editorName = editorName; + } + + public Set getAssignedAuthors() { + return assignedAuthors; + } + + public void setAssignedAuthors(Set assignedAuthors) { + this.assignedAuthors = assignedAuthors; + } +} \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/main/resources/META-INF/persistence.xml b/persistence-modules/hibernate-ogm/src/main/resources/META-INF/persistence.xml new file mode 100644 index 0000000000..43c86fb55b --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/main/resources/META-INF/persistence.xml @@ -0,0 +1,24 @@ + + + + + org.hibernate.ogm.jpa.HibernateOgmPersistence + + + + + + + + + org.hibernate.ogm.jpa.HibernateOgmPersistence + + + + + + + \ No newline at end of file diff --git a/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java b/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java new file mode 100644 index 0000000000..d7fd49d917 --- /dev/null +++ b/persistence-modules/hibernate-ogm/src/test/java/com/baeldung/hibernate/ogm/EditorUnitTest.java @@ -0,0 +1,92 @@ +package com.baeldung.hibernate.ogm; + +import static org.fest.assertions.Assertions.assertThat; + +import java.util.Map; +import java.util.stream.Collectors; + +import javax.persistence.EntityManager; +import javax.persistence.EntityManagerFactory; +import javax.persistence.Persistence; +import javax.transaction.TransactionManager; + +import org.junit.Test; + +public class EditorUnitTest { + /* + @Test + public void givenMongoDB_WhenEntitiesCreated_thenCanBeRetrieved() throws Exception { + EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ogm-mongodb"); + Editor editor = generateTestData(); + persistTestData(entityManagerFactory, editor); + loadAndVerifyTestData(entityManagerFactory, editor); + } + */ + @Test + public void givenNeo4j_WhenEntitiesCreated_thenCanBeRetrieved() throws Exception { + EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("ogm-neo4j"); + Editor editor = generateTestData(); + persistTestData(entityManagerFactory, editor); + loadAndVerifyTestData(entityManagerFactory, editor); + } + + private void persistTestData(EntityManagerFactory entityManagerFactory, Editor editor) throws Exception { + TransactionManager transactionManager = com.arjuna.ats.jta.TransactionManager.transactionManager(); + EntityManager entityManager; + + transactionManager.begin(); + entityManager = entityManagerFactory.createEntityManager(); + entityManager.persist(editor); + entityManager.close(); + transactionManager.commit(); + } + + private void loadAndVerifyTestData(EntityManagerFactory entityManagerFactory, Editor editor) throws Exception { + TransactionManager transactionManager = com.arjuna.ats.jta.TransactionManager.transactionManager(); + EntityManager entityManager; + + transactionManager.begin(); + entityManager = entityManagerFactory.createEntityManager(); + Editor loadedEditor = entityManager.find(Editor.class, editor.getEditorId()); + assertThat(loadedEditor).isNotNull(); + assertThat(loadedEditor.getEditorName()).isEqualTo("Tom"); + assertThat(loadedEditor.getAssignedAuthors()).onProperty("authorName") + .containsOnly("Maria", "Mike"); + Map loadedAuthors = loadedEditor.getAssignedAuthors() + .stream() + .collect(Collectors.toMap(Author::getAuthorName, e -> e)); + assertThat(loadedAuthors.get("Maria") + .getAuthoredArticles()).onProperty("articleTitle") + .containsOnly("Basic of Hibernate OGM"); + assertThat(loadedAuthors.get("Mike") + .getAuthoredArticles()).onProperty("articleTitle") + .containsOnly("Intermediate of Hibernate OGM", "Advanced of Hibernate OGM"); + entityManager.close(); + transactionManager.commit(); + } + + private Editor generateTestData() { + Editor tom = new Editor("Tom"); + Author maria = new Author("Maria"); + Author mike = new Author("Mike"); + Article basic = new Article("Basic of Hibernate OGM"); + Article intermediate = new Article("Intermediate of Hibernate OGM"); + Article advanced = new Article("Advanced of Hibernate OGM"); + maria.getAuthoredArticles() + .add(basic); + basic.setAuthor(maria); + mike.getAuthoredArticles() + .add(intermediate); + intermediate.setAuthor(mike); + mike.getAuthoredArticles() + .add(advanced); + advanced.setAuthor(mike); + tom.getAssignedAuthors() + .add(maria); + maria.setEditor(tom); + tom.getAssignedAuthors() + .add(mike); + mike.setEditor(tom); + return tom; + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index bab3fc2317..f1005c7053 100644 --- a/pom.xml +++ b/pom.xml @@ -509,6 +509,7 @@ persistence-modules/flyway persistence-modules/hbase persistence-modules/hibernate5 + persistence-modules/hibernate-ogm persistence-modules/influxdb persistence-modules/java-cassandra persistence-modules/java-cockroachdb @@ -1220,6 +1221,7 @@ persistence-modules/flyway persistence-modules/hbase persistence-modules/hibernate5 + persistence-modules/hibernate-ogm persistence-modules/influxdb persistence-modules/java-cassandra persistence-modules/java-cockroachdb From 94f40923141cf6481e810a38483f6b83bfee43f7 Mon Sep 17 00:00:00 2001 From: kyleandari <44148335+kyleandari@users.noreply.github.com> Date: Sat, 15 Dec 2018 17:35:09 -0500 Subject: [PATCH 292/429] BAEL-2431 Implementing multi-inheritance and Polymorphism using interfaces (#5924) * Implementing Hexagonal Architecture in java * Implementing multi-inheritance and Polymorphism using interfaces * Removing hexagonal code * Deleting hexagonal architecture code * fix for unit test names --- .../interfaces/multiinheritance/Fly.java | 5 ++++ .../multiinheritance/Transform.java | 5 ++++ .../interfaces/multiinheritance/Vehicle.java | 13 ++++++++++ .../interfaces/polymorphysim/Circle.java | 21 +++++++++++++++ .../polymorphysim/DisplayShape.java | 22 ++++++++++++++++ .../polymorphysim/MainPolymorphic.java | 15 +++++++++++ .../interfaces/polymorphysim/Shape.java | 6 +++++ .../interfaces/polymorphysim/Square.java | 20 ++++++++++++++ .../interfaces/PolymorphysimUnitTest.java | 26 +++++++++++++++++++ 9 files changed, 133 insertions(+) create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java create mode 100644 core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java new file mode 100644 index 0000000000..d84182aec6 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Fly.java @@ -0,0 +1,5 @@ +package com.baeldung.interfaces.multiinheritance; + +public abstract interface Fly{ + void fly(); +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java new file mode 100644 index 0000000000..a18bbafdc1 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java @@ -0,0 +1,5 @@ +package com.baeldung.interfaces.multiinheritance; + +public interface Transform { + void transform(); +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java new file mode 100644 index 0000000000..fb0d36e3e0 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Vehicle.java @@ -0,0 +1,13 @@ +package com.baeldung.interfaces.multiinheritance; + +public class Vehicle implements Fly, Transform { + @Override + public void fly() { + System.out.println("I can Fly!!"); + } + + @Override + public void transform() { + System.out.println("I can Transform!!"); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java new file mode 100644 index 0000000000..bf0e613567 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java @@ -0,0 +1,21 @@ +package com.baeldung.interfaces.polymorphysim; + +public class Circle implements Shape { + + private double radius; + + public Circle(double radius){ + this.radius = radius; + } + + @Override + public String name() { + return "Circle"; + } + + @Override + public double area() { + return Math.PI * (radius * radius); + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java new file mode 100644 index 0000000000..2cf4fafee1 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java @@ -0,0 +1,22 @@ +package com.baeldung.interfaces.polymorphysim; + +import java.util.ArrayList; + +public class DisplayShape { + + private ArrayList shapes; + + public DisplayShape() { + shapes = new ArrayList<>(); + } + + public void add(Shape shape) { + shapes.add(shape); + } + + public void display() { + for (Shape shape : shapes) { + System.out.println(shape.name() + " area: " + shape.area()); + } + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java new file mode 100644 index 0000000000..cc43c1300b --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/MainPolymorphic.java @@ -0,0 +1,15 @@ +package com.baeldung.interfaces.polymorphysim; + +public class MainPolymorphic { + public static void main(String[] args){ + + Shape circleShape = new Circle(2); + Shape squareShape = new Square(2); + + DisplayShape displayShape = new DisplayShape(); + displayShape.add(circleShape); + displayShape.add(squareShape); + + displayShape.display(); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java new file mode 100644 index 0000000000..fcb0c65e7b --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java @@ -0,0 +1,6 @@ +package com.baeldung.interfaces.polymorphysim; + +public interface Shape { + public abstract String name(); + public abstract double area(); +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java new file mode 100644 index 0000000000..9c440150b5 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java @@ -0,0 +1,20 @@ +package com.baeldung.interfaces.polymorphysim; + +public class Square implements Shape { + + private double width; + + public Square(double width) { + this.width = width; + } + + @Override + public String name() { + return "Square"; + } + + @Override + public double area() { + return width * width; + } +} diff --git a/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java b/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java new file mode 100644 index 0000000000..7ded5e6621 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/interfaces/PolymorphysimUnitTest.java @@ -0,0 +1,26 @@ +package com.baeldung.interfaces; + +import com.baeldung.interfaces.polymorphysim.Circle; +import com.baeldung.interfaces.polymorphysim.Shape; +import com.baeldung.interfaces.polymorphysim.Square; +import org.assertj.core.api.Assertions; +import org.junit.Test; + +public class PolymorphysimUnitTest { + + @Test + public void whenInterfacePointsToCircle_CircleAreaMethodisBeingCalled(){ + double expectedArea = 12.566370614359172; + Shape circle = new Circle(2); + double actualArea = circle.area(); + Assertions.assertThat(actualArea).isEqualTo(expectedArea); + } + + @Test + public void whenInterfacePointsToSquare_SquareAreaMethodisBeingCalled(){ + double expectedArea = 4; + Shape square = new Square(2); + double actualArea = square.area(); + Assertions.assertThat(actualArea).isEqualTo(expectedArea); + } +} From 6ede1b74407483df1d29034de3fefef86a5b81a9 Mon Sep 17 00:00:00 2001 From: Graham Cox Date: Sun, 16 Dec 2018 07:21:41 +0000 Subject: [PATCH 293/429] Kovert examples (#5831) --- core-kotlin/pom.xml | 11 +++ .../com/baeldung/kovert/AnnotatedServer.kt | 73 ++++++++++++++++++ .../kotlin/com/baeldung/kovert/ErrorServer.kt | 75 ++++++++++++++++++ .../kotlin/com/baeldung/kovert/JsonServer.kt | 76 +++++++++++++++++++ .../kotlin/com/baeldung/kovert/NoopServer.kt | 57 ++++++++++++++ .../com/baeldung/kovert/SecuredServer.kt | 68 +++++++++++++++++ .../com/baeldung/kovert/SimpleServer.kt | 65 ++++++++++++++++ core-kotlin/src/main/resources/kovert.conf | 15 ++++ 8 files changed, 440 insertions(+) create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt create mode 100644 core-kotlin/src/main/resources/kovert.conf diff --git a/core-kotlin/pom.xml b/core-kotlin/pom.xml index ed79ebc01b..8b871f28ee 100644 --- a/core-kotlin/pom.xml +++ b/core-kotlin/pom.xml @@ -72,6 +72,17 @@ injekt-core 1.16.1 + + uy.kohesive.kovert + kovert-vertx + [1.5.0,1.6.0) + + + nl.komponents.kovenant + kovenant + + + diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt new file mode 100644 index 0000000000..da2bbe4208 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/AnnotatedServer.kt @@ -0,0 +1,73 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.core.HttpVerb +import uy.kohesive.kovert.core.Location +import uy.kohesive.kovert.core.Verb +import uy.kohesive.kovert.core.VerbAlias +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class AnnotatedServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(AnnotatedServer::class.java) + + @JvmStatic + fun main(args: Array) { + AnnotatedServer().start() + } + } + + @VerbAlias("show", HttpVerb.GET) + class AnnotatedController { + fun RoutingContext.showStringById(id: String) = id + + @Verb(HttpVerb.GET) + @Location("/ping/:id") + fun RoutingContext.ping(id: String) = id + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", AnnotatedServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(AnnotatedController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt new file mode 100644 index 0000000000..a596391ed8 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/ErrorServer.kt @@ -0,0 +1,75 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.core.HttpErrorCode +import uy.kohesive.kovert.core.HttpErrorCodeWithBody +import uy.kohesive.kovert.core.HttpErrorForbidden +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class ErrorServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(ErrorServer::class.java) + + @JvmStatic + fun main(args: Array) { + ErrorServer().start() + } + } + + class ErrorController { + fun RoutingContext.getForbidden() { + throw HttpErrorForbidden() + } + fun RoutingContext.getError() { + throw HttpErrorCode("Something went wrong", 590) + } + fun RoutingContext.getErrorbody() { + throw HttpErrorCodeWithBody("Something went wrong", 591, "Body here") + } + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", ErrorServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(ErrorController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt new file mode 100644 index 0000000000..310fe2a7a0 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/JsonServer.kt @@ -0,0 +1,76 @@ +package com.baeldung.kovert + +import com.fasterxml.jackson.annotation.JsonProperty +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + +class JsonServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(JsonServer::class.java) + + @JvmStatic + fun main(args: Array) { + JsonServer().start() + } + } + + data class Person( + @JsonProperty("_id") + val id: String, + val name: String, + val job: String + ) + + class JsonController { + fun RoutingContext.getPersonById(id: String) = Person( + id = id, + name = "Tony Stark", + job = "Iron Man" + ) + fun RoutingContext.putPersonById(id: String, person: Person) = person + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", JsonServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(JsonController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt new file mode 100644 index 0000000000..98ce775e66 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/NoopServer.kt @@ -0,0 +1,57 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + +class NoopServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(NoopServer::class.java) + + @JvmStatic + fun main(args: Array) { + NoopServer().start() + } + } + + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", NoopServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt new file mode 100644 index 0000000000..86ca482808 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SecuredServer.kt @@ -0,0 +1,68 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class SecuredServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(SecuredServer::class.java) + + @JvmStatic + fun main(args: Array) { + SecuredServer().start() + } + } + + class SecuredContext(private val routingContext: RoutingContext) { + val authenticated = routingContext.request().getHeader("Authorization") == "Secure" + } + + class SecuredController { + fun SecuredContext.getSecured() = this.authenticated + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SecuredServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(SecuredController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt new file mode 100644 index 0000000000..172469ab46 --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/kovert/SimpleServer.kt @@ -0,0 +1,65 @@ +package com.baeldung.kovert + +import io.vertx.ext.web.Router +import io.vertx.ext.web.RoutingContext +import nl.komponents.kovenant.functional.bind +import org.kodein.di.Kodein +import org.kodein.di.conf.global +import org.slf4j.Logger +import org.slf4j.LoggerFactory +import uy.klutter.config.typesafe.ClassResourceConfig +import uy.klutter.config.typesafe.ReferenceConfig +import uy.klutter.config.typesafe.kodein.importConfig +import uy.klutter.config.typesafe.loadConfig +import uy.klutter.vertx.kodein.KodeinVertx +import uy.kohesive.kovert.vertx.bindController +import uy.kohesive.kovert.vertx.boot.KodeinKovertVertx +import uy.kohesive.kovert.vertx.boot.KovertVerticle +import uy.kohesive.kovert.vertx.boot.KovertVerticleModule +import uy.kohesive.kovert.vertx.boot.KovertVertx + + +class SimpleServer { + companion object { + private val LOG: Logger = LoggerFactory.getLogger(SimpleServer::class.java) + + @JvmStatic + fun main(args: Array) { + SimpleServer().start() + } + } + + class SimpleController { + fun RoutingContext.getStringById(id: String) = id + fun RoutingContext.get_truncatedString_by_id(id: String, length: Int = 1) = id.subSequence(0, length) + } + + fun start() { + Kodein.global.addImport(Kodein.Module { + importConfig(loadConfig(ClassResourceConfig("/kovert.conf", SimpleServer::class.java), ReferenceConfig())) { + import("kovert.vertx", KodeinKovertVertx.configModule) + import("kovert.server", KovertVerticleModule.configModule) + } + + // includes jackson ObjectMapper to match compatibility with Vertx, app logging via Vertx facade to Slf4j + import(KodeinVertx.moduleWithLoggingToSlf4j) + // Kovert boot + import(KodeinKovertVertx.module) + import(KovertVerticleModule.module) + }) + + val initControllers = fun Router.() { + bindController(SimpleController(), "api") + } + + // startup asynchronously... + KovertVertx.start() bind { vertx -> + KovertVerticle.deploy(vertx, routerInit = initControllers) + } success { deploymentId -> + LOG.warn("Deployment complete.") + } fail { error -> + LOG.error("Deployment failed!", error) + } + + } +} diff --git a/core-kotlin/src/main/resources/kovert.conf b/core-kotlin/src/main/resources/kovert.conf new file mode 100644 index 0000000000..3b08641693 --- /dev/null +++ b/core-kotlin/src/main/resources/kovert.conf @@ -0,0 +1,15 @@ +{ + kovert: { + vertx: { + clustered: false + } + server: { + listeners: [ + { + host: "0.0.0.0" + port: "8000" + } + ] + } + } +} From 0f443d300683b64f9ca3c749a3bc6b02f2aaf8b8 Mon Sep 17 00:00:00 2001 From: Dhawal Kapil Date: Sun, 16 Dec 2018 14:54:35 +0530 Subject: [PATCH 294/429] Task/bael 10829 4 (#5925) * BAEL-10829 Commented out spring-data-elasticsearc * BAEL-10829 commented out spring-data-elasticsearch project * Revert "BAEL-10829 Commented out spring-data-elasticsearc" This reverts commit 84b7b4086435ac25a14841199145cc5d9e5c4beb. --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index fce724b907..f22aeea5e6 100644 --- a/pom.xml +++ b/pom.xml @@ -528,7 +528,7 @@ persistence-modules/spring-data-couchbase-2 persistence-modules/spring-data-dynamodb persistence-modules/spring-data-eclipselink - persistence-modules/spring-data-elasticsearch + persistence-modules/spring-data-gemfire persistence-modules/spring-data-jpa persistence-modules/spring-data-keyvalue @@ -1238,7 +1238,7 @@ persistence-modules/spring-data-couchbase-2 persistence-modules/spring-data-dynamodb persistence-modules/spring-data-eclipselink - persistence-modules/spring-data-elasticsearch + persistence-modules/spring-data-gemfire persistence-modules/spring-data-jpa persistence-modules/spring-data-keyvalue From b4e1d7779f29a46472034250a9929f1a203569c0 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Sun, 16 Dec 2018 12:48:55 +0200 Subject: [PATCH 295/429] Create README.md --- rsocket/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 rsocket/README.md diff --git a/rsocket/README.md b/rsocket/README.md new file mode 100644 index 0000000000..fa232bc515 --- /dev/null +++ b/rsocket/README.md @@ -0,0 +1,3 @@ +Relevant articles + +- [Introduction to RSocket](https://www.baeldung.com/rsocket) From d9ac59cd132f72af339fb0ff0036743e66378383 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 16 Dec 2018 16:37:45 +0530 Subject: [PATCH 296/429] [BAEL-10127] - Added code for modelmapper article --- spring-boot/pom.xml | 7 ++ .../baeldung/modelmapper/PostApplication.java | 20 ++++ .../controller/PostRestController.java | 91 +++++++++++++++++ .../com/baeldung/modelmapper/dto/PostDto.java | 71 ++++++++++++++ .../com/baeldung/modelmapper/dto/UserDto.java | 14 +++ .../com/baeldung/modelmapper/model/Post.java | 98 +++++++++++++++++++ .../modelmapper/model/Preference.java | 32 ++++++ .../com/baeldung/modelmapper/model/User.java | 44 +++++++++ .../repository/PostRepository.java | 21 ++++ .../modelmapper/service/IPostService.java | 17 ++++ .../modelmapper/service/IUserService.java | 9 ++ .../modelmapper/service/PostService.java | 47 +++++++++ .../modelmapper/service/UserService.java | 25 +++++ .../baeldung/modelmapper/PostDtoUnitTest.java | 40 ++++++++ 14 files changed, 536 insertions(+) create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/PostApplication.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/dto/PostDto.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/dto/UserDto.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/model/Post.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/model/Preference.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/model/User.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/repository/PostRepository.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/service/IPostService.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/service/IUserService.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/service/PostService.java create mode 100644 spring-boot/src/main/java/com/baeldung/modelmapper/service/UserService.java create mode 100644 spring-boot/src/test/java/com/baeldung/modelmapper/PostDtoUnitTest.java diff --git a/spring-boot/pom.xml b/spring-boot/pom.xml index 87c782b044..e6866b5a8f 100644 --- a/spring-boot/pom.xml +++ b/spring-boot/pom.xml @@ -162,6 +162,12 @@ javax.validation validation-api + + + org.modelmapper + modelmapper + ${modelmapper.version} + @@ -259,6 +265,7 @@ 5.2.4 18.0 2.2.4 + 2.3.2 diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/PostApplication.java b/spring-boot/src/main/java/com/baeldung/modelmapper/PostApplication.java new file mode 100644 index 0000000000..7684c43648 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/PostApplication.java @@ -0,0 +1,20 @@ +package com.baeldung.modelmapper; + +import org.modelmapper.ModelMapper; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; + +@SpringBootApplication +public class PostApplication { + + public static void main(String[] args) { + SpringApplication.run(PostApplication.class, args); + } + + @Bean + public ModelMapper modelMapper() { + return new ModelMapper(); + } + +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java b/spring-boot/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java new file mode 100644 index 0000000000..c0cbca5220 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/controller/PostRestController.java @@ -0,0 +1,91 @@ +package com.baeldung.modelmapper.controller; + +import java.text.ParseException; +import java.util.List; +import java.util.stream.Collectors; + +import org.modelmapper.ModelMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.ResponseStatus; + +import com.baeldung.modelmapper.dto.PostDto; +import com.baeldung.modelmapper.model.Post; +import com.baeldung.modelmapper.service.IPostService; +import com.baeldung.modelmapper.service.IUserService; + +@Controller +public class PostRestController { + + @Autowired + private IPostService postService; + + @Autowired + private IUserService userService; + + @Autowired + private ModelMapper modelMapper; + + @RequestMapping(method = RequestMethod.GET) + @ResponseBody + public List getPosts( + @PathVariable("page") int page, + @PathVariable("size") int size, + @PathVariable("sortDir") String sortDir, + @PathVariable("sort") String sort) { + + List posts = postService.getPostsList(page, size, sortDir, sort); + return posts.stream() + .map(post -> convertToDto(post)) + .collect(Collectors.toList()); + } + + @RequestMapping(method = RequestMethod.POST) + @ResponseStatus(HttpStatus.CREATED) + @ResponseBody + public PostDto createPost(@RequestBody PostDto postDto) throws ParseException { + Post post = convertToEntity(postDto); + Post postCreated = postService.createPost(post); + return convertToDto(postCreated); + } + + @RequestMapping(value = "/{id}", method = RequestMethod.GET) + @ResponseBody + public PostDto getPost(@PathVariable("id") Long id) { + return convertToDto(postService.getPostById(id)); + } + + @RequestMapping(value = "/{id}", method = RequestMethod.PUT) + @ResponseStatus(HttpStatus.OK) + public void updatePost(@RequestBody PostDto postDto) throws ParseException { + Post post = convertToEntity(postDto); + postService.updatePost(post); + } + + + private PostDto convertToDto(Post post) { + PostDto postDto = modelMapper.map(post, PostDto.class); + postDto.setSubmissionDate(post.getSubmissionDate(), + userService.getCurrentUser().getPreference().getTimezone()); + return postDto; + } + + private Post convertToEntity(PostDto postDto) throws ParseException { + Post post = modelMapper.map(postDto, Post.class); + post.setSubmissionDate(postDto.getSubmissionDateConverted( + userService.getCurrentUser().getPreference().getTimezone())); + + if (postDto.getId() != null) { + Post oldPost = postService.getPostById(postDto.getId()); + post.setRedditID(oldPost.getRedditID()); + post.setSent(oldPost.isSent()); + } + return post; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/dto/PostDto.java b/spring-boot/src/main/java/com/baeldung/modelmapper/dto/PostDto.java new file mode 100644 index 0000000000..6fe2b23888 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/dto/PostDto.java @@ -0,0 +1,71 @@ +package com.baeldung.modelmapper.dto; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.TimeZone; + +public class PostDto { + + private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + + private Long id; + + private String title; + + private String url; + + private String date; + + private UserDto user; + + public Date getSubmissionDateConverted(String timezone) throws ParseException { + dateFormat.setTimeZone(TimeZone.getTimeZone(timezone)); + return dateFormat.parse(this.date); + } + + public void setSubmissionDate(Date date, String timezone) { + dateFormat.setTimeZone(TimeZone.getTimeZone(timezone)); + this.date = dateFormat.format(date); + } + + 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 getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public UserDto getUser() { + return user; + } + + public void setUser(UserDto user) { + this.user = user; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/dto/UserDto.java b/spring-boot/src/main/java/com/baeldung/modelmapper/dto/UserDto.java new file mode 100644 index 0000000000..23110ecbaa --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/dto/UserDto.java @@ -0,0 +1,14 @@ +package com.baeldung.modelmapper.dto; + +public class UserDto { + + private String name; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/model/Post.java b/spring-boot/src/main/java/com/baeldung/modelmapper/model/Post.java new file mode 100644 index 0000000000..be65ce34a2 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/model/Post.java @@ -0,0 +1,98 @@ +package com.baeldung.modelmapper.model; + +import java.util.Date; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Post { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String title; + + private String url; + + private String date; + + private String redditID; + + private Date submissionDate; + + private boolean sent; + + private String userName; + + public Post() { + + } + + public boolean isSent() { + return sent; + } + + public void setSent(boolean sent) { + this.sent = sent; + } + + public String getRedditID() { + return redditID; + } + + public void setRedditID(String redditID) { + this.redditID = redditID; + } + + 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 getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getDate() { + return date; + } + + public void setDate(String date) { + this.date = date; + } + + public Date getSubmissionDate() { + return submissionDate; + } + + public void setSubmissionDate(Date submissionDate) { + this.submissionDate = submissionDate; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/model/Preference.java b/spring-boot/src/main/java/com/baeldung/modelmapper/model/Preference.java new file mode 100644 index 0000000000..0ab5b1eddf --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/model/Preference.java @@ -0,0 +1,32 @@ +package com.baeldung.modelmapper.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; + +@Entity +public class Preference { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String timezone; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTimezone() { + return timezone; + } + + public void setTimezone(String timezone) { + this.timezone = timezone; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/model/User.java b/spring-boot/src/main/java/com/baeldung/modelmapper/model/User.java new file mode 100644 index 0000000000..a458b26f4a --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/model/User.java @@ -0,0 +1,44 @@ +package com.baeldung.modelmapper.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.OneToOne; + +@Entity +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private Long id; + + private String name; + + @OneToOne + Preference preference; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Preference getPreference() { + return preference; + } + + public void setPreference(Preference preference) { + this.preference = preference; + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/repository/PostRepository.java b/spring-boot/src/main/java/com/baeldung/modelmapper/repository/PostRepository.java new file mode 100644 index 0000000000..fc3f5733c3 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/repository/PostRepository.java @@ -0,0 +1,21 @@ +package com.baeldung.modelmapper.repository; + +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.PagingAndSortingRepository; +import org.springframework.data.repository.query.Param; + +import com.baeldung.modelmapper.model.Post; +import com.baeldung.modelmapper.model.User; + +public interface PostRepository extends JpaRepository, PagingAndSortingRepository { + + @Query("select u from Post u where u.userName=:userName") + Page findByUser(@Param("userName") String userName, Pageable pageReq); + + default Page findByUser(User user, Pageable pageReq) { + return findByUser(user.getName(), pageReq); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/service/IPostService.java b/spring-boot/src/main/java/com/baeldung/modelmapper/service/IPostService.java new file mode 100644 index 0000000000..0182a0da41 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/service/IPostService.java @@ -0,0 +1,17 @@ +package com.baeldung.modelmapper.service; + +import java.util.List; + +import com.baeldung.modelmapper.model.Post; + +public interface IPostService { + + List getPostsList(int page, int size, String sortDir, String sort); + + void updatePost(Post post); + + Post createPost(Post post); + + Post getPostById(Long id); + +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/service/IUserService.java b/spring-boot/src/main/java/com/baeldung/modelmapper/service/IUserService.java new file mode 100644 index 0000000000..79934114c1 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/service/IUserService.java @@ -0,0 +1,9 @@ +package com.baeldung.modelmapper.service; + +import com.baeldung.modelmapper.model.User; + +public interface IUserService { + + User getCurrentUser(); + +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/service/PostService.java b/spring-boot/src/main/java/com/baeldung/modelmapper/service/PostService.java new file mode 100644 index 0000000000..5980c30837 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/service/PostService.java @@ -0,0 +1,47 @@ +package com.baeldung.modelmapper.service; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; + +import com.baeldung.modelmapper.model.Post; +import com.baeldung.modelmapper.repository.PostRepository; + +@Service +public class PostService implements IPostService { + + @Autowired + private PostRepository postRepository; + + @Autowired + private IUserService userService; + + @Override + public List getPostsList(int page, int size, String sortDir, String sort) { + + PageRequest pageReq + = PageRequest.of(page, size, Sort.Direction.fromString(sortDir), sort); + + Page posts = postRepository.findByUser(userService.getCurrentUser(), pageReq); + return posts.getContent(); + } + + @Override + public void updatePost(Post post) { + postRepository.save(post); + } + + @Override + public Post createPost(Post post) { + return postRepository.save(post); + } + + @Override + public Post getPostById(Long id) { + return postRepository.getOne(id); + } +} diff --git a/spring-boot/src/main/java/com/baeldung/modelmapper/service/UserService.java b/spring-boot/src/main/java/com/baeldung/modelmapper/service/UserService.java new file mode 100644 index 0000000000..e445f836a4 --- /dev/null +++ b/spring-boot/src/main/java/com/baeldung/modelmapper/service/UserService.java @@ -0,0 +1,25 @@ +package com.baeldung.modelmapper.service; + +import org.springframework.stereotype.Service; + +import com.baeldung.modelmapper.model.Preference; +import com.baeldung.modelmapper.model.User; + +@Service +public class UserService implements IUserService { + + @Override + public User getCurrentUser() { + + Preference preference = new Preference(); + preference.setId(1L); + preference.setTimezone("Asia/Calcutta"); + + User user = new User(); + user.setId(1L); + user.setName("Micheal"); + user.setPreference(preference); + + return user; + } +} \ No newline at end of file diff --git a/spring-boot/src/test/java/com/baeldung/modelmapper/PostDtoUnitTest.java b/spring-boot/src/test/java/com/baeldung/modelmapper/PostDtoUnitTest.java new file mode 100644 index 0000000000..34ec4db783 --- /dev/null +++ b/spring-boot/src/test/java/com/baeldung/modelmapper/PostDtoUnitTest.java @@ -0,0 +1,40 @@ +package com.baeldung.modelmapper; + +import static org.junit.Assert.assertEquals; +import static org.apache.commons.lang3.RandomStringUtils.randomAlphabetic; +import org.junit.Test; +import org.modelmapper.ModelMapper; + +import com.baeldung.modelmapper.dto.PostDto; +import com.baeldung.modelmapper.model.Post; + +public class PostDtoUnitTest { + + private ModelMapper modelMapper = new ModelMapper(); + + @Test + public void whenConvertPostEntityToPostDto_thenCorrect() { + Post post = new Post(); + post.setId(Long.valueOf(1)); + post.setTitle(randomAlphabetic(6)); + post.setUrl("www.test.com"); + + PostDto postDto = modelMapper.map(post, PostDto.class); + assertEquals(post.getId(), postDto.getId()); + assertEquals(post.getTitle(), postDto.getTitle()); + assertEquals(post.getUrl(), postDto.getUrl()); + } + + @Test + public void whenConvertPostDtoToPostEntity_thenCorrect() { + PostDto postDto = new PostDto(); + postDto.setId(Long.valueOf(1)); + postDto.setTitle(randomAlphabetic(6)); + postDto.setUrl("www.test.com"); + + Post post = modelMapper.map(postDto, Post.class); + assertEquals(postDto.getId(), post.getId()); + assertEquals(postDto.getTitle(), post.getTitle()); + assertEquals(postDto.getUrl(), post.getUrl()); + } +} \ No newline at end of file From 5174d9495bfd515ee2af9bbfb10eac9a2c79bfec Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 16 Dec 2018 17:11:21 +0530 Subject: [PATCH 297/429] [BAEL-10840] - Moved FTP related code back to libraries module --- libraries-apache-commons/README.md | 3 +-- libraries-apache-commons/pom.xml | 7 ------- libraries/README.md | 1 + libraries/pom.xml | 13 +++++++++++++ .../src/main/java/com/baeldung/ftp/FtpClient.java | 0 .../com/baeldung/ftp/FtpClientIntegrationTest.java | 0 .../baeldung/ftp/JdkFtpClientIntegrationTest.java | 0 7 files changed, 15 insertions(+), 9 deletions(-) rename {libraries-apache-commons => libraries}/src/main/java/com/baeldung/ftp/FtpClient.java (100%) rename {libraries-apache-commons => libraries}/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java (100%) rename {libraries-apache-commons => libraries}/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java (100%) diff --git a/libraries-apache-commons/README.md b/libraries-apache-commons/README.md index 66090e3709..01f2379588 100644 --- a/libraries-apache-commons/README.md +++ b/libraries-apache-commons/README.md @@ -17,5 +17,4 @@ - [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) -- [An Introduction to Apache Commons Lang 3](https://www.baeldung.com/java-commons-lang-3) -- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) \ No newline at end of file +- [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 f61a7a4a9a..c7ff918af9 100644 --- a/libraries-apache-commons/pom.xml +++ b/libraries-apache-commons/pom.xml @@ -83,12 +83,6 @@ ${org.hamcrest.java-hamcrest.version} test - - org.mockftpserver - MockFtpServer - ${mockftpserver.version} - test - @@ -110,7 +104,6 @@ 3.6 1.3 3.6.1 - 2.7.1 diff --git a/libraries/README.md b/libraries/README.md index 28184c161b..ce2445f3e0 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -65,6 +65,7 @@ - [Guide to JMapper](http://www.baeldung.com/jmapper) - [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once) - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) +- [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) 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. diff --git a/libraries/pom.xml b/libraries/pom.xml index 16d79a59b1..2ad4871e3f 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -55,6 +55,11 @@ commons-lang3 ${commons-lang.version} + + commons-net + commons-net + ${commons-net.version} + tec.units unit-ri @@ -664,6 +669,12 @@ ${derive4j.version} true + + org.mockftpserver + MockFtpServer + ${mockftpserver.version} + test + @@ -888,6 +899,8 @@ 3.3.0 3.0.2 1.1.0 + 2.7.1 + 3.6 diff --git a/libraries-apache-commons/src/main/java/com/baeldung/ftp/FtpClient.java b/libraries/src/main/java/com/baeldung/ftp/FtpClient.java similarity index 100% rename from libraries-apache-commons/src/main/java/com/baeldung/ftp/FtpClient.java rename to libraries/src/main/java/com/baeldung/ftp/FtpClient.java diff --git a/libraries-apache-commons/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java b/libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java similarity index 100% rename from libraries-apache-commons/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java rename to libraries/src/test/java/com/baeldung/ftp/FtpClientIntegrationTest.java diff --git a/libraries-apache-commons/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java b/libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java similarity index 100% rename from libraries-apache-commons/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java rename to libraries/src/test/java/com/baeldung/ftp/JdkFtpClientIntegrationTest.java From 1e29af79ffaf70c65fad2652d4f5da1dec7a95e5 Mon Sep 17 00:00:00 2001 From: amdegregorio Date: Sun, 16 Dec 2018 06:58:45 -0500 Subject: [PATCH 298/429] Example code for Guide to Packages --- .../java/com/baeldung/packages/TodoApp.java | 22 +++++++++++ .../java/com/baeldung/packages/TodoList.java | 27 +++++++++++++ .../baeldung/packages/domain/TodoItem.java | 39 +++++++++++++++++++ .../baeldung/packages/PackagesUnitTest.java | 23 +++++++++++ 4 files changed, 111 insertions(+) create mode 100644 core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java create mode 100644 core-java-lang/src/main/java/com/baeldung/packages/TodoList.java create mode 100644 core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java create mode 100644 core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java diff --git a/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java b/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java new file mode 100644 index 0000000000..0f4a56f708 --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/packages/TodoApp.java @@ -0,0 +1,22 @@ +package com.baeldung.packages; + +import java.time.LocalDate; + +import com.baeldung.packages.domain.TodoItem; + +public class TodoApp { + + public static void main(String[] args) { + TodoList todoList = new TodoList(); + for (int i = 0; i < 3; i++) { + TodoItem item = new TodoItem(); + item.setId(Long.valueOf((long)i)); + item.setDescription("Todo item " + (i + 1)); + item.setDueDate(LocalDate.now().plusDays((long)(i + 1))); + todoList.addTodoItem(item); + } + + todoList.getTodoItems().forEach((TodoItem todoItem) -> System.out.println(todoItem.toString())); + } + +} diff --git a/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java b/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java new file mode 100644 index 0000000000..6ed6cd4ec1 --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/packages/TodoList.java @@ -0,0 +1,27 @@ +package com.baeldung.packages; + +import java.util.ArrayList; +import java.util.List; + +import com.baeldung.packages.domain.TodoItem; + +public class TodoList { + private List todoItems; + + public void addTodoItem(TodoItem todoItem) { + if (todoItems == null) { + todoItems = new ArrayList(); + } + + todoItems.add(todoItem); + } + + public List getTodoItems() { + return todoItems; + } + + public void setTodoItems(List todoItems) { + this.todoItems = todoItems; + } + +} diff --git a/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java b/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java new file mode 100644 index 0000000000..972e574a7f --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/packages/domain/TodoItem.java @@ -0,0 +1,39 @@ +package com.baeldung.packages.domain; + +import java.time.LocalDate; + +public class TodoItem { + private Long id; + private String description; + private LocalDate dueDate; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public LocalDate getDueDate() { + return dueDate; + } + + public void setDueDate(LocalDate dueDate) { + this.dueDate = dueDate; + } + + @Override + public String toString() { + return "TodoItem [id=" + id + ", description=" + description + ", dueDate=" + dueDate + "]"; + } + +} diff --git a/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java b/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java new file mode 100644 index 0000000000..212fb7b3c7 --- /dev/null +++ b/core-java-lang/src/test/java/com/baeldung/packages/PackagesUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.packages; + +import static org.junit.Assert.assertEquals; + +import java.time.LocalDate; + +import org.junit.Test; + +import com.baeldung.packages.domain.TodoItem; + +public class PackagesUnitTest { + + @Test + public void whenTodoItemAdded_ThenSizeIncreases() { + TodoItem todoItem = new TodoItem(); + todoItem.setId(1L); + todoItem.setDescription("Test the Todo List"); + todoItem.setDueDate(LocalDate.now()); + TodoList todoList = new TodoList(); + todoList.addTodoItem(todoItem); + assertEquals(1, todoList.getTodoItems().size()); + } +} From c97e97d175ef89e9bd93b3738a840f77113a174d Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 16 Dec 2018 16:25:49 +0200 Subject: [PATCH 299/429] add readmes, remove extra modules --- core-java-11/README.md | 5 + mvn-wrapper/.gitignore | 24 -- mvn-wrapper/.mvn/wrapper/maven-wrapper.jar | Bin 48336 -> 0 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 - mvn-wrapper/README.md | 22 -- mvn-wrapper/mvnw | 227 ------------------ mvn-wrapper/mvnw.cmd | 145 ----------- mvn-wrapper/pom.xml | 38 --- .../com/baeldung/MvnWrapperApplication.java | 11 - mvn-wrapper/src/main/resources/logback.xml | 13 - parent-boot-1/README.md | 2 + parent-boot-2/README.md | 3 +- parent-kotlin/README.md | 2 + .../spring-boot-persistence-mongodb/README.md | 3 + .../spring-data-cassandra-reactive/README.md | 3 + pom.xml | 11 - spring-cloud/README.md | 13 +- spring-cloud/spring-cloud-archaius/README.md | 7 +- .../spring-cloud-aws/.attach_pid23938 | 0 spring-cloud/spring-cloud-aws/README.md | 8 +- .../src/test/resources/test-file-upload.txt | 1 + .../spring-cloud-connectors-heroku/README.md | 2 + spring-cloud/spring-cloud-consul/README.md | 3 + spring-cloud/spring-cloud-contract/README.md | 2 + .../spring-cloud-kubernetes/README.md | 3 + spring-cloud/spring-cloud-rest/README.md | 2 + .../spring-cloud-ribbon-client/README.md | 2 + spring-cloud/spring-cloud-security/README.md | 2 + spring-cloud/spring-cloud-task/README.md | 2 + spring-cloud/spring-cloud-vault/README.md | 3 + spring-cloud/spring-cloud-zookeeper/README.md | 2 + .../README.md | 2 + spring-cloud/spring-cloud-zuul/README.md | 2 + spring-mustache/.gitignore | 24 -- spring-mustache/README.md | 1 - spring-mustache/pom.xml | 55 ----- .../SpringMustacheApplication.java | 32 --- .../controller/ArticleController.java | 43 ---- .../springmustache/model/Article.java | 41 ---- .../src/main/resources/application.properties | 0 .../src/main/resources/logback.xml | 13 - .../main/resources/templates/error/error.html | 9 - .../src/main/resources/templates/index.html | 9 - .../resources/templates/layout/article.html | 8 - .../resources/templates/layout/footer.html | 2 - .../resources/templates/layout/header.html | 11 - ...ingMustacheApplicationIntegrationTest.java | 30 --- spring-mybatis/README.md | 1 - spring-mybatis/pom.xml | 73 ------ .../application/SpringMyBatisApplication.java | 48 ---- .../mybatis/controller/StudentController.java | 60 ----- .../spring/mybatis/mappers/StudentMapper.java | 19 -- .../spring/mybatis/model/Student.java | 55 ----- .../spring/mybatis/model/StudentLogin.java | 18 -- .../mybatis/service/StudentService.java | 9 - .../mybatis/service/StudentServiceImpl.java | 40 --- spring-mybatis/src/main/resources/logback.xml | 13 - .../src/main/resources/mybatis-spring.xml | 54 ----- .../webapp/WEB-INF/conf/mybatis-spring.xml | 51 ---- .../src/main/webapp/WEB-INF/jsp/failure.jsp | 36 --- .../src/main/webapp/WEB-INF/jsp/login.jsp | 81 ------- .../src/main/webapp/WEB-INF/jsp/signup.jsp | 130 ---------- .../src/main/webapp/WEB-INF/jsp/success.jsp | 35 --- .../lib/mysql-connector-java-5.1.40-bin.jar | Bin 990927 -> 0 bytes .../src/main/webapp/WEB-INF/web.xml | 21 -- spring-mybatis/src/main/webapp/index.jsp | 34 --- spring-rest-embedded-tomcat/pom.xml | 79 ------ .../configuration/AppInitializer.java | 22 -- .../configuration/UserConfiguration.java | 12 - .../embedded/controller/UserController.java | 28 --- .../org/baeldung/embedded/domain/User.java | 23 -- .../embedded/service/UserService.java | 38 --- .../src/main/resources/logback.xml | 13 - .../src/main/webapp/emptyFile | 0 .../SpringContextIntegrationTest.java | 18 -- .../baeldung/embedded/EmbeddedTomcatApp.java | 70 ------ .../embedded/EmbeddedTomcatRunner.java | 45 ---- .../embedded/UserIntegrationTest.java | 60 ----- sse-jaxrs/pom.xml | 22 -- sse-jaxrs/sse-jaxrs-client/pom.xml | 62 ----- .../sse/jaxrs/client/SseClientApp.java | 48 ---- .../jaxrs/client/SseClientBroadcastApp.java | 52 ---- .../src/main/resources/logback.xml | 13 - sse-jaxrs/sse-jaxrs-server/pom.xml | 85 ------- .../com/baeldung/sse/jaxrs/AppConfig.java | 8 - .../com/baeldung/sse/jaxrs/SseResource.java | 119 --------- .../java/com/baeldung/sse/jaxrs/Stock.java | 50 ---- .../com/baeldung/sse/jaxrs/StockService.java | 78 ------ .../src/main/liberty/config/server.xml | 7 - .../src/main/resources/META-INF/beans.xml | 6 - .../src/main/resources/logback.xml | 13 - .../src/main/webapp/WEB-INF/web.xml | 11 - .../src/main/webapp/index.html | 1 - .../src/main/webapp/sse-broadcast.html | 38 --- .../sse-jaxrs-server/src/main/webapp/sse.html | 38 --- 95 files changed, 59 insertions(+), 2622 deletions(-) create mode 100644 core-java-11/README.md delete mode 100644 mvn-wrapper/.gitignore delete mode 100755 mvn-wrapper/.mvn/wrapper/maven-wrapper.jar delete mode 100755 mvn-wrapper/.mvn/wrapper/maven-wrapper.properties delete mode 100644 mvn-wrapper/README.md delete mode 100755 mvn-wrapper/mvnw delete mode 100755 mvn-wrapper/mvnw.cmd delete mode 100644 mvn-wrapper/pom.xml delete mode 100644 mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java delete mode 100644 mvn-wrapper/src/main/resources/logback.xml create mode 100644 parent-boot-1/README.md create mode 100644 parent-kotlin/README.md create mode 100644 persistence-modules/spring-boot-persistence-mongodb/README.md create mode 100644 persistence-modules/spring-data-cassandra-reactive/README.md rename mvn-wrapper/src/main/resources/application.properties => spring-cloud/spring-cloud-aws/.attach_pid23938 (100%) create mode 100644 spring-cloud/spring-cloud-aws/src/test/resources/test-file-upload.txt create mode 100644 spring-cloud/spring-cloud-connectors-heroku/README.md create mode 100644 spring-cloud/spring-cloud-consul/README.md create mode 100644 spring-cloud/spring-cloud-contract/README.md create mode 100644 spring-cloud/spring-cloud-kubernetes/README.md create mode 100644 spring-cloud/spring-cloud-rest/README.md create mode 100644 spring-cloud/spring-cloud-ribbon-client/README.md create mode 100644 spring-cloud/spring-cloud-security/README.md create mode 100644 spring-cloud/spring-cloud-task/README.md create mode 100644 spring-cloud/spring-cloud-vault/README.md create mode 100644 spring-cloud/spring-cloud-zookeeper/README.md create mode 100644 spring-cloud/spring-cloud-zuul-eureka-integration/README.md create mode 100644 spring-cloud/spring-cloud-zuul/README.md delete mode 100644 spring-mustache/.gitignore delete mode 100644 spring-mustache/README.md delete mode 100644 spring-mustache/pom.xml delete mode 100644 spring-mustache/src/main/java/com/baeldung/springmustache/SpringMustacheApplication.java delete mode 100644 spring-mustache/src/main/java/com/baeldung/springmustache/controller/ArticleController.java delete mode 100644 spring-mustache/src/main/java/com/baeldung/springmustache/model/Article.java delete mode 100644 spring-mustache/src/main/resources/application.properties delete mode 100644 spring-mustache/src/main/resources/logback.xml delete mode 100644 spring-mustache/src/main/resources/templates/error/error.html delete mode 100644 spring-mustache/src/main/resources/templates/index.html delete mode 100644 spring-mustache/src/main/resources/templates/layout/article.html delete mode 100644 spring-mustache/src/main/resources/templates/layout/footer.html delete mode 100644 spring-mustache/src/main/resources/templates/layout/header.html delete mode 100644 spring-mustache/src/test/java/com/baeldung/springmustache/SpringMustacheApplicationIntegrationTest.java delete mode 100644 spring-mybatis/README.md delete mode 100644 spring-mybatis/pom.xml delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/application/SpringMyBatisApplication.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/controller/StudentController.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/mappers/StudentMapper.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/Student.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/StudentLogin.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentService.java delete mode 100644 spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentServiceImpl.java delete mode 100644 spring-mybatis/src/main/resources/logback.xml delete mode 100644 spring-mybatis/src/main/resources/mybatis-spring.xml delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/conf/mybatis-spring.xml delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/jsp/failure.jsp delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/jsp/login.jsp delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/jsp/signup.jsp delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/jsp/success.jsp delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/lib/mysql-connector-java-5.1.40-bin.jar delete mode 100644 spring-mybatis/src/main/webapp/WEB-INF/web.xml delete mode 100644 spring-mybatis/src/main/webapp/index.jsp delete mode 100644 spring-rest-embedded-tomcat/pom.xml delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/AppInitializer.java delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/UserConfiguration.java delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/controller/UserController.java delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/domain/User.java delete mode 100644 spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/service/UserService.java delete mode 100644 spring-rest-embedded-tomcat/src/main/resources/logback.xml delete mode 100644 spring-rest-embedded-tomcat/src/main/webapp/emptyFile delete mode 100644 spring-rest-embedded-tomcat/src/test/java/org/baeldung/SpringContextIntegrationTest.java delete mode 100644 spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatApp.java delete mode 100644 spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatRunner.java delete mode 100644 spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/UserIntegrationTest.java delete mode 100644 sse-jaxrs/pom.xml delete mode 100644 sse-jaxrs/sse-jaxrs-client/pom.xml delete mode 100644 sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientApp.java delete mode 100644 sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientBroadcastApp.java delete mode 100644 sse-jaxrs/sse-jaxrs-client/src/main/resources/logback.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/pom.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/AppConfig.java delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/SseResource.java delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/Stock.java delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/StockService.java delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/liberty/config/server.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/resources/META-INF/beans.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/resources/logback.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/webapp/WEB-INF/web.xml delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/webapp/index.html delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse-broadcast.html delete mode 100644 sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse.html diff --git a/core-java-11/README.md b/core-java-11/README.md new file mode 100644 index 0000000000..181ada3f45 --- /dev/null +++ b/core-java-11/README.md @@ -0,0 +1,5 @@ +### Relevant articles + +- [Java 11 Single File Source Code](https://www.baeldung.com/java-single-file-source-code) +- [Java 11 Local Variable Syntax for Lambda Parameters](https://www.baeldung.com/java-var-lambda-params) + diff --git a/mvn-wrapper/.gitignore b/mvn-wrapper/.gitignore deleted file mode 100644 index 2af7cefb0a..0000000000 --- a/mvn-wrapper/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -nbproject/private/ -build/ -nbbuild/ -dist/ -nbdist/ -.nb-gradle/ \ No newline at end of file diff --git a/mvn-wrapper/.mvn/wrapper/maven-wrapper.jar b/mvn-wrapper/.mvn/wrapper/maven-wrapper.jar deleted file mode 100755 index f775b1c04cf89b25c7814d3a8a7c810301092e57..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48336 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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 - -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/mvn-wrapper/mvnw.cmd b/mvn-wrapper/mvnw.cmd deleted file mode 100755 index 4f0b068a03..0000000000 --- a/mvn-wrapper/mvnw.cmd +++ /dev/null @@ -1,145 +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 http://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 - -%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/mvn-wrapper/pom.xml b/mvn-wrapper/pom.xml deleted file mode 100644 index 7f45fe218d..0000000000 --- a/mvn-wrapper/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - 4.0.0 - mvn-wrapper - 0.0.1-SNAPSHOT - jar - mvn-wrapper - Setting up the Maven Wrapper - - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - - - - - org.springframework.boot - spring-boot-starter - - - org.springframework.boot - spring-boot-starter-web - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - diff --git a/mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java b/mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java deleted file mode 100644 index 3007d24ed0..0000000000 --- a/mvn-wrapper/src/main/java/com/baeldung/MvnWrapperApplication.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.baeldung; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class MvnWrapperApplication { - public static void main(String[] args) { - SpringApplication.run(MvnWrapperApplication.class, args); - } -} diff --git a/mvn-wrapper/src/main/resources/logback.xml b/mvn-wrapper/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/mvn-wrapper/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/parent-boot-1/README.md b/parent-boot-1/README.md new file mode 100644 index 0000000000..8b312c348a --- /dev/null +++ b/parent-boot-1/README.md @@ -0,0 +1,2 @@ + +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 ff12555376..3f18bdf38e 100644 --- a/parent-boot-2/README.md +++ b/parent-boot-2/README.md @@ -1 +1,2 @@ -## Relevant articles: + +This is a parent module for all projects using Spring Boot 2. diff --git a/parent-kotlin/README.md b/parent-kotlin/README.md new file mode 100644 index 0000000000..6c17a6ac29 --- /dev/null +++ b/parent-kotlin/README.md @@ -0,0 +1,2 @@ + +Parent module for Kotlin projects. diff --git a/persistence-modules/spring-boot-persistence-mongodb/README.md b/persistence-modules/spring-boot-persistence-mongodb/README.md new file mode 100644 index 0000000000..f093d4baf0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence-mongodb/README.md @@ -0,0 +1,3 @@ +# Relevant Articles + +- [Auto-Generated Field for MongoDB using Spring Boot](https://www.baeldung.com/spring-boot-mongodb-auto-generated-field) diff --git a/persistence-modules/spring-data-cassandra-reactive/README.md b/persistence-modules/spring-data-cassandra-reactive/README.md new file mode 100644 index 0000000000..87a61d46b3 --- /dev/null +++ b/persistence-modules/spring-data-cassandra-reactive/README.md @@ -0,0 +1,3 @@ +#Relevant Articles + +- [Spring Data with Reactive Cassandra](https://www.baeldung.com/spring-data-cassandra-reactive) diff --git a/pom.xml b/pom.xml index f22aeea5e6..2a3102880a 100644 --- a/pom.xml +++ b/pom.xml @@ -486,7 +486,6 @@ msf4j mustache - mvn-wrapper mybatis noexception @@ -674,7 +673,6 @@ spring-mobile spring-mockito - spring-mustache spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java @@ -683,7 +681,6 @@ spring-mvc-velocity spring-mvc-webflow spring-mvc-xml - spring-mybatis spring-protobuf @@ -694,7 +691,6 @@ spring-remoting spring-rest spring-rest-angular - spring-rest-embedded-tomcat spring-rest-full spring-rest-hal-browser spring-rest-query-language @@ -752,7 +748,6 @@ spring-zuul - sse-jaxrs static-analysis stripe structurizr @@ -903,7 +898,6 @@ spring-remoting/remoting-rmi/remoting-rmi-server spring-rest spring-rest-angular - spring-rest-embedded-tomcat spring-rest-full spring-rest-simple spring-resttemplate @@ -1196,7 +1190,6 @@ msf4j mustache - mvn-wrapper mybatis noexception @@ -1380,7 +1373,6 @@ spring-mobile spring-mockito - spring-mustache spring-mvc-forms-jsp spring-mvc-forms-thymeleaf spring-mvc-java @@ -1389,7 +1381,6 @@ spring-mvc-velocity spring-mvc-webflow spring-mvc-xml - spring-mybatis spring-protobuf @@ -1400,7 +1391,6 @@ spring-remoting spring-rest spring-rest-angular - spring-rest-embedded-tomcat spring-rest-full spring-rest-hal-browser spring-rest-query-language @@ -1458,7 +1448,6 @@ spring-zuul - sse-jaxrs static-analysis stripe structurizr diff --git a/spring-cloud/README.md b/spring-cloud/README.md index dc43bd1a66..eb2e46c3d0 100644 --- a/spring-cloud/README.md +++ b/spring-cloud/README.md @@ -15,19 +15,8 @@ ### Relevant Articles: - [Intro to Spring Cloud Netflix - Hystrix](http://www.baeldung.com/spring-cloud-netflix-hystrix) - [Dockerizing a Spring Boot Application](http://www.baeldung.com/dockerizing-spring-boot-application) -- [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) -- [A Quick Guide to Spring Cloud Consul](http://www.baeldung.com/spring-cloud-consul) -- [An Introduction to Spring Cloud Zookeeper](http://www.baeldung.com/spring-cloud-zookeeper) - [Using a Spring Cloud App Starter](http://www.baeldung.com/using-a-spring-cloud-app-starter) -- [Spring Cloud Connectors and Heroku](http://www.baeldung.com/spring-cloud-heroku) -- [An Example of Load Balancing with Zuul and Eureka](http://www.baeldung.com/zuul-load-balancing) -- [An Intro to Spring Cloud Contract](http://www.baeldung.com/spring-cloud-contract) - [Using a Spring Cloud App Starter](http://www.baeldung.com/spring-cloud-app-starter) - [Instance Profile Credentials using Spring Cloud](http://www.baeldung.com/spring-cloud-instance-profiles) -- [An Intro to Spring Cloud Security](http://www.baeldung.com/spring-cloud-security) -- [An Intro to Spring Cloud Task](http://www.baeldung.com/spring-cloud-task) - [Running Spring Boot Applications With Minikube](http://www.baeldung.com/spring-boot-minikube) -- [Introduction to Netflix Archaius with Spring Cloud](https://www.baeldung.com/netflix-archaius-spring-cloud-integration) -- [An Intro to Spring Cloud Vault](https://www.baeldung.com/spring-cloud-vault) -- [Netflix Archaius with Various Database Configurations](https://www.baeldung.com/netflix-archaius-database-configurations) -- [Rate Limiting in Spring Cloud Netflix Zuul](https://www.baeldung.com/spring-cloud-zuul-rate-limit) + diff --git a/spring-cloud/spring-cloud-archaius/README.md b/spring-cloud/spring-cloud-archaius/README.md index 9de26352e1..ae853c6ef0 100644 --- a/spring-cloud/spring-cloud-archaius/README.md +++ b/spring-cloud/spring-cloud-archaius/README.md @@ -1,3 +1,8 @@ +# 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 @@ -11,4 +16,4 @@ These properties are set up on the main method, since Archaius uses System prope #### Additional Sources In this service we create a new AbstractConfiguration bean, setting up a new Configuration Properties source. -These properties have precedence over all the other properties in the Archaius Composite Configuration. \ No newline at end of file +These properties have precedence over all the other properties in the Archaius Composite Configuration. diff --git a/mvn-wrapper/src/main/resources/application.properties b/spring-cloud/spring-cloud-aws/.attach_pid23938 similarity index 100% rename from mvn-wrapper/src/main/resources/application.properties rename to spring-cloud/spring-cloud-aws/.attach_pid23938 diff --git a/spring-cloud/spring-cloud-aws/README.md b/spring-cloud/spring-cloud-aws/README.md index 1340712c7a..36d0c7080e 100644 --- a/spring-cloud/spring-cloud-aws/README.md +++ b/spring-cloud/spring-cloud-aws/README.md @@ -1,5 +1,11 @@ # Spring Cloud AWS +# Relevant Articles +- [Spring Cloud AWS – S3](https://www.baeldung.com/spring-cloud-aws-s3) +- [Spring Cloud AWS – EC2](https://www.baeldung.com/spring-cloud-aws-ec2) +- [Spring Cloud AWS – RDS](https://www.baeldung.com/spring-cloud-aws-rds) +- [Spring Cloud AWS – Messaging Support](https://www.baeldung.com/spring-cloud-aws-messaging) + #### Running the Integration Tests To run the Integration Tests, we need to have an AWS account and have API keys generated for programmatic access. Edit @@ -23,4 +29,4 @@ Multiple application classes are available under this project. To launch Instan ``` com.baeldung.spring.cloud.aws.InstanceProfileAwsApplication -``` \ No newline at end of file +``` diff --git a/spring-cloud/spring-cloud-aws/src/test/resources/test-file-upload.txt b/spring-cloud/spring-cloud-aws/src/test/resources/test-file-upload.txt new file mode 100644 index 0000000000..7c4a013e52 --- /dev/null +++ b/spring-cloud/spring-cloud-aws/src/test/resources/test-file-upload.txt @@ -0,0 +1 @@ +aaa \ No newline at end of file diff --git a/spring-cloud/spring-cloud-connectors-heroku/README.md b/spring-cloud/spring-cloud-connectors-heroku/README.md new file mode 100644 index 0000000000..7c58d2526f --- /dev/null +++ b/spring-cloud/spring-cloud-connectors-heroku/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Spring Cloud Connectors and Heroku](http://www.baeldung.com/spring-cloud-heroku) diff --git a/spring-cloud/spring-cloud-consul/README.md b/spring-cloud/spring-cloud-consul/README.md new file mode 100644 index 0000000000..47dc39f0d5 --- /dev/null +++ b/spring-cloud/spring-cloud-consul/README.md @@ -0,0 +1,3 @@ + +### Relevant Articles: +- [A Quick Guide to Spring Cloud Consul](http://www.baeldung.com/spring-cloud-consul) diff --git a/spring-cloud/spring-cloud-contract/README.md b/spring-cloud/spring-cloud-contract/README.md new file mode 100644 index 0000000000..70e056757b --- /dev/null +++ b/spring-cloud/spring-cloud-contract/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Intro to Spring Cloud Contract](http://www.baeldung.com/spring-cloud-contract) diff --git a/spring-cloud/spring-cloud-kubernetes/README.md b/spring-cloud/spring-cloud-kubernetes/README.md new file mode 100644 index 0000000000..295ead1c2f --- /dev/null +++ b/spring-cloud/spring-cloud-kubernetes/README.md @@ -0,0 +1,3 @@ +### 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 new file mode 100644 index 0000000000..a650004708 --- /dev/null +++ b/spring-cloud/spring-cloud-rest/README.md @@ -0,0 +1,2 @@ + +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 new file mode 100644 index 0000000000..596b3226c8 --- /dev/null +++ b/spring-cloud/spring-cloud-ribbon-client/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Introduction to Spring Cloud Rest Client with Netflix Ribbon](http://www.baeldung.com/spring-cloud-rest-client-with-netflix-ribbon) diff --git a/spring-cloud/spring-cloud-security/README.md b/spring-cloud/spring-cloud-security/README.md new file mode 100644 index 0000000000..7099406614 --- /dev/null +++ b/spring-cloud/spring-cloud-security/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Intro to Spring Cloud Security](http://www.baeldung.com/spring-cloud-security) diff --git a/spring-cloud/spring-cloud-task/README.md b/spring-cloud/spring-cloud-task/README.md new file mode 100644 index 0000000000..cabc1ac854 --- /dev/null +++ b/spring-cloud/spring-cloud-task/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Intro to Spring Cloud Task](http://www.baeldung.com/spring-cloud-task) diff --git a/spring-cloud/spring-cloud-vault/README.md b/spring-cloud/spring-cloud-vault/README.md new file mode 100644 index 0000000000..b7529b4a5c --- /dev/null +++ b/spring-cloud/spring-cloud-vault/README.md @@ -0,0 +1,3 @@ +### Relevant Articles: +- [An Intro to Spring Cloud Vault](https://www.baeldung.com/spring-cloud-vault) + diff --git a/spring-cloud/spring-cloud-zookeeper/README.md b/spring-cloud/spring-cloud-zookeeper/README.md new file mode 100644 index 0000000000..a639833452 --- /dev/null +++ b/spring-cloud/spring-cloud-zookeeper/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Introduction to Spring Cloud Zookeeper](http://www.baeldung.com/spring-cloud-zookeeper) diff --git a/spring-cloud/spring-cloud-zuul-eureka-integration/README.md b/spring-cloud/spring-cloud-zuul-eureka-integration/README.md new file mode 100644 index 0000000000..32074f3699 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul-eureka-integration/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [An Example of Load Balancing with Zuul and Eureka](http://www.baeldung.com/zuul-load-balancing) diff --git a/spring-cloud/spring-cloud-zuul/README.md b/spring-cloud/spring-cloud-zuul/README.md new file mode 100644 index 0000000000..834917f159 --- /dev/null +++ b/spring-cloud/spring-cloud-zuul/README.md @@ -0,0 +1,2 @@ +### Relevant Articles: +- [Rate Limiting in Spring Cloud Netflix Zuul](https://www.baeldung.com/spring-cloud-zuul-rate-limit) diff --git a/spring-mustache/.gitignore b/spring-mustache/.gitignore deleted file mode 100644 index 2af7cefb0a..0000000000 --- a/spring-mustache/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -target/ -!.mvn/wrapper/maven-wrapper.jar - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr - -### NetBeans ### -nbproject/private/ -build/ -nbbuild/ -dist/ -nbdist/ -.nb-gradle/ \ No newline at end of file diff --git a/spring-mustache/README.md b/spring-mustache/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/spring-mustache/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: diff --git a/spring-mustache/pom.xml b/spring-mustache/pom.xml deleted file mode 100644 index 9e4c528ee0..0000000000 --- a/spring-mustache/pom.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - 4.0.0 - - spring-mustache - jar - spring-mustache - Demo project for Spring Boot - - - parent-boot-1 - com.baeldung - 0.0.1-SNAPSHOT - ../parent-boot-1 - - - - - org.springframework.boot - spring-boot-starter-mustache - - - - org.springframework.boot - spring-boot-starter-test - test - - - org.webjars - bootstrap - ${bootstrap.version} - - - org.fluttercode.datafactory - datafactory - ${datafactory.version} - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - - 3.3.7 - 0.8 - - - diff --git a/spring-mustache/src/main/java/com/baeldung/springmustache/SpringMustacheApplication.java b/spring-mustache/src/main/java/com/baeldung/springmustache/SpringMustacheApplication.java deleted file mode 100644 index 8cdf89d08a..0000000000 --- a/spring-mustache/src/main/java/com/baeldung/springmustache/SpringMustacheApplication.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.baeldung.springmustache; - -import com.samskivert.mustache.Mustache; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.autoconfigure.mustache.MustacheEnvironmentCollector; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.core.env.Environment; - -@SpringBootApplication -@ComponentScan(basePackages = {"com.baeldung"}) -public class SpringMustacheApplication { - - public static void main(String[] args) { - SpringApplication.run(SpringMustacheApplication.class, args); - } - - @Bean - public Mustache.Compiler mustacheCompiler(Mustache.TemplateLoader templateLoader, Environment environment) { - - MustacheEnvironmentCollector collector = new MustacheEnvironmentCollector(); - collector.setEnvironment(environment); - - return Mustache.compiler() - .defaultValue("Some Default Value") - .withLoader(templateLoader) - .withCollector(collector); - - } -} - diff --git a/spring-mustache/src/main/java/com/baeldung/springmustache/controller/ArticleController.java b/spring-mustache/src/main/java/com/baeldung/springmustache/controller/ArticleController.java deleted file mode 100644 index 5fc34c9f07..0000000000 --- a/spring-mustache/src/main/java/com/baeldung/springmustache/controller/ArticleController.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.baeldung.springmustache.controller; - -import com.baeldung.springmustache.model.Article; -import org.fluttercode.datafactory.impl.DataFactory; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.servlet.ModelAndView; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -@Controller -public class ArticleController { - - @GetMapping("/article") - public ModelAndView displayArticle(Map model) { - - List
articles = IntStream.range(0, 10) - .mapToObj(i -> generateArticle("Article Title " + i)) - .collect(Collectors.toList()); - - Map modelMap = new HashMap<>(); - modelMap.put("articles", articles); - - return new ModelAndView("index", modelMap); - } - - private Article generateArticle(String title) { - Article article = new Article(); - DataFactory factory = new DataFactory(); - article.setTitle(title); - article.setBody( - "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur faucibus tempor diam. In molestie arcu eget ante facilisis sodales. Maecenas porta tellus sapien, eget rutrum nisi blandit in. Mauris tempor auctor ante, ut blandit velit venenatis id. Ut varius, augue aliquet feugiat congue, arcu ipsum finibus purus, dapibus semper velit sapien venenatis magna. Nunc quam ex, aliquet at rutrum sed, vestibulum quis libero. In laoreet libero cursus maximus vulputate. Nullam in fermentum sem. Duis aliquam ullamcorper dui, et dictum justo placerat id. Aliquam pretium orci quis sapien convallis, non blandit est tempus."); - article.setPublishDate(factory.getBirthDate().toString()); - article.setAuthor(factory.getName()); - return article; - } -} - - diff --git a/spring-mustache/src/main/java/com/baeldung/springmustache/model/Article.java b/spring-mustache/src/main/java/com/baeldung/springmustache/model/Article.java deleted file mode 100644 index 78b08f877f..0000000000 --- a/spring-mustache/src/main/java/com/baeldung/springmustache/model/Article.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.baeldung.springmustache.model; - -public class Article { - private String title; - private String body; - private String author; - private String publishDate; - - public String getTitle() { - return title; - } - - public void setTitle(String title) { - this.title = title; - } - - public String getBody() { - return body; - } - - public void setBody(String body) { - this.body = body; - } - - public String getAuthor() { - return author; - } - - public void setAuthor(String author) { - this.author = author; - } - - public String getPublishDate() { - return publishDate; - } - - public void setPublishDate(String publishDate) { - this.publishDate = publishDate; - } - -} diff --git a/spring-mustache/src/main/resources/application.properties b/spring-mustache/src/main/resources/application.properties deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/spring-mustache/src/main/resources/logback.xml b/spring-mustache/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-mustache/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/spring-mustache/src/main/resources/templates/error/error.html b/spring-mustache/src/main/resources/templates/error/error.html deleted file mode 100644 index fa29db41c4..0000000000 --- a/spring-mustache/src/main/resources/templates/error/error.html +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - Something went wrong: {{status}} {{error}} - - - \ No newline at end of file diff --git a/spring-mustache/src/main/resources/templates/index.html b/spring-mustache/src/main/resources/templates/index.html deleted file mode 100644 index bda60f9d8f..0000000000 --- a/spring-mustache/src/main/resources/templates/index.html +++ /dev/null @@ -1,9 +0,0 @@ -{{>layout/header}} - -
{{>layout/article}}
- - - - -{{>layout/footer}} diff --git a/spring-mustache/src/main/resources/templates/layout/article.html b/spring-mustache/src/main/resources/templates/layout/article.html deleted file mode 100644 index 9d573580d3..0000000000 --- a/spring-mustache/src/main/resources/templates/layout/article.html +++ /dev/null @@ -1,8 +0,0 @@ -
- {{#articles}} -

{{title}}

-

{{publishDate}}

-

{{author}}

-

{{body}}

- {{/articles}} -
\ No newline at end of file diff --git a/spring-mustache/src/main/resources/templates/layout/footer.html b/spring-mustache/src/main/resources/templates/layout/footer.html deleted file mode 100644 index 04f34cac54..0000000000 --- a/spring-mustache/src/main/resources/templates/layout/footer.html +++ /dev/null @@ -1,2 +0,0 @@ - - \ No newline at end of file diff --git a/spring-mustache/src/main/resources/templates/layout/header.html b/spring-mustache/src/main/resources/templates/layout/header.html deleted file mode 100644 index d203ef800b..0000000000 --- a/spring-mustache/src/main/resources/templates/layout/header.html +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/spring-mustache/src/test/java/com/baeldung/springmustache/SpringMustacheApplicationIntegrationTest.java b/spring-mustache/src/test/java/com/baeldung/springmustache/SpringMustacheApplicationIntegrationTest.java deleted file mode 100644 index 1eecf58986..0000000000 --- a/spring-mustache/src/test/java/com/baeldung/springmustache/SpringMustacheApplicationIntegrationTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.baeldung.springmustache; - -import org.junit.Assert; -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.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; -import org.springframework.test.context.junit4.SpringRunner; - -@RunWith(SpringRunner.class) -@SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) -public class SpringMustacheApplicationIntegrationTest { - - @Autowired - private TestRestTemplate restTemplate; - - @Test - public void givenIndexPageWhenContainsArticleThenTrue() { - - ResponseEntity entity = this.restTemplate.getForEntity("/article", String.class); - - Assert.assertTrue(entity.getStatusCode().equals(HttpStatus.OK)); - Assert.assertTrue(entity.getBody().contains("Article Title 0")); - } - -} diff --git a/spring-mybatis/README.md b/spring-mybatis/README.md deleted file mode 100644 index ff12555376..0000000000 --- a/spring-mybatis/README.md +++ /dev/null @@ -1 +0,0 @@ -## Relevant articles: diff --git a/spring-mybatis/pom.xml b/spring-mybatis/pom.xml deleted file mode 100644 index af70cb6377..0000000000 --- a/spring-mybatis/pom.xml +++ /dev/null @@ -1,73 +0,0 @@ - - 4.0.0 - com.baeldung - spring-mybatis - jar - 0.0.1-SNAPSHOT - spring-mybatis - - - com.baeldung - parent-modules - 1.0.0-SNAPSHOT - - - - - org.mybatis - mybatis - ${mybatis.version} - - - org.mybatis - mybatis-spring - ${mybatis-spring.version} - - - org.springframework - spring-context-support - ${spring.version} - - - org.springframework - spring-test - ${spring.version} - test - - - mysql - mysql-connector-java - ${mysql-connector.version} - - - javax.servlet - jstl - ${jstl.version} - - - org.springframework - spring-webmvc - ${spring-webmvc.version} - - - javax.servlet - servlet-api - ${servlet.version} - - - - - spring-mybatis - - - - 3.1.1 - 1.1.1 - 3.1.1.RELEASE - 3.2.4.RELEASE - 5.1.40 - 1.2 - 2.5 - - diff --git a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/application/SpringMyBatisApplication.java b/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/application/SpringMyBatisApplication.java deleted file mode 100644 index acfaff2669..0000000000 --- a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/application/SpringMyBatisApplication.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.spring.mybatis.application; - -import java.util.Date; - -import org.springframework.context.support.ClassPathXmlApplicationContext; - -import com.baeldung.spring.mybatis.model.Student; -import com.baeldung.spring.mybatis.service.StudentService; - -public class SpringMyBatisApplication { - - public static void main(String[] args){ - ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("mybatis-spring.xml"); - - StudentService studentService = (StudentService) ctx.getBean("studentService"); - Student student = new Student(); - student.setFirstName("Santosh"); - student.setLastName("B S"); - student.setEmailAddress("santosh.bse@gmail.com"); - student.setPassword("Test123"); - student.setDateOfBirth(new Date()); - student.setUserName("santoshbs1"); - - boolean result = studentService.insertStudent(student); - if(result){ - System.out.println("Student record saved successfully"); - } - else{ - System.out.println("Encountered an error while saving student data"); - } - - final String userName = "santosh"; - Student matchingStudent = studentService.getStudentByUserName(userName); - if(matchingStudent == null){ - System.out.println("No matching student found for User Name - " + userName); - } - else{ - System.out.println("Student Details are as follows : "); - System.out.println("First Name : " + matchingStudent.getFirstName()); - System.out.println("Last Name : " + matchingStudent.getLastName()); - System.out.println("EMail : " + matchingStudent.getEmailAddress()); - System.out.println("DOB : " + matchingStudent.getDateOfBirth()); - System.out.println("User Name : " + matchingStudent.getUserName()); - } - - } - -} diff --git a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/controller/StudentController.java b/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/controller/StudentController.java deleted file mode 100644 index c1e5579103..0000000000 --- a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/controller/StudentController.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.baeldung.spring.mybatis.controller; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.ui.Model; -import org.springframework.ui.ModelMap; -import org.springframework.validation.BindingResult; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.SessionAttributes; - -import com.baeldung.spring.mybatis.model.Student; -import com.baeldung.spring.mybatis.model.StudentLogin; -import com.baeldung.spring.mybatis.service.StudentService; - -@Controller -@SessionAttributes("student") -public class StudentController { - - @Autowired - private StudentService studentService; - - @RequestMapping(value = "/signup", method = RequestMethod.GET) - public String signup(Model model) { - Student student = new Student(); - model.addAttribute("student", student); - return "signup"; - } - - @RequestMapping(value = "/signup", method = RequestMethod.POST) - public String signup(@Validated @ModelAttribute("student") Student student, BindingResult result, ModelMap model) { - if (studentService.getStudentByUserName(student.getUserName()) != null) { - model.addAttribute("message", "User Name exists. Try another user name"); - return "signup"; - } else { - studentService.insertStudent(student); - model.addAttribute("message", "Saved student details"); - return "redirect:login.html"; - } - } - - @RequestMapping(value = "/login", method = RequestMethod.GET) - public String login(Model model) { - StudentLogin studentLogin = new StudentLogin(); - model.addAttribute("studentLogin", studentLogin); - return "login"; - } - - @RequestMapping(value = "/login", method = RequestMethod.POST) - public String login(@ModelAttribute("studentLogin") StudentLogin studentLogin, BindingResult result, ModelMap model) { - boolean found = studentService.getStudentByLogin(studentLogin.getUserName(), studentLogin.getPassword()) != null; - if (found) { - return "success"; - } else { - return "failure"; - } - } -} \ No newline at end of file diff --git a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/mappers/StudentMapper.java b/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/mappers/StudentMapper.java deleted file mode 100644 index cf3584f7b1..0000000000 --- a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/mappers/StudentMapper.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.baeldung.spring.mybatis.mappers; - -import org.apache.ibatis.annotations.Insert; -import org.apache.ibatis.annotations.Options; -import org.apache.ibatis.annotations.Select; - -import com.baeldung.spring.mybatis.model.Student; - -public interface StudentMapper { - @Insert("INSERT INTO student(userName, password, firstName,lastName, dateOfBirth, emailAddress) VALUES" - + "(#{userName},#{password}, #{firstName}, #{lastName}, #{dateOfBirth}, #{emailAddress})") - @Options(useGeneratedKeys = true, keyProperty = "id", flushCache = true, keyColumn = "id") - public void insertStudent(Student student); - - @Select("SELECT USERNAME as userName, PASSWORD as password, FIRSTNAME as firstName, LASTNAME as lastName, " - + "DATEOFBIRTH as dateOfBirth, EMAILADDRESS as emailAddress " + "FROM student WHERE userName = #{userName}") - public Student getStudentByUserName(String userName); - -} \ No newline at end of file diff --git a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/Student.java b/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/Student.java deleted file mode 100644 index f33dd44f72..0000000000 --- a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/Student.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.baeldung.spring.mybatis.model; - -import java.util.Date; - -public class Student { - private Long id; - private String userName; - private String firstName; - private String lastName; - private String password; - private String emailAddress; - private Date dateOfBirth; - public Long getId() { - return id; - } - public void setId(Long id) { - this.id = id; - } - public String getUserName() { - return userName; - } - public void setUserName(String userName) { - this.userName = userName; - } - public String 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 getPassword() { - return password; - } - public void setPassword(String password) { - this.password = password; - } - public String getEmailAddress() { - return emailAddress; - } - public void setEmailAddress(String emailAddress) { - this.emailAddress = emailAddress; - } - public Date getDateOfBirth() { - return dateOfBirth; - } - public void setDateOfBirth(Date dateOfBirth) { - this.dateOfBirth = dateOfBirth; - } -} diff --git a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/StudentLogin.java b/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/StudentLogin.java deleted file mode 100644 index 867857b510..0000000000 --- a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/model/StudentLogin.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.baeldung.spring.mybatis.model; - -public class StudentLogin { - private String userName; - private String password; - public String getUserName() { - return userName; - } - public void setUserName(String userName) { - this.userName = userName; - } - public String getPassword() { - return password; - } - public void setPassword(String password) { - this.password = password; - } -} diff --git a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentService.java b/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentService.java deleted file mode 100644 index d26115beee..0000000000 --- a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentService.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.baeldung.spring.mybatis.service; - -import com.baeldung.spring.mybatis.model.Student; - -public interface StudentService { - public boolean insertStudent(Student student); - public Student getStudentByLogin(String userName, String password); - public Student getStudentByUserName(String userName); -} \ No newline at end of file diff --git a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentServiceImpl.java b/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentServiceImpl.java deleted file mode 100644 index 538e650482..0000000000 --- a/spring-mybatis/src/main/java/com/baeldung/spring/mybatis/service/StudentServiceImpl.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.baeldung.spring.mybatis.service; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import com.baeldung.spring.mybatis.mappers.StudentMapper; -import com.baeldung.spring.mybatis.model.Student; - -@Service("studentService") -public class StudentServiceImpl implements StudentService { - - @Autowired - private StudentMapper studentMapper; - - @Transactional - public boolean insertStudent(Student student) { - boolean result=false; - try{ - studentMapper.insertStudent(student); - result = true; - } - catch(Exception ex){ - ex.printStackTrace(); - result = false; - } - return result; - } - - public Student getStudentByLogin(String userName, String password) { - Student student = studentMapper.getStudentByUserName(userName); - return student; - } - - public Student getStudentByUserName(String userName) { - Student student = studentMapper.getStudentByUserName(userName); - return student; - } - -} diff --git a/spring-mybatis/src/main/resources/logback.xml b/spring-mybatis/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-mybatis/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/spring-mybatis/src/main/resources/mybatis-spring.xml b/spring-mybatis/src/main/resources/mybatis-spring.xml deleted file mode 100644 index 9f5bab3247..0000000000 --- a/spring-mybatis/src/main/resources/mybatis-spring.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/spring-mybatis/src/main/webapp/WEB-INF/conf/mybatis-spring.xml b/spring-mybatis/src/main/webapp/WEB-INF/conf/mybatis-spring.xml deleted file mode 100644 index c8b686358c..0000000000 --- a/spring-mybatis/src/main/webapp/WEB-INF/conf/mybatis-spring.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/spring-mybatis/src/main/webapp/WEB-INF/jsp/failure.jsp b/spring-mybatis/src/main/webapp/WEB-INF/jsp/failure.jsp deleted file mode 100644 index 66f16d4e09..0000000000 --- a/spring-mybatis/src/main/webapp/WEB-INF/jsp/failure.jsp +++ /dev/null @@ -1,36 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> - - - - - -Login Failure - - - - -
- Login     Signup -
-
-
-

Student Enrollment Login failure

-
-
-
- - Oh snap! Something is wrong. Change a few things up - and try submitting again. -
-
-
-
-
- - ">Try - again? - - \ No newline at end of file diff --git a/spring-mybatis/src/main/webapp/WEB-INF/jsp/login.jsp b/spring-mybatis/src/main/webapp/WEB-INF/jsp/login.jsp deleted file mode 100644 index 5a895bb348..0000000000 --- a/spring-mybatis/src/main/webapp/WEB-INF/jsp/login.jsp +++ /dev/null @@ -1,81 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> - - - - - - - -Student Login - - -
- Login     Signup -
- -
-
-
-

Welcome to Online Student Enrollment Application

-

Login to explore the complete features!

-
-
- -
-
- -
-
- Student Enrollment Login Form - - - - - - - - - - - - - - - -
-
- -      - -
- -
-
-
- - - - \ No newline at end of file diff --git a/spring-mybatis/src/main/webapp/WEB-INF/jsp/signup.jsp b/spring-mybatis/src/main/webapp/WEB-INF/jsp/signup.jsp deleted file mode 100644 index bc628862f3..0000000000 --- a/spring-mybatis/src/main/webapp/WEB-INF/jsp/signup.jsp +++ /dev/null @@ -1,130 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> - -<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> -<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%> -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> - - - - - -Student Signup - - - - - -
- Login     Signup -
- -
-
-
-

Welcome to Online Student Enrollment Application

-

Login to explore the complete features!

-
-
- -
-
- -
- -
${message}
-
-
- -
- -
- Student Enrollment Signup Form - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- -     - -
-
-
-
- - \ No newline at end of file diff --git a/spring-mybatis/src/main/webapp/WEB-INF/jsp/success.jsp b/spring-mybatis/src/main/webapp/WEB-INF/jsp/success.jsp deleted file mode 100644 index 7ae37bc241..0000000000 --- a/spring-mybatis/src/main/webapp/WEB-INF/jsp/success.jsp +++ /dev/null @@ -1,35 +0,0 @@ -<%@ page language="java" contentType="text/html; charset=ISO-8859-1" - pageEncoding="ISO-8859-1"%> -<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%> - - - - -Login Success - - - - -
- Login     Signup -
- -
-
-

Student Enrollment Login success

-
-
-
- - Well done! You successfully logged-into the system. - Now you can explore the complete features! -
-
-
-
-
- ">Login - as different user? - - \ No newline at end of file diff --git a/spring-mybatis/src/main/webapp/WEB-INF/lib/mysql-connector-java-5.1.40-bin.jar b/spring-mybatis/src/main/webapp/WEB-INF/lib/mysql-connector-java-5.1.40-bin.jar deleted file mode 100644 index 60bef5cfbfbecf98b7371ba19389fe792be305e0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 990927 zcma%i1CV6fwrzFUwz_QFwr$(Cy34k0ciFaW+h&*X>)iA1efQjV-ix1+8IiGLuG|^1 z#+ZA|HOG{b1OkQx000L7&@W&U2l%%a1OPCAw6GFCwYZE3?Z+qpfZTtDf&=J%g@(TR zMN|R;0APGAMgCg$uTW`z8F3L|MI{<(k;ude+f_Q`?yJ~aUNx;oi5`hLl~sk`)3Z1l zk=`NZ$+#qYDSD`DrPkwiH^zWQ zyrqvb@MC;$ktTP|3NUJZq4QW}yu-+R8m-u+>EuSo7YZ55G%#QprqUgYD|jJ@!b$3= z+v>{J73yZ5zZmaGqCJS^s48@I+K4$Su_J}@w=fZYVYt|({8bh1dCo7 zrC8HNlRyVq5mQum5xx)h2mDKN0{8oc#aJ7b6%x*RuY3BNjhz)}V6H^s2;fWCU>rEj z8k$KBz4BcnDoSIT7!XQ`(8;VMv^pH3Ebt`msSm?1izNVs4#q@)BO#L<+bl1UfL1m) z=`^KwUOSf%owtHHe~ogCsuWma$PB(p?*7@^J7+*qY?MX8YG&h3!$Ym!w$_Km&DWPq zX&d?O6_CSOh6^)^N5L*%cjrgbX!53H+_`cN@4Aa%Sg38OM0U+q*F1?yH;igW)mkmJ zZM_+{4F8E?B}WerrJqP-YqrVxrIw}#ZWa&YXle&f4Ez{xg=qeo6A^yYfk~B@Z#Jw% zV1_D4Fy$*mX0!~bE*;0w1a?k*zd&e|)L@aYV%pXq`29F)!Y?`AuEIR-djQ$ITsE@n z%7X5j0)xuAHW@!a($lVnu-JMae&kndm{k+Ua`JJI)*87bI@26VhVk~rnufk^W(_`l zB)IL+kh!2rqN7PcD)enzRZT;5RmPu9<$l+Bo|2p9j@muu{U^TvClwI?9p8?|4ld?~ z#*VcAj0gV*b?jWa+^N3exW7L5e;aS1@1jrRXm3R$>xQgwJ=seMKeA#CLu1d z=tw?FB}u(25folTOoC!eB1p8+ZM8MJ&G$Wo<6qPR08su9mI8m>%Fx#OUw`I*MtrgR z9}(8>U-$mEIFd2p930?}@W7|W9=~q@0MB2%XZ*Wxk$(;blU9;lLo{jRH}@jlzph zYZON<+QaT`4HxsxHqeut!DJ(OF42R&$>a}HpF3W5+bh~C0GFBsVaz&?@e?{*y`F9Y zeWsXBL>Ivq-`n-@ctOBSL2{oOe+Sz!qBV^V@~0wDi8fNVr` zp*YLUVfvxbZ>r5spB6DwHaw)Bm0%lfMiWHjMSob+2~QIWJ{hvpc+|2J&^*wQ*u zpRoxr0D!bFjFbLfTWVutZ1~^XSfP5Ri@b#41M1?MWDF=aA0p5nVxmrCDP;+rqYR%1 zdR+^drW0%&P~+)nf{JgRejmpqepTABJb15TZ81j#18;ye=b7$vUi@*}#pFGix?=32 z9`mpS=Q-&)=|1(!bM#NPaI*r+}lok&P$$oyxFUkW0~Ey$%1CK>Bc(sk_)CFoR?v^MLhltPEOhvdy-e@X!ki#B zo8=svkh)+?Spf=iaLKu*iVN4ZL=2(d@soC>P+KUZbM1Rlyp)Bbh){6X)9FE+%n_rB zLXsQ(GkJNG{G+dGb(277(-!&hN77D%BK{JXcF%UJhbXafVJ@8PX%tWHni8VZdTkk_ z^$FC zfEPu#u#42l7HlDB0nHHyB{s5iRxqA7IYHiTa{N~B8iDO_=F9$IOd0$FJ?~>CnG?&; zS~QmIgZrTw`iUeUZS!J02PrKHGig)?^_q<8#SLy1nju}eJ7{j|eY7{VVdUokIE7(lZjVHG>AZ zEhXz{Q0>dXMdNQRW7l2jCitlobHjeA!hS)Sk~d_C8z~?85~8T;s4-o_B?kF}qDQN1 zX6jP8Eyvkrhvc|oXV3YRLRUZxb_it~+1o<=3W6f7tfSX_%HLJ%rQo%d+eE2S^|gzP zW7e|xt&_vmIL^xFrR7FhbUMu=6I0dk&a#q-c=V>6px;MfM%s;Qmfy2%)Enat&glC= zhSYufXTFE__#)+tBJQSY$2X{2(1ySWMTdi{AYpE;LGqMus;PCU{s<2tph$^)`^C&0Wv)#qx zjydJ7d0#$ylG|#S+bS0qVFB~ixqL*NhRCtUEAUA?+rUlCy&pkKd4g*A2gFDwPw85s z^1+FU9cJil`U2~i4Q`oR{8TI!?*XQL*}5m~186T)v*mK;nTP=nR7tj|e+uh(e(c=F zmEImA3px6QMz0Bos{Qv+Ph^(^YVL13&@3RR)APt`y^9tRx<5WU)QXX7rN@zH*VV;C zbl_)ak>CL@6Nk8aigJeR_~haYJ!L~I0Gp;qhcC<^skb{p&aJHW@KD>>X!RZ$ey%NT z{g7|%hdI^Z0EAXd`DUT#XQi*EfzjCqy`T=dn-3kx-^3#bwy{0gWvA16MOcDA1$r4l z??u2rWFN&~o8yliJ+nYNU1LBy+(vq%zX{&mn=mB$=uru`mpy+=AC&X$vwKKfd4y?Y ze1-c}=tk-&i?@(8Y{w@9(|9-Bpp_ll6KQ5?MrMkMr{iY|O`giS#Y1D`3|v?OY5^0g zFiSirJ#Zwj5yrAXNZ8*8xcu|10_+kFBEPR{Vh1QW@!Fi*{_R9`&cj>$>TCa z^O}rd=UF(C_zQymGtFsy4Zhrz##uu_hQ#8Llhc$PZhJ@B)F=T&CuGE&IhfAkmO?GZ zs5DynI%?*oR)+AjNBG1wm51&4+6a`Jz-@i>IC_Az6Xmi^mjldGt=gSYNjab;1T}fL zWbeQwt$S@y^(y;HopV_wGW90y{btut_k+AJPei{wqp?7)6C^~cvL@o>yZ=xG$*73I z#a{w14Fmvy;(u2Jicb1Y#tO!ccD6Q-#(!$N$b=P}IX>i|PkU6>p2Bo-Gz|$!O>8g= zjm1WJ;(1{UWR1{(P0mYrEq16z|6?G$p0=OBA%MGnVB5LyrX=R`R01u-ZinNkS8qpC z%RfFoUSRZKR)`SANa=tTp;L)2w`~B+tK*o~k!qMx&L}P!g=EjCP0**ZS8c7v>dKAJ zN}NVB?ZWZp?Z%Wjt)4RQ6{r-1V49JT1*3g&=pt^LoR^M-n|iZbvW`HJC+Yj^Y!+ae zFcd^+f8%*e3AUP7pv4znD$ss zd6*}AE!8|6&PfO9PzX^p)!bsQIyblgiI>xe`*cW}*Hhm-O&s)?nxdB|&gorw?B=yQGQ zq{L1+ox3VyE6~S=Vd3(^iL5>&esf|_gSxz zXM+;Z(MNa0?3^m!IS@HA(jau=9xGMWgh(28<8KPLqCUUC#<@gAKfL>tCWZ^@T?JvW z*q>#mnx>4&aU}*6zJ~^lRDldS5xp2=XO^5ozlb#STjZ$V!ILrl>3#>6lFA-zFquVY z@F8?hX;637NobQT_)ajhWG00GphOcUOyL&3E!pgA90tUiP9|jl8BEG6kT zJDO&03eyCln|y1cdAo@uKR?&DPkle*l+J{)%gNs$WkE;CoQhm{XD#ia8NWG8Wa4Nf zy&uQXQ6Y0B=jv~AH*c!Ap{N0&F#ZO5;HW911*&T7UXeOY!MlNw8cXS`owH1kI^t0s z8?C+k+qc@O^n|yio7_6%r4*`(9$v=$L<>KDVD1U*uL5{IAux~c3+@G9l@#ya!Cg$> z(M-`y-@!;)-_Fk5#*|3G_^WzzH2%jmaT_CJH$__qCu4^{IgqKSZHvf{%v~pkdTdbB z*r-vi6y~*Ry?_S9B9Dk7EL~u}yH_1iJy9FpCaL%tPa7$oZf4;1Ac}ECm5!P_&@XLr zIo{zq$^AHfUbVI51F+naPlPy3f-qo$$iA)^D@zdM7Zz8)0xWHef`amhv0HTUyv_pL zH|l9mrX^eNv3|jH9>r$CUP-G3TA{zzTcNpr7ceAejVYsh_2Yp@{Y7-sMOyI3NQaKy zCCqndskSzE2$e*96-Mj1E#na6uvh4r*16nWDCs#=+u-*`yGOS*f+>SJ`sRiyZN*DL z)A_5^em-JApv$;Das9M$_Zg^^D3EX%(1CS*wd_=qcwD-Ds0kpSVdwBQ?RV{0K6D@F zRU|!JYsnWydW>9)n>77EL?R87rNa+7m)l*2r(9bN4{o!R*C@?&ahK#WBF)KZ=6**- zibgJXW=%w;KEPSb#+>ry#p4+{e@jL?W~#l`uwdxu&(}-l@jXaEk6P)V!tfWO+}7S7 zhtLioYxAk7hr%Io_n9pLf*XHN!^Pc)IG3_~#KOTNUzY{^kBr(~D?cQ4o=ZdWi zJ0`ktsEfE%IzhTfL4kxb4FQ_ME}1QgK&U}RF_!APJ)szj8i^bLOQa4$5a^Q7-F_1> zNkB6gUVv2bZx-oS$t}o6yqti4WHugqQ!0H!nt_Z&8kYt<8vLnf+D-mzM+IJ1KT`#A zx7mBqI_cpy{WEGgSg}MGffv?;BbXX#J2OWK6w9|mQVyIbB3H~S{>Q&6{XYwCbA@#R z=C3?_`BlXKZFTma;QSMWg({k=NUF#mGT>5(BK+|1$3vyKa)1~m5{$#7+ zefud9ndAMbp?)1r_ddUC;IzxjX*1rW6z<%iaL+`R&hE<&&zIYYM^TQfsAkIwg+(Abt|AG zzmD(3v{TmBe&x^{`^JQsOOR|K&e9Q$f7uF)D;V|0UGot9q^ZZ$v5t&YLzLE%?Wuh< zmhjSj@m~J=-8~hru}RAjDSFw9)Y|iE#Czi0GMk{?^oU(h8p7ORsew;io8e1=Fr_nLRIcV;t7VwG zJN@yIRBx9lGdw~RFk=}SWN$-=gU&nyv=kv?JFy#)(yC#mlBv1)G!iO9>aOU_EY z(RiPNPdgc{#E1kz?;zz)I28GB?A^uad6buOqvB|h>pv5n&CKY;8#a1j`x=K*2DK(bxlv#tDPXsQ(DNv=M5+K)1HrQWVvg=wv%^Uzewn;- zjhWkif1o5QYYx?fEK-u%Yn=8G97uPQ99VM`9cXil#vGFHi5H$51xEs-6Eeb8x#8h~ zwKP>zWZ?_ZGEoYG!Z1VcIUj7Gf%=|D}T0GLq5h& zsylrIrKq%?WV{rHS)Vlmt+q%(JhmG|)w*mPw3>)PQth-7H`i$<-eYzy5qI0%lm7F~ z2sPk1v4Be#WkHNU41Y_#dKG@bz>-CLt3{4%np5mCB=cg18BSS!ee#9fy@?3{!+d$Z zqiyjV;0)PXU_aL@zI2VoO~bwKOr?r}%xOW~ znCOOHRIVCS1F|?R$}$|J)&z9uu$+}Isgrc7`aFv(?p$ce4oGIqDC z%Y5FWsVgHjHYeF#q;V(sI#-#&E64m`L2PHV~4Pb9`O=j9$6aP)UaDejV+xDYsM6fJ=k1754MA;|$?7 z+s6YP@P&O_T*LhR3$lvevlehlyKTNHsLe_o6$DZtvSTTe!}5JP9$|2+u%jcmLLVT1 zl?5Y*2nEq!vOwu8`||vqEKtz5G5u2m{7V=7>&oA#0&CehIb@$pvNIJ9cQ8^vaIy_3 zWO$U7?qkG>-GF`sMBYv3WO)URa}K}HP}+Xr5R$>E53;?M4Tg|(#v1V{_Q!Uvql?Y# zu1+7Y>ab)?P(8B{fOSAJG-GvvasDVzo>hFh)KK_ir)#GFg2ch zjtpU?m1uaIt?`~&PN%yB_J<$bkmIv^*Z|xdFYyk5_su9m`vhW)5~T5Lgqzu&fNgmA ze)M@Wa?j{{LcfcENP6u^TxTG82(Ns08B-;NDra0_j7ir}SrZFtokBnESWa>75v1kC z%>_mRj?bh6P+Jq?n$b)$dXU8tZgB^^r4-MJlxAfFF+7BC{Z&w|h6(JEPR8Mc>h5&~ zxUW`6t>$Vnsrb`^bGd!l;|Q3lo*%3ZPpGT_Q!|ecBt4Y4m1eD^+Lyn-) zi)j&BLQ~GyJYfA5>iZeKEsa0`0Q6s-JhJ~UsQ*)Cthpiyqkl@*p0J!G%|Z>R#VUjm zbqr7lTUq!PHPRH6#wk?lkc`C8*tqOnf}UjW#7SaTfAcrs4n2C&9yqO`;}#l^ z;F8~gS`UFBkG@H`4YBgdLsy;Rqgzj17`d?x`$6PInV9L-9T=B!{F)NawU|coJm8qj zf$;T}u|qunSTk|YbaDfBY`HRI@7gvz-a=W# z1boH0^aLUhV`%Eu&!inAFphvSt2PjuDi52Av^|u-vOq$?=-YC`Z_UR;OA_&@lowNuL{;L#{1B=6E_{o-GX7AOOwJI@5DmZq02bgA=M6I1Yw4xIElJ#OT3m; z<&cH!*cyKyYh$h=Q=v+o*hz}Zh_yj~f$Ok#6PTVsZw~wAYp52#QSED=u^7u(9W~|b zrN51N3(8`*(M@7=+-$y$YJ=76-v&)srLVUw=|w!z#c~Zp_MmnYE*Lz!x!3a%I4Luz zd(-Ts8TH++SnP=L6EwNG1B>I;Ef1d*qeT94W=lmNKw(=>UX^+AK_#2UfEpfw;(aD+VDzv8!nPey3M=~@W^gdWWuHFSA;ksDYUIc#>%G_CC2m&_2yPeiW^i9rXPDxLQ zKz8w32&p*P&=(MKBO%6mAa832unmU7U7e2s+)})_O>`V^yI4S70a|Zg(i$NlMkdXoMn7eX*My_#U~;MW zOQI2z7=oCg8=eMr;dw4Lc%<*}?jmVpPcc*i^OL11j_7&vAEf9x$S?#CaDU}K$LVV! zaOxm2OnnW!4|GL{!o&=5_9OT^^nmSWOVJkqS@-eeZRZ1{Q=k< zDTuLDGaY6_CGjLA0-W8rZA~TahPT6rfrz@RhT27GppG&oh(Z5L{7DOMX&?@1Oawcf zVKp}SI?(Q^Fn}6jjo~FAx=LdvylU@BB%=%ENffa&K8L|6fqIS}swnFysUj5=NYfzZ zaUMsK(n_UXJE;HG_eE&pv`l{d5L=QlYz`V>Xa)n>M!l$^*IJX>AqX{m4P|4*J~(&I zP#If#ipH{0Fe52Lg-NN{0KtjCj@xmkJuk@=)3C_2*mOkPN`#TgG-*eH0UbZlG-NWp zZNJk{o$<+{u)ePX##!_z53(-j)O}&Le}#2ar}t4=R7^e_a3GB1HEqJqxkWFjwvg~u zZpx$AXsJb;1tuLytmdubNZ6<18@=b5KW?I>Z}4V;RvCRsoMj?f7K+*4Ran$G2C_`IGA(v;Dl?=DW~mZja>QqzB?6e2{` zFoFncZH>*Ob8vr8qvLAZd7Yj+ewd)2@c?}<7)7}W2!MBFo<&^Wa!WC+skgFk)Pe?z z8^eYaNLH|K42elE26yG`ev~y|T#E1_tslI(OYq~l=toiIPyCZh#rt+f%sgmsn4oVD zAzVTyhtc;CY8*)H!iq>AA_ZZ`^l5Wd)7bAA{-z<;nf$99{9H2%fmG+p^(wg;ITuw< zB&Tz$(KE4=OiS!1Ql8~USX7#)l0KoaXJfryKs`%#_TBP!c;+hKlCxq1)3nV;vDE_{MARwqfJTAGZARR=#)<6ri zG?s6myag4(2vNsX(c?|2qRC6mMe_K*8GfpXhqt-ui>Pz!D^UP~-wD{2r;qJpQ(M=D z_sh|it`CqMw(d}Dw-R(@ipdRN_!yOr(G6laC6y8?qx|?_Y#@mt4J?QvgM+=2LD+y7 zGDnrFdONltE)*3cRRkHTu~v9r07`HqK|a+;GcM^o*4q&ZYSr!5(ykkh?Xa7o0F^1` zzyQ57f4m%{gR-^)=dA_)Qf#AiN6c9gJO%3SUjfJM`YRy0s2WUCntn`DYaoP@q^}|- zk%3Wxs=q9squ8AX=S?|h(^?8r^PMKpi(N5n4 zRA>Id&+Pnhg&TD4z7Z$ag+fDIxzF@^?t$aN+ytyFKvHp+hmKN@b$i-#gp@~gFhSin z`6-XE^9^vdli?R9d01U!rDhiTiH;McP*#Zu=LXwy8xjd~m`!BaSB4b`9VPxMaH?ox z!%M7xnG4rj3Ny>r&nGV0c^#IqSi06F8d;r-K8Ddy*@!HpxrV{#r=Te-a*Do0PG~xe zw+Fy@X7xcji9Z^%;u0Qbt+cP{AoHMbCM`OGEYPIwTj|y5kBs~b2?*b;GsgB#;ODYN zo>0Gtn59Q@=ZA`e)R-yC!5Kn!`Y8|?(S!`Wrw$SN zo9tz&$Yh!cX4ECRD_#cex0ebdN_(Vh$Ry2Xd$}HXCc~!UH4o?W&w*gGc)R6L+tv{a z&SfKKW@C4IpUL_M7WHIerPt6{d&M5nC$&M+cAv6sMlYEeEB**S8Yc>L!74v{uO0(| z!DPtJUJT3-yf{|2-!Br{TJw-h1Q*|I`wmMTT8hefCxd#1;9BT|O4(4aR$4wF5ecJ2+T3*VDbvdyg+%lntUwYRU!>SI?h&6@Q&ld> zN|WEc*89u(plt@SW901y5^Lmb1meJeUxnuZS7S`H`r)U5WUDDW&{X0EPVD%d)5o=P zbwJs(TiIFrnDbNK`{_zr6yZ}|TA=c+sQCqplw_VcUvT?tOZX~d`$uofaqu7)Bqtt1TI1gL2&Qnfe zmg$%DYYZC+4TikNjNX|zaFRyqh^Bi-vgKWdptuQOWy9c+MSEcQcS~XDXdba#!7#tx z!Eb|8z?hFYtley0W2Rj2X6vFk>5+s!Q>H+Xvbnt7Y7bbvXl7n%1R9JqcMkkDev|^G>i9$>F2$x7_D1-yDub z14iEqbf|htAM7SQ*vQd}dwNP=aXB+KE-T=RCE>BS`tfOXtt(wg{k5%yr zqA4>E_QQu)JTNXKU#I`R(CI=pmZj?(&#YxXpWcD)W7 zb<%#js{J%vLlrQ^A^$+h7~25ZhD-W3Y5!#yvIPB@9sg5Hh@`>9 z+kf<2wn%1ey}v5X>M!FF!TS5IFfs0X%gM=-hAkTV+e2NWlyov~530GLi zRN1=ZDVBX4Kl}XnK+DYMdx9)JuovlD0cOew-?Q8=Y>4Z2 z{{_3_7i3%DF5gG&D>m^<18^j=?GR|LB&9(+f4{}Wnw2(Zf%?(+U=d{S?JUStH6rfd zhDN8>)v{>GE;Zw%U3-O$Q#t>o#HY((o!(WeO{$72LD$&8YM^puv#eX76|D}+@z!U!i!ZG?DvyRBq1|QXq!KcMG#eMKN7yWU#Jvi3!lKI6=Io@0oPV7?p>9E7a{y=zfkI-2aoFf74n3yKRTt(5qyvf~ z4_mi<9LdhtIrdb}eWY@2Hn|!eRVqI?y#Y+RxJ+w61k5>n6X7r!GP&RruGAhfTAP=C z@MsbDH0dzozE|4G-ft`WaH>q4qP@D>NFr3`a=Atv1{j=#ZZ;{LsQBGGP+{#m4|XaA zf9J7eHPoi+f7R~XrLWTL6@Q|0SX;M@GgOgwexa2;(Yire%nCX5jDWq9OyB?gQCM9I zLypc^mO#W4GT2OZ?v65BpJ#~S2ftBL7Gc5&kLZ(YYcJb4V<`BPdlpp49dY29YRXm5GLmRz&iYtMvwIOV7syi z6FjdMpG~{mX;sta51ydeyHvHqO~?`mpF|z_L}DBhK}6{XDwG&hAXK=FB8&7IRFEq_ zg(=pIDKYU2bsXJ5#bwE; z9V>dY^33ASofM)!{9`YwvE|G;37!*m^y)P)4bs==DnOH!6K-JtD&=0~Q6&n#PDUxe z^Wi3<^<6h8PA0D~B>f6La;OUVdK=8$U~VyBEMpwDw6PA z?JQDD(^gelqQCGU*$`yWu{cdrp23bUe~$C3V1~|WBNEN3E3$57YT8F}r7WVHzwlu) zmz7`mwU)N#B1WFF8>+Tp2PIP%Yq?6TTBjXUXcL)tf$7|LV$PnI{YYAAR_yo7=9wh1 z(yx8P#;9sRC*MTex)EoCEX51H=En#K4bdJbue~9IjzOmWE+##O;&O~VSRKP4J^pTD z1UAciB5;s##C6QRK5`#45LyL8fK$17eE5!1t0mUKYF2LBzEgvz8@r@s1A{8}XL#8> ztCP726T_SfQcgg1!@9r`eRTGl`^Z`ztSF%#S1Dkmg$>wO2$Q0urJjRPR@YMUrG;?Bhrx*FTLW zfq7<*pBnCP1ekGQa0NMpvPF%02;Xrrz}<-sV|%JagZjVs`{CS|D(Cw9G+>@iUl3ROzag$*YxOUPTgtBLA^SiE zqLv5_V7aAFTIZxoWw!NXK=;JbF)N7=^CVW*rp=lZrkvk>O!o^-BvJcpMr*iiuCir_ ztnPDVtj!&9b00irUv&XcmZD0c_^G}VXRVP~Z6O>oB;q%;zOW+WZ6&<#g7 zZYD8^*ug@u4>}`2gmwhnbO1+n^gP(W3?8YqV4j&Y3vt`KTITFfei~F`KaDNQA**=nSGC%p14VeQf!SB&pU!R6Lg4d zU7p%Bo|K;g8+>3B6?b9=GjU0-u0;E4$Xc(+ufog~ds6A=w_;;rd!UnlSZ&o{txS1p z1wZp+L|BAKKciwRAb^X7En-W6L?09c0`6L_m#7FBnb>MK6Afc9BtYI|FeQ{Rz8gH4 zQ}y@kX=#vgTtco<*%{T^Zy;%Bu}h0b;Jct%3u7A%zw%%6tajFROspGDWmc){Xet`I zd2q%don6}=84#f0qTJYbbeH;m`ak?8f;j+@iv|7rnB40E&LLg9GrL`3KUr_h&M=zN z(}h9?na>ugdXGd1>96lh!880#VLB;c9)~5+j8po&S!MHyIWInppH4sno&!S_fun8A z(PE5NV;w9H#YX^f-6d4Gh;tbYIDDJmx}s8P^5Ag|W95X>%xJ(nXTet%p1yUmpxiMaK#1S$w zv>iorgh`T`!y1!c_tIX+om)ev^#S$QB(Ji8vt9J%^e6pNX@8&O|8T_oqtErHK=YO# z`@{RiZOBQxL~M;jRtN+Cn}1h;3e`$tUO1L7G0!QM;UrP%JTEg*%4}+IgKRDO@aU0TJ8DpEZL4Z#1uND4OgTHG*$=YM=B?N zw3lfN3IBeVF_|=tI|E1I(Q3!h92rWd*m1`$>CL@ib~K1!4VDnU$GF|RM$)K0t^cYZ z=$DlR3+SJ&v;V<_`QB-HG4>LDCs5`gSfNJa;z2SqGKNlYiZMBFZ=bj-B*3Z)dTE$GK zMJ3V>=d{I=sSF$r;xfG-!7lGhWhFs4#MZ_?In7^|k&RM+(Z+4<$FVwQMhZKyCcmlW zHu?blb(81YvlJ1&Hu&vJh7mS7PO>$RW^udU{U zf~PwmfB-9Y*dbaA%g2)xNg}_+cmoTT3j`YQh1O8hpAV^>=B{t2LI1I2BSUJr#l%`9*1I z$_kE^g1N|xeeSLe?WL*^`+@UXeM*k4l8*|LWa?>}jv;zG_ZJpuFd0-GSvFyl8p8SA z%e0}zZtqA#qN*@sc1s}paVt=WJn8AQC|fKIq{Xmv9OVhx)8pI| z^vj+0WUXK#4W0*09ghSHgvB!jl|9$bU3JYR`=2U$D*iojmyI4ohMczdgx_4_O#=)3 zT1nrs0^txu)0@R>k;NRc2rSSIR&7{)*iuJpWo)LKT7QtNM3!uPa?yW+Ye|C^&8)o% zIKqOa+2h1lAM>^~f4*`+?nQPNimwXB46iU3=a@n-3IJtxGHrbN~9Wm(Wu>?tD(B4RN@3(MM<#cHmG(8J;Y~MEJxTLa)Ry=y)Ea2Lh zwwkAt%%C?8d@wMVTcJgI^L$qV`Zg#2>Gtxl3%zWM9D>*HKup^|dq8O{RX!XC+Ck5Y zRrD@40Q7MLGd-E}&P zBn$D5Oj!eiAh!YX$N>nO z)NUV)h}WkH=)3K9M;Og?D&{Z}%(nYdqG{}8QghQA+Fu#vY!p*C_?0%#zQn^H!(jhY z8~+=lMDz`vY#rQ*=>Mcvq=K~VAJjTyvp0a2hN>^BKTQ_LfmP%7k139H!lc76Zqh|K1%fFpjB2b0Ao2dN?uJp1QJPyVa%jZMnw~EnLl_+jk4^ z%-44e78kR6S8t(*LlC{+HclV{_L&IY13SX>IS^9kjz1{`5BJ6@rNDHkF4U-61`hpn zDnMekz->|vVvQ8~Aq#hQM~hb6_y-5>@OcUxvOB7WhMjY7UH`VOjAW;=+DYb}BrbVY zmasRD>_ADn81uPN>SPu}b4`|sfD2Omb~3k|E7EEHm~d|03R1ibF=we92kB=nm59f& zUSCg9Ff}kPrX4qzz*rxPK+plN>ix7xc&_lA=)wKW)JZ-T1sEr^-Zkv3l8I;7QOh_+ zTGvQ4=#c_4bkAos{jW`I7w>}x$;zUlev@UMi+AP}n#vc8rq8^->W3*YQLKLD7NOO$ zjxMY#!^|v+%q&>Tm&1<;;U`qC*(L~brD4F{DLqx)jp%Bgl&V{ZM(=yrhcU!Oa23fX zT-2NOKE$$Xb86~Y)Ju55iv5*d>=EJH=YsSU(iU%PXVSmo9ekVzmI zhVV%b^jqWg7oWITCtJCWxrASbdtLX8`4hz*w|x$&?xk9bmnMeK*l;)=j<bUaAXiL_?mfYkDx;(T93EW?Ii$0&r=_p%~XzG zvhaw+ueVYQYU|yOCT&CqEO(JNJs!bG>Qt{nb|RgEBC&sQXdIlNzC<_JFalk#pEozxGCFpHYhe!nN_)8X@E7kO&K8>gyGp`xo!Lq?ZIge*|Cd){m8GyE1uC!1rLj^x;TD1k2y=N+AEC zBNdP_s2HW3QhdaVE!su|E)e?Mg7-nI64$EUgeYm$=jJ8Xy>=5$Q8pa1am_pyn61Kd zc`Yv-=g6WmVN2}<2FkRGw$VK_eRPmroF@u3IwFb~hTv7_S%bIW>46ta|3c znNRlV0Xh3dR@CrNxdiOU?@QKPJ=rB{=7jik0CJwlK4O!&n9rqnmr030k|Wze@zh%?>I^y-`XNkGA0uCIF@jk}LqcXjgee9O?IjATnv4AB=(P?ldrRFl>7$6wjUx4q7qh$(k@ zLSogvY#7%-XVW?J!xw3y(H^AUx^U&jq`{ejs6w9%>w5m=mv9EH*kv7IQgr5eZQQb6 z?s=ypQT2KP(RlYG@S!c>{Ki?P9#qMB6^9=h;+p@GRis- z+M-5jh{gMj?Hv^*jIKZ&A*;67c!{r^ub4xUG}$iFW77?c5f)4?;ufIHp6TZUg|ed( z)IQ`nykqkE1NhnyAZ!f&Jo;(u02dxrH`*DhADQgRg2Esp2#54D$^Dj@F^ieAdUjDC>3e><_OzAXzT9e*g>$`@XS}5wg;_fntg&Bq9ZIc6b;y z2>DJp0`20Ne>=FsDc7b+Glpl)|xv0O*pHu-f8(r zK^GZ5gH!G^J2u5;&|HA3w~C>29#i`=@t%#_P-4W%uGF!w(J@Y{)=RkObmLpIS9n`Q z_uKPDEe1gw_Ro692#Rc^h!P7ZT6YXSxqTph&2Oyi;H zlV)zA)T6?P~ISYv?kn7+C3sk~|i8UK26=fJ9k`rt(=f{TGl zA6p91+5DDVLsCDNRWc&bW2jq`^UN0?qWlV5nwZqLBv%Q42c&%K-~8PSfj1@eBZrJD zZ)rYGBm}Es7@TnsW%;1XSJ{Ff%E%ux$gk+kZTGeKzkTsvhcf>$w~qC9I?K%5z}Ug& zYeMPYCfNU2sLY;0C;a7g>G&FV7W%&z{yEDo?QG>_u4HVZZ{s9r`_CC@IR{%8bEAK@ zt23}mQ(MJt6$Z3RU15?{KZ(86WUQ= zo?ak*rRv$WCb?=xky8_T(jk5I_!08q*C;#pn1Pd|y{w$hBkR4NVLSC)dG+Xhl;Qro zHPr>aE%PSbN8(1|1%tnTIvuD^KOVZ1fG!ihgHZEYlJf-$%1siVPVG0Z;IJX3c11x# z+@))p_BPzB9;DxHh_azO9Tc0Y!NoT|Fw{>!MNa)2o?^n_!neL7^ocTiL4RMmhVWA8 zE4EV^C|33o>0@zgc>0yXOM364Bd0qJ--E`S_8xb=JNEktva@X0(%|5XVzTrp$gd&m zL_@@*_iNCoW(e#Rh3t{iZ24$8%XaxAAa*j9dH7RtnAcjWMa6HeG4+}}Z#yYBAU@Ps z#*=ie=FP_H6S4>wq(QuowFr7jX`0EYH-*{2yiaCex6^Wk{Bp^Tbz~}T(b;Kxt=73&s-+6c8lzTU6rxshYd({ zLzT<@9=h3cGH>Bm@#XI6)I=+@0VK zjk~+MHtrDIyMZ7<8+RvoaJR-GSRlC5xDD_9X1;rCX6}z$`_%b&s!r85 zS?!4(lZEs~aFLvXyLXEVPo)T|b$S=q9eD(*j(y~V)L#>7U@P86-3++&}17uY<^H&9L4GhW#D4Y6L1SEX|=DKH2uFB)o= zmQZ(wmPV5DI({Xek)jhPz3IrjFK%4&qT_SA#~&Hffpd9& z3YH2P>cFp(jQn8iIO6GZy+_5t(=emJPrYQ1DuZ81=Fe#!b^47!j~W0^|8%Ljb4wDn znukFCT09caAN8czvsKwNwqRTPyDw*^hV#(|(sRoxwC7;3+_!bvK_vefF2BK)j`5TA zD|!~KuPZ|{oQ4-434eWcAYJgMx9_AzK*;}xFj^h8apZ7HdlRBV+0NKmd&20uXSB;z zSF3GpKj6M2(G4VY>`bM_Ob+qC?ro(aw_yKU#Jfc#i+?*%hw{yq$;4zAMvnp2;E z6|PSdI%ax>NN#-fIIK1f{KqS^|r z%TGmEeIUv8A553m@7_R8!hA6tWPCg4Ascohk=Ad&>=)v$5%9f2=rBZLo1t^wGgY^} z@FzGbS1r}YylYFyI9tK zm-uTFFfOM!!5`|a#p?Nic$6X;BnkD$=^2G$|ISKMb9YeF7x z5=41M-O7&?$B*znEZ$5QW5}sti+3mp4~Q%y2FA`+2g?3dWukj4A6I|`45M-vro+Qb zT#KJ#;M6NOmFYh_cu`i5omCS&Wr>%-3M}T!I~$8ftZ0j+PIcY2sL*o8rvzl+wSP}d z+MQZ%3_?d;^uqV#Y78^_T{KKz^#?bnVh40dWgoAEqHg#1M@?Z{tAa?`MfEjyQ?~HU zNWIpl^!5-3NQ{@l3=`_Fl=&t%-QNx|UdI~Clj3c_aL~uheIs1yy>nVJ3hO~u=C85X z;U?67Bj1~Ih>}a{hk%OS?0mjBrA~YIsp!aPN4`)qr@hDs%PfnA<{W>5!J#7!S%JDO}jc^waH9 zt%3^vbet-VbOIyzVoO6Ck_NMRNpqA3`B7w1XJxWSm+4rGIa~2lEA3nC`6v^4Cfdoa zyQ);;+~e_YPBhc+85abqvdtY@wK0wEvA-q^%mrwsl??8LXpMWJ#=bGe%M-;@bEi51 zB%=NKHl*_lCmuUw0yS)dtMmdZBe20({#TPZ1<8A6T9XP+H)<1z)f>KVs8z~y91N=0 zUMeGE!G>YVlkdSd&KM~veyXxfJD#XyVaA)^8?ISlVSDdLNAAQBcijd26-d)5CK(qC zNPt$rtmNc}|JGptf8!hc|GzNB*4*^}J)FmbZc>K&HTaG}{@*B8{>L|xuC7k5sus?# zlGWE({J)3u03BZytp6F*o}Zxk+@sb@F{VgZEk#fem#6FR|t@uEyy>aM^$CFL9~mit-B^oHp2Wc!DA~X2b*if*1fi(4vxuBWqehW zQ*D(g`f5fnvR{goBUA1R4GMw5d1`TxRONX(NO)(64RLv+?65OWBbW-r*J>#^uMeqC z;1PeW+GjIIX;pizV6^8{fO3U8w3zqze;)Fkgm<%0qqX?2mfRPav8;4%UbJjsSC!no z)J^<8Q%0BHAc{#qxq{r`@I*1x#XAtU@S(KfzcBEc#r~nP#=Twe5KbJ0Cz~|(g)e+0Kf4sDd>}) zr0f)`AY0tc_F=c3<&}DheilvE_=L{`lOBY<+Iqx47&PR%d2Thkar|gZ5mV_kSI!9sVYTLgQCeE}Eg!p&fB1+K=oaY`sFYu%9YwYUh=z^lZR=As|r`-jVSSlM{bANZyMA zfeyoQk}zQvCvRKhMp){V*aLrfmukJATa>Pb$_jTps)ia@OeP+fIyu*wTL(- zRTBA8(W6N@4*5RA@O|$`zWq$OIl1+}7>2(?;*p8+-3~Z72dq=5M7J`xOGrkJas-Gu!Nns*bT{z9S+nN7(!MjQTa4@_WM66>-lI>!KGr9S#w) z0u@f6NKtd<+7Olx2FIqg6FfAD^#R8}q5y>5%qC5M^krbbIfxQ%i*Lz2wBkOQcW199 z6itxi&%3unxgQpCvB^chg%4Y~0N%q%iV^`?Cif3%Qqg`K!26jrtj;v5W73|VM%JVh zWz^v5XG*`@pFz}66}A`v6oFGmL0Mvjr!2$*F~ql}{T{QuT)ohDRO8A+nu$_5quHmZX_ECu^HO(YbpJ$xFoArZ7O?|8H`tg5 zKLl}b$cnmmDv`L5 zKS(YX8@sUNsxT@$H%%CoAFk&XS%=j+YbO*l$7Pe8eyv4%awL2oxZsk6g8Y*~56xhO zjYrnGIBW$XD3L5;H!VVs7x$HmE}`!wYZv*`&<3QxOL`J(s2ktXd(73#Hqu_)1fA~n zv<8!g(T%6o^&Cy4p{W1UQS-aTRUk!+y~Y~;{Z=Z1o$vmCkv#qfKJY^5toSQ@MX&Jj z|DVD4nh-l%yxu4lZvO>j7`Q_lcMq)`08cw^ZK zw}UtpYbs7f#%ea&`bf_sTJ*>$jRkgC?eh@cVoN=x7w@01*jI3%Rr=I3>O62pbjO)g zXGBMUuuiGeG77ygrgGTy#YZ#aGqErNGF+5=A}8r6Y!549@k?ObOf&rIiu;~uz$<{K z)u=EB5pQ!@-Ihjti zcPO4uyxr4`e6E^bJU>nH;d{mC5&>vgEigz#LCF0s;gwWvT!Zw*4yU2LieXLpk7|3V zm)v>N-=@E${iOW{{cTgDcI2QI%3#5}s_y6irEc*bY5b#|J-R$@>@KmG(Nu;zgTyHF<2Aniy~X`k?_f~*$>)8Yt$*qA05))+SE6$zBM-8+B7>3+S(vQi7(vXMTsx|eF)BR zx4X(nz#!7UaDyLu4o}WFLFLxOyA+u35bqs4hFM@vzYCe%>_!{EATq(dh6=;>Wy|IG zg99j;nPj`zezeB~tmrSJ+#Bq}G+VZB43=$q_~rDVb~LR^A04m|?F^QIaNjyP{;+(3 zxwr=}JY7$gIUv-p=P zSF2V<2~G-7iBTHb8rt>`1aS|g4B8e7S9f72G_4>0EK?tg@^z&>g96R#e9sZ8Y=9PIH>OpW>E4d)oQ)K)yh5?nbG(5t`b;{`;udNhodv;rlu?s z91$X>Wk{f9s5L8Z$P-=I#!x+!q7}Px>4Up{HFhW|>V$GX^$#0-uc|B(QHTqN_KKn0 ztFZ=!1mh-8&-u#`Npu^dge%vuAU>$DCWn~d9w~`_L&U>HD>iz7pv;;Y z;({AnZ2S)KgR=7%#1AUY&TsWHwSe6cDAX#>9}y!|oeA?u6|pg?XK>W^{-}eCR9Le@ zK7+14qFAb8Y3zH~>wDL)9{p(lR@H9HrxBV><>V;3*52L%AO*sb0OK?^Lcm7A99Ugi zl@y37qbmXv1LK1mA`2t|q>?Zd028$h8&FP0R}3}{AXR{=f>XgDG~i$&h!Hpl29W>< zlRyH%LC7}Mu$-zO@CtAzbCEPFqKW_v06zk_z_T){I6wse7i3mmHK^bXa8yQD3g!w< zh2R3{WK>asOn@*Mlq6hgI(bzFU?m_+1cnTdl!;EnrJ|EnjV&MqIsh7z8bS*20F?k6 zDqy*ct|ZJBtO;odFW>@X$-trjl~guNK$;{FHjoAaVh0u{f>40PU=Tg9I0-}qEQWyi zfL4hhB%l=-L=Ch`0^tL#ARunwZXyT+xC;g`19y`^WWZerNC|G!T<&` zFiC)c1gsxmAP=Jg7>L0N0S2-#3xI(X>>t2D5rzja5QU`x41h2VfPo}z4q%`F;{q6n z!x{kwaxfq8JOo4vTu1^50v8}41Rzf$h!V&H2H^mCl0Y0lPNdycF&GnIRTfqWSe1e~ z09F-Y$ADE)7%5;C2+IOEe6c|QdM1GgfSwQ#5AY@tgb5@DF3Z3=0IPB^f556V>6bvT=o+iPCfTs{RCiqzt_5t880*e6n%fO@o{t~c3fWJJ<5PS`WBLj01 z;dH&?pg(2s8r2sendFa6F(91kMFqPlTfb*THZm z;Cd3A6u1t73j&2-n=U|MFq{(jLcPBZc#?oA0iNVxlYl2N7z^MjqTnSF&H(HJ!-;`i zNpODP>;D>opXFfWfG1H{4xqc~m&)sblLAY;n*6JYy_)Q+Nr9zQ$$;K~{a0&|aZO5A zQWXL^g8u;U64gb(5dchJ7yu7E8&<#!aHlF|0Itd$NU3^)TOsNas#w5&03KvEw15n7 z1t_HfcE}t^syZDjT?(T;`H-W?8sqHw51R|%NCg?niVFX?n`yc7hl@J;*9i3$o}$L+ ztSc=<9Ne=StQ#$ix_5|~uI4|>{3h1lOOQa=oC+zk!G>4@E1Ye4apSzjYs1!zGmZFN zH+t#=g{?gb`;v`+0ZsjPZhM%Zx|-5TALDiBl~0Mo>Y+Q|GpQ+hq@4T#8@-obyI8_` zskj$CnqAyyW0Nz_jI&t?@r?foyFV6AcjE8Iw~XSySS%tF9wz=0-~5?I{E0b3R9)MB>;cs`PjIOE}ts9gC^zZ zmR^;dM63P|Ns+?1^;RHZs|2|*Jcny3BFhIYxr(6;R3C8#sI6I&NF>Vic=dw!Vd#+P zg7v$aft3&rM4E;>%JRE^$&U;7W;mt4ArtblN+GVw#xYu^2z)GrQKjRX)@Z_&n;!%8 z9lZGZZ1gMFtU(sMA!Tk{US?}PPPkTr0;sg-ngukq!6ADNJj&@3k89yAd0$5QjvZpc zio^AE-^r9l7~th^<}T3MmCBkL#HQI+_8eLAo1_|gUM34x@3<+KYcCRD=+fY8dq=OE z{2RkLR~smnrr7*A(*7|*v`m$3>t~JAH${vLE{BoX^TD~X%5PPU&)XTxW&2$2g9=%C zYHokv&?3bgEiJBQB!Q-pG$M(|A)kaJ)Us5~-s`1(Q{aQaFsr{~|#=zWK9Ja{H1_W5{vN%pqv(>l&Y%u;DCBjfT_ z6-iKfs`zp=Oe>UGsWZ1))^D+K5{*p1N?9r*yRb;D+#JS;FSWSlZ~gZqJFpsXEePo_ zTZ6RouizxqL+q<_=3V83HBXWTnkEADYBRH%PH#Z{(lL(nrUMGD;)2=svH^9Grn1Ku z(HZY)9_~T{oceeT4l#-PdAYD7r_;h8H_}V5d)PArKf5O8)gKO+3BlIJ@qLJiuxS$O z@u7zqSlqflgOkbSh71w|RB>0gB&`n1ZxjR{j6)!Fg=;E{}fRmaOv+c{4f67w|U4bCSgGa$V<_xt=0 zrxMlkr+ZW!Nvfo%3PYlDu&Z(8oZjVqSxA}pw2I0~7)AezIe~54<&@TWBYrwn>?~!i=(qBi0<7zVE)zXLF=|-@)(*`V6xDGD}#*%w4)=v`TdP z7*Qaw9$eJ<(LH+)^3v2F`{BiRDzoXzvkOKn{*YfoiomNGp>d8= zD-t982cN?y>u%n-8beR4{}4k0GP#-L$jWY;ga#`htB4Cnutj2J|Mj`-;V-yt*kc(F z`9tWH;kqj*=(_eT)f~~l$DVQyVItuMTh2S`IvE9=@Apl^+>nCIaX|WCCtFl1J-T0& zTzd&BI?C&ofpt9byWcy|)!J#@bGqhN_I4=&uB_whMCX*^aP8s8rcZbaJtCYzWtk)> zVP=MIXh#<1jeQ(AaVJ%+OoXV3e2bEiJg?(*roGf`4H!3mTBe0oQl=$=_7*E4PhZS*0LMHb!4DWf2K$^r3t%UHc;I2ijGEDa?ZI z&Q|~KsxbU|Lo9!0tf3Ju&89AqN8TvKByLq{mK-}RdZ$db_1(oPS^!H&mDHW%(rz__ zZRRre1JO}Z0@haxuOfa0iukjLlF)0&J~ke~%5*vfeIIUKC1QtRXdqtP--~Gt40;h< zwH+{?AeYAbEO#t?!j>`c%jk4B!t=2RRxwJs|DD`4Af-L2 zp&=*nFWdDpHb{7pm2I3oo!kk{j~(X%sr;#S$5}i%Gu2u!a#WK9fzL|nS+~7>CqgSf z@luzq>dpqR|0YwaoN%PAU*tEXfuEsKeb?Lfh8fvg(-^K_YcpR0={l&EaLJFN>DJP! zKMTeO;vpFrRa}4Hh?V(ek*&iTfs!F7o!FBu-#qV}jM)~MmU-$DAtw+f^sLXi z?1I~j9ijC~m+yKd$2 z6BaNFma3l2snLKqkhfA+Gc~Y_r7m=a5ZYVq%(H|}D9ATq#ibn_{Cdl6scK+xj}TE* zJa)QHp4TV4A_lyZy`F?e64Z|O_3b;d?yiV^EgASTRbf*<7z@RU#6*~4gUv7p)1p{( zu3K^9#&V!LFjcxgTaQJ6c~-JKLeBN}Dy6Z{C*BMOm*i>tm5CRbxan1VZD+^L3BtR) zdyr=-dAD~z_D%E0PBKnOZrK!8w{r)NcJoNh@siDHXk|swW!np>HSKrTNn@@XyN>fNzD;rFvCv3JUb%69u1zQGc}G zt$4s@hV}V3xkcS#w>ZcOFU+($1%UM$tsu7o3MSMaLN`-5J^#8J;@P4(V}cVhBnRVz z0p!r~IbL0dWSoSg$uybOcL7^ZAug>0#2F;EBJ|c9=WeJJGTd}m*a0?$o?NqRvm#p> zrmh<1ibTbCaaxSQT-$xDN(0BRU!4p06v6X^fuz0FE6e@4vuf7dO^;!{-6g|mt`P4i z*XZuz?2pCV&0(nvuHa5T3iRGD<7o-Y%tbn270Q{%d@flUzFydELULPa) z`O#L^b>R3XFzzD9@UdxLB$i;gfo^Wbx)WQWLxe_Q269152+0&w@+N#gu za*KzR?HUrLsdz27HYa$iB;qElbMJiEvQ0dd8(PKTnd{H`dRL@Zu&nN;pMWUl5a75y zhJKE3oXT)2v}LBIVWz;#?XM9;B0eiBf63z``mHx%Fcy}aXet~)75?7tc;MSXJ(Xd~ zOyZY&$8}fN+b`vt+@OxQn0l;Dpq*ltS&5`CONl<3)&KqlLa%!&)tg6LA1{ItxhV!xy!zE_G$ilRcDNn`{A4Xl zHW=Zif8ub@RF50N{EARiD$~OH%9m@*<4`7d7cw%e)9CBWg|agzY>dQC9RDP$vq~7n z!J;?GT~tphX3B5VkS6Yzm&YsVdjTwkP3$fTF1So+ z8-)jO08b^axBlmT+&206Wt zEl4sE@OfTG%%iVz+Sx>t7f)RcP?R$*u-z1A{1f`7*=*}m(mfS)_nhmQviiaslvB`T zZp*zOyht|pR$kU7V969E>~R8T`CZz`LWqM=fP99@KMz;4SR&;=5#|kV=(aADKR}&wUwjy|F%+?V&|-qsH+Jpd`Oz zz-CXFQNNvYABS6_Dez^x+v+x&sAhb&PTU-_)f?TnG?26HDySy33pHt&P@WO!?Ozyg zt;xk(CUYWj51z73z9t+qLfA2wJ-)}$)Lj1sO{HI54_Yb9S1Wnbv9tJAJcchUG6@J( z*!+Wri((qCDec|0u);gOj*?g{RPzpHemg-|%eYhdMM_YX3Adr&&R}ysZv5W~kB^Fe zI6sDOpYLpb zxBZbWFQpza&u2~eb}KUM{PHb%V6&k)nc4s~PsK+Gx`%#;VJpkC(sy$((=mav{Mo|K zj+*qkM0>ZNovEUyG@PQ&4;*47#%e6jH8w6ml}toOGL6l#j9)e2>!nX>O@x0wZOoi5x1E93Yx@t+3@#W>r5a}D+2^4= z!ctYx-2O*OmRs?IyMWileo=Gq$5e|}XtjC-q5GWtxzY{i7P~CbnfAl(uWw z^)U8(U#KH5R>W6UizMsHQlwDeqqEb-hD+R>5jr5?gx~~o%b-I zUSq?0>8DPQDpuL9l`p;HMX3<*Q?B$dcz|+Stpt^L1f$oO`2dqjxX>rNZ)87S8|q$F zi03wFtcSoTdPtRQ(|DQUuJEieZ*pI+k%y7Pv}^mDMJw!eQ;v^Wx`>7~QLBsVuN8s> zbh$tBE$7@*UjUu%)(4e;CRx8_u)@)cJ5{38v8RWz+^$V0JgtnCH*4o^?>IT;@sZDo z(TT&P7IaUhY}s|qO^?!WtlA$E1D0<+8he2Q3!wz!|YpE~h^Ys>zXO0s)`rPBNy!J6&R?LLIUXIqfnYBI< zKE}N#*(hcq_qa2DnP|k51eZL7Gt&X>P_}!YV16qRS0z@eNU68t)Fw|qkoen{SJN1$ z{m?I`Z8lSe6o1H!AeRO0|CLNY$UjdplZvf3k&--~m)u9rGGGE06}QT~j`1PYC(M5Q zWYi9UQ`k9{coa5sotUf(?>(+P533Yc_8$-*ZJWw!Xj5@FE+yo#fc5eAwbaN41u_{v z-39hAsFEvn>1JR5N|A8T>zLNj!|mXExOg_Ex)IY4HDhl$Bpm%xpn}y7i`Fa zUh?0J5+3^V`fM^K~g| z*vD_@^DFnGXBlw)l*BUA9b?iT{d+QRefgfSNuu-U4_6H=Q7B+vjZ4QV2q2*7f zHYHm&dvMp!JQJp=Z%MhN;!C)GehH^uxq^>&REB+Tnl6hQpto3j))-K2p^wFUOaUm4 zgSE+wQsx1E-al{aptPU3{;*tE6?uNq#mNqNW{IY-<+l7jt$R`6i7a8KVtVdPQbyx~!m{~&a7x?BTKEJ4 zuM^z2AZ*e2yOz^lLbuIBrD*$D$iVczNpdr$8aF0*=F|?_Sp8^Gye^QhB*@pbN=U{g z9yG$z9G=siuDU6QCn%NDcZ}iFoJOP)oY4AwYpSlxldW8T&_w92HY~ST*}N03mh{lc z*xdLI+Al+M70v(Y-za)Z-7ZhxIOf()={%U&%)1+~nbADE^P61Or`)niXs-t0*gb4#rXTeqClr!p#z~GG!(>{3hRC z7T#sGWy#eQr@X~RO;)tb?t5|D^9d?m|A3F9Nz_GAle@>{uZtnc1M|tJ_Nf(jnr_X& zu3X6;6gJ$jvz4b3>$v10y^KX zP|1udem|E-z$G%20DaC|$!=ePt1^R4_*9NhNzSU`(!b)eMgz>^-pt(JallH3>5?kw2D#7IYRfFECC=qT^K{JlLK*3*_)JNIou<_% zuC-_Gv&_HH*nOoaUk7VEl2dWO{GKtEzVvF`R=<~@N)tlqIvCm zXXpI)d^&0BGDd(zqY}sQkk-;YID$&1=PGL@@$LTIkR$ZUtB8WoposQmU0dk496AG;&C z+pshVjl_*RUn%oGp*wQTFcZ1d#UG|Ux0uxhjLu}8gekKSscMnfwNT34Y3>)lL!9W7 z>3_kRX4oe;Qbf12T$sob-hmXcpKIVcA=Xckee|#x+J6R#9lskip?xI6-+SV2GvApP zyB>~Nd(%?)7BSRNPc&@g`#x$C8wvMf#5Rj;;dO2<77?A0+1ddG7x-;GvIh8x-1dHA zvH!87xT24z777NcH_|*KSDdq#DkcB4oBn2#@j;JID$GI8xyQYyQw+)k7|JYW!fot; zoX+51DTSBPX_M{`P#t!Pb!Ipw@nEw*>X}m(p{X8exZ_h1k*IvFac*5YibZDZKL)U%QjfZ>I$*LZa$aH?ykZS z$q0$3W=knhTJ;Qag?Y0_$vH6&ynFud)V_Xa*nm;9e#{NS6F~ zdXP3$;9lFG#Ahen&F)a(f)XCd=XByXl;E1K>Eg3JNZV-uqHtPH&KRDX5xm#}_3fGE zG#O7p6BcMhcKNh(kEb!GFeTU!?!MgVMUj5jB^kDJDG25P)4Kr%Ib?=2aI`DPo{T$S zP^Dy}AKG!#A5zZ~!bg?2EFLo-*q@PYKhw8W6f(_Axy`W)->vWSk0e>lb|rV$Fx#D1 zF_+)`Xe6qZCz8r{l_ux(fqNy~L+_moa<->2r}Kzp|COkGss8Q_aUuSo-Vl%`-6_|p zXG&Rj->z@Eg?~0t%ZSemZ8o|h9L^Z^)0_nf%^$IFP|$Js=qCj5rdY1WUnwonY*G71 zOLwZRZ6tL;x~_+eRL(fw`O^zBB?t{cm1c_Nj;4~EEd0S_TtZ)<-F@kUd%pz3a`92aaGyie zZ6|mCJZYl>rL#Th(ql5oq^^Opua9K{r4?f=?Uk;1JA!qLC)c#74SijftmQXv%I5o9 zJNuyIl`L1Z2FX>k?{eF4j#ZMU7aFFz*_{%R3g;|>KiQzX96-#SXys3vMok~DK4#3Y zSp!EzY zh8?e>U0kq|)7f4?2iA3AQskY#=jTG0%+r^i$faNLgEQiSK9EN$`_57<-1Co=Ku5zf z>GlTm#RT5Wt2bjcrAUruK^dh?Gbt8>zR7E{d41u$cVtUY7O3wB(6c{OdRPslyPKFM z-!o=+L3C(qAKl<2mPE9N=q&e!G_>|p_xyE<4$Fc&$d!q&LEuQ``5oSz-W3jr)Pc1u z!215NkU12>Al&)AN&&Q^z$$`i}b4M>peR-PHDx^&!T*u zs&iK!&i59bsmu0j%6-Z@QmY3*vM2K=+=PHKvit*yhi`Ei*ZZ>pNC4GPaKrBrI@CL@ z0jQ+86)jj=Snc!o?6y$Sw*vP%pcX3%Y9|ESM1k1k=OwSzi$5jt_daHDoa@P}_L^ z*Kx?>ffS9YyjAj{Z48Q*JHS&xy*4|Q^WJ)qq251AK`=UR9DcTl43#z;>-q`0MM+Q% zFH@ntzqjyVYy-JMxkCiXiiS+2{fnlKVAfnpqQL0Zh8e=PPI>Gw4=%Y zaQg&CP%H|izp3aPswk=`UeOlQ75gT0OwT9RC)W#(d>d&Y>xbg{B%_uXbtZ^4o9B-Zu}8|JF4HR_DkN`ozKxVVC7=LmBUSNOY<)HSqx zlckgMS_9&wy?>THBco&&Y|x=(7j1k-@lZQsMEs9G)fguO8|H3Eq8R3HSd=Ad$@rv% zEbMji(0V~I)+zR#aN8AbI^=fOpd0>tk3j{PbhnWq33Q8c-88sddi;zSe9>$k62F^ z>PA~qWXznEDczj}y7WV_r7M9NzePl))0Sv{#oiPpb*iNhmqadNP{moGUrQ-C0fU(K zOl?Z$h6{rG#pWAO6h(J$hZV6BS7J|JJHbZ`Izao9P?qsMHJd06bF7v=YV!!wj*Y{wK5bTBVmmtIZSG3AVU5}PyW}Jj z4!D8S)}A|=35iy9Yo7>+*6DXX4=9ctzPWVII78RVetAD84W(mI`l~ecqYB>0$n=(M za}Qno@1>O%Bgwi(@fX|42hoYn1>EUtncMVZixvJkoT$?D^AydbmT6I#{xQ4s8!_QB zsFrqChx)0rR$XX)Se^eu#(MJYSV@;xV^AYm&n_b=&E1i?#k=*~G5uEY9Mb;wBtj#h z2>NXZ^=4aG59;N+iJ+M!VZYt)#aQ6$|rx3WB%ap%H*FM zMrrVW{93Eh%O@c>iL`zbWmx=K=(wlAVG2-WoF7(J<78sxfYfyHvL!X=GWz-0Jayu* zcA5BsX#Fo$r6}v+;&ffhi%yAD$SQj~)(zgL5{@T6&osg-ok?EYX#fCq9uAGi3HVj-b*^ z`$dmZ23cV_GW(aZv}yM~;TncxuY|s+fsCMZI=w&c92LQ~E8*@P@5B0u{aIYJ;@93_ zcN7EZtleZzYH|fV#ufKD5U*v*&P7TyjBp~e^{r1-Y*uV1Lpz6GL))}9s(>al2xhC zOVjbSq?Jf&w?CXdxEt)&W zc1;eodH(M4A7G=@#9Br^q86lG^akj!(YX7N6Km0S ztw0ew^)b_WcY&(~F@#Qe#FO3q9HYp=%=?pjWR(MB4s*-soI^#f{`!CbNL$-bW!8fK zurI0eZ!aBKJEgR@Yk(?lNo6kYjuK#-~5pmn3Ap=e))aR$Ex! z39CcLnwkxn?kpL~prG$En2dpuqz$8fgbO~?mmesD^rc)2zhbiISBUN_=?lE0q0R5) zUo3DqN<^xS8$ z?1;6KB<{K&qAwxvH@+%9$sP0^zYTvFS~)Y`(s`-yR>s%E`)YzTPlX=gN^AH_!V(cb-6X+;P4>jZ{|kv4Pq_%wdcR zFIOT?%R99SA~dF-iKH{ zd?tFHNhd35Q3r;rd@4!lAA8C%g(+2S+LBRrYIl(li){RhwZz&BvKl*t_G%i2K@K=x5f-GJ9rl;|6m#A%UTH`X6gIAP|C+oGAh;KWhjxBTY z33H^mW==mGnLR(yJ%qdv(Kmm;61)AJ8CLJM$ivvzX{BMe#4p@D7LCZC_25kl7yz_zx!h)yBA8;rYkox6%69??h7s7eB%? za?giwiB}d%KAbjIbZJo1_ODjNRGN}CMCTLaTdErEq{`}Gfx09PCc|Yc1c=Ef#SoT? zvap%#St0&tlL%R)F`aFl`pW};cx_97f>{yL_^uMR>CFxEnR?!(pCD{21m!XdeFGnu zAhoSAzg|4#AKr>KYd1f>y8LoNDU3ChC8b`hG~_BVyj~P0)6~ToO-dVQ#ZiDFpB5JQd~SE8y~)tS^KDbqp}#*yraPSUNQ`PaL>lX?k7nu9Xgx;sJz z0Q*XdjZ5D)Ob_;Qk(U|yR`s4PO-{$Y%nP5ADE=L>wwokZHle1P%4}U$Se1n!Lv+uI zj$NT{KD}AFoVvR`I^NV*%Bks`nz-in-}Uw-OW83L*8O<1MNla>MFvNxF^&aa&efai zP1+ec+8LXQOwKIy#Ii+W8+>BwaZAc6%=o0TrEZu2H`deUCd^NhYOap5kgrKu_ji0M zey!y`Eq*F~{b-@tVjRrn+%S<8`QMA-^IHpnq`PhM(j2o0DE!5NmalENEGhGs14N%v z7}>6Xu2JeBjO(Jluwal<^gre5FBy_)SE;%V zwzGpFC%x#k=6gopr_f8MRKCIkE09)Ax%cv1_Ne8|h|n6BMlM!9AL(a9CCHH22uyXO z1S-VHH0zmRM4F6QL-#UvOF}T9z3{%d9!wl@{NXh-6UEpm+S%YV!3bz}WnCW=CHEDN zr0nIEIS!k6ckxX`2vagZDB3TJ=~?LA*o!V+JL)8ao77AR*&&~W3&&QjmvI*prSOa}6Jl}F~CrQi1pfBGA+ z+UVyRMD_eX>0~E-y&)W7K58?o@QdB{7{}ic4Z{=vijnM52ZT}X8If6B78=+m!Fly4 z1fzr=k(*R~2IytC`{{pcNFkU*76FnP4FCq&!hWD79b@-rpSlkhjrT51mKgL`5>bK^ z^O~4S$@T<7x6dgp1w477PD`psCPjOuWc^{^()*&7VRzB|RQ>M?tU0p~d8JcUN$Ij1 zY$g<6H*V&u(RTY++t;)8iv~`hj{G$s%Hnz-z~O zvtM+MR=dXd_1P&}Xj)D6Zag*qwr_k5_0K0FI?;JRjuQNO#jKaL8CY#gpEW}cmt-Hr z2?&>czS12@ew4DeBA^WM@Q507epV&PnVDdQoa>ABe^hjCx%2Hu;%@)H7<)bcbbI$$7IQL!# zKWdb$y=w2d)|$JjdQXjbd0@%Kxi;Sfz2jXJZW_zDG1A!l$uVj4%=gvF>a@={4GPLGXwoBPzzAP& z)H9$rrZcvO4lg^snY+FPqz9Q9m%QQBdyH$kBReh==iGRnv{4MMrPDVz*S9VmCS9dG za{72|(Qd`>uft~LzYBj;cx)~{4Eyf56=w1_IdUYh1g*81M~dy!52-wMtnOicZ0UC- z_qUR>)|WxEX_sbD2VYbBb`gL>#_fKaFCFs--;MkuaIZ-}hio!ayjgflD*aCzWX5$f zY)6jSM6EVv*%m)uGCR=9>`03N;72{awPqTHl~f;>zQdaQy%Whc)>ROKarJf5Y|1LV zxqZ{@t0^W$)^`4^+!?w~*>-BnCq=EK`aCEx&?WMKCL3Nn`yG9AQh|R(V4KP}SBiN% zVRYZQGg8Z>dWw}17kSzZ&Y{PuCT7zK6irdO_*xz{T9t2C20B`j@YjI|eujXS0~EAn z&z9fU`D)W4{<`tYyhZY*``!)Gv-j6Am$+%(hXHKh86&`|c4o#x)qXrf+iI5DT7#X; zjM=3_(vGM1)WCL+W-Lg}0@r>QC8=H?n)D9(kri%`J-CJNV?{Yuq!?PH&fJ6wMMPk5i^ty20Ale)w%ydwcq}+vy7X=OFO|r>vOH7Z#g)odO-pKQ=eezXg^$Ohk%{2Vu`( zSko-oRnU`5{0{FR^;#yqHga4>`DMjtAQm0pbLR6)D?vNq<L2hsMxFf2BB@i@B>SUg)=`-|BXfIO%}Eq;^k8akC5N|1PAPd(V?UU* zZqmFMTmQeu)vx7rf0az#R!6w5cRHpDCX3`!<}X_>TmGhGra>>?&_y!QV*^Dk(syO% zo!FjDz2vDz8>CHHg@vn$&Wb9-xmX@uHdSKrQj&Ryxt~FLV2SSUZ=xWsmm>r#Jez zHZ?jb;Nv@poPqPv`>QQBtCFUMQjUk!$vo8)%2S(Pm!j|L)Af;a zhy2C21K}=Q>a~@Km{*NcXGTG(PKhT`k0fqrhDp6T#kH&mzXU3xb8LU|m0VLu8!ZPq zr#YkBwwHB^t5%(Te0Om2y_3n32_&8Ij3u8PY`Bq8C!9DAqm7X1+06Wfs4tKI9jj zyr0;Q5bgGldJeSf7oSE50Lfy#w=<{-0=c*7YY=4vX>vSO{8=~#blUyRJA&b_pxmz< zk`U+Tk$8K*y-#8;ULg=>*&9M!Rm*$UR4AS|7d~U1TDa`t@c8kXa z1`m~f8bE*bXaD85kIJM4&~qi3mHC*)3NH5eS~}E}{u)nN|vV=T5 zoAN8%JX{4ic%!Vuw*6D$62j!qp;X#M931A}^sw}y7DvlmfmPIdqJ z|HP6(D4~%8N5~W_#5lJ&`|7JOF1x$Ymse>;EHyQ~RBg1Ei<2h0v)gB~9uCNm3W55MynN8NJM&J3Y@v6a2a6Iz`^W8%fBHO-o7kA`hZ2~tu;eSG94=S0!H&T;E~xsp_E5 z@=VYZBic>nDF*_L{4~xA40|T%nHKG)n(hecTb{)_rF&uBk>Fz6V#15Xz0b){=uE#P z+mt9GiV2_9n4nW%7~X)HN9z=BTApcSFT6MC#FW@g-)OiF7pUC9E=+`II>;%7zSgQ& zx334QMMDq9B44!VDk+yDLO*Z;WXU8UF9I2_&r^W+C>HTv5^A27(~DrJc@ge`0+zBO zmbl7dUz&o0HnJbF+UT^HG!{`Ybc@Tnb#KuF(r%z5#lFQ9dCRWu?;v{RcSu{E{OEO) zDLfybqq>dCPl~0Fn!zBMTG3zP`$+ymkxCO!Ikk3nR9#u%^B^t!_|7aU$o|NP`b})C zG7fEwy$cs``~!@WOlPa>Fom2#U2LCO6#Do&0;>is3BAf9j2+A~43Z+KN&H-&3Lk2A!ghYReG+uk{fWrEP9GllRUUP^% zP&xYFtvTs)h)tMn-Ad&Wf{KEfY67qq00iSTst&fM#S=BD%3QE*O;!G$V>i*o$xcAx zQOtDQ6rRqMV;H>8DFZYA-iVN$l(X| znuc{>bn3p0#@h#NWbf8+x7ek!3%#FN8yB`!Y^C*33`!|@>-u$L1ZYGdUYsGX@w!=` zm}WvihW4s~l~5ad>?BGSD#HD&G8I?b@C_kTLue|Msl--^criDVKyCt$X&i|m?qauq z7+Qw8F1*Yh8~fA{{yR%Uz#+5>yso3tp4P75jJ>!%D#{m3wTy9ExEYsG(^Wb+KW{_1 zva@1`33a(X9(lD+yC%!wRh-dABZsq03T$m=fC;7qNeOa@(%Q`CaPFaIQk%tuF(QEp zV7pjtW^*}PKL8xNfz+UdFzD`UP#zBVp0K6+t4vj72#J{x9>8|LyU}obZU+7%K3!rG zG=QTD0fK1O#()gA9RNg3g4$3r*$^OmW^M2Q-Mwid5qg`$!??2SBzsX%H3HFo6>oZ3|WeUSUW{?X4B^7zBQpH}C%vfmE{dir8rZhHMy+k*!~ z9Z^3(G?()yE|)VBgpk7-5pweyWP;EA(`#@}e)yULD5)UwX7|JZ|DJ1m zLO@Nn&TldcaL*(t5+zd%8A4=sj|(uh?YY)XfvUKzpBz=5-r#WsVu9auU(;B#;6r@GrA+L``x~{e|X0 zrWgS?`Hwj0dnyPn2RR0~#B6jx?Pn&)zMdP*CBZ)MN`P4~}+@fKEC^kVt`1K!s*8p^RkW^K1~EJ0l}ic>(6qOerw0nGg=Zu_rY) z|L_&3W*RqGUkVKA0V07W|Ca^!0YF18=L8N{E*99+tPKv(dRNwo%dIVJS&qYHj07I* z0V4j#&rU+_30V6u{7?WEL!o{g);py!w`!YFtYtJX3q)M&XyDaupzxowPm~&pI|(xM zs<_*PsMbY4ucEa1OJ>C9GnrUyMrRTVSQ;=`t)PQh%~sI<+}dXBxA@qcpLz1AnG{G6 zRSr>ju+yU!bYt*Mf8c|KEl~LbP%Z3~aat6k%}GS(qVu;rCuC+4l#Z5p69Pr#_=W<8 z?SAIV48nC>;GE<+(xZYnn)#6fTti^}p>5OUH^*|){U zj^fHphOcozVn`5^KlgL5W|0500yMcFS1qYmgb=T!ng$Tn+@#fF1N^1{6GNg3O)6nw%!?N6OTXb+HS&rFV_r^$)M+ERWp~q z(&D3ICkxi;V11;rF*uE5WUz7%FM|V6z*?P(VGp^}9G}~cV|;7H1h2^n@`L%!o<1TI z{6(=?-`o~ZB?ay@V?xvvhn+p3TRO3}GV+PPgBme$$A{ zDVxhV@By%ARt^Vw&$0J?ps=fkwtRrk7Qp;3lv5*!l(iua>UfYUpj@+(f-Y)X^yloC zZ7h%a4ko0zY}HfqlLreZP;iI~(*Zb?jciJ%L(JF$jF-zXnQ3xZlE79*01sn)0U$f!<3v>5#ubKRMd`{!zI4CX^#E-)m8GO`}+E>nUKbBQU z=u^fG9{T`j4uisGzL?WclDFtt=1HQ0RlWFVy6E3+t6ALhNE~hc= zzc6R%Fm`ZFDNAf2tnt!`T}1g8>97M~L5(s-7K=j6bw8!r=p}FQ5Au+VF*n%m`|1jD z+b8v-joGbM5Wqy;*VM4+@+vtBENdxk=^df&C0qotA8o$XrIcGW!jO7L!MgZP~LM=H?5HZXSBMf0EmY`vdnoY_P*d;oAOXxU~u zto0IX!SNGLlkch0M-T&tTl9OJeM(XpJ4mT#4htYyIa=7o&1T^@O#-o@f>3f`AVIMI zU_XZYgx+RlJI=l$sq8g?z>E~;Mu(moxWEGJJPB%gl{pw@{~9zH&iL`G-nIOeEC6;V zsJGek%>PN&seJ}4_hdh*!CtlitXG-f5PK#NIP}lS4y_>jQf{#P2S7tN4;jD%=I;>G zhPZZACWYtVH7Lnm4CK(Gg$#b(Nuu>JHq%Sc($8qP@g+b$+@2BSt`}R9fXyws6{pxD zTx)_w_Xb4T4NJHV#ULo7EkNy6W_qZ-ASldi)SNY4NNM~!jvKuGZ^r)UiZnlC0k+NM z6s5N^KmgzeM;vz=^%QrU$0JrZczSZAFV#6gVDD6>;l<=oeWk&ZvaQ#z!#wU zbJen)iRJy5Zi3%-D|1W;{|nL=s^pY5_ps5|{Qx-X0g{8Nku}*i$`A$sHA0qtD*uv? z(LrGXTOoz<>o#sM{|CTrh&>JH6j2k?6s;UNHuLE)4yr;0vEguj0nvd00$#ZapZnWh z9Mn|`{IRDI50Dtbm`wm1h-eFNm$0Ru;lJc#bW2&%GZ_RWw*{R2_jIl92A1v*{NX=& zKYkkls0oF7a(sIMW_eUQEU?M<1-0ZnZB^!oVgJiM-1WRmC}4~ah6s5naANm0C+H@O z@zryR(6Ut)waxt!3B-g7vTt?|4={zL_h*O}Cxm_yBu4Nr>2SXgSHa^Bgq7NSDX?kJ zH5n)f8HT@70SJ&2(v`y*$Y$X_0`OpT`l4)YY1Dd`ZxfZ-`F`-a*ayK*^yzqKNL1$Hwd#R5M&6U@KnT%Vde z2*R1w4s)SCpbKTo*4Bao=PlZv1&SWD75EW>nv(n&K>fSoxh$TxRtx8c36k|QsW$!3 z*%)ntpU134=S4VE8px~OZYAhc|D_!6cN*_RHP(uRmS@Tfb8nFGI9OjmX3PxGV1cB0 z!E16A0jN(Quj+ogHZ!XI7s>J7Op{v7HtzLB1fUPX2Ce^~`442u@wf$-XV3t>h)pg8!-Hroqs6xvQOzYAofFG=&_SLvwlla z+RD8DV0rO@d94f?NjP+-)a{vAA zKPGfI){(%gJ*g4iN}?-sr6m@0^bdNWiYd*n|4?kf0LCwTQJFa>cC;C&nHxwDVKYA> zK&wyXBg|1@1DK<*ZlK`^Lx&^JW1Dn{yPM#jG24TUF_Wo{L1%B|j|wM1 z5F16sXVA!Uf=>N=`HFzQB%6<-LO?UN8KM{-xJDFb?!#LFP2F#Fa#iQhBGW0g8&ttu@C3#75L^zJw4c}nBw4w8B?{fv* z`upj_-Awo|ZpJ9lTmcT7QR*NQA0I?a(N0ZrIjR!pZ1talP$`O_R&z6{ox z|Jqq@dHf*nNbKRpM4*KrNZ>pvzEMb8(=^fyPF+TGQ~P0+&wOpw8(4kGEXj{!&4+58 zKCx1M2XHEBp~yY)pnY}QI-38Ns~auoRNQ1N#mb>`nIaF~Qv3KswML8(Dvb?LU_PVK_wM3(!B2V*-nu znoIV-Gt$<(x=HL?L{+a2DO1X|3#Q<|lhV=N#F9Mw8${da%$#E%M7lpW`w!1?depPc z2JA<{ycdJDkzeuX-`$7(AL?HfkF5`9lH51pV!-ucDAH{FoJ=2O8cqLYy}l8 z-<>*<5xifzJb2U(RK011&;4WQAF9JgQT1x}fDM1KG=;oIg8q+VSO+F>>#?vTwl^>P zU-w~(068-ALx4?E>evXm1y?U%uS$lm`9K>lAnmYuQ=(_|fAz#aH3HTXCEG!BBVxJ- z@(~Y4d%>7s_U>z1ko!`m@i)L4eC~-0EOwelpa0Sw>#ZRTb~VRP-6$Be{~r36+|RUe z#h)^{1qv;%qy1!DTOVcRo~WuVa7l}Iv)x)v-sC^Ja;V!7UR_rrJayUg`b+V*RyArk ze?A$wu?qb?!uAi%-(0wFH0V$@vY5PSO@_JG`Vdx)5Bx2W5$}5B*U;~R?U6|KYsJw){<*;rbJ@QI{V%8-Hua3anw%W`48yZdvX6yEccSvqE z-<{}Ti8&?B|DV`6H!kxo`HAKo>o~KV2a9tx=G%bj`LJqCSUIYm^B*@@`;+HO31E+w z|BVl)0NvXx!0jIotY99f>YV^y11V#jpPp${#+nxBF&x} zQw3Iq@C3a)wbxTdvHvj9TE^uuL6fca(X#xU{DkdEu$iaBsHvZ)siptYJwnByW#%(l z9e%L_r?9<+E z{JQKuXL&SV*RqKLUmZUYh&@2zrysRRG)Lr2T8QH4ouMaPDPW>u%Ew&Rmm@+unDh*O zq8+gC8IT;?VAX2YC1-fZLmz$0y7zN9)Nr^8(g)p>EeQ8xzS{bVdAMC;U-P(;+QmzA zM7&c2C02CnD0yPVo8AWV)9ePX_t8nz-c@Ys>sZDzNgVNL#Kb-kJ)cdFLP7kmH$NBWMgb?duLix|WpzQ!TH;EyT$>6^c1U1g>T-wGD7DI9JRF=gC0HA75O{ zYe-<@@iSkEz|3>P7h4{XRAj{yTPBG7I9Il%j;+Kma&FcK15aN+A!w2=11K8t2vJ^KZTfT!yyo6l1EyB#%=0T%1GGv@!N!f+V>s1-_Tjx&`OBUe#YC|zZlS-VKZed zmAxsb5_na)&B6f)FSfI_Z{XHBqVL_#EYh}hPQH%Hu?C^q<{%R9r}qNh0Ys;A8hH1;%`m){Sh?xQ(evHv9>R&E8mbYm}0$( z#-->tLYcCSIHopg{qWN&WBWeMiL(8*^r5yBO8ZI}Q&E>})%>M^pM&QmGjZsBW`uQ) zZ`uyqccHrT=l>=g^=D~Y?*x$mAD9BEDbD}ns?jp$Kyyu3PuOzx|5?>GO~=^>UzZ?= zzCD|SPg;tPiWi@?WZDV07rx3snv~KMTLE4L9;GR5r;mcVri5Fix-es!D+7;)1&O@HZl&JUf{ifp? z!cugXj2pWX;xFD7bsbNdlUYHv1YZd{qZ;Bkqwcd`<42-u3(rds673 zkPNOgs|gDX`}X;>{B$guAHlWk1>R#L68m>s3wFc7DeFh6o>=wcZe^|@#vN;t8U?)! z2&=U68%R}-xlID*jbaj}lHRJLjeApiU7|g-gCg`nE%{w;eVqP!@;h;!stJeaH5#Z) ze$fhR!A&EdImt*J^^P3QBh-hCLnG({ZnS~d>d|sn=^G4H>h-$6=}sa^OqCn z63$rTL~$k?Qv$A=T=q=hE7lBQM*~KeeI~h|mG;ZO)2$5z!5+z9+T-HPy_Hc03=r7Z_3`EG1=Haq^^ps4qod)kN9>qSH=f_K$ZAFRjya=4L6-A-xXr z2|5lf5Sv&S9Pdb*%lxsTxNbwh?Kf*<4SnMs`>8n|7zSg!V|>?Zr#f9por1ruaejXp z=+9;@UrOPhWh~t-;4Yl}#Il29sd-L_tHr+5GIFW-?o#JI>Il~cE_o1lO46{IXBB@d zJDtc%%)f!*0`8$2H|HZgICJFGWiaYyiuPyaFcbZbHiegJGx8{@bzn!mX1}7WjqLM` zZT)O1=LYGV3C38TzYiH*cw>C0v;7gTDpGmi_aM#tZY7|saF=diJ8tfqnx$Uail7j)Z_?Q4EjTnidx%vJhuY^Sabl5@xy^S$Kz>9tj60r${) zo9b+i!L|t+|x@6LuYi#sxFZE^o(V`%2mNqK~wK zt43juYk%|Rc4|!X%VsiTTmzl1s7V#BEalbn_7_4AS_GX;H&i@7})L)P}?V-oB3BhF>+PS4q;YSMBwF{n zt6$g0OZwS3Lb-piNUo9ByiTf0WAb}Xmk0$k!oH~@(cU)J2b(!W@&^f4Wn^Z=UFemh zV~wY#lg;cCQ|Gu1UxpgUX!iZu-s3h+?~jqETXQdQxvkRMNP{Q1t-19S1!pdNjq_nw zMRGCFy(#*jPq&_zR=dBG_kJK{&FkpxU@6O0rH|ena7*=xu$`zwOD`Pb4qZ(7N$e@I zymz0$BSBE4G)nr`2UsJ2>)SX~^o?Tg3vHDxi>i4wGQ-bz?4PO~+tJEcb-sqYGqiiL zHI^_$xoGgA#YL8QAA4X&Kta(n@I8uju{pZshlM!Zd8x82@f(BUttM~m)~Etnt^BAF z-GaDxbw7~iFeP6_QJh813w)?I=r$PrDh1Zt&zu+Be5J=9fQq(vzr`G7EZ@gh7BcuL zVd)+|>%c2pS!^o_K8vVMQp&bPup?@f)~K62Y?Wb4NNkzJ-ZcTpBae2c^}_pg*L7Dg z$1#}fi*w>Sqd>vi^<%qJ+?>+oZM!BkRl5~S?-UH*H-`mI*j>7S&?`+k9EIV*mf#Sj5SeIY0G=$^$(r+nV%h6MO-%8N%Po3p- zANqC6k$guDc0)^)=zCq_G3`cCn)wUgB%%lT0^M855|tzX1uwX0Z_|7$zxINC_ri62 zTO5=k1S-dy&HOew%sxQpkaJVS(27kKB=Nrxq*OS)A1Areow?zeM4Tfylxu2)Xf$?mI$ zqwulGTLyW>-q^LbNN7!(&5)S|3*@Z2iWW^)horr3Tt-98ytV&-89$!_psT=SZe=jw z;8_1(R;ZV8xA*!-LN8a>P!~@Z{|Pf%^>yDslwPIIoIxM20sB`8bri`@67S*dWRyQz zp%nE2axzh_gSs})R^EJ9eshkfXZ`hlu6llRZhk({MvCjh7w0z$lN(njtIfB|cu$WH z8Jlpg`_!m0&5ioS059J&hKy0m6w4U(Si$MaI`#3sU`GRO4`sX@ew=9xX$*;jla*n$ zk(r|!6SqP9LVf5a8bU_RGmiKf+3eghVW^cPgt2>jhM_pVBgF81 zgOe1bBF!C*00*rY40ID4l!2PD=G`c|qh*CzK5fy}fp_G*z_D~sf2oB_w7$+T^UHvm zIdNWm`b2LuwOBCcicYYH_9&*vOx9_`w z#)C|DR|l<}@+o3;j5LVZQeKLR^2qz#0dulD{qZUf;Q34$u=)CYcaI0lb!JJ!fS|>$ zv-jQ3OQ51>i0w18eReF0RVs;K&9auHvre77wdTx8%clt@It=|K$I?&f)G}+OYfZvc z1d*jm`esYUhv=Sb%3nY{mo^3@?*yqZvIh&pR}tNCOT&oa33PT;ajYH4?89#@U~*TI z9TCll9eDliK8agzF^oTQ1IgJs!qp^(BAz-AP}QPllj1IyQMLmEBnHx>Vjb#b_ZD?6 z7^1K)aHNe=Z&HQ@=*Nv_3|(FmF;*agSNgoLs)wAhdey4{N5R!ww6kRM1OX^{btA&IwX|}O zkCuB@j*cJi$@92eU1dnaVs8A#JHGS2dN$#T7MtIsRi+>A-*=!N z?XF!O@Q8c>e24p;B=j<}6i0#vbB9FeO+mh=wjHJ5@uzG>my6-5x6Qu0Udh5D^@+Pt z@?uJtoQaPtBSWH>s7@u^C&5DE@>x4?XTZJb=>)a@n7cfIG1nN^-HF^j6aguMl)ysR zFPflJYFR?}{-N)xE4mJT5#Hyy*gG4_%_}^-S?Wz+k?u?iCNX5IvN&?i!9cA*xeFd> zN_D0GR+(P+4YGMaFUzs#s8+A7B`z_cQ5uZlSteJ%S{H`>yzvXp^LFuFzJqB`HEm2g z(YJ%5H($l*Hwj0HqogFzS2;r*&~d*Kp%Bn3$)RLQh|7KI1!<~b&Ai8_DnDh>o=r4P z;1{3jd`BZLOTK+qmj9^p=~nTQya=?9meV3OnNpIGA{le+j!Vm8Ti;ZYhC|;aeZCp7 zdF%1%ph`8wQB?zjtq~;QOck2!c%I?a^AjH$aJ{}n>Yz7xDx7nizA%kfFlc>jZ`hNf zJV42d`3@Y64vx;P#H$?PWkYgg(OHc$FEwzLrRmQnyLq|nmO3nqzoLB7YN|7iG1VWH zO-CnTEFepNdQ@J7a8qe+>VT+LW$|o0hgns?NFXGE;Cue`EiA*K9%#uU!0nXSlo|gU;lD(Q{wTiwNZ7FTf~nd(z*KGiXXO+n87XO=|AR7- zr-t$$WuiR9V)(F-IeIZ%OL!v3IR1F#3J`;XLj0|B`vPsrfV1+k>D70vb9s_d0+x58 zjlx%=KW0w%7ax#eRVd+QHm;N6^xJ73C%K5h{-~{0o5(3+d4e_DFirSnorh?Ni^B=C zzNm}0OLXrpK{emrnQzo5g{&RkK%CU(Nvf)(cqf`A`YBE zXVIMSEE{<2FJ?bUB%SNkzI%`z{n9J_>^4>qL^=JQV=BL7QCwb4-2=hA7BjK!c*Dr# z3w^H7VEelxPwhpwpr;Y@UAp(F1|_bCk(XUq&C2&;2Z1uE$Mo8`{-X>-g9;z|&j^O` zD3f~VV>8N9X_CSb$1g#9=c(BGA9`PFe88o9nXUow9oN!;?JkpI6+0>uV`fxCu!_@x z=@XI49l14LVEpeRNwn(U&4368_w?%jq)+rek0eZ_=pP}RTy19$JZ=0Smt-%h<)(s& zSwe!Bsh!vw1jQPavv4cPkr`5ZvePPlt1gOs<_)M-h1{L!LOaNwgX~Z6U59Z+nz`y? z5Bxb7@&a-9YuV2A&a*gowcfXR4>?yNw>chXPZv|{T`zoa-pI{-1mL&3nP3oEMC}xY zDkIqx*$r9qb`?en@^*a91yyhw_5CDv`F=v|vYk%4!FgT{ujepaPE{J|i@+6WtjAGn zXEqYzY^G0Xl3wk+w_j}76g!z#27$LQ_)Mb>9L?MF@zCj{US&JYZGV1$yoS0>R9We` z-*P;hBTp2H05z&hVyR3&+fDg8zq_pR*)8-YrODDC5B_&J)VjifmN_q1&E$P7E!3}x zB@t@^RYqgLmvK6+i9E9mzkc?cll4_2uryY%yzxt#$0qSb`f+{th0W96FDEv^KtC?e zMzEEQ=Z!@h)yGQain%!*YEhc&CY`s~q7BI@w0lxoJo`#xDJj1!bj*gnznf63W5S!E zYNf7iH>a~*&mSX){Y0!?)H1CxfUt>zYyLHt_A8Q#7hJqD-q@cmsBAE#>MOYIL-Q!X zHd<@e(2~n0Ud@L8R4M>|+F$W$=YjdK1)hIC!jCOc-^YhQ1H3Y~2NBvK)p0EohO8rTHfwZO_1(tx zMxv}aWXqRpN|SiR{!X)5rAkSAIQdmR$yUE(dmigQmfv&$OVMb-&LD#2RQvU;2_FK_ zCOtQg%gQR!$M4UL=Qt&!{Xwre)I%%_qmrZh6i|*GmLuR1;=dV}3*;Fm{gfp*NEnGd zpv9AS8}A+2MP2G(lzk8$id$Ta~pwUy~2CPSvGkg#Y9b3>cEMJWo5LXc)j9;}GO{v}^Fb@6J6UJ*m^RBIB z-#~SFc8hM$A_9E=S;$$`sZ*0j*ZSQ$WWu?5E94f@@cA;?u%n`yHZZ{Zy!2g~3xbJ` zx4Sg&8HZ=76UTYvB652rH5OubnT41s{rd9gq^0BH)pUE0uc$bXH@(tbuG+_MadDo! zh+cT{qUS2c_Ls-8G|F${?*bvBK4<{c=LRZ~KHE1q5~+L?6q8u)d_CS#XE$4)@~MKR zm-cy-^j!-vn$JbL{2Uox_fmfDisTqqpm|Ie zD*R3A8@CyaAT+JmRr}+}2A^__Q~pS#jq<3&cqxHK!69GFwCBqLB^Q#(=iDK0#~;p# zy#d*lc?pEA$AV91OZV+Bt%k(_4^XAJ0EV@=f%EO zd0t`!^vgYfoG+rm>+-8X#6F1h*A9gn0Mxi68x68Js%vaxB-N*hQ{%;(@&&#v$A_#_ zXQnq~U#)RFn?n2Bn(#h74Wp!aePleFnz%gmXwK&x%6Ihbvl8mAWcJ0$J@ND{^1-M% z%8B2`?~=-nI9;bq&FEwYX7R)fYssn$`Spg@Hy$OK&UqA}HK^KeH>%lhqfgG#=+Ql? z2Sh51Ne6tpjZ$v#*Dn6T6MMg}c2a`+Ij+pzFWNWpHqR z9`F8p1#E-jf4<1a*~$I=f0s1+K`<&%rnGTI_6zotN_kwABX9vC5-$A$Zgw$GI0ezGJfSa|&Ml z+NkfxR%PZ=`E?H6X~?L7?1dY~h_RF_Yyrt%K36l9 zGQ!mYmd#R$zH4Hx$H6aWi8EBs6riqUJKPl*Psnq9rWCLl^4RqWx;e~!y)KN&5lrYt z^o#D}Vj**X^KlGw7+5W&;aR2iSEbbYWmYGxt`pd6hdhFF1O-X1&gDBi8!2%QG7?*z zVqI&DBa&Fp1Op$s)3)*~SYC%`S2b-vh7`@DY5^!HM1CYB{(H{)WHvP8Mk%y*y>VVq zp{@K{Rs8A^s0%+5?;B+O9kmJFX{RjmDZo1qeN9TPulM;7-!D=1uyX6>K@97f)Vc)^ zym8u6sl*w4oUGME;H#CFyWPHAvFP{BbGiBU#%uo8r2e{GlYK5?Gii)oc>6v(+|zSp zF9ukm#`VMBQ<>AFcMG6438iJ~k-Uc#^oA#36EXhAi)c}u_bC$v&wYWksvFTgPzC;0 zIKm;7Z>affJ#>pRs(MV5GjSq41-=fH2~zKTb3tnpexXZ8&TRrp+H;5~hVHWm_$=Sx_u z5VD2P&llADz4A#IcN3jf^PZVF_y^{+ctt5tsJm;5l}Af0hb zd?wWwpgG=qc*0?^&-1d^meD-^3dQM)KMBUowLcllrrw~(m91eHNUz9_YAJuB-eZ=} zh`|{w9_=P*i;7;|?IG!qcEp)Y{|Z_0_qKO!Gv-8H)3jJG{S}uLc>ixULiu0Wh-rm) z?=>bI+!YxdoWTDzqsZ9XT6+NhTVAnub@{8LsOud-wix&>9(i3{^G*g$;sJ_|=t!EAWUp1?x zDtnK|U&y(r3A#b!ymsdA4JV0uBYz=2|FP}X|LpgMD|^TFH!M-C&&sb~nbEU7Tm-;r zw@{0--(7ry>$v;!_$UeYrf-P$+5#>(D)He$-u-Hb)Fk;R-|kKZ&iJl4QVkKipFmuU zyxY$xJ%7s1N549M{=D=BV8`R~$``{F<$LU1@*C5e9cI!_(r%Tzthbk*zE2p@*D4q_ zcNbM~Pw2sHu1`{Z&9o)Vl12ljNEfkJ+{Aj#_1L_S~$;le>Nq3GVJrFy%SHqd|pVpy@eNu(B*y6h5Z6u zK^sYiz)j{Wok-TXLodB|kcwT_mzi^c{Fo5BuvDXiEWM&=0}R)NT1u=1heFl9oR^FC z0u@`Vq?7hOQg~FpO&jcd3XvJVEs8>>xVWO73@CXXlP;oW^lMYfCfz)n@|(Yn0A|G) z-mR~>8+AkSRY35LA5%y?8k6$)suV4StVf5ITRsW7=qa{(V~O54ak1Ch3goGHgZD3O zHF8Vi?U_l=#`X1uSAF?%>)kIVLwDmcn;+0_Dl_X+-1<~)xUI;uI8UDRY0|j3xqsk5 z6hP_S)i&~@sh={TIki<*Ha5XyKjl-s`OMRR27%hvc?3%bYi}EJr7b^B4Nl~YeQh%< zVel2n9zo#|P#}Svidd|+TJH4y7UADvbNPIoWDr>v+>ylPuiF`;t-wTY@I;`NT|W&@cx?#1JoBa)})Mb(flbB{l401(cD7Yr`7iWzS8%T z*PgA8{57`mkCh_t;qof$bjaw4^Lcl$_Fvhr0J^_wY{Y3|`&WDL2&+d;-IUnWuT6r- z)^`<&nDkPLXkg`#ucwq9QUMPdF9yAdKVxq%>Qe&F6L_iU>1Ved=(L|FPPJS}=w4I7}8bGHVn2 zQ%vNBM8&Q#eOfsrCWGmvdggpUYcWa2lU{IrAzs=5$y%iK3_Hc_58NE>uV*cvm_W%N z`bTOQehR&IUDEr?Z6kNTe$4*k3b@6yXTF{{sgd+p*~5aF!)WDv^@YYV@FKc$b$n__ zYnd$_DqMrH!k+_l#9Pc-$(SIqEoNMx)hUUInY$+Q_(?{nb`)Q_hDib%Cai1`1f@#8 zsh*n?di#Q$&d%`Loc@xw4;>%WqG5@;_UBi_1h!s_3bsSpa8oD9fQmp>Y_@DayNkJu zww-O89sVlfp=yr6j0s(ISuFYIR|T=T78%{`$l96-wM_(-0I}reO#WZPdF$=M)Y7Fi zgG}VqBLQzejgQT#%Czhm_Xp;iOFG3`K@<&h^W6P@b2ex5$O>rUVP{Om)=F>7`- zHip(vQvSnj3QpC}ir>Kn<21)rsEi%f{mx}NbcJYT_G1!R*eR*N=BpazA!Ms-AFJ;v zw)=N8L4KDwBBRw7_&c&g9$X*)Kf=B#u(B{)GgU#wwr!o*so1t{+eyW?ZQD*NuGqGX zlcZuydiwU1N*F<$A4Gk}J4>+-RCg znHCc>s%L72j7yDHd}B>xzx2OQ@0&v7XmQWDP9|M)tZ|JIUruWFmWqcM7kiGjc1xZz zF%vgAwC^7_Krk7jXG@Kz?p)E+%^L$2GY);fdTZH1h$afHL-7xkU>1KOe&XOyv8gaB`ExasMOO+b=M;%c?*pZVoSP+bC~-Mv6h1b08N0V+bSnu_(<&L~-OYc~}S)t6E5dOLsbz<5)&7#*ir?w4AHR z`O$&NI=x2iiV2kywN~X?Lc^g_{C>rDj4RY3r1ER4@!~DKNct(FT&#ihx!-vUE-89a zD0$?@n?9NJxxew0GhLUm5O?5YaYdJTU+UD~iLh_X1kt00$wEZ5tV z{qkrs%8#yD@Gvt-WrGyGTrO+DIiH_kJVBxDON7BJ^#}WQh1mEt!%P(=;(4CiC3zW{qwrsfd~}Rg?x1QxmCq?C zC=iQOp*WM7tV4RwK@=M>g>*}O0wu@?-W?p5+lA~-LlliWauXP2`R5VRH%$K5#_Jzm zsn_mkmT8nZk1>at=su?+1`ivIf&3Q{7FfOhwRn>a7PO9bn{V+n)lI8(cjnrIu2_&N z#wdd=DrZ~Mn}IyJN0U?u>~-nH5-ud9)psmn2E~@^z(PqNb;P~NTtnAXXyCiavp)QQFn$4j{M&JDc&1t8*+b-epyP(2j0l<~n*1}93SpiYDBeyR> zCc|#x9#J`L{)zQQTU-`D5SQ7tP1aJBoHQ4dfiWZKQ6RN5*b}7cKl?z|1l0u-2*y#; z`zt1`boV>Uw7(Q&QwUdaShc}4vg`ObeKVX(s;nJdwyvj3ewlEyBC#Z(Zw87{`D>Fe z4yX}3XkjSdS+UwxiQe#OGFUVP+PaXyy8A0k(r_Rh<}mnM0+R{y^{`hP#EFlXNOt|r z_!AoSv+gq8)VQ9C04sIJicudT-#_ri^)Ke$7mdAc%2lHClIp8bj zcJlLNhi9uPh`YjJuPc?$r`=`X7kGI2|t_dDBk1r{{#6JE!*ke6%XTH@FcRF_`xq3TBPwu-@On9!JG zO!EEQs7MY+%QLU!y}zMu*xv(+JL?+R*E+Ua+86b8col*T)l!|ok`^16_!gViCEhgd zzY7P?mefz#^1a(oC*f3b=YvUZSfDH$yB@Hz($6WgtV4r6O2f}(VIG2FY4?C>vZ_cA zl{JLmZl>#joClR~{_sTiyrid1R2=0csV{wGvp?~6e>2qd4nB|61p>04KZ9>BnL&`(3 zsXIxffEJ~~U z53Mc1tb3u|2HV6jBj0VK8p*(gCFR8QA|^i04$(Q17j ztCR4>8a;jI?!&NXWvDmtNgsNqnW(8{^6L>@_Q_`ZfY9?ssol{Un~UXKGOp_q3+`J~ zwCXx*5zR)$S2K_oTRT>^+7N`wk*}`*#!wz|Qb@{B0dZc+BUO=ZnRNCJE4GSl^3GMO zxetI?CT<6pS{&PDuu5`ri+7V1rH>yDl?+^W4Tb?rb%^+2$`RUTww%&Bm8KKcP?h74 z(o+^u%nLl&KCOJ_|4-E7A9q;Vw3YF&P#_@ls30JG|90Y(uyri z7<%}r4~cz^vLVGB6??h@F90}#5ej8*#h-YK@}Wxo-kL+DEMPYlMBAl%zHl`02?Q2s z2xT0F`AA}2?($oKw@*<#_;YoVO;7f!_{U%)9&ous0|oa^-*4^=_wmv6ZuTN|wP$W1 zdk%&Qk+T^p-KB@rP*1-0Gsmdcu^Okx2YuJ`V#J0ILKwP+27kcfZ9#*L>x%&g#fmWn zA3CoJOIEMVo7?W$=FkTd6fI(?V>Zx=?>WlYgx;v0)m7@dccn3OB_H4|*)+Ki5~s3? zg@~T99cVdtM4UB&57Q7+8k7d(ikj&u!(;PuyENZsL1Zz4qQTDBa4Xo3pfSgWVKfy( znWdd*5$|sz5jBt9R}D=+iG66n&X2QD5>uFihl&E!p_vb~m>02Nahl`QZ;Db%1X;bI zKopOJWqu2-ZYLKzZ^?N#l{YL7LZi*r?ifgdj9)fUp(*=gE1U%n z*fxa9f=WHH0jAW&G$L+mW|^*d;+)qB*BLvc$p>FxFr_*Yn^B&Ip(=n+vm&+*w+=Zn z`Wj^wISuBq;3}HvITp$=}a>N(mSWrqLYXyQfOyM2?{o?aFQZ*_R+ujJ0kYx8;q4 zq2etzvj0>Qaeey4=bN`5YUtzmJaI4&BzaSx;mbE-uvG)1;PDSls|%9+!p%w`#gp4R zruHRz!+`NPp5Vjl9jtX0Mw&+&VPo4zt*k+Ok?wYQh@#K5R>V^@V?tfSZ!WTSOwdHC z7v!@*)nh`I8#YwnHh4HHA6ux7(c4dm*gkop^Huw!^CJ%R_q7X8F#kdMI;M={+W8a7 z2Pv-KRLOdKQo&WC@EdsQ;X`dxlGFIv6|*3ns~*$D-XzfQ!MqJ8LG@3%a-*BbRg^G- z=%AR`Sn3W&>1gS`-BTyeNB(|p!e2iLk~f^sS)iV_f`f`#B~8a(zlaW%;>IfR9|F#| z44a0_vdeRs2$kF@5k2CwP9cA{_Gt!(ZVeS4mV8ttJvbjlW#8di7YBL!_k)7{aMWj$ zoaxbQ5uJC}`#f)#Y=zo~bf{-|?kXI}?A}oH80gQoabYMf&fnDqdOvaJB9H#@Dfi~g7lPDml!97;C8qmW>7S8Bs3FJ%IrF~s%TVx&h7^y>)Q|N07-6TqFi%dufN!6AgZag|YjV zLG-Tyy)q|5qO_)>n6V*1^iM!hzQqhrgkKhE%+Vux0T%K(DLpHHgYF;A9$jz4PEl1@C@u*Rj5t_g$t(ZZSRam3(NEM zOhD|U?cwG`hN|{J*vO|?N7go1;53;O+$Sr;Q93ugpWSiow>E{r$AC4Kq&0!Ij`KOn z4uY%1v?V~;-qj1sf>SBg{xIyv^=1AB^C*9+=Pw)y9g!F8EtZ1sl>h>(`apI*%j%y{ zt_6|E3$Z#Ya2%!Ub)hdE9nmLkFLQ;kINkYo8 zg*J$uZW)lwZp+1t@35vbwIR%D3m#p0Ui0zbaR#)Ru=D>BCjbX*xmcvbsK9 zx(mr!1@*)u#X~o@9xwvi5t2=aClItkG(v4iyem<<)(+a8;UKLE`x@?SeQX8z(|u0m zMp#Sx@R%{3OLd*-CV|d1sb<;Nu&EOCsTZz77Hz4wd#-ncM>F-*4%W8Na^sJd0!x)1 z_Yv@%TN7^K>~agS9Ezgq`YqiPZg5WBDdY{mt-g#Z4oW~5g??MOV%jplK&3ZNY+Q|G z2c?4Niy{^DRGr&>RW-MMG0G7Za=~5$Erq}@;xjrJ! zaE3c**ptdwfU!g83AuBEs&d|bbwSgrimnKxtoNA#+-V3&e z`jPOg;|HKt>(BA7Tp-+hTz^C&hjz?Q`n!bL34hcYx&07YKQ&HO*|F(NocT7YaXsEJ zl`b37mqimRMRji4jU+)Q?DHwS2TF?C8e9DtTidu>JqDtp8#L9ISf=?am%dvCzqk;k04q*x22yQgnShr8!DU2$(+6BOMb zj7CCJ>hl}quB1&yrf8hV(qMC z;w*3A==3jaFk4m2Xm40glu9@-_4j*?idY&PcTNnsdVTrIE3lbk2i4N?}t_1<(FxsJ6P8_ysz2U++Izc zb9R28PmsSgl#S#87=7Fh6Z<+?7$({g0{z;!L|qga;{eilwE64tHe?}O&RyLwBP6MU zcIqR(Fe5A&rdtQnI^ql~CRLFW7yl3W;fyF8*j=mvrY?;TeM{$LA{ILg&H-SS0dUCD zBb%G%r9&b|c#8hysNxFKaKk>NOJ=}i#u2=;D%ovwy`&|-mRnSylB31UirZwq9JR^h zN>zqoy1TMt-;rW~P$g){o-KKOuGOXb46CFiPmRfDAZyn%eb)8|DDz2f@h1dOyNSmv zRbW&T-R($b(}j~P>B1QAK>-z;F$4=@oxBm>&3PJ~N(7I8+~hSz-PcT&^oa5PdYa5w z9f!>&#wXO+2nT{aGSXAyU}hWJxSDtysm5L>z@V%#tuxtFz|50u%RZw+W$re|NWEA( zlfufQOIRek*qNMr00CZGb9)bbIu_?jb9G|3ZtLFYJKJLBrT)XfoH?ZP9YM#~!!2&o zN^gxAnCPA8=v;S&Q0$5B8KuH!E!bw~`yZ&`Th~RZ8>x^L;Xs{Z8$n?zckJmI|N6nJ zBw&0%tV80idMV++Z+F&GY-uO3}oWFNkP0TFEgXnmY$!^6j ze2f4(wndINSg#yED~etz(#IaaM%Ozu4yByA;arF_wBjMDRT8qVh`bhr!_sZf!)Duh zgH&ISEIOBwU%Qj`ORnf|@uu})y1@lg_%WsbDo5G_^KJ{2LGhRl#+*?XM}o@B)HpWB zkiLQiAY7t44|_ILP^KGOy!AVhL*kkr2=gnPPU^Ce#WUMew40^n$3r&%J8m=J%s=%s zm@P`ln92n)X9Q+}xxgzNQTX=9**e@VhU{}^RmWV&r6B+^kvp~|aD5Uhe z;Y~8Nj}#5`OLCeZL91W)L>t1!&|mc*;jPMG87U*pbbSZMG|YU##GD_>q&xK z5+$R*jmamZJMu2%6=tdFA&ChK(AdWe=dd+U!9>n`0%0hr3kuo_1Gd|*Co|a-B{B*= zX4$Vd+^*Wqo~PQ6x87bBDsz3(!j?EvI?H1~>ESy@`|yUGLES977G?0aj`l8X9UW35 z-OTUhp;T_c`@59z*EhV0^okq`Gdn#}MRVO8#0weP%G10Klxm|MEpV6ITOrR=89?b{ z%)RS}Q_XQ*fO(ndP7^YBoL7597bHkd+w-?^ zq{?!(mHSig(CB;SWLUkEd1_pNthN=0zrGZr*Dlz4481>ujYEg+T!C;*?{xids?WD< z(RNAkt({bVuI+&WNN=(p7Y@KqmL3Ub-&XrBvHi!6Cm-8er=R!T8d*SJj}60yZB4<; zw{IRBMkd69OhE?0=NZV{k-ML->FKlS}i){n4A{<9L8r?_E)`6v8n{;NH?HVX_t z#eKQ<=Xq~C0Kw7ghWkb>5EPsLOZd+N|Y|JuvKcuYQzwC&NedUclS|&H?E-#N=)>5=G#%Bmi*j(7z zY;Iehx!*2rq_?zlUPP73p?atSEOMT0obvFbGH7V}O}l}!>dECSR;Ue*SfDc1ms))s zG*-@1dEL$3MjMP98%XBYW9A8Hf38Y?=JEb+BD@}v`TLPF1tQ$R{+y|~BL@~O!5*eB z<|Ae{^Rl#oe^CdS4u^{gMhnRT-p9F_2iN_^XjMWb0bbDAs5C5nx}NctnaRyW3pXiK z{g?biG8%B`R07iXP&9h(kKdWS``;a3tJGA9-_`=YhQw)(c= zylY6i^>WI6MM+IvO(S^6S>W!%&#qb`)aVct>1MiaU|&Yx`>0eQYo`!zxVYV7i-%uZt+++ZTr8|)CulL3DhDT$$=PnBIHHeDy7o{G`RUbe8Dm^(q8 zQKkjwH-b%xp(RYoU{dXfWmzmpniN|?-; zVpEIuhP@bJ?P#0Ft-?u_(lW6?B3JM=Vmgd)9!mSe<*DiCFd3;P(fSUUcoHUDLy4~L zaUWci>c!u7#?hN?1xbS2DVFP~=o`<3(Wzi4kb%OCP299pwxrzi!#txlKXkmNhjzD= zdkDe%M~RA(f3DgjWwIsvOvxAUr-SM!K|?F`XPNBCNhM0(QRw8;E(<_g&%X|o%S5Q9 z3>Prd43qR@DQTQ16{kTPK^#l8*Wet3YwR3od!XFN1QKVW0C$O$VgrP|88+tZaFBJP z%_&7u4|#HO88H@cB^abgp_@EIPco?beYVAegO6eq=OX=aC9RQO#P32n{-C*EQ#0>z@(|HnS5RR zXwhX^gzKZlPsSP>9oqMh87o1op^D`V4a-ROWKlJ&ZB0d1+x(o!wLO`}yY%_;J$6`K zC?asQVzoGArMJjxxgpPG5tAA;MTU|nL|U`DYM)QM{pNrhu>D@PG@m?Z{JSDUgi2{> zaio>G@ejn|Z>lvGaD+87tx?**4|TmFwFR1saDYY(F&(zEs+W=hFr51_2$K2|AE9{RHWDUG+i2m!xz4-xu!!Hi zBxEwrd56EMKN;%Y<-peq-NzP6in=M43O=VD)4S7XTlf9cz(!ygPGy3K1};>`?leL` zbG9&KOOS!@ZiVSPXJatSWoyWrc_^4vBX1Pp} zhS53oTkWU2RcdKoAgD5*M?d$7<)-GI*Fbo*B4TlJvMG2Ub_%FvS?#pFju_A7qp&+; z&xrF$iLmz!Zf-CNP~SVNR4U;C-N}@gwp1#xRASAKCGr{9-1>R{?^b@4@{iDA`v!I- zg;H_aM(&&wI6G)KF{Qb0SMu3iv}AOtFt_8F**Kd`ubGOkRBvwKIj%{2Mj>t1#jKvH7wi7kDe$v!|TOmT@SANN5& zv zkWqxcUn%RK#@uTVUE<@TSD4#z%<;#KX*L7+U@6bvaC{YDpXlZor&n{!Jp(jnf4Rer z3{vPf0vRr&Bw}bKhEidJkw0f6Mrjw#v@K(X^&sq%{>bN?VF8rkb5o zV&?pV6Z1PRyt^v6sS68!FBlLYtIzcws5^@X&WYX+*D)~4Z>GtpF%OkJ|Nc|6%EKE( z5;vI3C$NXgMYXBfmfDere##jY*y|iRo_`u+=*buDe{mOlWq+sVECz+|ypq4az@B_5 z%o-GWc$5MWK)&=?yc?`i9cxY{tbt@{IryU=eVVjkv<|RcTu`_+sv?)QU=( z8yf6K4V3+gqbpv{FTCAF+$l469Y*E)*6I3d%JUl`&La}krJ9dFrtLK55J#RhqN)Yh z)l;w$S=DfGgxywFLdF`!$P5;<^X<;mdjA|jujWSdr^1I8jAr4J`8YHS;Tg(3eZ2mC z1OtC}RBI>BrGK^^WT~sngmACupUQ_=J_2uZS+~Y*E}|3v%%?fl9o^_5?@?#EuAb;trn@`?^pg?$>>Ae}_FYH~*1%SG{zsOXEO7ak)pR9bJn{suz z!s3tk1s{}Pv+E;Dd=;0eDl$>=2j>3!0tRk{EDH)z3kHLuO(c+nD_@PujZB#iIwhyt#Z_H! zm>1~!E_gD^2J}5z1XP7@b>NNx-T};+HqL%bX!wIIi`-e_zsX-kAPA!;tqepjx7;U; zE0KDp(v;EF>dN!Gs{xd$w22Ma_Tn&Zs#%pqa-K;hTrLr;46iL^(!Y4G43Fj_yj4tZ z6P;vd9F5#Jtcp3GzkAhy83^?JG0n?Hafflgn%Jh3_ZMK%Y6VY#8zzuBtVRhX)0AYF z$3vnk^|(j(qycopB?Z>}@F|SugZWxw=gfTKwsK;Vhp=`6BhWi9`uNNDOTqlzCoy^p z^ktLng=yxxel|7Gw>EkU)VSdPWJbAUmPFs6D{le<~+ORS&12fy4fE;w@nMT zVP68-*5F=Tad<)R@z^}cPq=NIu}%w>+Iuz7Ny#IBvt z&xBgv!_N>j&SLoYjEK4gezZkz!M&icaeaSDWa}WfFSWk+eS2lujC^dz90&)yf6uce z#oz>bW!NRHu#3jjj44n*!E#pS6ypm zRE~t@-1(Tuazgq6H{bCK$7lq2$Y$J6;1SvB~` z_9H=6fUmF<3QU!D+n@7Akff=R?849B#3!WA?>m#3>WSzLmvOu?%>nFKd4&;#T>0|lmwztE5_WX?PTT}ymik-(m>KOr$YoZFq$m;bg3BKrfM)U-1>#$glMS^;U zbb&6|j&+7(OMB>n*VfP`q>tQWLY*$7YWKwG@7>!4p~tyUx-Z1cM${;1uI_P5qDfb) zh*_W&f=rA=#@1__Xqo&)`mPea=5o?}OpRcavda*gaDzUVH_r6?9Tl~QyP59|X^^P=XJnqK{G z;{EEOdIfk7$YBS)&$3X?opw^~6H;cEw9=YTZx+0Bq1LupG;N!zkqxb!(lEh3b;;o5 z5IiS~)-O#D!~9i!8po%dY;_%q6xI1{Ep`TbVG4g?q^a8qPhR0z}Y{V25fqq=u)hh}`N7!1A|U1EbhHgHY*Cqe|G_vg~n zgCKrhgh+2`s&t-iq#kftl7QI#0W$lJaxoGOXLfK?0>6uuF};Na|46%8>>GBHn0;0h z@q1o6C!(2vJ=wc}fPCrmz1aAB2kWh4%6$5V@D~x(2LRn&RsZMMf*Ne21DZNeX9`@* zTnUlht}CL;zu`Wm?m|w>~bbZP@NL4+e_3mN9ajfYZwxWWnT^sbHqgDP1Tx?+{)d z2%5{6?R>2rSLKDU7={*67XUVn@A+Z9amwq<40b$yGSQ z?#vli=2Xjj!}x`~Bx9}PPv#P}ty{+jqkb1VvqbokWU~TTTH>?;v=XL-yO*K?CH2P- zS99n&AnV8HO%#UmT-B4jqUcXD7y^>s)l0o3eELd=vW(X@y2J%%cUYXV3X_E&| zBkK&Rg#GUelWc{`;R@r(72InC^4pONxWfXHLVmM(g31Zqu-I20oVwFM)TWy4Oh#kb z(jTT%uKJ?lA@ra0qc_h7{Jum7vpr@4(#aM zW^jYieg3G?{SWmwG4~^rrvtgVr`oztyRg1(3y@|Tgo<@I@vzJ|*K3hI6T_yIZfa4` z84vs}E!Zvaiil3Yz~r5We?)vPMh4)l-q5)ft+2BibJJw#BoD0+wChjQ>|qxNg(&fI z7*Y=~fd`-|N$aP{Xn3F=nrud_nuJm)2_+wklt;4Q#s8N|PKRG`cLpnDS=OzXq;!>7 z?ShVt#4WWeJ>JP{GiUQbJy}1G-$@j+Y#xAEAHY7TrpqLWu`Hw3o4PQ0BTJBfa?$^| zA!_><8qd^N)U+%ffE~nDe~Vmul})bQKrqh!jF<1OLv`EC0{06K8bq_*icJ4aT4+?PzJvFxob(vR+VyPmVnwf`V60;T?ec zhll$Mnfr^0Zq1DY2E4P7Gg)qsd&*81;{KsG6Qfg{D-e3e2zzbr@=s+lNAre1o*7`v zG>@&VJwUB|V26A4$3z>_p%B|_fyu{9lwHAV2 zwy@R_?n&ERn_yq*7s({`V+gqwt&C-Uc>M>Us`lww`R3U0oTYCG?C@hQ%W)b_iSp6z z*YEjf*v4(kVQC8`NuQjcd27pGGdAgWjh06GOR$*tdFiM-t;m%N)@9Z*D7oo!zK%@K zr9vNAN-2Km%jvg|X>MSAxfID3V-pWOk}(W(OANUA22FP!YPzutYx-6*-b-VAP9|MI z%{#W=rSORw6v(1e%9hTbn$|6S=lD?p>K%B^KiSV-R#Lel8+rEv!;VH%BJfW0pNQh?-->EJp~W+AEu4nV=S?Y^ z+HZR2OdE?QAH_423bGw3JLlTy+s00AnMWc#&(#5Xp3z7hn)D~O`DnMkll|Nl`O{7| z!{}JuvKGE!5%Aq?DYJe#7aLuX+PDD+_-ntr7e;-Yzdh1;W#o@jS13$+A;pYMnvTQ2 z)8e>kvRySjCW3Ia2lN`fZ*##<};#Kf0FLUz#ID^L65~QEbJcst#>Mw9s z)T1Eh@Sm!{y~bJ7la}oXVu?wZ3RE6*s5l@heuofhDYiiK%%MmwQTgL8G*4~2tLoBJ zyTg{uiA^W=(9K%;XitbyoR`axh~!e@irc0~L;dkzK*@jH_RDyuTp@j#5A1(E|E>AJ zKNXYzA%6USlD^_5B|!nG!P7P)F?gR9gnR+2GbfVvgEIAPWsvY;JJd4!X$k33=}`-6 zPP?E_@`fb^Ve`qWq>r7PpR&ivWnawhesid-0Jg~Pv z1()~BQR%Pz^2ewqMJt>EL>*~R8XP9KOoQb4nPn`;H4O>&FZ|1m?@o3bbj6)X-o$hU zZvG01_jXV;f>O45F$@;;pQ*|08Hbm-5VkhsLG4?a|SW~tBqYcz*0n5AZMJq&znq_j_giT0KmZNI^ z$9O>>i~SAP&PX07?86miLCqd!?!!4>V~t3_8Cp;buhakaX>08LHJFPcEnYg5;abc&|zvANe(u)f)@} z=1Ppkdaw|iFCsSl5KzxU4=HE<#KA|DB3JR06vB4E;*Bk5`4pvZK48Y`4WFy#peTgV zLnz!+wkJj1Q$?tKYYk5KE*8BnItF-O=!yS``tCBvGAvVDrZ4i7`Z*;Vn-RK*HCmH% z|w_oN0y%T%qt~ve8I?7UToiWy#5UjdWrNLYweLH%(-*Fq|TP}NS}(| z)YB^(keTM*o5_0d9%2@Lhs(4lr+M$<Qbwzv3jU4`tEUuzN1ePWC}H(L~FGhnAP z){Jf9wNYU-v{0*Rh##Iy%${n*G*{@J5A3OW*mmkR7UV}6lDu^{S#A}51vtxnWLXum z85@*E>{`TQs2qZo`)(p=YZp$Y0tb*UpxT5jz*xXj8HVJB#b?u~DNi)H#P4=B5bwe~ zlc#TB!+Tb-oR@so+@K{cdwysyOPiw=kgVq6nPUgPqm22K4*Y( z@q;uewgIdd1lZhT3-ToiP2UD`?7O=-rzTVurbiUIuJWlbT3#@)H{!xG>m12kk#1F> zs+_vBjE~pRV%sB7Wh2Pfv=bQ&VG2GslsAJwbD969J$Rz7hnpR3?pNhlq0iQr2}f!% zW}g-4&Kc~lvrzwfL%4b$d@@KWD-&qjtD_qpM$O3X%*j1KH|VApr* ztOA}14~fics$5qm#AE_0kMQCgh^UoNC`VD6k22Ug#o@eEm}8fXhRWC@0=?ClKtqQx z6GInAhX&G_-?^o?C?xg$7*E$yR$+%=Tmws8>p#XQbp@Ii_k+opr`7r0gAh7P-U)Lq z#atE64YP2=D0rkMwn7f#b%-zEP+ZG7MtQ9|MfSAH$}Fv^+N#FPFL^r8CPOiqPtzz~ zvI^`tG&DRe$8mhPhN#WKGgDFue}|C$>B=6YTFKGAr+;6xbC_#_5%g~5G)S`UUA7;# z$w2J0)Dcc&9gSOrmjEw6(0Vu2=&;hQ(mUuBYr`0Hme3eYjo-E#-$}G{*r1-8wA3EG zezAH666_HiX9aOU=I>-9_aGtl;|2!J4{i)Og}n|}Gt0N+h@8y8_M0IRt=N|tK}4J7 z@llX5YwsUGG>epZfV0}>^;`~C!8z}sUx1K0IQGgC+RP<$4Dp zT&ogynWp0}=O*-4@D`zPzUrDC`6ZmmFRn$VCYUfd=i$Fh8QlAHKs1x8i>TU&ks*Bg z!e(a0Vaxg|B)$p5>HrPx68$CIU+cXsnTL7mIXvebcMXL z^24g%T#7Q0zuXLZqLR&KUBvsDS6umKla^%j$?|zKW3mN}h+X-r6D5jo7c6u_Zoj-h z$9rS^MtNxmP8jd>MTKBf#RX|l>img1GX$gxV)>VB&A?&x2_O`HXHyz5Tu+KVG0=>ZcOwvG93yC^INjA9W1X9#Yw`u5uGWbSSsn<1Uk zq6%O?S=^-cNBjtMn{PziqLC6xZ?v1~w`oWtZb~ce)j0r|#LMi!OYGhp${noZWd3Jc z^?z4)=dVTe?^a<`FVYag#z)`0QE=gB=L+voLt|J@Um29?bEc51QB;q5ZD?CHCS z^>K{=BHZAQjY}m930sY5!U@@3$u!c&z6I0ojHj>JLfcMjG9e;oM`;LcSGTT82n|7D z_pl+0;hCvEBhA*aAZG@p*Xa-bB%P7{9*?3V=m6ksCY0Ni|u10~uG37i_KP68MPta|-Tw zqVS^P(%~fBduW>;;Dn2F-Xu@;sv}AI| zd3}pJS6Oaw8K`KJ2>D&3Lg~~uP!#VKySvCHrb zOCUoUMZ#;0TEjM@4YL6xJbbEAvKu&^F}DCWUIS z!Q1C(OWQbAq9Ws_ba$FO>6+%0q0~*k2qjOhoxGd~y`y;27(5m^{daQT)~<6d)$-pn zuTsU6QsCYAWMGXa>jrVu8X+m z8ez_324aP2SYY=vqR`+hs+fX4<9|*t%Vk->S*b7A`OCm*wGA-3`sQPkJ7f#Up5lWK zoU|Jid#x%v@^{)DX@~4=D-~6W>>Hd!Vw%;Do{%U`Aiz%`e?yL6nrdO|T$S`2^0f8D zNX5P`Tqkq95Y}qcPr}y^)1}BpqAO{R<$-!XV4n482t=K=FllNTis{?(j2kyz@7__- zCaPTghDof4IHwLt27f)HgyFTj!Y!_c7?s`sc!T-z7$i?C)N z*ivH~WLOwfX|-MuMjBU-y|zbTo?5q@ROacW;7oV~{JUHa#|LDOfvV-oa0mpVogzv` zDg7Z;1_Vt^iw_I=V=wS-kHtY|wyLCJ^?F%71UQDhZ#+A!({{;$dH zpEFnwiK+C-*J!-{a_V3g{Lfg#t zkXzLB_hMr3P{^!t%*Wi92k9SRFUAe!M*QJ3^O;ZtjsO?%8|M8K*9q+3_>p8UI^Qly z!%FGhg!h2?S)LQ}m(TgR4_K0}R)6Guv7;fiah~!YX)`%=-vl|nxts<5LF`3Dwc@E~RWB49V9>u~XYs8PsTs2#u1VG_I+)X>y zDOf}fHE=o|O`Jdw)s+T4a!4AgaXXO8EODGko=30AGwtg)35oXmjdi~jE__edG_y2Y zUl$H>dIs#8p5gf%##H_KKe$VCq^c{@WV`JL?YDIwnyp<7PCj84Hw}K=YJr{%NromR zQ&9{!*C-BAF-0UlV6FU+WYI2etjK^{IBmN9rah2B+!6Da>_*J|`V)lx6ME}+^!JTY z3mMr~?%X^&)y#@@VreZv)v*$I;6xEZdz$XgK31Bx4n28Kmyp|^&@Um?vfW?!r-@jK z(+PDg4)sKRgZu`es^9>j6e~|&c4*NjQMvnlW{7RRzpvcJAYHM6l*7gc)c-!QzhuUd zM1Q5uy06qp_3u)rjERlmzj)ozN>)nq@`${xGMOyGW%a-E3_ViO!{oh{xxzRUU8sG3 zmk*3I4Puk~to$hK?e8sM)--hp^X1b{blp%p>~gQrFwGg7E=InTtzjYSyr#e(xo5>KR zY0)5`B`)Ja#BOaDSFO|{WcQnO?n%|EjlIA-cW+ny%9^&?W&EGV%XPV;gtXHKJ^BL6 zj14STEiOl^jlzq4y(%Yr;R=1sF$GD&1edeG`!WCESFdJjNW)gBSS@xmefKw2(BI3- z$!os(-xA}fBVj1IHgM3pW+XT ze|veGD%e_SN~eL9Hj)HQ9Aiw^tETVz>lGy|XRe1DpR*W!cl~dN5-+Oy>G3m})%4r8 zr1ZQVQgJRhNN{SYwEaPMG8vSWH`ZcSP-m*@CK7EIVrt1SSKEuYJ_gHxPzoQqo1r4gd{4Yzj ze`Y|<;(NoWubB4yis}E>HTysAuKs5y`=4%R|4M^8|BP!omgw@KKcQuisQyi8f@o+( zsA!=WFs=}TKp5cCeSVq%Jek2&F@VHCRTR1-h;w(mAC+t)_2wt;u?f#$SCE(mkF1fufa`?)vX!m< zh_Sqtmv`EHd)9P`eQo^qx2H&^lWx)pO=>32u_d52?6f99hPU{j}qNj z{Q&uTZJH`3(&m0PAdD$XRT|DobwhPa&$<=P6xyxU~r|vJ( zhz-n_iX?N&&|Sn(u;F=q^xmQy_su43GP#)rwxi@OOf9pr7wGoO_-cUF7;Smq>GC8VAwTDw~Wy*TmsXrZVZwF zK)yNaZ>J8Vr**T)f0B^BNOoYzT%}yYh_bnfca*q6-;t4Qo%wrZU=vkhexPm<&Di4* zn~mzlzj#M*&n0_96yiB1&qDbFQo0F|T2czFcd?JdYCxa9ZqQT38T*si*$1mR~FW%wi^V}*45Dh9_R zbUFydeuw-QOk2VY#Hc9hqvata(u^~NMg2rkjU+~g-~tb6^vn%#rMm>Hs^&FCa$N|e zw3uX5ne5)bR9T(gj3Tk$VZHSo)(rpeqxv61`o0x8_I9>T|LN(Xw4t~lkE&C;!mJ87 zBGV<@lq3ed0XC!MjE_jkU>Bsld()-e8c++n>J7Xx4OpR)p@(%D$*- z`Zm!$`S^Hzi#XAE<*)!C0E$3^#vWJ&d{keKl6m9;BCd3R=-na zJ;&cytN7$oi$KpU12$78Cv)k?$h1ub>0RRYa_kAusZ4JE zhLJ>|q&sW3It#q|m}L3HpXw_#TfDQHI@mb3RImqT-PSD9mE$_Vqg=8BEbe2dgb3Nw zb_%oenEm$HpP1rCh*%+YP9bxq_nC)I`)M6He^znE@AeZI`)mfvku8NhnzS_4l~`d6 z_o)W>yIm!t->lT-_7$*|(qscB;f|Z&VFTX?Abtt2o9ZdYvOGZW@@jVoUp zgGCn#WL(SXv(~o0_=XrWMa4=8^KIFy3g5+qF7}pT{h2UH6m}FQk6$ltEb+{#}`S;Zg8; ziM@8~l(xlZ{B$dS;1fTV+hIB}`7jVeZ|w{&)}6oFb@E&snJURY^MMg(!}P#YG^w>r zAz{w|*<hJb*leb7@lj+V^tvP` z&EPUS3LnbTBIdPL`PoZBd2$SrPhzr$hd9fp8OV5OLPf$LU7nNrv0waHdMcWUl2O zv&lCiJG6*--=(}~)npn$C8FdqUNAoB&ay5olZRJBvm2OBxOTjm%%)ea33!3iMq;8M z6?IyFX&_ZZ{ZM4&a3WmSLUhmx2}=qR>E7P$Bek`SP*0hQMuV#KHWLxn6b{KRtl01j z&sXD`&por8Vxd)G!eg77ZL&k3XxD0h3n_Nmz@pWoEH5@X2`}cIcWO>o%T1=~$WU`? zH!AbWV$LQ_n2yq5-J%itiO#1FX{!P)yi%BMa$sAX#B}lQIb9$wTzTkn&fg+)_1>5F zzUquwvLSvf4=6Wp^@?^Rs&lszn4s-zo``!8>?_R)Z*mI5n5ckNy8IQsQ+?6VtN~zr z_^W8~=cr&k3^^eE;gS(jHpZY8tWJZeI=}!$e*5?0MQ5GS9efD(RQi!Um;x;2sSux# zUIPM7b2Y)eDFx;b8j=-sed`e7rx-MH=55IE7?t`+NPvtrk?!jEU0`M5b22H3&I`&H);!l?q?YHSnWBExDtTN}@YVu2BF zTX$k<48%Oj0}j`NY7P4DGgI(7Y5GQVfs;Sym%ts?HQ$;+L|G%FCKocfz8%k~NPV{M z4I?041^Y)-+ziwoN5~-oYHuem`kNIgW^EW(>z(7tCx_kT17=z;v9Jg*arEZ-2; z%j7oX*+lCc`dJ!nl!SLjh4Jvll$@d2ttFGXy4VH9-Ms_hs%A$1k}({qh&^90bra!f zhr5Eu2T5Y5zGD3`E~C>n0`U*_2qG z+o*B`MqbmXr}Cs1i#Voy23EDu86mpTA5-EK#STFnfc4RCIJQbD+h(S)ZunW-5^~!82!c=S{?v# z^pM9VxZ5?LE7?V2!+-3L+`_+bI$)ra9NN4dKG01He+6TMcUK@hMzO_xFw9DmYrjpx z;AQAJ9Zu~mL%yG|#l0)goE)(A9*WewNEz!s8%Ap5qh<1uIeuve^%E*#rvefS_Eaw6 zAVc9MUS>0ywUZDY4m?OWZwY?G>yvfA(Lv}YKYr$U@!yp5v>y*N8~VtHm>K(Qg!n{e z`-w2qaZAiL?Oq3J)@42fW1Ho4AOa@VFFuTB+6-nC&u{EiPlvl&MJ_JdWEeJ4V@#Lc^Y?ExBqAMS{3*ZR7#7yf0E2^5uN{q{e(KDMy?Z z4hM-iL(%;Cgtmz|8B)Xx+iny^>S0vazo?sbHmjh4I-4;ex*lifkFa=(uMVOc56wH_ zNWtz!!Bvq#LH>S32#q=7UOvfQjhT7i-}T8~Z*8?c{VH?gUhcsMcz3 zR30LUwtdh3EJcOF97$J}D3ai49pNw>1P0`8 zl;BctGD33qPOx=TC+KcMLf9NM2Iy|7;q3No;ChDbTE8f`lFdyzLU#5eLU#6`T`)2x zT#+IiD|RLtI;hcMa6FXZSrPS{55 z;~2V?!Yu>BXaYtLUELUW&asTlvz~6VCAgJgZBac<1f|2|0TJssSzIF}ymJE9btJYZ zTJL<4XyqF9k1rg{^?4<3PdB$_%aSeeB)p{R96Yqq|M>>n;TS~Rwi8iv-yU(vLT z;VU0Sl4OtgMrE@Xaw#GMK2nEj{@(k=hT+2odI~PtWqTN(j=uL8h2px*aeUnxd9?|u zNUFE(p0f>!tUFSj+cI+G#Aw%vXApU3OBSe0xgxi3Kj$S4a0prxG0U+L+uy1K-*wW%Y2~)iBJ511r8RvRSSsUBjELzRl52CfbFJq zIN99$0!If#>`(ihbEg!qHw8z?)$qO6BI3X@2Lk!znhk7Xu7bDdt48?tWPTI=9UvSrm@wDiy zSQ+R<(iN}-m&0Z2;^)CjP2@-``;MH#0VO7jpNBE{{j?JYDaWl}QJOL}F8cl?2jOrxQ^;HehS&vwYkqw;ZRp=)Vuv9}DUXaE6RcI$su-kh{$wKou zsj0dmfUb0`EE2a5#2UI-F2G23av#1UIqaS)9GmUWK$pX9#vrZik?L^=Gc)=?ZK<#( z))v>+>Rcz8v>C&YwQ%OA9EJ-XlvNMYT9hfHYYT&C4H3dkAyW(!^kNqRu;xS_BfgGd zgOtAvlJB5HPuwQXIf`D{L|&P9o~gj^Ttkm^plGDUk_Hq6tmP7?3QTjA=s$~6zAbMP24_18z9ZrnuUN2g4f-UqLf{Z%7Buu$QCY#n4p)=A0LKi`eVTE7Y>r5=edg!F zVAAbf_Q>T&UNOEDs$8QV6S|xx_~M0@hHO*U3%N!d7y2CDIY+gLc%B#?*R~Np2*nK; z2>U>|yN{sw{TAF&Y&VcKy9ytPc<+4f(pyoV72vUzqTFNgx$=sCGc+7 z^!5Y0&!SQUOmTCahkJJY6t2nosPKYAH>Y^Ko-W$l+C{aXd~~bTy+oSwHbUC}RG8iu zA&;lCEQ~RMCLOX0*;nflbpfWTu%5BA9{K5%A;Ya63v}0(X%kO)F`aYLSO*6Gx@|aC ziO#ubvu4Tk8DQ_J0ymMMn+CECQ`^r8?#qj)Kwc1BxVf4 z#7l)}y4?fu`EsR-wuN3I)XyOOLm?o2fAz+<^c)!qgASi=#U@sU^BJRbSDn}f)hg_J zY}=v`*_&2`$2<@U0=sIWlez)IDHLmTdqy4~Uv}659ZPc@?-9SpAlwS@1V{=EqBlMQ ztU2*51lOTx;2d@l6++Z7W$%qo5$k`=oLUnNbI^f39iKcqcSe%`A#2xCi6NABNGON^ zNXHjitb2h+G6Rgz-55?d@dyz>Q8O+n#p$h`}f;rn&TOM=IgqS{D<-ZA3ja54%HKCK9pDS8u`=~KC52RvDEw~ z@l@CRCizrqahqPoC%*I`kOjW|0X2ToF2Dj_@?OOP-b3Dh0G~UImuu4m9Mo*P@|WfaC0lM% ze&zR=h|(?g%RcA$9EDpQwsvlJ^qF$^?Pv_{v|u6I&QpPE3U9edK9Uq~y&(kUP7><( z{GYk;+Y?l}3b({)zsF~-Y(G|`SI}BhtF;-;WXeSS6@Tm73o#?hoyHG3@@!fhE>z3s zX;Q@pjYa@ZC21AR)#i&C)5!JxbfU=#3nsE*OxodE#J;qK$`l8H6)(r-(5D2iN3-O+ zJ0C|`EZx=Tsr87&;xJhnm(jyDF_|ZHpt(;H@}Mtt7z-cW70{kf9Z}t|{$61_`>Msa zxTmw#umeSDYK*&1b#b|I@wNKqZAp~Oll?7us?C*}L-9VbYvgiz)F;9|-*4>ar$Clm zbWrseas;ahF{dUBVGbo4E|`8oCvKK5HR#8JJKH<*q#>#2IhCw}849Mtw0UlE8)6Ik zw0cZYr=X~+i^LV95qI);A$+gmy?#uSbg(sDH*)~Xc?32tLH-+;>y+x2Ju9=i2>ElMWK zX2dzm2dG)Ghf-e{uB-VA<#xic88&aUPQj-Wn{WP}&BgwH1VF@e9y`a#D_u#pMw&JDb>>0c$-KKe_2Slw?IS|mvti+gQ#<_T{pFUvs68X zA}f~&P)Bbz*W9)%oZqmXahG3lDezZP1$Heoeg|o}M%S$Z>J8WLF8^&#_NAIY+^no( zW(TwP!;*k}AitDX%ifAy7u!zqoR7>gi&)Au_Fv4(^!a}mk;y7o7e;c2PNcED__trZ zKL5IX2(kJ*+{t}J+5#3fxQYyugHevs8~0hC8RFw#4NQYKePK%|zEe(V$8PPy_` zJR{UyOF`+#mM7~`aM_;hISx4wHPI&`;l;Cy=;6ar;GUc#a}AQiI17KO(`qhzw%H?4 z-uT=!1c`@TWRCGj%pqNedS%a%vQl^yj-Q=iO$TN|gcBy5G&yTuGjzx=^pE|8T4FfZ zfSK63NSfT4?)Q-)xPu$e9t0ViNSD(`JB3ieJ-$g}>d%qj29~2!L6Pnb+CR$gh;I#; z@3&jzYh2ZZJsdJRgYJ?o?o^UeOU5QB^s>q5N;`>UxVzC^<3!y!QWdn)fmzt819MeM3#oe|Pyms3Thwsp_14l|Rg}X>jnm8MK6!d)P z+G)UTW(fWS1MUO5W*N4?KZ72Rhf-Z8!0q-fxbr8$uW+)34I&Isq1Tp;>9r*rOw(uv zXh||fJPjHX#a@U&_A90Pv&Yz&0`1UW0TW{wO|P8bmbn>Y7^Ax#S>7%judJ)y454%c zuN<#rijKujZ`U99De#=T70Fy`C4a#Vcb;KA;>!!Qhp_hWw)PAc4qpt+&R{s=a zQ=Ugmg>|D-NiFNAR3(WF#fS{a*4Q~X@&s$G1roN|YlY#E*jmYIQ(*Mz@Mr@IMbelr_7Ll`C%8z0T3yn=$^gIkq6-WlM|Vu zB%B4nkd(4`Ll;i$ZJi<(IAZ9~HUnr{aZd9v@la>}YeJ2j+@L^CWZC zXWr*##&8Lq;YuviL0M|yfWu}b9X%G@k=(iw*3p%lw!XJGr|R`S;?x5pJ8*E`r#|L{ z^rsC0GBIOFh->e-RG-0>p_DJsVKsZ0ecJ#xw>aS{PX=TkKQ;25)zL3!Q}5?9-eETr zxf^rfJ9=rvOv`7vMw@a1ZS8Y{4MF1Z6|?tL-%6Hd*FyPHdfD33DSpAW)Z)8ifhO9k zYAKOfL4}6=Gs@!+1%lCV%OxG(NUbstqf<0XN-vVVu7eH-g$C5Q0cADS-nY`b^l7su zEUo1i2VS!^xBIrBnJmc;LwE98Rq-|U@Nfy~g59pw3VdrdT;*}xp?cnk#0At_J+Zn? zg(~s>77SYq7^Dfs;ub2O{`=`5%ITnTi5D;r&Gvm?vAT7Iteip80`QuJdRPD@@-Ex+w zE3h*MKhU&v#`~TTl(P?luxPA$rC^VkXr}3yF7@`3uT*^3I)^8w&O0eP`{?2uxJz~p z=ibnxxdsI9n=OptQu$(bP+I16UOS7b`YyTav<(vyi5yZ;C^4|t2Epzw9YV)^PySEg z^na6#iT{5vY!i1Q6MN@xXDFwC0l`giL+<9kD=*A%S9G5L-3??sloX`@-G)}=KX3c* zKu@-^)Hl}ylP8r|QP4vLQC>k;(83=QGEBt#M=-s}2xYz8KyiqKlC&bYsdnq#N~^;{ z3;=iei{i1vLNi}ke{*vr^*-C_%B?3ex2OB>5Bf+OtS#~JwEo5@EDB`&F-XH^IH$DK z8}*PN3n&;Q8cFqpxe#(9BMn%&p}2%vqCG63)BzhIrsvj6Op){K_UYbcto4?zEa2NQo{(Klhg>FSQ`pEJ0Gi|G_L3u+h+%qxY$JC3 z!Zrf<)-$*RjoE{t0A&^@f%Fmo#9ByA7OM2SxY|qjbgVYxJ_T3lT1$H4vr8em41@IG z-}I~n+?t}Mgg+%gO|$;$j8R)8{)G55xRxUshL)DHI98J3*-EJP1Q=0bg;Diyd# zV4&!RJ|YYr#uekFCENAk2t5R>C(#+Iv;2L)R)H;y%xR|Z<}+*+aYDG%oQ*`R zE+;g{%^T&Oa^{01rP9~q8O6gk$?#`*i{&2F(G;otxjB$0wjTP<+eaP&eW6OEAu5IC z&jdOF3D!fn8NeiNBHXEOCEfi4k{Nh?JWO?V`;;(7hJ+iTrINE7qR#Ud;S6t6+_h;c zE`&u4NrF2o=HHerM{b#_6I{bHFpf;POI>lY12;>Q9&aCwS`FM;OG(v4Nxc4g9L|xha|58f+ z_@ViYsekW}|GK^vdH>B@($d)QUwt9@b&B~-zB!{2-#d%t|NgUpp@FTjovn$nke#iq ziP1myrjWIXfvt!n&R7)Dgth5;~$ZD|KOSUTy z@~rXKc8^$OH+uJ<_~0{X4p26pSDGpgss5M!HGfW^*g6096L2m>Kp2NKuU+^nzj@mk+{TGC@QZ7FKy-9B8)Kbb$~sBM^WWG&hZ zDocJFHyl%wW{*CqOeHo)aD6%{6_tz0TrBb$Zc@Zo!xlM`IDp)R_ul&a!jZ#Wn?thT zzGW>h&1M@Mzm8O=#6N5ob12@r9ajmN3aVzeeB+DHTjK*T_tKb9#jHrBdF;f3h;2JR z`ZN6{_0UB@PP;mAlqE=WY9G~ZQAd~ErG_bFw>7{d2JddJjk1GXq|qLM^FITEvg&Rp zU)iEh0D|%3v1c=}w~ZZnrqvSh?Z^f3za5BLhPDxyY8a3YLAN!W?5Evitu2V{A*R2J zF;st1JvhTeq4=D!MP&D^WdI|4ZdOGN26G@!nELX#2>yczs>n!31ruJ%~HLf3+I zL^5p{5^pLmZi*7w8WC$T7X^q1i968%(~L-B5{vc75(xK&d1w{ye0l+1VW-=Z?B^Ey zt3X5+j@o#dT`nxsRC;VJr-#8ZrIJ!Hk_J?Ltr`F(Tbe`M6}Si!WxqK@KISeg|LB^4 zEaR931u{;eK{!ULnqQ#@dPPT`;QTa090>FIF!j)HwgCIrwbmAHdX{oTg|}SB|Ey8O zDQo0p^y6RHj(&Lom7w2m#KrHu`_F90f7|2&PT!-L|FK&|4J@opjQ`~g7_Fr952^#t zLW*q%Ku}W>NkpW$QAC}pA7)rsA)w^$=XwxE;>MLsn{kKM^T6)RT`^0-X$Rjpdq?C@ ztl{e6_E@=}>dEVcjKW~y2e6XoD5_FxtbLsu^*V{u>K&{Qcp$KlDV2 z_css2oW@r2QOa^~hY;tN%%P8Z0JoBF-KUaQTHVxvMe>42&kSVKm+L(MTVHOs$Xd_x zs0MUK9r3Q z%F|k2;WI5<)qNfuf<=ajj(E`gD30b8cav2i2A}xnuroZR;#JkNQgH(KcuHw+QP&?f zCckhq1$q5JPKC5zndj#Ys$^&ksFyQj)a~)u_WxEOSBh%FI80CF{xfT4!xE4z_AMU} z{SK*rCWQZcIQ<_#;P04{w{|hJ_z(BaXoU&c{_ocIKxG7-GCp=HfCgZ#Z6uwvTcOYx z4&x?-br#1M?1A~hg5mp%z$8nxKw@ri=x}qB<79K?-{ka8jkp(FWnAWn%tR&cjB^rc zgP*Iy+MDxG#AO{ee$skn7)nSU{wdnRcmXNKOar7!Tf$KzkP#5MZsfx463Fk_l*Q6_hl3!W+FG;`0=TWY5o1vPslCrye(xY)V;j>c`> zIKK>R9)g=5$v8vXX zN|y>LNdbaRZO^E!wa;0BWvjn%*Fw`_tg^9MrvSu)b8R}eP5#fTQTkVJ74~~ID85(Y zp9S^*wi<#4)&{mlCf^9dw>`7jf2it;73yRM=n=c9^Yg(ZA>z`~4EhY=&wfxTR{rG2 zO4lBVz(wXFftU1+^7lvBEtIDNLP90Tsv+K>U05maIfRuI%?cS>e9F zN{vkH)-kISZx|H9oS`OcD3Nci4W)-xE^4E73cvZtWj-OuYD9vuu5mt`@`Un>`$%wm z8p#J%Iu_I|4=P#x3oDJ+nylcn{_U7}mj0j&xd7Olq9XGP8raVCFewJCPvJG59h0@* z_k1~r{i4rn5azZ-n zGZz=N*{*J;>Dj@{kr?}PFt|zX^q322?)(VJo91egxhFo`&+px@$2&9EKUTx3ftU^0e-Vdy?R4t72e3yN3Ek`OPz8R^$p=(O7M{9G1X+Go13z_QQ~Dwk}aC&rZk8( zYA-W8uBYY9y(KjomaUiBP&TJzTq6A>qclu!Xxw|jsO>187w@sa%&5FeQUz$~h8%c#B!85@)xt@X_^SJUJZ-3(U zIKTl|LL?MctD(w!c{yQXj=gSSqBrW73z)*l$?2GTxv-BY+xS)xvh;LbdP8Vbk?2-C zgi$GM1b({gmiSzMLnXL!>1uPz*m|2FqiNc6%m`sJMfz!^CzYLr1OyZui!!53ext7j z_1STjAfPn2PlL2hvA{H-2t3N$RM?1nI*Kn|b~F^l}#}#JX5OXv(R%~-g=%)|4ZVm)zVxJe}&j4w6`q1Mfo!B%CUQV zuYLfC(16Dn34??}JWQUHBtN{Bf-qPDinBzWFWEeM$N~t509s5C8|!MeqC+A8NJ$Vq zl|+3syq5IPL8G@M^jZms3;!CFR>+T=LB!ix(V|eX^m1-tCOc>TV!(nazvw;dGS0O{ z$VlpZ98QI`kC>yhC%^3(O0L}A1I;1BR6=h;-l~%kcpcg?btA&|Fvh$gW>GSInF%!7B+=*?+LU8%w*2pa`(Z}3R zjSrzRlZots>jm6PL+aYcW*_i96j#ey|D7LN^3~{CH?Urc0+2X$;k3U4O+YTMFpI}| z-3r=-71UKXr3+bV_IgB)cvWNezJD@Utp< z+pa9LYtf@y>P+Fc)qQ{-H$QD0UutmMNh9_8$Rpi?wGNN*BK-JGyGLSQprSU8ob3!|WXxU8|wKxV;*k{UA*UiR@t(xFO*JhpoJk?A!ee+5=FY zSoyiAJkk3?QG3Ku2TED}Hd(`|9|)i5D8lwBnA0dj9Ge4RAJAw$dqln?s9*fxe)rs; z5UHD4eo>-tSHjd*KZUJ9gqQk||H0*7_4o9|BKeXH3V(;#w=u%Sxxv#d(vE8_!CbPn z)Gl11bq`l1`RIq_l0R7-bY!6|!13C&)HJ?eXj#XY8#v{$wWHH0bMbmFKPNTvi%-;T z_Wh7BwZ{?AN)}lQl&YZrgkXWmipcuJ*C2U?=ncOiE5MJugnK7H(m7Cxn-DQQK z3y!Tcq12AY8XVpdBdHFgzfPFFMF!MdaEI>a9|E+W3UIqi_Rg`p^YFL+ruatD%CYMoq(v;r9TK)}p zB9w20Y=)t!_aZh5!;>;HG%~LoIi|IShsKF4_Xc1`11(1R$7qrjYF zi09@)U%aqeKrk*r@xep3K!@#4ljg9_og;ZhB!$(m7;pck?t>eldCr0$`{ zeAS^cx1su-x`J_A*idh5gT#WeiM`_3PMd1+k?8Q`Xd9`ar=DTN$ho+3&O+YgyKNh7 zP-q- zG@|bCb9!udm)8?6*co_jwuLgpT3v?-%?^qg^Y z`d&&+PRg0`DlbR}*!o5F@nNLzn&m3)a6)((gwUC-R#+d7BJxr5QTs`rwh}HS5tbQIjIz$yjltR5lke} zYccy{XUS@HLNayg0{6N)ii@lO?$i=3zq8@OX%juwer_W1*$oyD?+q5EGm|{h{}oZT zpcEfYEk0_9ttc}R^=_;)bKi`r9c8OB=LJs2!r8K<3YXD!5Yd>a=a(2hR&7?9(C3+T zd9OS83^daOf8UtF<#pJ<`Kcv1d}d@yWfC?1g=CCTBIR;inN?D*zA=2fzErYgpPPp4yp*&<}Sg)|1n>KiDoxv!%$6hnK92Mi*ap9UkiVQG1&`y** zq539&H2IaGc$xZ{oGMY1EY8OLt$Nu89Ns+d+Pc3OFC5Cv;I6SPC2l3m$b9@o#1H8u z_Kuv*88}&P_Xy*3z~OMo*|=Hkg1+YVc6n^s>nUcvK4}H>jfw4*+Wl#8Z%*3}w4TWh zJj9CHlL7QdrUQL+lXq}~yW;*rGi9$%w{LffvG%|&-7zzV? z!T5uTiuuYjBH#LySsYT!Jki184+E^8b z&GvteU@rkq8x4R<#|HC}j%6V3Gt>lKdHsvs4h_bprVXqH9EX(euH|=mfiT2PINvENZkSx#a}yWowEfvi!&wfJDiWZd z;zn+Dr`wBpqnY5>4q_HPB+u@^at$_O z-G4PBnt9srIZ;^MrM}@rbc%FySog%dS-H1T$|I(5s<3miSQKko=))(26t5d9-Ee*s z_YIMCE%Jpz)by<+y(j1%b_nchKkZgioHPi>Z;v;VC4?{nw#+5d11eKPa5?Ko`X< z{TeVGeJ6u|z1_&(W#Qn7=Ww`zIoEY2gRe*Mj7w;n6mBoY);+!c0fF?@CTf%8Wa*Su zy)&G#Z#h=b?hDU_zg6P7s$yM{O82zVjD)U_SL#+{Z@L5hcmKuC^o?(Ix~w9|eo5G6 z-GPNn-J$chMwdfKnh-RUG$)$dQh6(@3wHoF{wtVD&GOk<YZZK zRAT_vLq!H&fT*hgt79!%w;BLlhXz*w{4PuiUk9u;1dp-P%)G1*09FxOQ?*B; z2!AiO;G?{it-GB)0eVMLwu+F;&JQeOHz&2>0koRuMiH9iO0h+I2V=SH2BlKv071JI zf7F21a9`GyPN+yHaz;Gj8^QdG))0|v2=OUm0rd|or^q1byu4;n{zDVfVEd&ep)mb{^vwZ)X~mH+Rn(p+0K#VKRzXF?OmL|8y+VADF94X-BJ369KN1R6N6g~Nj{Wo zkp%9gkYT=l(3s1c(?eosMwq*xEF((09+(QG^SWAdHO2C}zO9Ge?Mthy%idOJTl|gv z!phF^LNS5_TAwt&ZZn(Vd48XEo00kYI7y}bVRlo5wUuUn010q7XY?C%w+SzY~PB>5=G_0BuY8G8nB|w0X0y#Aa)>_v1=G{<^ko zw~d7Y^;r5NX_Q)7IMV<8Nut}{L5=ajhpkqfaEos>O#qHABuY@+(ya-;Yk2VO?I zKO$4}sR_-d=U|fbqPI_uHH!qvyHduJf5wxVCh5UJ>2uZ#`*j#jqSN@P z_WeD2_CHAla+p({p+b>4gnGI)#m|>%X|u`YsAI=VnW;xk&`Kx$mA4f_S{1aL5}S*y zz@RKQ>7A_@eSHm4chj3v=F7c^HhlN_raQ+w1A{nT7NW0#Y1yA1R$?ZrgHc-%qdN3nLUKPWgozf5p5=5BD zU)xsF$1+KEipUYKirOqq9?EflD{0})3Ur4;6U0=W4v3(M%@r1WV7a$rK4=Je z5~ur-5KhAxDKoUm)b}xQV)|27qO6Rmx^qm;0gVx`DX6DZ_(W1=31$UzNN5wIlQvUM(sU@0MiJftIE6KB|u#^K0k1KFau(i#v^k;kT^`77_)^*8ozPVduIo2Xt@hh{Z+|RGiimqh% zyLj8inb#y1_iU4!+mM2mTA8FPQc206%QRA2GigIEPy&BtSq|W|9dgb`ulWD)o|fdo z@|VzULGI>mkBdJ8@7~^U1)2ihp7ua7-^M&aAvE}ZVtRs6zJSxLen7*2#Rbk&vj^s{ z*xy1$Lr>``(hvL+uZ&xZF?EHcy`b-$j07wL5u69*y6lk*mBqO`W(md($Ndl|7vYCY zB@~Aiuq2wf*CBl2G>(?@K0LOc?r1F?c-;5OvbAyi3^@i93$;oFOoOeFgPVm;j>zDe zs|aPXw}z**@IFUg&#rr#qvT+hjw)XJ$T_0Y8sk?JuL+TOG4#d|4tlds#2oN)L1kwL zObNbZ1>eF&h5>^H6U|VA?Jip=218lJ(WFP*{XnYMW;u#SEat;83HB9k2{27o6iba5z@^kYgPF0Fs>I{A%k=naW*5G%Z zeU0Fr9nnb)x;e&XO-cIW}T(?H%W&v?`G8EzqsriQYiLJjA_v zN{K$F?h2)X> zi*?dT*y!2Qq3#h4BUK|+Rvs0!tXwKxmH_f1w*vG9c^kV}X?yYwvQ%T=i=(~L#ghfgN35j}VVl=-?9a)-T(27#x||_8mHVui6PM22Axd|Jt-lEv z3%3Niol$Ds?kad*Q-LcyFUb&gWxv@}?o%LoR53n8NBlf*njv~r#QfAE+-|&APxP35ZG?^L`JAbhO^erp){ZQgqRKf2yAxVI<#_RKG~ZQFKEY}>YN z+qP}n$%((QZRf;xZlCz)!tRTo@cF(l21gu%EM39n=;kRhX^Z=%Uhrr6KD2<;-ysgCBqmGRKTcNuQ%YWvu-1sE{0 ztNH0W3GQT8(8VxXhNeE_#McwA9pqShy^auZzsJh*+GtbAx-Kk1^>V(5zHp z{ykuv3BM+R=o5qEDr)H+iy}W+@?4NEAvqP@#l*FQn6g+?Xpm|NqXz|KW10t4Xx>mz z-ixm97NNRwr{&R6hmI&pYFYBO@|7n=K5)mwBJwP%NsZ{R1?i9VTCPC}(cQe>-DOK8 zXB!(*BV;~4s!|O1sR(;H`+X;U@2+$dG*2aSve-U}g)=+(hc-QuI-PlQrN)tiO53!s zttjDzUB%CDWNc5r7IY+n$=6#^mh%Cm)wKRb?kfl?O&l-ITpzm|lkz(%c8J zr4U~cwfmJG< zDKCfIkD!Q{T>Nn7smY9Wt}dvRKF?2;4)o-obGw(!#Joarh?;3ldX{{LJ27#vTKbm) z#iU4{Tyi|TK1njOhFwMxr>x2>M&@C{(IAcfS|W)4ZjuNJ=2{k~S^&@F73PJU>G5);pxn}}p{=Ve zv7vF1JhC?N%4<_lG<}Ds7clAjim|mnl-m(a)Y9A8>gg$7(b{P%Iwl2OtRAYhQl}}4 z^^^lEZBj{Z{%Vp5>a#%k`v!X7)zEZDZNNa*@e&FYXZp&0L-@h31&{K{qX}R@XJl`u zzq+>5$iCGUG%3`UU9wI=*A!HEC(@bv0+2F=0w0W|Xmd=QS#_}^%K#;b3c@nhkY9>$ zWl@OR=3Ls;UW$ss)`e12)>UiaCFiKSE)PpTb))4?t0m%zfEVjn7UNzJ$%ZCJ1s^8o zAu#`iqj?>zvZgX*O_4g`yP}-`V>!^N zt>#TzYFv6iivaXnUlI>j(MlwMFLK%YdM`xM7L!E7$X>^~Jk0#r&rN$mr!JF{An|5Z zz`|FPphN4G5Zwo6=e{p3KB%j#xUQ_w@gsKh;Z<<(yF^5zMvx{)+xb*mp>g37JY@vn zn4Q3=#*Ebpl%3kyF-<}D(Iwi=K0c8p!4`l`fzrgw8(-|oM@(G`QV)IGF)iq7*PLzI zQS)kW*&M)CJBQxY3ydtuDvPNcTu414IW7-n@bFHhNYXIk;;+*1)Nv=`(S!v{`>l6s zs#*y%n(kWnxlH{nE=b9A^=aqSb7c8`t**+0Ztg0^C9C8e9a9Ml$8Za296AG(z*S5A z!g8X>lrDXrdvsOesaiY?q0R){((+I^+)C)gZDljKqAnDU4XAnct6;Oy^0HYBN7yK2 ziW5E_ri5(XcSn$DTAnhdFmAXI`TeB#6u^+iet;Z&`2DlPe40s_$7s{1b{f3VWzG6W zu8W^}rRkncKS$;!Z#egOA+TNO(^LsUinZVeDzRnR=$AXHb0G?M5Kp_~DoV(mGz^f4qmpUO7%f?T_vYhkK=a$lVZf&!b{$#TR zB-@RSgzuf!&BN6dL`#!EDD)LNNEZy^xe$zG6nFy}+YOBuNXG&=E>BXb9S$|vv_*!n zT;L402!r4&4V318!S5s8)xp@J1&VIQhSw*DxNvx< z7OlQ>dI}WO6~NXNW>dCxAF{)wYy81nHt9$dY$B$3V)x#xCq}p@hQKGr(AZ2MlZw%1 zeys*F*}jbr)W3mUJLbK4v97q=qC!U zcnka;xhJMi>Qu&l$aOTdJNM}C>yirp^Jl6XWQw7 z!f;v^je1(ixkm%EfG~=GJqj|3W8BpY;Zg}WAJA+SINCCqzqvGg#&SDXecirMe3UC3 z-ZPfrPn>Vq*6CW_pEp0RyB}9V(T|d`x4wNkRi%bA*;1zdlchFBmFKl|o|<2Epjw4F z*A1)ReAKEya&0?6EX((XEYFc1pB?AotX>GN*bq3%(}wA&#SGI{TS0dn<5wd1FMjgIrlB+$p(eIaxZ&5sX|fCH~f;Lot~d}fl0?# zw-hEp-3}z6FIUqeA^FebO~Jb&y?&>)z635DlkeKG0EVA3D0yzv=g6 zh41W|6sH*hDksJkM&1}NUo_KAILEI|Dte-Y+%2}}+=BW9cf zDvbl`91;@zGRk~GcSne};>H{h;GM^ictt()j$fobko^bZ@A&gZPd&s&_boFc^5-l4 ziCjI@(D%4BLslo&9~QzeO!4%{-5KU5^ivsg_(e+Dh~WhK4C7`F z>uAoH`N3*vr?|QRA)VM?Bz0}T$JG~+m%IH^l!!;58qAm6AB z`~PI9fIEP17O+P~8fXSv$4hy9;A{atuSwv%6qHX^olahEr}T15avwhkBSD$wFKMuP zPmW*(LjV3p;J8ZBbHQ@`n$t&DfdS`?8GahIiE8-EL$t0|&(%mkG5gQ1B~;U(N@<&O zR;5&p6g_{X?I!*dcO)rsfx23D)vm<4ec3d(ZKi+gvMEmQ)E?l6@nNC6B3g?b^sS<6 z?pe{vQ2^JxK6N>}`K_7mI=ei>8#~cjh03U_MB^su`uMaV$O@xn4L(oov-@G)VHpZi zZtczJ7t>ZhC;G5b$rZ(%r;*tzYfVRC1ryVn)wTe6r++|qaR~-2{&cesvSG%=kCE=- z#NHhf5CpoHz%(T-7?W~`Nkd^w?0gKH8IZ{gWiA0pV*o^Ke>KXV|`<2gJofx`rUw@(fZy)vVt&grNCoDrvX3CY0%qaD|<;?{D1 zk%e59D1S@?(I}-HI-U6ur7PE`v*&com6CRtf5(SXdOW3+elKz-+rGZGHN%C*uQumf zGH6=VtV)KzG2g!d`*^M6{&mddQYjKWUBDvV?Sq_(n*FViW3u)&7I} zc~TA*KnD7>dJF#1e*Divot~ngUy!~oY2Jygvm?w$hoRM}b}9wOq-{$g&W>2VeH`mv z*D~eiSZcV|ZDszhBG=U=(^9xQWyUZb)y7HF9PB^$R;Y0__Pv}16JY&fpGld$Zpvd` zl-FxwPQQGvrJzF-9u>KSHXk^X)Hn3Mtli)XP6bP!wqsKojLS9H5)btgwwSNWU?;R-rK#Zh$<$(|4u-?J;Ie9ri0ktcclFf%v*Bcp0)Ns9lfw!c z=uBJh``64g!k_;TDZ)0AomSOG3@=_$BuqljH=6mni-a?b-g`^e&E9(gDx3#0NSb z;C!@ax$}*(^W%&~B0zSQp9<~CkHPd|!`P|8Jl!CEvqlyZ9jeH0BsU&t3EW%`XoMH@ z1jD5$rDO?I&M+?gZfOe`IsjOT4Q$G;<%q7eteE_#XuMxI>i_JZZw6aE0bDa0WxzIO zP&yh0IDnoUP-R1xo61ESy4*T0DAaEeR7xI^_y(H~N*;faz6DHT($zP>dZQ&Dv#F8P zH)Fq{olM|p05Ei-Ke128?J#^?f=?iPqG3wZ41|RW6auxoMX|{ zbg8kk4A~G}_~PJW^BU!dJbmVR`zaePpts+V`s|tnm*8v2s3W{&wDauE{>t?!sP-qD zo}qF1Fbq;U{g{VkykI5p|LOFJNbm`HyG$R~A0IB~l;#(vNJVnzY*;M3L#sK24u?_a zl9I`-HSxf)CRvyUUjAE1El@vgI&Ure7|GQ&4{K%R5}Wyy3+qnZ(-|eSj^I?kjsARL zlKDs( zMkYLhq70b`zC~mTv=9mcy(fkWDZmUfAtVtdpOFF8p}7cJXzfz1tgo_G9EPAQ67xa5 zdfvW%ZrrT%wQ29(ytdQU-n@ElwXXik|Jd$)m^PU^`#yS^O#jIBzTx_L=s(TzzQO3b zf0j0nw1|ZCtVs9E6~#ICf4#%;`%EL~f7rY8_WKMZ_?e9Vd6?6F6vz0Q5MF<@_UpMS zbHCL_>R|~sb<{=l~jCzdm-9K_Z;EX7@{rBXOyXt zM@NrHvvw9rt344Pty458{1miRH2+H}Msu%sizH9)&`|I*e@H7#8~kqTEBwALT#?P? z3lixr$YD!t)Zk@A-^GQL2elOew>fcjMR09#)!pc~t0?Ym?%f^5g#uh}EX@~kGkW(H z)Zn4;@B|rm9~3*-j(vMHm>QkV7^oyTYQhA>h#M7pP%@KKy4w@3a3RHodjSu12Rlyf zKyQ8p^Vtet)e778_HGl3KdxseU@qWoTWdbH6<|RrK9Cn&;8@(~gTRJDS&F}8ox~MB z*R@{Z+43IJ?MXhm+BamXaI1%o3f++l##K#fq1&RH=%Zjk{oRh6(`c|ZnvFAP5ojQR zl@t^=;Y8fQjR7f0bVBLr;HoiGj}f#nEhMtG@%0T=V&%PAi8)i89xRpQf?sxGe5J#Zz2F4Dj} z&A4!YFd8aUfcgE9MExg4D0zuHjRiNLu~%obTiC_O zjDUY2R;4?bd&t6r!sYt3f|76d;`mBu8HRtI(YcLgX>vA?8Cv2;j@egdAEn?kIo2(d z5L&OHZvFi)j~|qziaBe=&jem7z~1FZ0C|L?RzQwqQ5+QK4!&BLl-S!-^7C%s^jHCl zp&arSYP^IEPsS+Ja9|4K|LQ}MRH!fD&*VE!1D*_NeEU4GM9Q&idL4M7IY?5L(OA`& z^pn|49Pv2T!h;QYS4NT_nEzC3Pc+0s(#J5^Vl~o+P+HegN2dzcBg<5dWP37mos@{r zj--i!psSh9BAw+8^dTTZ2SVUfmBULYD&Sc&5X3t1BH7JUY_lz_QCbEr|617z*~G_- z7v1eiY_2(&fEKqf&#V?816wl&BMF|$!$cRvAzX-^2qoccap2>EUkn?07*o9^RR44H zFOdhArDYSmPa4sQ9govA=AuyCP_^gxf>@C1>9wk^@#Go$5Ai5Y9Qj{X@X0WzlUlF& zRcx4n>}YAPl$u#!#iONT4b1`@lGu~eCF9U=D6m}`ow-J53Y~bn82OZz?lSdq0cVuj zX9&uLQqZPeYo560RGtGVp<;b1i{kUJ)nlt-OK`SjJh(NeyTRMG_ouOBZiD6r? z-OG~U>R|z?Ymyqt^&->?;Vs{aKBjj-@$4M$L&_E%H@UeZ=yoG?O>F z=h4(_M|$ksG2P-JsBo~iqSs>{HJ_(A zO7}hjfpmtg?wLh(4x8#Zb^>MPFSz$Ss=o6ud4Fj?)`hjONaDu?7(!3 zM5>33$_-#}^E{V*zL9+=GtwnKZ4m6yD3FqPG7yTn&oPXd^0*hVlup|2J(LQ`F5o)X zq%SsB=0z1d1{{po$JN4IA1=a3S)TZ^GxFo(3WL>7r^MVikxsSO@U>Ox!ZPvT2X=~h z{nmiXqn^hO2Km-vNl} z<6;g!58An{nAg|x1WDcVG|$iRV@80xJ&ecyHZtt51X(&lh%_%QkzJemU|9USJSRwL zZ!bLA**Ou6Vdof-iTZ4^&Qe><-Ght~dplBMgcVZ6Q5JF4+_!v!*kgz%J zLs~zJztx*ZHd68k7ncM`!>i$VT+4lL69hI6kGJ|HYOr4UBJ3l@SIGLAl|3EO2)%Wy zdn-g!jvsXvgmSLR-Dr4xg|}kJ+DERpjfz>GUTkA#(NJdU>1oD{N`j@iVi zbop_`kg?UM;qd$YlXQ}g@FiB8;3+rhw0P0!K2p+bZ%0dp)c$(m2l9V%%RMJa0;Di< ziDs#6hpAHCa)yq-0LRuXl@x}6xLseeH*h>M^$AC(qSg(28d)}F=*e?pjcaN;E~#d{ zvdck?acv$+F0f7y8Ks@d4bqCtVf|Y#N(9YDXF%m$>yS;DU}Pq-%ez$uVj|G>0B zEHW25-w+!hzg)9-#h!<;8vM;F_lhTMuM^bsMP>SOY`GrIfEbvI)(|kOg`!n4 zhHpM8u*o^gWQz+AHDbxm8J&MX z^W+QZ1>iu+6WM09WM-DhrBf$_M5eC*M@CTp^-j5X~ir<=1()OkF_(gd8#m}#%)(8qdADItVwY?fSWo5m1dQ!0Amg74?jp-_+zQ~sA6E! zi$*RpK#2CdyV*Fn6R~If(Fsmn4v-4_6zNG@+E6H+q-|Z(dAB!QYi}H`*S2!#V^4~2 zV0C8D&tjR&4`yT&zT=m*?=>2yY9`Fxy)j>-0rN#Jw43Qe+~{C9HO=DDV7!5y_79x# zW|N&jpp$ZHNrGUmYoNm$lxL=22!7S415q9RV(h$JJ1(>M z>J+u^TzOAe@rqpFW|6fvv+ZxP$gXVl{bkzMwoFS{b>HAt`57y+30HGhskYLnqFE03 zT-pu3iO&{3BcQjUXQLsZQb@z+mZW^)hDC=6PKM^HL1NS* z<69wdxm4b2QZIOg)NBuR+Ezb1X2GanVH4&YW1A$1fggC3;@CPRQgk z_pSwvmpU(s%2SHSTdiCx*0}b-SWhl!WQXTde=Ze9$cMKx->Ut$bFv`ih|d-oy7aqB zZ$(GR!)lLVwIg??f)}XITNS40rc!>GLwwu$qMLstl9xB4

p?9?j-;qd_@Iq|IAN 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�|x-gHa$IbyvGKSEgJtrf{vp> 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

;w|$ja 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

R;2v*H!yTle2 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

e9Yy+$?WBotD+=cy;Bf$CS|h@$$g-WwRw$pCp>R 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%0AuT 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%0AZz6}`@}C(k{P*>q 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%0A$oqtWZ(TPN1 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%0ASlEEB^J_* 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 diff --git a/spring-mybatis/src/main/webapp/WEB-INF/web.xml b/spring-mybatis/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index 569b5ef9b1..0000000000 --- a/spring-mybatis/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - myBatisSpringServlet - org.springframework.web.servlet.DispatcherServlet - - contextConfigLocation - /WEB-INF/conf/mybatis-spring.xml - - - - - myBatisSpringServlet - *.html - - - MyBatis-Spring Integration - \ No newline at end of file diff --git a/spring-mybatis/src/main/webapp/index.jsp b/spring-mybatis/src/main/webapp/index.jsp deleted file mode 100644 index b60222e7de..0000000000 --- a/spring-mybatis/src/main/webapp/index.jsp +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - -

- Login     Signup -
- -
-
-
-

Welcome to Online Student Enrollment Application

-

Login to explore the complete features!

-
-
- -
-
- - - \ No newline at end of file diff --git a/spring-rest-embedded-tomcat/pom.xml b/spring-rest-embedded-tomcat/pom.xml deleted file mode 100644 index a8c53dbc3a..0000000000 --- a/spring-rest-embedded-tomcat/pom.xml +++ /dev/null @@ -1,79 +0,0 @@ - - 4.0.0 - org.baeldung.embedded - spring-rest-embedded-tomcat - spring-rest-embedded-tomcat - war - - - com.baeldung - parent-spring-5 - 0.0.1-SNAPSHOT - ../parent-spring-5 - - - - - org.springframework - spring-webmvc - ${spring.version} - - - - javax.servlet - javax.servlet-api - ${servlet.version} - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.library} - - - - org.apache.tomcat.embed - tomcat-embed-core - ${tomcat.version} - test - - - - org.apache.tomcat - tomcat-jasper - ${tomcat.version} - test - - - - org.apache.httpcomponents - httpclient - ${httpclient.version} - - - - org.apache.httpcomponents - httpcore - ${httpcore.version} - - - - org.springframework.boot - spring-boot-starter-test - 1.5.10.RELEASE - test - - - - - - 2.9.2 - 4.0.0 - 9.0.1 - 4.5.3 - 4.4.8 - false - - - \ No newline at end of file diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/AppInitializer.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/AppInitializer.java deleted file mode 100644 index 24bd28166b..0000000000 --- a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/AppInitializer.java +++ /dev/null @@ -1,22 +0,0 @@ -package org.baeldung.embedded.configuration; - -import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; - -public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { - - @Override - protected Class[] getRootConfigClasses() { - return new Class[] { UserConfiguration.class }; - } - - @Override - protected Class[] getServletConfigClasses() { - return null; - } - - @Override - protected String[] getServletMappings() { - return new String[] { "/" }; - } - -} diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/UserConfiguration.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/UserConfiguration.java deleted file mode 100644 index 4c102a74cb..0000000000 --- a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/configuration/UserConfiguration.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.baeldung.embedded.configuration; - -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; - -@Configuration -@EnableWebMvc -@ComponentScan(basePackages = "org.baeldung.embedded") -public class UserConfiguration { - -} diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/controller/UserController.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/controller/UserController.java deleted file mode 100644 index a9a5faa0c6..0000000000 --- a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/controller/UserController.java +++ /dev/null @@ -1,28 +0,0 @@ -package org.baeldung.embedded.controller; - -import org.baeldung.embedded.domain.User; -import org.baeldung.embedded.service.UserService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.RestController; - -@RestController -public class UserController { - - @Autowired - UserService userService; - - @RequestMapping("/") - public String welcome() { - return "Hello World!"; - } - - @RequestMapping(method = RequestMethod.GET, value = "/user/{userName}") - @ResponseBody - public User user(@PathVariable String userName) { - return this.userService.getUser(userName); - } -} diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/domain/User.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/domain/User.java deleted file mode 100644 index 2f9443daea..0000000000 --- a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/domain/User.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.baeldung.embedded.domain; - -public class User { - - private String name; - private String hobby; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getHobby() { - return hobby; - } - - public void setHobby(String hobby) { - this.hobby = hobby; - } -} diff --git a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/service/UserService.java b/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/service/UserService.java deleted file mode 100644 index 76696e12c2..0000000000 --- a/spring-rest-embedded-tomcat/src/main/java/org/baeldung/embedded/service/UserService.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.baeldung.embedded.service; - -import java.util.ArrayList; -import java.util.List; - -import org.baeldung.embedded.domain.User; -import org.springframework.stereotype.Service; - -@Service -public class UserService { - private List users = new ArrayList<>(); - - public void addUser(String name) { - User user = new User(); - user.setName(name); - if (name == "HarryPotter") { - user.setHobby("Quidditch"); - } else { - user.setHobby("MuggleActivity"); - } - users.add(user); - } - - public User getUser(String name) { - for (User user : users) { - if (user.getName() - .equalsIgnoreCase(name)) { - return user; - } - } - - User user = new User(); - user.setName(name); - user.setHobby("None"); - - return user; - } -} diff --git a/spring-rest-embedded-tomcat/src/main/resources/logback.xml b/spring-rest-embedded-tomcat/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/spring-rest-embedded-tomcat/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/spring-rest-embedded-tomcat/src/main/webapp/emptyFile b/spring-rest-embedded-tomcat/src/main/webapp/emptyFile deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 8b8ff1a322..0000000000 --- a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.baeldung; - -import org.baeldung.embedded.configuration.UserConfiguration; -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.web.WebAppConfiguration; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { UserConfiguration.class }) -@WebAppConfiguration -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} diff --git a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatApp.java b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatApp.java deleted file mode 100644 index f340f6c837..0000000000 --- a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatApp.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.baeldung.embedded; - -import java.io.File; -import java.util.concurrent.CountDownLatch; -import org.apache.catalina.Context; -import org.apache.catalina.startup.Tomcat; -import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.context.support.WebApplicationContextUtils; - -public class EmbeddedTomcatApp { - - private Tomcat tomcatInstance; - private WebApplicationContext webApplicationContext; - private CountDownLatch started = new CountDownLatch(1); - - public void start() throws Exception { - tomcatInstance = new Tomcat(); - tomcatInstance.setBaseDir(new File(getClass().getResource(".") - .toURI()).getAbsolutePath()); // Tomcat's temporary directory - tomcatInstance.setPort(0); - - Context webapp = tomcatInstance.addWebapp("", new File("src/main/webapp/").getAbsolutePath()); - - webapp.addLifecycleListener(event -> { - if (event.getType() - .equals("after_stop")) { - started.countDown(); - } else if (event.getType() - .equals("after_start")) { - webApplicationContext = WebApplicationContextUtils - .findWebApplicationContext(webapp.getServletContext()); - - ((ConfigurableListableBeanFactory) webApplicationContext - .getAutowireCapableBeanFactory()).registerSingleton("baseUrl", getBaseUrl()); - - started.countDown(); - } - }); - - tomcatInstance.start(); - started.await(); - } - - public Tomcat getTomcatInstance() { - return this.tomcatInstance; - } - - public String getBaseUrl() { - return String.format("http://localhost:%d%s", getLocalPort(), getWebApplicationContext().getServletContext() - .getContextPath()); - } - - public int getLocalPort() { - return tomcatInstance.getConnector() - .getLocalPort(); - } - - public WebApplicationContext getWebApplicationContext() { - return webApplicationContext; - } - - public boolean isStarted() { - return started.getCount() == 0; - } - - public boolean isStartedSucessfully() { - return webApplicationContext != null; - } -} diff --git a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatRunner.java b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatRunner.java deleted file mode 100644 index 1bf15556e8..0000000000 --- a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/EmbeddedTomcatRunner.java +++ /dev/null @@ -1,45 +0,0 @@ -package org.baeldung.embedded; - -import org.junit.runner.notification.RunNotifier; -import org.junit.runners.BlockJUnit4ClassRunner; -import org.junit.runners.model.InitializationError; -import org.junit.runners.model.Statement; - -public class EmbeddedTomcatRunner extends BlockJUnit4ClassRunner { - - public EmbeddedTomcatRunner(Class klass) throws InitializationError { - super(klass); - } - - // use one static Tomcat instance shared across all tests - private static EmbeddedTomcatApp embeddedTomcatApp = new EmbeddedTomcatApp(); - - @Override - protected Statement classBlock(RunNotifier notifier) { - ensureSharedTomcatStarted(); - Statement result = super.classBlock(notifier); - return result; - } - - private void ensureSharedTomcatStarted() { - if (!embeddedTomcatApp.isStarted()) { - try { - embeddedTomcatApp.start(); - } catch (Exception e) { - throw new RuntimeException("Error while starting embedded Tomcat server", e); - } - } - } - - @Override - protected Object createTest() throws Exception { - if (!embeddedTomcatApp.isStartedSucessfully()) { - throw new RuntimeException("Tomcat server not started successfully. Skipping test"); - } - Object testInstance = super.createTest(); - embeddedTomcatApp.getWebApplicationContext() - .getAutowireCapableBeanFactory() - .autowireBean(testInstance); - return testInstance; - } -} \ No newline at end of file diff --git a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/UserIntegrationTest.java b/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/UserIntegrationTest.java deleted file mode 100644 index 1c5d482171..0000000000 --- a/spring-rest-embedded-tomcat/src/test/java/org/baeldung/embedded/UserIntegrationTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.baeldung.embedded; - -import java.io.IOException; -import java.util.Map; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.HttpStatus; -import org.apache.http.client.HttpClient; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.impl.client.HttpClientBuilder; -import org.apache.http.util.EntityUtils; -import org.baeldung.embedded.service.UserService; -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 com.fasterxml.jackson.databind.ObjectMapper; - -@RunWith(EmbeddedTomcatRunner.class) -public class UserIntegrationTest { - - @Autowired - protected String baseUrl; - - @Autowired - private UserService userService; - - private String userName = "HarryPotter"; - - @Before - public void setUp() { - userService.addUser(userName); - } - - @Test - public void givenUserName_whenSendGetForHarryPotter_thenHobbyQuidditch() throws IOException { - String url = baseUrl + "/user/" + userName; - - HttpClient httpClient = HttpClientBuilder.create() - .build(); - HttpGet getUserRequest = new HttpGet(url); - getUserRequest.addHeader("Content-type", "application/json"); - HttpResponse response = httpClient.execute(getUserRequest); - - Assert.assertEquals(HttpStatus.SC_OK, response.getStatusLine() - .getStatusCode()); - - HttpEntity responseEntity = response.getEntity(); - - Assert.assertNotNull(responseEntity); - - ObjectMapper mapper = new ObjectMapper(); - String retSrc = EntityUtils.toString(responseEntity); - Map result = mapper.readValue(retSrc, Map.class); - - Assert.assertEquals("Quidditch", result.get("hobby")); - } -} diff --git a/sse-jaxrs/pom.xml b/sse-jaxrs/pom.xml deleted file mode 100644 index 68d1b1bc2b..0000000000 --- a/sse-jaxrs/pom.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - 4.0.0 - com.baeldung.sse - sse-jaxrs - 1.0-SNAPSHOT - sse-jaxrs - pom - - - 1.8 - 1.8 - - - - sse-jaxrs-server - sse-jaxrs-client - - - diff --git a/sse-jaxrs/sse-jaxrs-client/pom.xml b/sse-jaxrs/sse-jaxrs-client/pom.xml deleted file mode 100644 index 15a991bfc0..0000000000 --- a/sse-jaxrs/sse-jaxrs-client/pom.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - 4.0.0 - sse-jaxrs-client - sse-jaxrs-client - - - com.baeldung.sse - sse-jaxrs - 1.0-SNAPSHOT - - - - 3.2.0 - - - - - - org.codehaus.mojo - exec-maven-plugin - 1.6.0 - - - singleEvent - - java - - - com.baeldung.sse.jaxrs.client.SseClientApp - - - - broadcast - - java - - - com.baeldung.sse.jaxrs.client.SseClientBroadcastApp - - - - - - - - - - org.apache.cxf - cxf-rt-rs-client - ${cxf-version} - - - org.apache.cxf - cxf-rt-rs-sse - ${cxf-version} - - - - diff --git a/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientApp.java b/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientApp.java deleted file mode 100644 index 5d42b3a243..0000000000 --- a/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientApp.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.baeldung.sse.jaxrs.client; - -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.sse.InboundSseEvent; -import javax.ws.rs.sse.SseEventSource; -import java.util.function.Consumer; - -public class SseClientApp { - - private static final String url = "http://127.0.0.1:9080/sse-jaxrs-server/sse/stock/prices"; - - public static void main(String... args) throws Exception { - - Client client = ClientBuilder.newClient(); - WebTarget target = client.target(url); - try (SseEventSource eventSource = SseEventSource.target(target).build()) { - - eventSource.register(onEvent, onError, onComplete); - eventSource.open(); - - //Consuming events for one hour - Thread.sleep(60 * 60 * 1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - client.close(); - System.out.println("End"); - } - - // A new event is received - private static Consumer onEvent = (inboundSseEvent) -> { - String data = inboundSseEvent.readData(); - System.out.println(data); - }; - - //Error - private static Consumer onError = (throwable) -> { - throwable.printStackTrace(); - }; - - //Connection close and there is nothing to receive - private static Runnable onComplete = () -> { - System.out.println("Done!"); - }; - -} diff --git a/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientBroadcastApp.java b/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientBroadcastApp.java deleted file mode 100644 index 9afc187a6d..0000000000 --- a/sse-jaxrs/sse-jaxrs-client/src/main/java/com/baeldung/sse/jaxrs/client/SseClientBroadcastApp.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.baeldung.sse.jaxrs.client; - -import javax.ws.rs.client.Client; -import javax.ws.rs.client.ClientBuilder; -import javax.ws.rs.client.WebTarget; -import javax.ws.rs.sse.InboundSseEvent; -import javax.ws.rs.sse.SseEventSource; -import java.util.concurrent.TimeUnit; -import java.util.function.Consumer; - -public class SseClientBroadcastApp { - - private static final String subscribeUrl = "http://localhost:9080/sse-jaxrs-server/sse/stock/subscribe"; - - - public static void main(String... args) throws Exception { - - Client client = ClientBuilder.newClient(); - WebTarget target = client.target(subscribeUrl); - try (final SseEventSource eventSource = SseEventSource.target(target) - .reconnectingEvery(5, TimeUnit.SECONDS) - .build()) { - eventSource.register(onEvent, onError, onComplete); - eventSource.open(); - System.out.println("Wainting for incoming event ..."); - - //Consuming events for one hour - Thread.sleep(60 * 60 * 1000); - } catch (InterruptedException e) { - e.printStackTrace(); - } - client.close(); - System.out.println("End"); - } - - // A new event is received - private static Consumer onEvent = (inboundSseEvent) -> { - String data = inboundSseEvent.readData(); - System.out.println(data); - }; - - //Error - private static Consumer onError = (throwable) -> { - throwable.printStackTrace(); - }; - - //Connection close and there is nothing to receive - private static Runnable onComplete = () -> { - System.out.println("Done!"); - }; - -} diff --git a/sse-jaxrs/sse-jaxrs-client/src/main/resources/logback.xml b/sse-jaxrs/sse-jaxrs-client/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/sse-jaxrs/sse-jaxrs-client/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/sse-jaxrs/sse-jaxrs-server/pom.xml b/sse-jaxrs/sse-jaxrs-server/pom.xml deleted file mode 100644 index 825dcddbdf..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/pom.xml +++ /dev/null @@ -1,85 +0,0 @@ - - - 4.0.0 - sse-jaxrs-server - war - sse-jaxrs-server - - - com.baeldung.sse - sse-jaxrs - 1.0-SNAPSHOT - - - - 2.4.2 - false - 18.0.0.2 - - - - ${artifactId} - - - net.wasdev.wlp.maven.plugins - liberty-maven-plugin - ${liberty-maven-plugin.version} - - - io.openliberty - openliberty-webProfile8 - ${openliberty-version} - zip - - project - true - src/main/liberty/config/server.xml - - - - install-server - prepare-package - - install-server - create-server - install-feature - - - - install-apps - package - - install-apps - - - - - - - - - - - javax.ws.rs - javax.ws.rs-api - 2.1 - provided - - - javax.enterprise - cdi-api - 2.0 - provided - - - javax.json.bind - javax.json.bind-api - 1.0 - provided - - - - - diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/AppConfig.java b/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/AppConfig.java deleted file mode 100644 index 058d19f045..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/AppConfig.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.baeldung.sse.jaxrs; - -import javax.ws.rs.ApplicationPath; -import javax.ws.rs.core.Application; - -@ApplicationPath("sse") -public class AppConfig extends Application { -} diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/SseResource.java b/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/SseResource.java deleted file mode 100644 index 1f60168a1b..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/SseResource.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.baeldung.sse.jaxrs; - -import javax.enterprise.context.ApplicationScoped; -import javax.inject.Inject; -import javax.ws.rs.*; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.sse.OutboundSseEvent; -import javax.ws.rs.sse.Sse; -import javax.ws.rs.sse.SseBroadcaster; -import javax.ws.rs.sse.SseEventSink; - -@ApplicationScoped -@Path("stock") -public class SseResource { - - @Inject - private StockService stockService; - - private Sse sse; - private SseBroadcaster sseBroadcaster; - private OutboundSseEvent.Builder eventBuilder; - - @Context - public void setSse(Sse sse) { - this.sse = sse; - this.eventBuilder = sse.newEventBuilder(); - this.sseBroadcaster = sse.newBroadcaster(); - } - - @GET - @Path("prices") - @Produces("text/event-stream") - public void getStockPrices(@Context SseEventSink sseEventSink, - @HeaderParam(HttpHeaders.LAST_EVENT_ID_HEADER) @DefaultValue("-1") int lastReceivedId) { - - int lastEventId = 1; - if (lastReceivedId != -1) { - lastEventId = ++lastReceivedId; - } - boolean running = true; - while (running) { - Stock stock = stockService.getNextTransaction(lastEventId); - if (stock != null) { - OutboundSseEvent sseEvent = this.eventBuilder - .name("stock") - .id(String.valueOf(lastEventId)) - .mediaType(MediaType.APPLICATION_JSON_TYPE) - .data(Stock.class, stock) - .reconnectDelay(3000) - .comment("price change") - .build(); - sseEventSink.send(sseEvent); - lastEventId++; - } - //Simulate connection close - if (lastEventId % 5 == 0) { - sseEventSink.close(); - break; - } - - try { - //Wait 5 seconds - Thread.sleep(5 * 1000); - } catch (InterruptedException ex) { - // ... - } - //Simulatae a while boucle break - running = lastEventId <= 2000; - } - sseEventSink.close(); - } - - @GET - @Path("subscribe") - @Produces(MediaType.SERVER_SENT_EVENTS) - public void listen(@Context SseEventSink sseEventSink) { - sseEventSink.send(sse.newEvent("Welcome !")); - this.sseBroadcaster.register(sseEventSink); - sseEventSink.send(sse.newEvent("You are registred !")); - } - - @GET - @Path("publish") - public void broadcast() { - Runnable r = new Runnable() { - @Override - public void run() { - int lastEventId = 0; - boolean running = true; - while (running) { - lastEventId++; - Stock stock = stockService.getNextTransaction(lastEventId); - if (stock != null) { - OutboundSseEvent sseEvent = eventBuilder - .name("stock") - .id(String.valueOf(lastEventId)) - .mediaType(MediaType.APPLICATION_JSON_TYPE) - .data(Stock.class, stock) - .reconnectDelay(3000) - .comment("price change") - .build(); - sseBroadcaster.broadcast(sseEvent); - } - try { - //Wait 5 seconds - Thread.currentThread().sleep(5 * 1000); - } catch (InterruptedException ex) { - // ... - } - //Simulatae a while boucle break - running = lastEventId <= 2000; - } - } - }; - new Thread(r).start(); - } -} diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/Stock.java b/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/Stock.java deleted file mode 100644 index a186b32771..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/Stock.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.baeldung.sse.jaxrs; - -import java.math.BigDecimal; -import java.time.LocalDateTime; - -public class Stock { - private Integer id; - private String name; - private BigDecimal price; - LocalDateTime dateTime; - - public Stock(Integer id, String name, BigDecimal price, LocalDateTime dateTime) { - this.id = id; - this.name = name; - this.price = price; - this.dateTime = dateTime; - } - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public BigDecimal getPrice() { - return price; - } - - public void setPrice(BigDecimal price) { - this.price = price; - } - - public LocalDateTime getDateTime() { - return dateTime; - } - - public void setDateTime(LocalDateTime dateTime) { - this.dateTime = dateTime; - } -} diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/StockService.java b/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/StockService.java deleted file mode 100644 index 15818ead5d..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/java/com/baeldung/sse/jaxrs/StockService.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.baeldung.sse.jaxrs; - -import javax.enterprise.context.ApplicationScoped; -import javax.enterprise.context.Initialized; -import javax.enterprise.event.Event; -import javax.enterprise.event.Observes; -import javax.inject.Inject; -import javax.inject.Named; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Random; -import java.util.concurrent.atomic.AtomicInteger; - -@ApplicationScoped -@Named -public class StockService { - - private static final BigDecimal UP = BigDecimal.valueOf(1.05f); - private static final BigDecimal DOWN = BigDecimal.valueOf(0.95f); - - List stockNames = Arrays.asList("GOOG", "IBM", "MS", "GOOG", "YAHO"); - List stocksDB = new ArrayList<>(); - private AtomicInteger counter = new AtomicInteger(0); - - public void init(@Observes @Initialized(ApplicationScoped.class) Object init) { - //Open price - System.out.println("@Start Init ..."); - stockNames.forEach(stockName -> { - stocksDB.add(new Stock(counter.incrementAndGet(), stockName, generateOpenPrice(), LocalDateTime.now())); - }); - - Runnable runnable = new Runnable() { - @Override - public void run() { - //Simulate Change price and put every x seconds - while (true) { - int indx = new Random().nextInt(stockNames.size()); - String stockName = stockNames.get(indx); - BigDecimal price = getLastPrice(stockName); - BigDecimal newprice = changePrice(price); - Stock stock = new Stock(counter.incrementAndGet(), stockName, newprice, LocalDateTime.now()); - stocksDB.add(stock); - - int r = new Random().nextInt(30); - try { - Thread.currentThread().sleep(r*1000); - } catch (InterruptedException ex) { - // ... - } - } - } - }; - new Thread(runnable).start(); - System.out.println("@End Init ..."); - } - - public Stock getNextTransaction(Integer lastEventId) { - return stocksDB.stream().filter(s -> s.getId().equals(lastEventId)).findFirst().orElse(null); - } - - BigDecimal generateOpenPrice() { - float min = 70; - float max = 120; - return BigDecimal.valueOf(min + new Random().nextFloat() * (max - min)).setScale(4,RoundingMode.CEILING); - } - - BigDecimal changePrice(BigDecimal price) { - return Math.random() >= 0.5 ? price.multiply(UP).setScale(4,RoundingMode.CEILING) : price.multiply(DOWN).setScale(4,RoundingMode.CEILING); - } - - private BigDecimal getLastPrice(String stockName) { - return stocksDB.stream().filter(stock -> stock.getName().equals(stockName)).findFirst().get().getPrice(); - } -} diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/liberty/config/server.xml b/sse-jaxrs/sse-jaxrs-server/src/main/liberty/config/server.xml deleted file mode 100644 index 9bf66d7795..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/liberty/config/server.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - jaxrs-2.1 - cdi-2.0 - - - diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/resources/META-INF/beans.xml b/sse-jaxrs/sse-jaxrs-server/src/main/resources/META-INF/beans.xml deleted file mode 100644 index 4f0b3cdeeb..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/resources/META-INF/beans.xml +++ /dev/null @@ -1,6 +0,0 @@ - - \ No newline at end of file diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/resources/logback.xml b/sse-jaxrs/sse-jaxrs-server/src/main/resources/logback.xml deleted file mode 100644 index 7d900d8ea8..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/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/sse-jaxrs/sse-jaxrs-server/src/main/webapp/WEB-INF/web.xml b/sse-jaxrs/sse-jaxrs-server/src/main/webapp/WEB-INF/web.xml deleted file mode 100644 index b4b8121fdd..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/webapp/WEB-INF/web.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - Hello Servlet - - - index.html - - - diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/webapp/index.html b/sse-jaxrs/sse-jaxrs-server/src/main/webapp/index.html deleted file mode 100644 index 9015a7a32c..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/webapp/index.html +++ /dev/null @@ -1 +0,0 @@ -index diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse-broadcast.html b/sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse-broadcast.html deleted file mode 100644 index 5a46e2a5d3..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse-broadcast.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - Server-Sent Event Broadcasting - - -

Stock prices :

-
-
    -
-
- - - \ No newline at end of file diff --git a/sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse.html b/sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse.html deleted file mode 100644 index 8fddae4717..0000000000 --- a/sse-jaxrs/sse-jaxrs-server/src/main/webapp/sse.html +++ /dev/null @@ -1,38 +0,0 @@ - - - - Server-Sent Event - - -

Stock prices :

-
-
    -
-
- - - \ No newline at end of file From 12e2e0903323a58a84c50aed926322c425c1540d Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Sun, 16 Dec 2018 20:27:29 +0530 Subject: [PATCH 300/429] Java 11 String APIs --- .../com/baeldung/NewStringAPIUnitTest.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 core-java-11/src/test/java/com/baeldung/NewStringAPIUnitTest.java diff --git a/core-java-11/src/test/java/com/baeldung/NewStringAPIUnitTest.java b/core-java-11/src/test/java/com/baeldung/NewStringAPIUnitTest.java new file mode 100644 index 0000000000..43e9022a64 --- /dev/null +++ b/core-java-11/src/test/java/com/baeldung/NewStringAPIUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung; + +import static org.hamcrest.CoreMatchers.is; + +import static org.junit.Assert.assertTrue; + +import org.junit.Test; + +public class NewStringAPIUnitTest { + + @Test + public void whenRepeatStringTwice_thenGetStringTwice() { + String output = "La ".repeat(2) + "Land"; + + is(output).equals("La La Land"); + } + + @Test + public void whenStripString_thenReturnStringWithoutWhitespaces() { + is("\n\t hello \u2005".strip()).equals("hello"); + } + + @Test + public void whenTrimAdvanceString_thenReturnStringWithWhitespaces() { + is("\n\t hello \u2005".trim()).equals("hello \u2005"); + } + + @Test + public void whenBlankString_thenReturnTrue() { + assertTrue("\n\t\u2005 ".isBlank()); + } + + @Test + public void whenMultilineString_thenReturnNonEmptyLineCount() { + String multilineStr = "This is\n \n a multiline\n string."; + + long lineCount = multilineStr.lines() + .filter(String::isBlank) + .count(); + + is(lineCount).equals(3L); + } +} \ No newline at end of file From 53dc48b94a087ddba0588a76615fe979978bdff1 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 16 Dec 2018 17:13:50 +0200 Subject: [PATCH 301/429] fix cassandra parent --- .../spring-data-cassandra-reactive/pom.xml | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml index 037b1fd3c1..1c15f4893f 100644 --- a/persistence-modules/spring-data-cassandra-reactive/pom.xml +++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml @@ -13,9 +13,10 @@ Spring Data Cassandra reactive - org.springframework.boot - spring-boot-starter-parent - 2.1.0.RELEASE + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 @@ -57,14 +58,5 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - - - From ca3a38aa0adaea158a69a29594206b14bf2ea941 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 16 Dec 2018 17:20:58 +0200 Subject: [PATCH 302/429] move ftp file --- .../src/test/resources/ftp/baz.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {libraries-apache-commons => libraries}/src/test/resources/ftp/baz.txt (100%) diff --git a/libraries-apache-commons/src/test/resources/ftp/baz.txt b/libraries/src/test/resources/ftp/baz.txt similarity index 100% rename from libraries-apache-commons/src/test/resources/ftp/baz.txt rename to libraries/src/test/resources/ftp/baz.txt From d8e34dc9f2c8c5fabbf3172974d9da80bfd21117 Mon Sep 17 00:00:00 2001 From: Laurentiu Delcea Date: Sun, 16 Dec 2018 18:22:22 +0200 Subject: [PATCH 303/429] BAEL-2376 Inline classes in kotlin (#5842) * BAEL-2376 Inline classes in kotlin * BAEL-2376 Move classes --- .../baeldung/inline/classes/CircleRadius.kt | 14 ++++++++++++++ .../inline/classes/InlineDoubleWrapper.kt | 3 +++ .../inline/classes/CircleRadiusTest.kt | 19 +++++++++++++++++++ .../inline/classes/InlineDoubleWrapperTest.kt | 13 +++++++++++++ 4 files changed, 49 insertions(+) create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/inline/classes/CircleRadius.kt create mode 100644 core-kotlin/src/main/kotlin/com/baeldung/inline/classes/InlineDoubleWrapper.kt create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/inline/classes/CircleRadiusTest.kt create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/inline/classes/InlineDoubleWrapperTest.kt diff --git a/core-kotlin/src/main/kotlin/com/baeldung/inline/classes/CircleRadius.kt b/core-kotlin/src/main/kotlin/com/baeldung/inline/classes/CircleRadius.kt new file mode 100644 index 0000000000..5b46b9570f --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/inline/classes/CircleRadius.kt @@ -0,0 +1,14 @@ +package com.baeldung.inline.classes + +interface Drawable { + fun draw() +} + +inline class CircleRadius(private val circleRadius : Double) : Drawable { + val diameterOfCircle get() = 2 * circleRadius + fun areaOfCircle() = 3.14 * circleRadius * circleRadius + + override fun draw() { + println("Draw my circle") + } +} \ No newline at end of file diff --git a/core-kotlin/src/main/kotlin/com/baeldung/inline/classes/InlineDoubleWrapper.kt b/core-kotlin/src/main/kotlin/com/baeldung/inline/classes/InlineDoubleWrapper.kt new file mode 100644 index 0000000000..430fa509da --- /dev/null +++ b/core-kotlin/src/main/kotlin/com/baeldung/inline/classes/InlineDoubleWrapper.kt @@ -0,0 +1,3 @@ +package com.baeldung.inline.classes + +inline class InlineDoubleWrapper(val doubleValue : Double) \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/inline/classes/CircleRadiusTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/inline/classes/CircleRadiusTest.kt new file mode 100644 index 0000000000..8de378b6dd --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/inline/classes/CircleRadiusTest.kt @@ -0,0 +1,19 @@ +package com.baeldung.inline.classes + +import org.junit.Test +import kotlin.test.assertEquals + +class CircleRadiusTest { + + @Test + fun givenRadius_ThenDiameterIsCorrectlyCalculated() { + val radius = CircleRadius(5.0) + assertEquals(10.0, radius.diameterOfCircle) + } + + @Test + fun givenRadius_ThenAreaIsCorrectlyCalculated() { + val radius = CircleRadius(5.0) + assertEquals(78.5, radius.areaOfCircle()) + } +} \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/inline/classes/InlineDoubleWrapperTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/inline/classes/InlineDoubleWrapperTest.kt new file mode 100644 index 0000000000..349c90d6f4 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/inline/classes/InlineDoubleWrapperTest.kt @@ -0,0 +1,13 @@ +package com.baeldung.inline.classes + +import org.junit.Test +import kotlin.test.assertEquals + +class InlineDoubleWrapperTest { + + @Test + fun whenInclineClassIsUsed_ThenPropertyIsReadCorrectly() { + val piDoubleValue = InlineDoubleWrapper(3.14) + assertEquals(3.14, piDoubleValue.doubleValue) + } +} \ No newline at end of file From a40c2f2601aa384bd285a97a30b2311306b1a325 Mon Sep 17 00:00:00 2001 From: Loredana Date: Sun, 16 Dec 2018 20:11:53 +0200 Subject: [PATCH 304/429] fix pom --- persistence-modules/spring-data-cassandra-reactive/pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/spring-data-cassandra-reactive/pom.xml b/persistence-modules/spring-data-cassandra-reactive/pom.xml index 1c15f4893f..5303f9a53a 100644 --- a/persistence-modules/spring-data-cassandra-reactive/pom.xml +++ b/persistence-modules/spring-data-cassandra-reactive/pom.xml @@ -17,7 +17,6 @@ parent-boot-2 0.0.1-SNAPSHOT ../../parent-boot-2 - From 78735f582b7bf256e53628d5856296580e42ed8e Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 16 Dec 2018 23:57:08 +0530 Subject: [PATCH 305/429] [BAEL-10866] - Upgrade jackson version in tutorials repository --- apache-curator/pom.xml | 2 +- core-java-io/pom.xml | 2 +- core-java-lang/pom.xml | 2 +- core-java-sun/pom.xml | 2 +- core-java/pom.xml | 2 +- couchbase/pom.xml | 2 +- ethereum/pom.xml | 4 ++-- guest/log4j2-example/pom.xml | 2 +- java-lite/pom.xml | 2 +- libraries-data/pom.xml | 2 +- libraries/pom.xml | 2 +- logging-modules/log-mdc/pom.xml | 2 +- logging-modules/log4j2/pom.xml | 2 +- logging-modules/logback/pom.xml | 2 +- persistence-modules/hibernate5/pom.xml | 2 +- pom.xml | 2 +- rest-with-spark-java/pom.xml | 4 ++-- spring-jersey/pom.xml | 4 ++-- spring-kafka/pom.xml | 2 +- spring-mvc-simple/pom.xml | 2 +- spring-rest-embedded-tomcat/pom.xml | 2 +- spring-security-mvc-custom/pom.xml | 2 +- spring-security-mvc-socket/pom.xml | 2 +- spring-security-rest/pom.xml | 2 +- .../spring-swagger-codegen-api-client/pom.xml | 2 +- testing-modules/rest-assured/pom.xml | 2 +- testing-modules/rest-testing/pom.xml | 2 +- video-tutorials/jackson-annotations/pom.xml | 2 +- 28 files changed, 31 insertions(+), 31 deletions(-) diff --git a/apache-curator/pom.xml b/apache-curator/pom.xml index bcca38b199..e6be32277d 100644 --- a/apache-curator/pom.xml +++ b/apache-curator/pom.xml @@ -59,7 +59,7 @@ 4.0.1 3.4.11 - 2.9.4 + 2.9.7 3.6.1 1.7.0 diff --git a/core-java-io/pom.xml b/core-java-io/pom.xml index efa32b8e3e..ac5f1f7c2e 100644 --- a/core-java-io/pom.xml +++ b/core-java-io/pom.xml @@ -236,7 +236,7 @@ - 2.8.5 + 2.9.7 3.5 diff --git a/core-java-lang/pom.xml b/core-java-lang/pom.xml index 2f307859f1..d00eb7ca72 100644 --- a/core-java-lang/pom.xml +++ b/core-java-lang/pom.xml @@ -409,7 +409,7 @@ - 2.8.5 + 2.9.7 2.8.2 diff --git a/core-java-sun/pom.xml b/core-java-sun/pom.xml index 57d5e9da5b..ef68c947ce 100644 --- a/core-java-sun/pom.xml +++ b/core-java-sun/pom.xml @@ -262,7 +262,7 @@ - 2.8.5 + 2.9.7 23.0 diff --git a/core-java/pom.xml b/core-java/pom.xml index 64345ab14c..5bf5699cc3 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -482,7 +482,7 @@ - 2.8.5 + 2.9.7 2.8.2 diff --git a/couchbase/pom.xml b/couchbase/pom.xml index 4f0f8787ca..7da027597e 100644 --- a/couchbase/pom.xml +++ b/couchbase/pom.xml @@ -70,7 +70,7 @@ 2.5.0 4.3.5.RELEASE 3.5 - 2.9.1 + 2.9.7 diff --git a/ethereum/pom.xml b/ethereum/pom.xml index bd1bacb221..85cb260670 100644 --- a/ethereum/pom.xml +++ b/ethereum/pom.xml @@ -215,9 +215,9 @@ 5.0.5.RELEASE 1.5.6.RELEASE 2.21.0 - 2.5.0 + 2.9.7 1.3 - 2.9.3 + 2.9.7 2.3.1 3.1.0 2.4.0 diff --git a/guest/log4j2-example/pom.xml b/guest/log4j2-example/pom.xml index ab55e0b60e..045ff7325b 100644 --- a/guest/log4j2-example/pom.xml +++ b/guest/log4j2-example/pom.xml @@ -41,7 +41,7 @@ - 2.8.8.1 + 2.9.7 2.8.2 diff --git a/java-lite/pom.xml b/java-lite/pom.xml index 03f4e29f4e..b261e521a1 100644 --- a/java-lite/pom.xml +++ b/java-lite/pom.xml @@ -95,7 +95,7 @@ 1.15 5.1.45 1.7.0 - 1.8.2 + 2.9.7 1.15 diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 54d24edbf6..1a7833a0da 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -449,7 +449,7 @@ 2.8.2 1.1.0 1.5.0 - 2.8.5 + 2.9.7 3.0.0 3.6.2 3.8.4 diff --git a/libraries/pom.xml b/libraries/pom.xml index 2ad4871e3f..b2e6552644 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -823,7 +823,7 @@ 1.0 4.5.3 - 2.8.5 + 2.9.7 2.92 1.9.26 1.41.0 diff --git a/logging-modules/log-mdc/pom.xml b/logging-modules/log-mdc/pom.xml index 8e9968085e..3031274d0b 100644 --- a/logging-modules/log-mdc/pom.xml +++ b/logging-modules/log-mdc/pom.xml @@ -103,7 +103,7 @@ 3.3.6 3.3.0.Final 3.1.0 - 2.8.5 + 2.9.7 2.4 diff --git a/logging-modules/log4j2/pom.xml b/logging-modules/log4j2/pom.xml index d46f92dcd6..924abfd346 100644 --- a/logging-modules/log4j2/pom.xml +++ b/logging-modules/log4j2/pom.xml @@ -115,7 +115,7 @@ - 2.9.5 + 2.9.7 1.4.193 2.1.1 2.11.0 diff --git a/logging-modules/logback/pom.xml b/logging-modules/logback/pom.xml index e917754b3c..ef7adbc3ea 100644 --- a/logging-modules/logback/pom.xml +++ b/logging-modules/logback/pom.xml @@ -42,7 +42,7 @@ 1.2.3 0.1.5 - 2.9.3 + 2.9.7 diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index f5a3a7e4c9..d7b3cb85c6 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -84,7 +84,7 @@ 2.2.3 1.4.196 3.8.0 - 2.8.11.3 + 2.9.7 diff --git a/pom.xml b/pom.xml index 57487f00cc..d07d1728b4 100644 --- a/pom.xml +++ b/pom.xml @@ -1610,7 +1610,7 @@ 2.3.1 1.9.13 1.2 - 2.5.0 + 2.9.7 1.3 1.2.0 5.2.0 diff --git a/rest-with-spark-java/pom.xml b/rest-with-spark-java/pom.xml index a0005b7dec..f7c91f8827 100644 --- a/rest-with-spark-java/pom.xml +++ b/rest-with-spark-java/pom.xml @@ -34,8 +34,8 @@ 2.5.4 - 2.8.6 - 2.8.6 + 2.9.7 + 2.9.7 diff --git a/spring-jersey/pom.xml b/spring-jersey/pom.xml index 5e7b50d291..b548de3701 100644 --- a/spring-jersey/pom.xml +++ b/spring-jersey/pom.xml @@ -101,12 +101,12 @@ com.fasterxml.jackson.jaxrs jackson-jaxrs-json-provider - 2.6.0 + 2.9.7 com.fasterxml.jackson.core jackson-databind - 2.6.0 + 2.9.7 org.slf4j diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index 3060dc00b3..be16da5ff0 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -35,7 +35,7 @@ 1.1.3.RELEASE - 2.6.7 + 2.9.7 \ No newline at end of file diff --git a/spring-mvc-simple/pom.xml b/spring-mvc-simple/pom.xml index 8d7ad0fa7f..65fa4339d6 100644 --- a/spring-mvc-simple/pom.xml +++ b/spring-mvc-simple/pom.xml @@ -196,7 +196,7 @@ 1.2.5 1.0.2 1.9.0 - 2.9.4 + 2.9.7 1.4.9 5.1.0 20180130 diff --git a/spring-rest-embedded-tomcat/pom.xml b/spring-rest-embedded-tomcat/pom.xml index a8c53dbc3a..a4e2c739a1 100644 --- a/spring-rest-embedded-tomcat/pom.xml +++ b/spring-rest-embedded-tomcat/pom.xml @@ -68,7 +68,7 @@ - 2.9.2 + 2.9.7 4.0.0 9.0.1 4.5.3 diff --git a/spring-security-mvc-custom/pom.xml b/spring-security-mvc-custom/pom.xml index a1a1beb4f4..12520a0d01 100644 --- a/spring-security-mvc-custom/pom.xml +++ b/spring-security-mvc-custom/pom.xml @@ -202,7 +202,7 @@ 19.0 3.5 - 2.9.4 + 2.9.7 2.6 diff --git a/spring-security-mvc-socket/pom.xml b/spring-security-mvc-socket/pom.xml index d1b8365077..b83f10d9fe 100644 --- a/spring-security-mvc-socket/pom.xml +++ b/spring-security-mvc-socket/pom.xml @@ -188,7 +188,7 @@ 1.11.3.RELEASE 1.4.196 1.2.3 - 2.8.7 + 2.9.7 \ No newline at end of file diff --git a/spring-security-rest/pom.xml b/spring-security-rest/pom.xml index ef16f2201b..37c743e896 100644 --- a/spring-security-rest/pom.xml +++ b/spring-security-rest/pom.xml @@ -281,7 +281,7 @@ 3.1.0 1.1.0.Final 1.2 - 2.9.2 + 2.9.7 26.0-jre diff --git a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml index 06a92ffae7..c175ea48b3 100644 --- a/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml +++ b/spring-swagger-codegen/spring-swagger-codegen-api-client/pom.xml @@ -189,7 +189,7 @@ 1.5.15 4.3.9.RELEASE - 2.8.9 + 2.9.7 2.9.9 2.2 1.5 diff --git a/testing-modules/rest-assured/pom.xml b/testing-modules/rest-assured/pom.xml index ed7e5e3577..687a9a2fe4 100644 --- a/testing-modules/rest-assured/pom.xml +++ b/testing-modules/rest-assured/pom.xml @@ -171,7 +171,7 @@ - 2.8.5 + 2.9.7 1.8 19.0 diff --git a/testing-modules/rest-testing/pom.xml b/testing-modules/rest-testing/pom.xml index 9bfd715682..2fa303a98e 100644 --- a/testing-modules/rest-testing/pom.xml +++ b/testing-modules/rest-testing/pom.xml @@ -151,7 +151,7 @@ - 2.8.5 + 2.9.7 19.0 diff --git a/video-tutorials/jackson-annotations/pom.xml b/video-tutorials/jackson-annotations/pom.xml index 121609ad4d..b0e1c7e8d9 100644 --- a/video-tutorials/jackson-annotations/pom.xml +++ b/video-tutorials/jackson-annotations/pom.xml @@ -138,7 +138,7 @@ - 2.8.5 + 2.9.7 2.9.6 From 997f1fcb5910ca592096d890335c4f442e2fea2b Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Sun, 16 Dec 2018 20:42:33 +0100 Subject: [PATCH 306/429] merge --- .../main/java/com/baeldung/akkahttp/User.java | 18 ++--- .../com/baeldung/akkahttp/UserMessages.java | 81 +++++++------------ .../com/baeldung/akkahttp/UserServer.java | 38 +++++---- .../com/baeldung/akkahttp/UserService.java | 31 +++++++ .../baeldung/akkahttp/UserServerUnitTest.java | 4 +- 5 files changed, 87 insertions(+), 85 deletions(-) diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/User.java b/akka-http/src/main/java/com/baeldung/akkahttp/User.java index 9b5b95ebc1..43c21eca62 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/User.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/User.java @@ -1,30 +1,26 @@ package com.baeldung.akkahttp; -/** - * User Entity - * - */ public class User { + private final Long id; + private final String name; - private final String address; public User() { this.name = ""; - this.address = ""; + this.id = null; } - public User(String name, String address) { + public User(Long id, String name) { this.name = name; - this.address = address; + this.id = id; } public String getName() { return name; } - public String getAddress() { - return address; + public Long getId() { + return id; } - } \ No newline at end of file diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserMessages.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserMessages.java index 1f88e5f646..995b92bcb0 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/UserMessages.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserMessages.java @@ -2,71 +2,48 @@ package com.baeldung.akkahttp; import java.io.Serializable; -/** - * Defines all messages related to User Actor - * - */ -public interface UserRegistryMessages { +public interface UserMessages { - class GetUsers implements Serializable { + class ActionPerformed implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; + + private final String description; + + public ActionPerformed(String description) { + this.description = description; } - class ActionPerformed implements Serializable { + public String getDescription() { + return description; + } + } - private static final long serialVersionUID = 1L; + class CreateUserMessage implements Serializable { - private final String description; + private static final long serialVersionUID = 1L; + private final User user; - public ActionPerformed(String description) { - this.description = description; - } - - public String getDescription() { - return description; - } + public CreateUserMessage(User user) { + this.user = user; } - class CreateUser implements Serializable { + public User getUser() { + return user; + } + } - private static final long serialVersionUID = 1L; - private final User user; + class GetUserMessage implements Serializable { + private static final long serialVersionUID = 1L; + private final Long userId; - public CreateUser(User user) { - this.user = user; - } - - public User getUser() { - return user; - } + public GetUserMessage(Long userId) { + this.userId = userId; } - class GetUser implements Serializable { - - private static final long serialVersionUID = 1L; - private final String name; - - public GetUser(String name) { - this.name = name; - } - - public String getName() { - return name; - } + public Long getUserId() { + return userId; } + } - class DeleteUser implements Serializable { - - private static final long serialVersionUID = 1L; - private final String name; - - public DeleteUser(String name) { - this.name = name; - } - - public String getName() { - return name; - } - } } diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserServer.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserServer.java index 151c92826d..0c1dbd1f60 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/UserServer.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserServer.java @@ -5,37 +5,39 @@ import java.util.concurrent.CompletionStage; import java.util.concurrent.TimeUnit; import akka.actor.ActorRef; +import akka.actor.ActorSystem; import akka.http.javadsl.marshallers.jackson.Jackson; import akka.http.javadsl.model.StatusCodes; -import akka.http.javadsl.server.AllDirectives; +import akka.http.javadsl.server.HttpApp; import akka.http.javadsl.server.Route; import akka.pattern.PatternsCS; import akka.util.Timeout; import com.baeldung.akkahttp.UserMessages.ActionPerformed; -import com.baeldung.akkahttp.UserMessages.CreateUser; +import com.baeldung.akkahttp.UserMessages.CreateUserMessage; +import com.baeldung.akkahttp.UserMessages.GetUserMessage; import scala.concurrent.duration.Duration; import static akka.http.javadsl.server.PathMatchers.*; -class UserRoutes extends AllDirectives { +class UserServer extends HttpApp { private final ActorRef userActor; Timeout timeout = new Timeout(Duration.create(5, TimeUnit.SECONDS)); - UserRoutes(ActorRef userActor) { + UserServer(ActorRef userActor) { this.userActor = userActor; } - Route routes() { + @Override + public Route routes() { return path("users", this::postUser) .orElse(path(segment("users").slash(longSegment()), id -> - route(getUser(id), - deleteUser(id)))); + route(getUser(id)))); } private Route getUser(Long id) { return get(() -> { - CompletionStage> user = PatternsCS.ask(userActor, new UserMessages.GetUser(id), timeout) + CompletionStage> user = PatternsCS.ask(userActor, new GetUserMessage(id), timeout) .thenApply(obj -> (Optional) obj); return onSuccess(() -> user, performed -> { @@ -47,20 +49,9 @@ class UserRoutes extends AllDirectives { }); } - private Route deleteUser(Long id) { - return delete(() -> { - CompletionStage userDeleted = PatternsCS.ask(userActor, new UserMessages.DeleteUser(id), timeout) - .thenApply(obj -> (ActionPerformed) obj); - - return onSuccess(() -> userDeleted, performed -> { - return complete(StatusCodes.OK, performed, Jackson.marshaller()); - }); - }); - } - private Route postUser() { return route(post(() -> entity(Jackson.unmarshaller(User.class), user -> { - CompletionStage userCreated = PatternsCS.ask(userActor, new CreateUser(user), timeout) + CompletionStage userCreated = PatternsCS.ask(userActor, new CreateUserMessage(user), timeout) .thenApply(obj -> (ActionPerformed) obj); return onSuccess(() -> userCreated, performed -> { @@ -69,4 +60,11 @@ class UserRoutes extends AllDirectives { }))); } + public static void main(String[] args) throws Exception { + ActorSystem system = ActorSystem.create("userServer"); + ActorRef userActor = system.actorOf(UserActor.props(), "userActor"); + UserServer server = new UserServer(userActor); + server.startServer("localhost", 8080, system); + } + } diff --git a/akka-http/src/main/java/com/baeldung/akkahttp/UserService.java b/akka-http/src/main/java/com/baeldung/akkahttp/UserService.java index 67979dc76e..50dc1e1b28 100644 --- a/akka-http/src/main/java/com/baeldung/akkahttp/UserService.java +++ b/akka-http/src/main/java/com/baeldung/akkahttp/UserService.java @@ -1,4 +1,35 @@ package com.baeldung.akkahttp; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + public class UserService { + + private final static List users = new ArrayList<>(); + + static { + users.add(new User(1l, "Alice")); + users.add(new User(2l, "Bob")); + users.add(new User(3l, "Chris")); + users.add(new User(4l, "Dick")); + users.add(new User(5l, "Eve")); + users.add(new User(6l, "Finn")); + } + + public Optional getUser(Long id) { + return users.stream() + .filter(user -> user.getId() + .equals(id)) + .findFirst(); + } + + public void createUser(User user) { + users.add(user); + } + + public List getUsers(){ + return users; + } + } diff --git a/akka-http/src/test/java/com/baeldung/akkahttp/UserServerUnitTest.java b/akka-http/src/test/java/com/baeldung/akkahttp/UserServerUnitTest.java index b61929c801..1170a2d761 100644 --- a/akka-http/src/test/java/com/baeldung/akkahttp/UserServerUnitTest.java +++ b/akka-http/src/test/java/com/baeldung/akkahttp/UserServerUnitTest.java @@ -9,13 +9,13 @@ import akka.http.javadsl.testkit.JUnitRouteTest; import akka.http.javadsl.testkit.TestRoute; import org.junit.Test; -public class UserRoutesUnitTest extends JUnitRouteTest { +public class UserServerUnitTest extends JUnitRouteTest { ActorSystem system = ActorSystem.create("helloAkkaHttpServer"); ActorRef userActorRef = system.actorOf(UserActor.props(), "userActor"); - TestRoute appRoute = testRoute(new UserRoutes(userActorRef).routes()); + TestRoute appRoute = testRoute(new UserServer(userActorRef).routes()); @Test public void whenRequest_thenActorResponds() { From ad03c69e016ba2d2a790ad83e8a3e0908a9ef2d7 Mon Sep 17 00:00:00 2001 From: dev-chirag <41482403+dev-chirag@users.noreply.github.com> Date: Mon, 17 Dec 2018 01:20:17 +0530 Subject: [PATCH 307/429] BAEL-2100 Custom Lombok Annotation (#5918) --- lombok-custom/pom.xml | 58 ++++++++ .../com/baeldung/singleton/Singleton.java | 10 ++ .../handlers/SingletonEclipseHandler.java | 124 ++++++++++++++++++ .../handlers/SingletonJavacHandler.java | 108 +++++++++++++++ pom.xml | 5 +- 5 files changed, 304 insertions(+), 1 deletion(-) create mode 100644 lombok-custom/pom.xml create mode 100644 lombok-custom/src/main/java/com/baeldung/singleton/Singleton.java create mode 100644 lombok-custom/src/main/java/com/baeldung/singleton/handlers/SingletonEclipseHandler.java create mode 100644 lombok-custom/src/main/java/com/baeldung/singleton/handlers/SingletonJavacHandler.java diff --git a/lombok-custom/pom.xml b/lombok-custom/pom.xml new file mode 100644 index 0000000000..41bd042a5e --- /dev/null +++ b/lombok-custom/pom.xml @@ -0,0 +1,58 @@ + + + + parent-modules + com.baeldung + 1.0.0-SNAPSHOT + + + 4.0.0 + lombok-custom + 0.1-SNAPSHOT + + + + org.projectlombok + lombok + 1.14.8 + provided + + + + org.kohsuke.metainf-services + metainf-services + 1.8 + + + + org.eclipse.jdt + core + 3.3.0-v_771 + + + + + + default-tools.jar + + + java.vendor + Oracle Corporation + + + + + com.sun + tools + ${java.version} + system + ${java.home}/../lib/tools.jar + + + + + + + \ No newline at end of file diff --git a/lombok-custom/src/main/java/com/baeldung/singleton/Singleton.java b/lombok-custom/src/main/java/com/baeldung/singleton/Singleton.java new file mode 100644 index 0000000000..2d2fd0ffb9 --- /dev/null +++ b/lombok-custom/src/main/java/com/baeldung/singleton/Singleton.java @@ -0,0 +1,10 @@ +package com.baeldung.singleton; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +@Target(ElementType.TYPE) +public @interface Singleton { + + +} diff --git a/lombok-custom/src/main/java/com/baeldung/singleton/handlers/SingletonEclipseHandler.java b/lombok-custom/src/main/java/com/baeldung/singleton/handlers/SingletonEclipseHandler.java new file mode 100644 index 0000000000..03cdd707a4 --- /dev/null +++ b/lombok-custom/src/main/java/com/baeldung/singleton/handlers/SingletonEclipseHandler.java @@ -0,0 +1,124 @@ +package com.baeldung.singleton.handlers; + +import com.baeldung.singleton.Singleton; +import lombok.core.AnnotationValues; +import lombok.eclipse.EclipseAnnotationHandler; +import lombok.eclipse.EclipseNode; +import lombok.eclipse.handlers.EclipseHandlerUtil; +import org.eclipse.jdt.internal.compiler.ast.AllocationExpression; +import org.eclipse.jdt.internal.compiler.ast.Annotation; +import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration; +import org.eclipse.jdt.internal.compiler.ast.FieldDeclaration; +import org.eclipse.jdt.internal.compiler.ast.FieldReference; +import org.eclipse.jdt.internal.compiler.ast.MethodDeclaration; +import org.eclipse.jdt.internal.compiler.ast.ReturnStatement; +import org.eclipse.jdt.internal.compiler.ast.SingleNameReference; +import org.eclipse.jdt.internal.compiler.ast.Statement; +import org.eclipse.jdt.internal.compiler.ast.TypeDeclaration; +import org.eclipse.jdt.internal.compiler.ast.TypeReference; +import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; +import org.kohsuke.MetaInfServices; + +import static lombok.eclipse.Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG; +import static org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants.AccFinal; +import static org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants.AccPrivate; +import static org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants.AccStatic; + +@MetaInfServices(EclipseAnnotationHandler.class) +public class SingletonEclipseHandler extends EclipseAnnotationHandler { + + + @Override + public void handle(AnnotationValues annotation, Annotation ast, EclipseNode annotationNode) { + + //remove annotation + EclipseHandlerUtil.unboxAndRemoveAnnotationParameter(ast, "onType", "@Singleton(onType=", annotationNode); + + //add private constructor + EclipseNode singletonClass = annotationNode.up(); + + TypeDeclaration singletonClassType = (TypeDeclaration) singletonClass.get(); + ConstructorDeclaration constructor = addConstructor(singletonClass, singletonClassType); + + TypeReference singletonTypeRef = EclipseHandlerUtil.cloneSelfType(singletonClass, singletonClassType); + + //add inner class + + //add instance field + StringBuilder sb = new StringBuilder(); + sb.append(singletonClass.getName()); + sb.append("Holder"); + String innerClassName = sb.toString(); + TypeDeclaration innerClass = new TypeDeclaration(singletonClassType.compilationResult); + innerClass.modifiers = AccPrivate | AccStatic; + innerClass.name = innerClassName.toCharArray(); + + FieldDeclaration instanceVar = addInstanceVar(constructor, singletonTypeRef, innerClass); + + FieldDeclaration[] declarations = new FieldDeclaration[]{instanceVar}; + innerClass.fields = declarations; + + EclipseHandlerUtil.injectType(singletonClass, innerClass); + + addFactoryMethod(singletonClass, singletonClassType, singletonTypeRef, innerClass, instanceVar); + + + } + + private void addFactoryMethod(EclipseNode singletonClass, TypeDeclaration astNode, TypeReference typeReference, TypeDeclaration innerClass, FieldDeclaration field) { + MethodDeclaration factoryMethod = new MethodDeclaration(astNode.compilationResult); + factoryMethod.modifiers = AccStatic | ClassFileConstants.AccPublic; + factoryMethod.returnType = typeReference; + factoryMethod.sourceStart = astNode.sourceStart; + factoryMethod.sourceEnd = astNode.sourceEnd; + factoryMethod.selector = "getInstance".toCharArray(); + factoryMethod.bits = ECLIPSE_DO_NOT_TOUCH_FLAG; + + long pS = factoryMethod.sourceStart; + long pE = factoryMethod.sourceEnd; + long p = (long) pS << 32 | pE; + + FieldReference ref = new FieldReference(field.name, p); + ref.receiver = new SingleNameReference(innerClass.name, p); + + ReturnStatement statement = new ReturnStatement(ref, astNode.sourceStart, astNode.sourceEnd); + + factoryMethod.statements = new Statement[]{statement}; + + EclipseHandlerUtil.injectMethod(singletonClass, factoryMethod); + } + + private FieldDeclaration addInstanceVar(ConstructorDeclaration constructor, TypeReference typeReference, TypeDeclaration innerClass) { + FieldDeclaration field = new FieldDeclaration(); + field.modifiers = AccPrivate | AccStatic | AccFinal; + field.name = "INSTANCE".toCharArray(); + + field.type = typeReference; + + AllocationExpression exp = new AllocationExpression(); + exp.type = typeReference; + exp.binding = constructor.binding; + exp.sourceStart = innerClass.sourceStart; + exp.sourceEnd = innerClass.sourceEnd; + + field.initialization = exp; + return field; + } + + private ConstructorDeclaration addConstructor(EclipseNode singletonClass, TypeDeclaration astNode) { + ConstructorDeclaration constructor = new ConstructorDeclaration(astNode.compilationResult); + constructor.modifiers = AccPrivate; + constructor.selector = astNode.name; + constructor.sourceStart = astNode.sourceStart; + constructor.sourceEnd = astNode.sourceEnd; + constructor.thrownExceptions = null; + constructor.typeParameters = null; + constructor.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG; + constructor.bodyStart = constructor.declarationSourceStart = constructor.sourceStart = astNode.sourceStart; + constructor.bodyEnd = constructor.declarationSourceEnd = constructor.sourceEnd = astNode.sourceEnd; + constructor.arguments = null; + + EclipseHandlerUtil.injectMethod(singletonClass, constructor); + return constructor; + } +} diff --git a/lombok-custom/src/main/java/com/baeldung/singleton/handlers/SingletonJavacHandler.java b/lombok-custom/src/main/java/com/baeldung/singleton/handlers/SingletonJavacHandler.java new file mode 100644 index 0000000000..1f4cf0ea58 --- /dev/null +++ b/lombok-custom/src/main/java/com/baeldung/singleton/handlers/SingletonJavacHandler.java @@ -0,0 +1,108 @@ +package com.baeldung.singleton.handlers; + +import com.baeldung.singleton.Singleton; +import com.sun.tools.javac.code.Flags; +import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.util.Context; +import com.sun.tools.javac.util.List; +import com.sun.tools.javac.util.ListBuffer; +import lombok.core.AnnotationValues; +import lombok.javac.Javac8BasedLombokOptions; +import lombok.javac.JavacAnnotationHandler; +import lombok.javac.JavacNode; +import lombok.javac.JavacTreeMaker; +import lombok.javac.handlers.JavacHandlerUtil; +import org.kohsuke.MetaInfServices; + +import static lombok.javac.handlers.JavacHandlerUtil.deleteAnnotationIfNeccessary; +import static lombok.javac.handlers.JavacHandlerUtil.deleteImportFromCompilationUnit; + +@MetaInfServices(JavacAnnotationHandler.class) +public class SingletonJavacHandler extends JavacAnnotationHandler { + + @Override + public void handle(AnnotationValues annotation, JCTree.JCAnnotation ast, JavacNode annotationNode) { + + Context context = annotationNode.getContext(); + + Javac8BasedLombokOptions options = Javac8BasedLombokOptions.replaceWithDelombokOptions(context); + options.deleteLombokAnnotations(); + + //remove annotation + deleteAnnotationIfNeccessary(annotationNode, Singleton.class); + //remove import + deleteImportFromCompilationUnit(annotationNode, "lombok.AccessLevel"); + + //private constructor + JavacNode singletonClass = annotationNode.up(); + JavacTreeMaker singletonClassTreeMaker = singletonClass.getTreeMaker(); + + addPrivateConstructor(singletonClass, singletonClassTreeMaker); + + //singleton holder + JavacNode holderInnerClass = addInnerClass(singletonClass, singletonClassTreeMaker); + + //inject static field to this + addInstanceVar(singletonClass, singletonClassTreeMaker, holderInnerClass); + + //add factory method + addFactoryMethod(singletonClass, singletonClassTreeMaker, holderInnerClass); + } + + private void addFactoryMethod(JavacNode singletonClass, JavacTreeMaker singletonClassTreeMaker, JavacNode holderInnerClass) { + JCTree.JCModifiers modifiers = singletonClassTreeMaker.Modifiers(Flags.PUBLIC | Flags.STATIC); + + JCTree.JCClassDecl singletonClassDecl = (JCTree.JCClassDecl) singletonClass.get(); + JCTree.JCIdent singletonClassType = singletonClassTreeMaker.Ident(singletonClassDecl.name); + + JCTree.JCBlock block = addReturnBlock(singletonClassTreeMaker, holderInnerClass); + + JCTree.JCMethodDecl factoryMethod = singletonClassTreeMaker.MethodDef(modifiers, singletonClass.toName("getInstance"), singletonClassType, List.nil(), List.nil(), List.nil(), block, null); + JavacHandlerUtil.injectMethod(singletonClass, factoryMethod); + } + + private JCTree.JCBlock addReturnBlock(JavacTreeMaker singletonClassTreeMaker, JavacNode holderInnerClass) { + + JCTree.JCClassDecl holderInnerClassDecl = (JCTree.JCClassDecl) holderInnerClass.get(); + JavacTreeMaker holderInnerClassTreeMaker = holderInnerClass.getTreeMaker(); + JCTree.JCIdent holderInnerClassType = holderInnerClassTreeMaker.Ident(holderInnerClassDecl.name); + + JCTree.JCFieldAccess instanceVarAccess = holderInnerClassTreeMaker.Select(holderInnerClassType, holderInnerClass.toName("INSTANCE")); + JCTree.JCReturn returnValue = singletonClassTreeMaker.Return(instanceVarAccess); + + ListBuffer statements = new ListBuffer<>(); + statements.append(returnValue); + + return singletonClassTreeMaker.Block(0L, statements.toList()); + } + + + private void addInstanceVar(JavacNode singletonClass, JavacTreeMaker singletonClassTM, JavacNode holderClass) { + JCTree.JCModifiers fieldMod = singletonClassTM.Modifiers(Flags.PRIVATE | Flags.STATIC | Flags.FINAL); + + JCTree.JCClassDecl singletonClassDecl = (JCTree.JCClassDecl) singletonClass.get(); + JCTree.JCIdent singletonClassType = singletonClassTM.Ident(singletonClassDecl.name); + + JCTree.JCNewClass newKeyword = singletonClassTM.NewClass(null, List.nil(), singletonClassType, List.nil(), null); + + JCTree.JCVariableDecl instanceVar = singletonClassTM.VarDef(fieldMod, singletonClass.toName("INSTANCE"), singletonClassType, newKeyword); + JavacHandlerUtil.injectField(holderClass, instanceVar); + } + + private JavacNode addInnerClass(JavacNode singletonClass, JavacTreeMaker singletonTM) { + JCTree.JCModifiers modifiers = singletonTM.Modifiers(Flags.PRIVATE | Flags.STATIC); + String innerClassName = singletonClass.getName() + "Holder"; + JCTree.JCClassDecl innerClassDecl = singletonTM.ClassDef(modifiers, singletonClass.toName(innerClassName), List.nil(), null, List.nil(), List.nil()); + return JavacHandlerUtil.injectType(singletonClass, innerClassDecl); + } + + private void addPrivateConstructor(JavacNode singletonClass, JavacTreeMaker singletonTM) { + JCTree.JCModifiers modifiers = singletonTM.Modifiers(Flags.PRIVATE); + JCTree.JCBlock block = singletonTM.Block(0L, List.nil()); + JCTree.JCMethodDecl constructor = singletonTM.MethodDef(modifiers, singletonClass.toName(""), null, List.nil(), List.nil(), List.nil(), block, null); + + JavacHandlerUtil.injectMethod(singletonClass, constructor); + } + + +} diff --git a/pom.xml b/pom.xml index 57487f00cc..6053e06b8d 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,10 @@ com.baeldung parent-modules 1.0.0-SNAPSHOT - parent-modules + + lombok-custom + + parent-modules pom From c53211dbef8eb12485f9b617d4babd4d7339d461 Mon Sep 17 00:00:00 2001 From: rodolforfq <31481067+rodolforfq@users.noreply.github.com> Date: Sun, 16 Dec 2018 16:07:31 -0400 Subject: [PATCH 308/429] BAEL-2432 (#5936) Article's companion code. --- .../ConditionalBranches.java | 68 +++++++++++++++++ .../com/baeldung/controlstructures/Loops.java | 73 +++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java create mode 100644 core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java diff --git a/core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java b/core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java new file mode 100644 index 0000000000..bace609699 --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/controlstructures/ConditionalBranches.java @@ -0,0 +1,68 @@ +package com.baeldung.controlstructures; + +public class ConditionalBranches { + + /** + * Multiple if/else/else if statements examples. Shows different syntax usage. + */ + public static void ifElseStatementsExamples() { + int count = 2; // Initial count value. + + // Basic syntax. Only one statement follows. No brace usage. + if (count > 1) + System.out.println("Count is higher than 1"); + + // Basic syntax. More than one statement can be included. Braces are used (recommended syntax). + if (count > 1) { + System.out.println("Count is higher than 1"); + System.out.println("Count is equal to: " + count); + } + + // If/Else syntax. Two different courses of action can be included. + if (count > 2) { + System.out.println("Count is higher than 2"); + } else { + System.out.println("Count is lower or equal than 2"); + } + + // If/Else/Else If syntax. Three or more courses of action can be included. + if (count > 2) { + System.out.println("Count is higher than 2"); + } else if (count <= 0) { + System.out.println("Count is less or equal than zero"); + } else { + System.out.println("Count is either equal to one, or two"); + } + } + + /** + * Ternary Operator example. + * @see ConditionalBranches#ifElseStatementsExamples() + */ + public static void ternaryExample() { + int count = 2; + System.out.println(count > 2 ? "Count is higher than 2" : "Count is lower or equal than 2"); + } + + /** + * Switch structure example. Shows how to replace multiple if/else statements with one structure. + */ + public static void switchExample() { + int count = 3; + switch (count) { + case 0: + System.out.println("Count is equal to 0"); + break; + case 1: + System.out.println("Count is equal to 1"); + break; + case 2: + System.out.println("Count is equal to 2"); + break; + default: + System.out.println("Count is either negative, or higher than 2"); + break; + } + } + +} diff --git a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java new file mode 100644 index 0000000000..83f2a27ea7 --- /dev/null +++ b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java @@ -0,0 +1,73 @@ +package com.baeldung.controlstructures; + +public class Loops { + + /** + * Dummy method. Only prints a generic message. + */ + private static void methodToRepeat() { + System.out.println("Dummy method."); + } + + /** + * Shows how to iterate 50 times with 3 different method/control structures. + */ + public static void repetitionTo50Examples() { + for (int i = 1; i <= 50; i++) { + methodToRepeat(); + } + + int whileCounter = 1; + while (whileCounter <= 50) { + methodToRepeat(); + whileCounter++; + } + + int count = 1; + do { + methodToRepeat(); + count++; + } while (count < 50); + } + + /** + * Prints text an N amount of times. Shows usage of the {@code break} branching statement. + * @param textToPrint Text to repeatedly print. + * @param times Amount to times to print received text. + */ + public static void printTextNTimes(String textToPrint, int times) { + int counter = 1; + while (true) { + System.out.println(textToPrint); + if (counter == times) { + break; + } + } + } + + /** + * Prints an specified amount of even numbers. Shows usage of both {@code break} and {@code continue} branching statements. + * @param amountToPrint Amount of even numbers to print. + */ + public static void printEvenNumbers(int amountToPrint) { + if (amountToPrint <= 0) { // Invalid input + return; + } + int iterator = 0; + int amountPrinted = 0; + while (true) { + if (iterator % 2 == 0) { // Is an even number + System.out.println(iterator); + amountPrinted++; + iterator++; + } else { + iterator++; + continue; // Won't print + } + if (amountPrinted == amountToPrint) { + break; + } + } + } + +} From ab2ee364f262ddc8a6d19ea50e458ce5d4cb52d5 Mon Sep 17 00:00:00 2001 From: Jonathan Paul Cook Date: Sun, 16 Dec 2018 22:32:09 +0100 Subject: [PATCH 309/429] BAEL-2175 - Verbose Garbage Collection in Java --- .../gc/VerboseGarbageCollectorRunner.java | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 core-java/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java diff --git a/core-java/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java b/core-java/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java new file mode 100644 index 0000000000..f57580bbb5 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java @@ -0,0 +1,63 @@ +package com.baeldung.gc; + +import java.util.HashMap; +import java.util.Map; + +/** + * A simple Java program to demonstrate how to enable verbose Garbage Collection (GC) logging. + *

+ * This simple program loads 3 million {@link java.lang.String} instances into a {@link java.util.HashMap} + * object before making an explicit call to the garbage collector using System.gc(). + *

+ * Finally, it removes 2 million of the {@link java.lang.String} instances from the {@link java.util.HashMap}. + * We also explicitly use System.out.println to make interpreting the output easier. + *

+ * Run this program with the following arguments to see verbose GC logging in its complete form: + *

+ * -XX:+UseSerialGC -Xms1024m -Xmx1024m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:/path/to/file/gc.log
+ * 
+ * Where: + *
    + *
  • -XX:+UseSerialGC - specify the serial garbage collector.
  • + *
  • -Xms1024m - specify the minimal heap size.
  • + *
  • -Xmx1024m - specify the maximal heap size.
  • + *
  • -verbose:gc - activate the logging of garbage collection information in its simplest form.
  • + *
  • -XX:+PrintGCDetails - activate detailed information about garbage collection.
  • + *
  • -XX:+PrintGCTimeStamps - include a timestamp in the output reflecting the real-time passed in seconds since the JVM started.
  • + *
  • -XX:+PrintGCDateStamps - include the absolute date and time at the start of each line.
  • + *
  • -Xloggc - by default the GC log is written to stdout. Specify an output file via this argument.
  • + *
+ *

+ * It should be noted that the first three arguments are not strictly necessary but for the purposes or the example + * help really simplify things. + * + */ +public class VerboseGarbageCollectorRunner { + + private static Map stringContainer = new HashMap<>(); + + public static void main(String[] args) { + System.out.println("Start of program!"); + String stringWithPrefix = "stringWithPrefix"; + + // Load Java Heap with 3 M java.lang.String instances + for (int i = 0; i < 3000000; i++) { + String newString = stringWithPrefix + i; + stringContainer.put(newString, newString); + } + System.out.println("MAP size: " + stringContainer.size()); + + // Explicit GC! + System.gc(); + + // Remove 2 M out of 3 M + for (int i = 0; i < 2000000; i++) { + String newString = stringWithPrefix + i; + stringContainer.remove(newString); + } + + System.out.println("MAP size: " + stringContainer.size()); + System.out.println("End of program!"); + } + +} From 9297099abf0f4ad18041619ccef3c72efb41c032 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Sun, 16 Dec 2018 16:28:09 -0800 Subject: [PATCH 310/429] BAEL-1049 update readme (#5941) --- libraries/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/libraries/README.md b/libraries/README.md index ce2445f3e0..c1f16df6b4 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -66,6 +66,7 @@ - [Exactly Once Processing in Kafka](https://www.baeldung.com/kafka-exactly-once) - [An Introduction to SuanShu](https://www.baeldung.com/suanshu) - [Implementing a FTP-Client in Java](http://www.baeldung.com/java-ftp-client) +- [Introduction to Functional Java](https://www.baeldung.com/java-functional-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. From 64dd23f8f0915d6aaecdcbcb39360e675eb4f8c5 Mon Sep 17 00:00:00 2001 From: Emily Millard Date: Sun, 16 Dec 2018 18:18:13 -0700 Subject: [PATCH 311/429] BAEL-2324 sorting arrays --- .../baeldung/arraycopy/model/Employee.java | 8 ++++ .../com/baeldung/sort/ArraySortUnitTest.java | 44 ++++--------------- 2 files changed, 16 insertions(+), 36 deletions(-) diff --git a/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java b/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java index 757a8f8ec1..a7592574d9 100644 --- a/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java +++ b/core-java-arrays/src/main/java/com/baeldung/arraycopy/model/Employee.java @@ -7,6 +7,14 @@ public class Employee implements Serializable { private int id; private String name; + public Employee() { + } + + public Employee(int id, String name) { + this.id = id; + this.name = name; + } + public int getId() { return id; } diff --git a/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java b/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java index 489f1848e9..59035738fe 100644 --- a/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java +++ b/core-java-arrays/src/test/java/com/baeldung/sort/ArraySortUnitTest.java @@ -5,18 +5,20 @@ import org.junit.Before; import org.junit.Test; import java.util.Arrays; -import java.util.Collections; import java.util.Comparator; import java.util.stream.IntStream; import static org.junit.Assert.assertArrayEquals; -import static org.junit.Assert.assertEquals; public class ArraySortUnitTest { private Employee[] employees; private int[] numbers; private String[] strings; + private Employee john = new Employee(6, "John"); + private Employee mary = new Employee(3, "Mary"); + private Employee david = new Employee(4, "David"); + @Before public void setup() { createEmployeesArray(); @@ -25,13 +27,7 @@ public class ArraySortUnitTest { } private void createEmployeesArray() { - employees = new Employee[5]; - Employee employee; - for (int i = 1; i <= employees.length; i++) { - employee = new Employee(i, "Emp" + i); - employees[i - 1] = employee; - } - Collections.shuffle(Arrays.asList(employees)); + employees = new Employee[]{john, mary, david}; } private void createNumbersArray() { @@ -74,45 +70,21 @@ public class ArraySortUnitTest { public void givenObjectArray_whenSortingAscending_thenCorrectlySorted() { Arrays.sort(employees, Comparator.comparing(Employee::getName)); - Employee[] sorted = new Employee[]{ - new Employee(1, "Emp1"), - new Employee(2, "Emp2"), - new Employee(3, "Emp3"), - new Employee(4, "Emp4"), - new Employee(5, "Emp5") - }; - - assertEquals(sorted[0].getId(), employees[0].getId()); + assertArrayEquals(new Employee[]{david, john, mary}, employees); } @Test public void givenObjectArray_whenSortingDescending_thenCorrectlySorted() { Arrays.sort(employees, Comparator.comparing(Employee::getName).reversed()); - Employee[] sorted = new Employee[]{ - new Employee(5, "Emp5"), - new Employee(4, "Emp4"), - new Employee(3, "Emp3"), - new Employee(2, "Emp2"), - new Employee(1, "Emp1") - }; - - assertEquals(sorted[0].getId(), employees[0].getId()); + assertArrayEquals(new Employee[]{mary, john, david}, employees); } @Test public void givenObjectArray_whenSortingMultipleAttributesAscending_thenCorrectlySorted() { Arrays.sort(employees, Comparator.comparing(Employee::getName).thenComparing(Employee::getId)); - Employee[] sorted = new Employee[]{ - new Employee(1, "Emp1"), - new Employee(2, "Emp2"), - new Employee(3, "Emp3"), - new Employee(4, "Emp4"), - new Employee(5, "Emp5") - }; - - assertEquals(sorted[0].getId(), employees[0].getId()); + assertArrayEquals(new Employee[]{david, john, mary}, employees); } } From 4a55426727407702435bea9db929eb64dedcaaf8 Mon Sep 17 00:00:00 2001 From: Hai Nguyen Date: Tue, 18 Dec 2018 00:39:41 +0800 Subject: [PATCH 312/429] BAEL-2230 Equivalent of Java static final in Kotlin (#5848) * constant unit test * kotlin const --- .../kotlin/constant/ConstantUnitTest.kt | 17 +++++++++++++++++ .../kotlin/constant/TestKotlinConstantClass.kt | 8 ++++++++ .../kotlin/constant/TestKotlinConstantObject.kt | 15 +++++++++++++++ 3 files changed, 40 insertions(+) create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/ConstantUnitTest.kt create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantClass.kt create mode 100644 core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantObject.kt diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/ConstantUnitTest.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/ConstantUnitTest.kt new file mode 100644 index 0000000000..51d45b8df0 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/ConstantUnitTest.kt @@ -0,0 +1,17 @@ +import com.baeldung.kotlin.constant.TestKotlinConstantClass +import com.baeldung.kotlin.constant.TestKotlinConstantObject +import org.junit.jupiter.api.Test +import kotlin.test.assertEquals + +class ConstantUnitTest { + + @Test + fun givenConstant_whenCompareWithActualValue_thenReturnTrue() { + assertEquals(10, TestKotlinConstantObject.COMPILE_TIME_CONST) + assertEquals(30, TestKotlinConstantObject.RUN_TIME_CONST) + assertEquals(20, TestKotlinConstantObject.JAVA_STATIC_FINAL_FIELD) + + assertEquals(40, TestKotlinConstantClass.COMPANION_OBJECT_NUMBER) + } +} + diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantClass.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantClass.kt new file mode 100644 index 0000000000..8bcc327999 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantClass.kt @@ -0,0 +1,8 @@ +package com.baeldung.kotlin.constant + + +class TestKotlinConstantClass { + companion object { + const val COMPANION_OBJECT_NUMBER = 40 + } +} \ No newline at end of file diff --git a/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantObject.kt b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantObject.kt new file mode 100644 index 0000000000..815fdeaf14 --- /dev/null +++ b/core-kotlin/src/test/kotlin/com/baeldung/kotlin/constant/TestKotlinConstantObject.kt @@ -0,0 +1,15 @@ +package com.baeldung.kotlin.constant + + +object TestKotlinConstantObject { + const val COMPILE_TIME_CONST = 10 + + val RUN_TIME_CONST: Int + + @JvmField + val JAVA_STATIC_FINAL_FIELD = 20 + + init { + RUN_TIME_CONST = TestKotlinConstantObject.COMPILE_TIME_CONST + 20; + } +} \ No newline at end of file From 2f7c16e00df9eb29b7171245bfce333458735910 Mon Sep 17 00:00:00 2001 From: DOHA Date: Mon, 17 Dec 2018 23:15:06 +0200 Subject: [PATCH 313/429] predicate chain --- .../java8/Java8PredicateChainUnitTest.java | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java b/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java new file mode 100644 index 0000000000..fa579f9a00 --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/java8/Java8PredicateChainUnitTest.java @@ -0,0 +1,131 @@ +package com.baeldung.java8; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.contains; +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +import org.junit.Test; + +public class Java8PredicateChainUnitTest { + + private List names = Arrays.asList("Adam", "Alexander", "John", "Tom"); + + @Test + public void whenFilterList_thenSuccess() { + List result = names.stream() + .filter(name -> name.startsWith("A")) + .collect(Collectors.toList()); + + assertEquals(2, result.size()); + assertThat(result, contains("Adam", "Alexander")); + } + + @Test + public void whenFilterListWithMultipleFilters_thenSuccess() { + List result = names.stream() + .filter(name -> name.startsWith("A")) + .filter(name -> name.length() < 5) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Adam")); + } + + @Test + public void whenFilterListWithComplexPredicate_thenSuccess() { + List result = names.stream() + .filter(name -> name.startsWith("A") && name.length() < 5) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Adam")); + } + + @Test + public void whenFilterListWithCombinedPredicatesInline_thenSuccess() { + List result = names.stream() + .filter(((Predicate) name -> name.startsWith("A")).and(name -> name.length() < 5)) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Adam")); + } + + @Test + public void whenFilterListWithCombinedPredicatesUsingAnd_thenSuccess() { + Predicate predicate1 = str -> str.startsWith("A"); + Predicate predicate2 = str -> str.length() < 5; + + List result = names.stream() + .filter(predicate1.and(predicate2)) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Adam")); + } + + @Test + public void whenFilterListWithCombinedPredicatesUsingOr_thenSuccess() { + Predicate predicate1 = str -> str.startsWith("J"); + Predicate predicate2 = str -> str.length() < 4; + + List result = names.stream() + .filter(predicate1.or(predicate2)) + .collect(Collectors.toList()); + + assertEquals(2, result.size()); + assertThat(result, contains("John", "Tom")); + } + + @Test + public void whenFilterListWithCombinedPredicatesUsingOrAndNegate_thenSuccess() { + Predicate predicate1 = str -> str.startsWith("J"); + Predicate predicate2 = str -> str.length() < 4; + + List result = names.stream() + .filter(predicate1.or(predicate2.negate())) + .collect(Collectors.toList()); + + assertEquals(3, result.size()); + assertThat(result, contains("Adam", "Alexander", "John")); + } + + @Test + public void whenFilterListWithCollectionOfPredicatesUsingAnd_thenSuccess() { + List> allPredicates = new ArrayList>(); + allPredicates.add(str -> str.startsWith("A")); + allPredicates.add(str -> str.contains("d")); + allPredicates.add(str -> str.length() > 4); + + List result = names.stream() + .filter(allPredicates.stream() + .reduce(x -> true, Predicate::and)) + .collect(Collectors.toList()); + + assertEquals(1, result.size()); + assertThat(result, contains("Alexander")); + } + + @Test + public void whenFilterListWithCollectionOfPredicatesUsingOr_thenSuccess() { + List> allPredicates = new ArrayList>(); + allPredicates.add(str -> str.startsWith("A")); + allPredicates.add(str -> str.contains("d")); + allPredicates.add(str -> str.length() > 4); + + List result = names.stream() + .filter(allPredicates.stream() + .reduce(x -> false, Predicate::or)) + .collect(Collectors.toList()); + + assertEquals(2, result.size()); + assertThat(result, contains("Adam", "Alexander")); + } + +} From fb210d0499052a5b18cfffa042e714b1d00227c9 Mon Sep 17 00:00:00 2001 From: FrancoCorleone Date: Tue, 18 Dec 2018 02:56:30 +0100 Subject: [PATCH 314/429] BAEL-2090 Insert With JPA * Adding inserts for JPA objects repositories * Refactor tests * Small refactor * Small refactor * Remove redundant @Repository annotation * Refactor tests * Change to simple entity manager implementation * Refactor changes --- .../dao/repositories/InsertRepository.java | 5 + .../PersonEntityManagerInsertRepository.java | 7 ++ .../PersonEntityManagerRepository.java | 10 ++ .../PersonQueryInsertRepository.java | 7 ++ .../repositories/PersonQueryRepository.java | 16 +++ ...rsonEntityManagerInsertRepositoryImpl.java | 21 ++++ .../impl/PersonQueryInsertRepositoryImpl.java | 24 +++++ .../main/java/com/baeldung/domain/Person.java | 47 ++++++++ ...PersonInsertRepositoryIntegrationTest.java | 102 ++++++++++++++++++ 9 files changed, 239 insertions(+) create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java create mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Person.java create mode 100644 persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java new file mode 100644 index 0000000000..6a74e067fe --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java @@ -0,0 +1,5 @@ +package com.baeldung.dao.repositories; + +public interface InsertRepository { + void insert(S entity); +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java new file mode 100644 index 0000000000..6d3cbb07df --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; + +public interface PersonEntityManagerInsertRepository { + void insert(Person person); +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java new file mode 100644 index 0000000000..cbf3d59620 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java @@ -0,0 +1,10 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PersonEntityManagerRepository extends JpaRepository, PersonEntityManagerInsertRepository { + +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java new file mode 100644 index 0000000000..be01e9883a --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java @@ -0,0 +1,7 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; + +public interface PersonQueryInsertRepository { + void insert(Person person); +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java new file mode 100644 index 0000000000..1516c38443 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java @@ -0,0 +1,16 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +@Repository +public interface PersonQueryRepository extends JpaRepository, PersonQueryInsertRepository { + + @Modifying + @Query(value = "INSERT INTO person (id, first_name, last_name) VALUES (:id,:firstName,:lastName)", nativeQuery = true) + void insertWithAnnotation(@Param("id") Long id, @Param("firstName") String firstName, @Param("lastName") String lastName); +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java new file mode 100644 index 0000000000..c14cc44125 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java @@ -0,0 +1,21 @@ +package com.baeldung.dao.repositories.impl; + +import com.baeldung.dao.repositories.PersonEntityManagerInsertRepository; +import com.baeldung.domain.Person; +import org.springframework.transaction.annotation.Transactional; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; + +@Transactional +public class PersonEntityManagerInsertRepositoryImpl implements PersonEntityManagerInsertRepository { + + @PersistenceContext + private EntityManager entityManager; + + @Override + public void insert(Person person) { + this.entityManager.persist(person); + } +} + diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java new file mode 100644 index 0000000000..341db1615d --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java @@ -0,0 +1,24 @@ +package com.baeldung.dao.repositories.impl; + +import com.baeldung.dao.repositories.PersonQueryInsertRepository; +import com.baeldung.domain.Person; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.transaction.Transactional; + +@Transactional +public class PersonQueryInsertRepositoryImpl implements PersonQueryInsertRepository { + + @PersistenceContext + private EntityManager entityManager; + + @Override + public void insert(Person person) { + entityManager.createNativeQuery("INSERT INTO person (id,first_name, last_name) VALUES (?,?,?)") + .setParameter(1, person.getId()) + .setParameter(2, person.getFirstName()) + .setParameter(3, person.getLastName()) + .executeUpdate(); + } +} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Person.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Person.java new file mode 100644 index 0000000000..30d7370982 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/domain/Person.java @@ -0,0 +1,47 @@ +package com.baeldung.domain; + +import javax.persistence.Entity; +import javax.persistence.Id; + +@Entity +public class Person { + + @Id + private Long id; + private String firstName; + private String lastName; + + public Person() { + } + + public Person(Long id, String firstName, String lastName) { + this.id = id; + this.firstName = firstName; + this.lastName = lastName; + } + + 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; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + +} diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java new file mode 100644 index 0000000000..476554f6d6 --- /dev/null +++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java @@ -0,0 +1,102 @@ +package com.baeldung.dao.repositories; + +import com.baeldung.domain.Person; +import org.junit.Test; +import org.junit.jupiter.api.BeforeEach; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; + +@RunWith(SpringRunner.class) +@DataJpaTest +public class PersonInsertRepositoryIntegrationTest { + + private static final Long ID = 1L; + private static final String FIRST_NAME = "firstname"; + private static final String LAST_NAME = "lastname"; + private static final Person PERSON = new Person(ID, FIRST_NAME, LAST_NAME); + + @Autowired + private PersonQueryRepository personQueryRepository; + + @Autowired + private PersonEntityManagerRepository personEntityManagerRepository; + + @BeforeEach + public void clearDB() { + personQueryRepository.deleteAll(); + } + + @Test + public void givenPersonEntity_whenInsertWithNativeQuery_ThenPersonIsPersisted() { + insertPerson(); + + assertPersonPersisted(); + } + + @Test + public void givenPersonEntity_whenInsertedTwiceWithNativeQuery_thenDataIntegrityViolationExceptionIsThrown() { + assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { + insertPerson(); + insertPerson(); + }); + } + + @Test + public void givenPersonEntity_whenInsertWithQueryAnnotation_thenPersonIsPersisted() { + insertPersonWithQueryAnnotation(); + + assertPersonPersisted(); + } + + @Test + public void givenPersonEntity_whenInsertedTwiceWithQueryAnnotation_thenDataIntegrityViolationExceptionIsThrown() { + assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { + insertPersonWithQueryAnnotation(); + insertPersonWithQueryAnnotation(); + }); + } + + @Test + public void givenPersonEntity_whenInsertWithEntityManager_thenPersonIsPersisted() { + insertPersonWithEntityManager(); + + assertPersonPersisted(); + } + + @Test + public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenDataIntegrityViolationExceptionIsThrown() { + assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { + insertPersonWithEntityManager(); + insertPersonWithEntityManager(); + }); + } + + private void insertPerson() { + personQueryRepository.insert(PERSON); + } + + private void insertPersonWithQueryAnnotation() { + personQueryRepository.insertWithAnnotation(ID, FIRST_NAME, LAST_NAME); + } + + private void insertPersonWithEntityManager() { + personEntityManagerRepository.insert(new Person(ID, FIRST_NAME, LAST_NAME)); + } + + private void assertPersonPersisted() { + Optional personOptional = personQueryRepository.findById(PERSON.getId()); + + assertThat(personOptional.isPresent()).isTrue(); + assertThat(personOptional.get().getId()).isEqualTo(PERSON.getId()); + assertThat(personOptional.get().getFirstName()).isEqualTo(PERSON.getFirstName()); + assertThat(personOptional.get().getLastName()).isEqualTo(PERSON.getLastName()); + } +} From 4ea86703d402933e097a5bfa8d26788c497cdddc Mon Sep 17 00:00:00 2001 From: Javier Date: Tue, 18 Dec 2018 05:27:49 +0100 Subject: [PATCH 315/429] BAEL-2412 Change method names to a BDD-style. --- ...Test.java => PrimitiveValuesUnitTest.java} | 58 +++++++------------ 1 file changed, 21 insertions(+), 37 deletions(-) rename gson/src/test/java/org/baeldung/gson/primitives/{UnitTest.java => PrimitiveValuesUnitTest.java} (83%) diff --git a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java b/gson/src/test/java/org/baeldung/gson/primitives/PrimitiveValuesUnitTest.java similarity index 83% rename from gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java rename to gson/src/test/java/org/baeldung/gson/primitives/PrimitiveValuesUnitTest.java index f952ae5b92..7d249bc55c 100644 --- a/gson/src/test/java/org/baeldung/gson/primitives/UnitTest.java +++ b/gson/src/test/java/org/baeldung/gson/primitives/PrimitiveValuesUnitTest.java @@ -8,8 +8,8 @@ import java.lang.reflect.Type; import static junit.framework.TestCase.*; -public class UnitTest { - @Test public void toJsonAllPrimitives() { +public class PrimitiveValuesUnitTest { + @Test public void whenSerializingToJSON_thenShouldCreateJSON() { PrimitiveBundle primitiveBundle = new PrimitiveBundle(); // @formatter:off @@ -32,7 +32,8 @@ public class UnitTest { assertEquals(expected, gson.toJson(primitiveBundle)); } - @Test(expected = IllegalArgumentException.class) public void toJsonInfinity() { + @Test(expected = IllegalArgumentException.class) public void + whenSerializingInfinity_thenShouldRaiseAnException() { InfinityValuesExample model = new InfinityValuesExample(); model.negativeInfinity = Float.NEGATIVE_INFINITY; model.positiveInfinity = Float.POSITIVE_INFINITY; @@ -42,7 +43,8 @@ public class UnitTest { gson.toJson(model); } - @Test(expected = IllegalArgumentException.class) public void toJsonNaN() { + @Test(expected = IllegalArgumentException.class) public void + whenSerializingNaN_thenShouldRaiseAnException() { FloatExample model = new FloatExample(); model.value = Float.NaN; @@ -50,7 +52,7 @@ public class UnitTest { gson.toJson(model); } - @Test public void fromJsonAllPrimitives() { + @Test public void whenDeserializingFromJSON_thenShouldParseTheValueInTheString() { String json = "{\"byteValue\": 17, \"shortValue\": 3, \"intValue\": 3, " + "\"longValue\": 3, \"floatValue\": 3.5" + ", \"doubleValue\": 3.5" + ", \"booleanValue\": true, \"charValue\": \"a\"}"; @@ -70,14 +72,14 @@ public class UnitTest { // @formatter:on } - @Test public void fromJsonPrecissionMismatch() { + @Test public void whenDeserializingHighPrecissionNumberIntoFloat_thenShouldPerformRounding() { String json = "{\"value\": 12.123425589123456}"; Gson gson = new Gson(); FloatExample model = gson.fromJson(json, FloatExample.class); assertEquals(12.123426f, model.value, 0.000001); } - @Test public void fromJsonPrecissionMismatchForDouble() { + @Test public void whenDeserializingHighPrecissiongNumberIntoDouble_thenShouldPerformRounding() { String json = "{\"value\": 12.123425589123556}"; Gson gson = new Gson(); DoubleExample model = gson.fromJson(json, DoubleExample.class); @@ -85,7 +87,7 @@ public class UnitTest { } - @Test public void fromJsonOverflow() { + @Test public void whenDeserializingValueThatOverflows_thenShouldOverflowSilently() { Gson gson = new Gson(); String json = "{\"value\": \"300\"}"; ByteExample model = gson.fromJson(json, ByteExample.class); @@ -93,7 +95,7 @@ public class UnitTest { assertEquals(44, model.value); } - @Test public void fromJsonRealToByte() { + @Test public void whenDeserializingRealIntoByte_thenShouldRaiseAnException() { Gson gson = new Gson(); String json = "{\"value\": 2.3}"; try { @@ -107,7 +109,7 @@ public class UnitTest { fail(); } - @Test public void fromJsonRealToLong() { + @Test public void whenDeserializingRealIntoLong_thenShouldRaiseAnException() { Gson gson = new Gson(); String json = "{\"value\": 2.3}"; try { @@ -121,14 +123,14 @@ public class UnitTest { fail(); } - @Test public void fromJsonRealToLongEndingIn0() { + @Test public void whenDeserializingRealWhoseDecimalPartIs0_thenShouldParseItCorrectly() { Gson gson = new Gson(); String json = "{\"value\": 2.0}"; LongExample model = gson.fromJson(json, LongExample.class); assertEquals(2, model.value); } - @Test public void fromJsonUnicodeChar() { + @Test public void whenDeserializingUnicodeChar_thenShouldParseItCorrectly() { Gson gson = new Gson(); String json = "{\"value\": \"\\u00AE\"}"; CharExample model = gson.fromJson(json, CharExample.class); @@ -136,7 +138,7 @@ public class UnitTest { assertEquals('\u00AE', model.value); } - @Test public void fromJsonNull() { + @Test public void whenDeserializingNullValues_thenShouldIgnoreThoseFields() { Gson gson = new Gson(); // @formatter:off String json = "{\"byteValue\": null, \"shortValue\": null, " @@ -154,7 +156,8 @@ public class UnitTest { assertEquals(1, model.doubleValue, 0.0001); } - @Test(expected = JsonSyntaxException.class) public void fromJsonEmptyString() { + @Test(expected = JsonSyntaxException.class) public void + whenDeserializingTheEmptyString_thenShouldRaiseAnException() { Gson gson = new Gson(); // @formatter:off String json = "{\"byteValue\": \"\", \"shortValue\": \"\", " @@ -164,7 +167,7 @@ public class UnitTest { gson.fromJson(json, PrimitiveBundleInitialized.class); } - @Test public void fromJsonEmptyStringToChar() { + @Test public void whenDeserializingTheEmptyStringIntoChar_thenShouldHaveTheEmtpyChar() { Gson gson = new Gson(); // @formatter:off String json = "{\"charValue\": \"\"}"; @@ -174,7 +177,7 @@ public class UnitTest { assertEquals(Character.MIN_VALUE, model.value); } - @Test public void fromJsonValidValueWithinString() { + @Test public void whenDeserializingValidValueAppearingInAString_thenShouldParseTheValue() { Gson gson = new Gson(); // @formatter:off String json = "{\"byteValue\": \"15\", \"shortValue\": \"15\", " @@ -192,7 +195,7 @@ public class UnitTest { assertEquals(15, model.doubleValue, 0.0001); } - @Test public void fromJsonBooleanFrom2ValueInteger() { + @Test public void whenDeserializingABooleanFrom0Or1Integer_thenShouldRaiseAnException() { String json = "{\"value\": 1}"; Gson gson = new Gson(); @@ -207,7 +210,7 @@ public class UnitTest { fail(); } - @Test public void fromJsonBooleanFrom2ValueIntegerSolution() { + @Test public void whenDeserializingWithCustomDeserializerABooleanFrom0Or1Integer_thenShouldWork() { String json = "{\"value\": 1}"; GsonBuilder builder = new GsonBuilder(); builder.registerTypeAdapter(BooleanExample.class, @@ -220,25 +223,6 @@ public class UnitTest { assertTrue(model.value); } - @Test public void fromJsonBooleanFromYes() { - String json = "{\"value\": yes}"; - Gson gson = new Gson(); - - BooleanExample model = gson.fromJson(json, BooleanExample.class); - - // pay attention here that we are deserializing yes. - assertFalse(model.value); - } - - @Test public void fromJsonBooleanFromInvalidValue() { - String json = "{\"value\": \"15x\"}"; - Gson gson = new Gson(); - - BooleanExample model = gson.fromJson(json, BooleanExample.class); - - assertFalse(model.value); - } - // @formatter:off static class BooleanAs2ValueIntegerDeserializer implements JsonDeserializer { @Override public BooleanExample deserialize( From 6f8d130786ab5e0998d91ed9be8883d85358e0a6 Mon Sep 17 00:00:00 2001 From: eelhazati Date: Tue, 18 Dec 2018 12:33:49 +0100 Subject: [PATCH 316/429] Hibernate 5 bootstrap API Test. --- .../bootstrap/Hibernate5BootstrapAPITest.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java new file mode 100644 index 0000000000..39111f6256 --- /dev/null +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java @@ -0,0 +1,69 @@ +package com.baeldung.hibernate.bootstrap; + +import com.baeldung.hibernate.pojo.Movie; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.BootstrapServiceRegistry; +import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +public class Hibernate5BootstrapAPITest { + + SessionFactory sessionFactory = null; + Session session = null; + + @Before + public void setUp() throws IOException { + + BootstrapServiceRegistry bootstrapRegistry = new BootstrapServiceRegistryBuilder() + .build(); + + ServiceRegistry standardRegistry = new StandardServiceRegistryBuilder(bootstrapRegistry) + // No need for hibernate.cfg.xml file, an hibernate.properties is sufficient. + //.configure() + .build(); + + MetadataSources metadataSources = new MetadataSources(standardRegistry); + metadataSources.addAnnotatedClass(Movie.class); + + Metadata metadata = metadataSources.getMetadataBuilder().build(); + + sessionFactory = metadata.buildSessionFactory(); + } + + @Test + public void testBuildSessionFactory() { + assertNotNull(sessionFactory); + session = sessionFactory.openSession(); + assertNotNull(session); + + //Persist Movie + session.getTransaction().begin(); + Movie movie = new Movie(); + movie.setId(100L); + session.persist(movie); + session.getTransaction().commit(); + + List movies = session.createQuery("FROM Movie").list(); + assertNotNull(movies); + assertEquals(movies.size(), 1L); + } + + @After + public void clean() throws IOException { + session.close(); + sessionFactory.close(); + } +} From a9f853b24153cd41e137801147b434247cfa8633 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:02:40 +0200 Subject: [PATCH 317/429] BAEL-10335 - repo cleanup work --- jib/pom.xml | 14 +- metrics/pom.xml | 45 ++---- .../metrics/micrometer/MicrometerApp.java | 3 +- .../spring-data-gemfire/pom.xml | 12 +- .../spring-data-mongodb/pom.xml | 15 +- .../etl/customer-mongodb-sink/pom.xml | 16 +-- .../etl/customer-transform/pom.xml | 18 ++- spring-cloud/spring-cloud-vault/pom.xml | 132 ++++++++---------- spring-mobile/pom.xml | 16 --- spring-reactor/pom.xml | 19 --- spring-security-stormpath/pom.xml | 8 -- spring-sleuth/pom.xml | 17 +-- spring-webflux-amqp/pom.xml | 19 --- 13 files changed, 95 insertions(+), 239 deletions(-) diff --git a/jib/pom.xml b/jib/pom.xml index e71250f157..ad4011c3c4 100644 --- a/jib/pom.xml +++ b/jib/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 jib 0.1-SNAPSHOT @@ -42,16 +42,4 @@ - - - spring-releases - https://repo.spring.io/libs-release - - - - - spring-releases - https://repo.spring.io/libs-release - - diff --git a/metrics/pom.xml b/metrics/pom.xml index 79d340aa49..d7d7a8a911 100644 --- a/metrics/pom.xml +++ b/metrics/pom.xml @@ -3,8 +3,8 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 metrics - metrics - + metrics + parent-modules com.baeldung @@ -66,7 +66,7 @@ org.springframework.boot spring-boot-starter-web - ${spring.boot.ver} + 2.0.7.RELEASE @@ -85,44 +85,21 @@ spectator-api ${spectator-api.version} - - - org.assertj - assertj-core - test - - + + + org.assertj + assertj-core + 3.11.1 + test + + - - - - org.springframework.boot - spring-boot-dependencies - pom - import - ${spring.boot.ver} - - - - - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone - - false - - - - 3.1.2 3.1.0 0.12.17 0.12.0.RELEASE - 2.0.0.M5 2.9.1 0.57.1 diff --git a/metrics/src/main/java/com/baeldung/metrics/micrometer/MicrometerApp.java b/metrics/src/main/java/com/baeldung/metrics/micrometer/MicrometerApp.java index cf818f6600..1d738085ce 100644 --- a/metrics/src/main/java/com/baeldung/metrics/micrometer/MicrometerApp.java +++ b/metrics/src/main/java/com/baeldung/metrics/micrometer/MicrometerApp.java @@ -1,10 +1,11 @@ package com.baeldung.metrics.micrometer; -import io.micrometer.core.instrument.binder.jvm.JvmThreadMetrics; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import io.micrometer.core.instrument.binder.JvmThreadMetrics; + @SpringBootApplication public class MicrometerApp { diff --git a/persistence-modules/spring-data-gemfire/pom.xml b/persistence-modules/spring-data-gemfire/pom.xml index 292b7387ac..dbb869acf0 100644 --- a/persistence-modules/spring-data-gemfire/pom.xml +++ b/persistence-modules/spring-data-gemfire/pom.xml @@ -2,10 +2,8 @@ 4.0.0 - com.baeldung spring-data-gemfire - 1.0.0-SNAPSHOT - spring-data-gemfire + spring-data-gemfire jar @@ -54,14 +52,6 @@ - - spring-snapshots - Spring Snapshots - http://repo.spring.io/libs-snapshot - - true - - gemstone http://dist.gemstone.com.s3.amazonaws.com/maven/release/ diff --git a/persistence-modules/spring-data-mongodb/pom.xml b/persistence-modules/spring-data-mongodb/pom.xml index 76ec5a96a6..63b9c3c1b0 100644 --- a/persistence-modules/spring-data-mongodb/pom.xml +++ b/persistence-modules/spring-data-mongodb/pom.xml @@ -1,9 +1,7 @@ 4.0.0 - com.baeldung spring-data-mongodb - 0.0.1-SNAPSHOT spring-data-mongodb @@ -23,7 +21,7 @@ org.springframework.data spring-data-releasetrain - Lovelace-M3 + Lovelace-SR3 pom import @@ -76,17 +74,6 @@ - - - spring-milestones - Spring Milestones - https://repo.spring.io/milestone - - false - - - - diff --git a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml index 392244dc84..1f16a02a98 100644 --- a/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml +++ b/spring-cloud-data-flow/etl/customer-mongodb-sink/pom.xml @@ -1,6 +1,5 @@ - 4.0.0 @@ -17,13 +16,6 @@ ../../../parent-boot-2 - - UTF-8 - UTF-8 - 1.8 - Greenwich.M3 - - org.springframework.cloud @@ -81,5 +73,11 @@ + + UTF-8 + UTF-8 + 1.8 + Greenwich.M3 + diff --git a/spring-cloud-data-flow/etl/customer-transform/pom.xml b/spring-cloud-data-flow/etl/customer-transform/pom.xml index 0e429cb593..ed281b420a 100644 --- a/spring-cloud-data-flow/etl/customer-transform/pom.xml +++ b/spring-cloud-data-flow/etl/customer-transform/pom.xml @@ -1,11 +1,9 @@ - 4.0.0 customer-transform - 0.0.1-SNAPSHOT jar customer-transform @@ -18,13 +16,6 @@ ../../../parent-boot-2 - - UTF-8 - UTF-8 - 1.8 - Greenwich.M3 - - org.springframework.cloud @@ -74,4 +65,11 @@ + + UTF-8 + UTF-8 + 1.8 + Greenwich.M3 + + diff --git a/spring-cloud/spring-cloud-vault/pom.xml b/spring-cloud/spring-cloud-vault/pom.xml index 3a7198ecc3..363de6e107 100644 --- a/spring-cloud/spring-cloud-vault/pom.xml +++ b/spring-cloud/spring-cloud-vault/pom.xml @@ -1,88 +1,72 @@ - 4.0.0 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + 4.0.0 - org.baeldung.spring.cloud - spring-cloud-vault - jar + org.baeldung.spring.cloud + spring-cloud-vault + jar - spring-cloud-vault - Demo project for Spring Boot + spring-cloud-vault + Demo project for Spring Boot - - com.baeldung - parent-boot-2 - 0.0.1-SNAPSHOT - ../../parent-boot-2 - + + com.baeldung + parent-boot-2 + 0.0.1-SNAPSHOT + ../../parent-boot-2 + - + - - UTF-8 - UTF-8 - 1.8 - Greenwich.M3 - + + org.springframework.cloud + spring-cloud-starter-vault-config + - - - - - - - org.springframework.cloud - spring-cloud-starter-vault-config - + + org.springframework.cloud + spring-cloud-vault-config-databases + - - org.springframework.cloud - spring-cloud-vault-config-databases - + + org.springframework.boot + spring-boot-starter-test + test + - - org.springframework.boot - spring-boot-starter-test - test - + + mysql + mysql-connector-java + + + org.springframework.boot + spring-boot-starter-jdbc + + + + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + - - mysql - mysql-connector-java - + + + + org.springframework.boot + spring-boot-maven-plugin + + + - - - org.springframework.boot - spring-boot-starter-jdbc - - - - - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - spring-milestones @@ -94,5 +78,11 @@ + + UTF-8 + UTF-8 + 1.8 + Greenwich.M3 + diff --git a/spring-mobile/pom.xml b/spring-mobile/pom.xml index d65820594f..4b04c3b8d5 100644 --- a/spring-mobile/pom.xml +++ b/spring-mobile/pom.xml @@ -32,20 +32,4 @@ - - - spring-releases - Spring Milestone Repository - https://repo.spring.io/libs-release - - - - - - spring-releases - Spring Milestone Repository - https://repo.spring.io/libs-release - - - diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index f6db404656..e828c44f74 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -30,23 +30,4 @@ - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot - - true - - - - - - - spring-releases - Spring Releases - https://repo.spring.io/libs-release - - - diff --git a/spring-security-stormpath/pom.xml b/spring-security-stormpath/pom.xml index 5c5783eec5..4f19921fbd 100644 --- a/spring-security-stormpath/pom.xml +++ b/spring-security-stormpath/pom.xml @@ -35,14 +35,6 @@ - - - spring-releases - Spring Releases - https://repo.spring.io/libs-release - - - spring-security-stormpath diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml index 5ce9e07858..dd4477c551 100644 --- a/spring-sleuth/pom.xml +++ b/spring-sleuth/pom.xml @@ -6,8 +6,8 @@ spring-sleuth 1.0.0-SNAPSHOT jar - spring-sleuth - + spring-sleuth + parent-boot-1 com.baeldung @@ -38,19 +38,8 @@ - - - spring-milestones - Spring Milestones - https://repo.spring.io/libs-milestone - - false - - - - - 2.0.0.M7 + 2.0.2.RELEASE diff --git a/spring-webflux-amqp/pom.xml b/spring-webflux-amqp/pom.xml index 4faa165c50..0868e14717 100755 --- a/spring-webflux-amqp/pom.xml +++ b/spring-webflux-amqp/pom.xml @@ -60,23 +60,4 @@ - - - spring-snapshots - Spring Snapshots - https://repo.spring.io/libs-snapshot - - true - - - - - - - spring-releases - Spring Releases - https://repo.spring.io/libs-release - - - From 6bcc78dce273830bb7310a897be706fd357e71e4 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:10:32 +0200 Subject: [PATCH 318/429] BAEL-10335 - maven work --- libraries-data/pom.xml | 7 ------- spring-mvc-xml/pom.xml | 21 ++++++--------------- xml/pom.xml | 37 ++++--------------------------------- 3 files changed, 10 insertions(+), 55 deletions(-) diff --git a/libraries-data/pom.xml b/libraries-data/pom.xml index 54d24edbf6..f913cf32ca 100644 --- a/libraries-data/pom.xml +++ b/libraries-data/pom.xml @@ -429,13 +429,6 @@ - - - Apache Staging - https://repository.apache.org/content/groups/staging - - - 1.2.2 4.0.1 diff --git a/spring-mvc-xml/pom.xml b/spring-mvc-xml/pom.xml index 7187b5c270..8e4a56c148 100644 --- a/spring-mvc-xml/pom.xml +++ b/spring-mvc-xml/pom.xml @@ -1,7 +1,6 @@ 4.0.0 - com.baeldung 0.1-SNAPSHOT spring-mvc-xml @@ -86,13 +85,13 @@ - + - org.springframework.boot - spring-boot-starter-test - 1.5.10.RELEASE - test - + org.springframework.boot + spring-boot-starter-test + 1.5.10.RELEASE + test + @@ -116,14 +115,6 @@ - - - 1 - jstl - https://mvnrepository.com/artifact/javax.servlet/jstl - - - diff --git a/xml/pom.xml b/xml/pom.xml index 5490f3a89f..dfdec4da16 100644 --- a/xml/pom.xml +++ b/xml/pom.xml @@ -24,7 +24,6 @@ ${jaxen.version} - org.jdom jdom2 @@ -166,7 +165,7 @@ template-binding.xml - src/main/resources + src/main/resources *-binding.xml @@ -174,14 +173,14 @@ - process-classes + process-classes process-classes bind - - process-test-classes + + process-test-classes process-test-classes test-bind @@ -230,34 +229,6 @@ - - - jibx.sf.net - JiBX repository - http://jibx.sf.net/maven2 - - never - - - false - - - - - - - jibx.sf.net - JiBX repository - http://jibx.sf.net/maven2 - - never - - - false - - - - 1.6.1 1.1.6 From 8ed4ac497c8cd96e9250e103b48b44a74a0e3685 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:15:46 +0200 Subject: [PATCH 319/429] maven cleanup --- libraries/pom.xml | 19 +++++++------------ persistence-modules/java-cockroachdb/pom.xml | 11 +---------- persistence-modules/java-jdbi/pom.xml | 9 --------- spring-integration/pom.xml | 8 -------- 4 files changed, 8 insertions(+), 39 deletions(-) diff --git a/libraries/pom.xml b/libraries/pom.xml index 2ad4871e3f..3a51ff5be0 100644 --- a/libraries/pom.xml +++ b/libraries/pom.xml @@ -130,10 +130,10 @@ ${serenity.version} test - - org.asciidoctor - asciidoctorj - + + org.asciidoctor + asciidoctorj + @@ -577,7 +577,7 @@ test test - + org.milyn milyn-smooks-all @@ -654,8 +654,8 @@ org.yaml snakeyaml - ${snakeyaml.version} - + ${snakeyaml.version} + com.numericalmethod @@ -678,11 +678,6 @@ - false diff --git a/persistence-modules/java-cockroachdb/pom.xml b/persistence-modules/java-cockroachdb/pom.xml index 2a92934a6e..2738ef85ff 100644 --- a/persistence-modules/java-cockroachdb/pom.xml +++ b/persistence-modules/java-cockroachdb/pom.xml @@ -5,7 +5,7 @@ com.baeldung java-cockroachdb 1.0-SNAPSHOT - java-cockroachdb + java-cockroachdb parent-modules @@ -22,15 +22,6 @@ - - - Central - Central - http://repo1.maven.org/maven2/ - default - - - 42.1.4 diff --git a/persistence-modules/java-jdbi/pom.xml b/persistence-modules/java-jdbi/pom.xml index 9281f4fd9d..dfb31b26e8 100644 --- a/persistence-modules/java-jdbi/pom.xml +++ b/persistence-modules/java-jdbi/pom.xml @@ -27,15 +27,6 @@ - - - Central - Central - http://repo1.maven.org/maven2/ - default - - - 3.1.0 2.4.0 diff --git a/spring-integration/pom.xml b/spring-integration/pom.xml index 457645a144..8a5399ae0b 100644 --- a/spring-integration/pom.xml +++ b/spring-integration/pom.xml @@ -104,14 +104,6 @@ - - - repo.springsource.org.milestone - Spring Framework Maven Milestone Repository - https://repo.springsource.org/milestone - - - UTF-8 5.0.3.RELEASE From e566167d3f2bb75f1bd28a6ed9d396622b0de50b Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:27:19 +0200 Subject: [PATCH 320/429] package cleanup --- .../spring-boot-persistence/pom.xml | 54 +++++++++---------- .../com/baeldung/boot/config/H2JpaConfig.java | 4 +- .../baeldung/boot/domain/GenericEntity.java | 2 +- .../repository/GenericEntityRepository.java | 5 +- .../baeldung/SpringBootH2IntegrationTest.java | 7 ++- .../SpringBootJPAIntegrationTest.java | 5 +- .../SpringBootProfileIntegrationTest.java | 7 +-- .../config/H2TestProfileJPAConfig.java | 6 +-- 8 files changed, 46 insertions(+), 44 deletions(-) rename persistence-modules/spring-boot-persistence/src/main/java/{org => com}/baeldung/boot/domain/GenericEntity.java (95%) rename persistence-modules/spring-boot-persistence/src/main/java/{org => com}/baeldung/boot/repository/GenericEntityRepository.java (63%) rename persistence-modules/spring-boot-persistence/src/test/java/{org => com}/baeldung/config/H2TestProfileJPAConfig.java (91%) diff --git a/persistence-modules/spring-boot-persistence/pom.xml b/persistence-modules/spring-boot-persistence/pom.xml index 0ea42b1cb7..d9d3a9f9b7 100644 --- a/persistence-modules/spring-boot-persistence/pom.xml +++ b/persistence-modules/spring-boot-persistence/pom.xml @@ -1,20 +1,18 @@ - - 4.0.0 - com.baeldung + + 4.0.0 spring-boot-persistence 0.1.0 - spring-boot-persistence - + spring-boot-persistence + parent-boot-2 - com.baeldung - 0.0.1-SNAPSHOT - ../../parent-boot-2 + com.baeldung + 0.0.1-SNAPSHOT + ../../parent-boot-2 - + org.springframework.boot @@ -35,42 +33,30 @@ org.mockito mockito-core - ${mockito.version} test com.h2database h2 - ${h2database.version} runtime - + org.apache.tomcat tomcat-jdbc - ${tomcat-jdbc.version} mysql mysql-connector-java - ${mysql-connector-java.version} - - UTF-8 - 1.8 - 8.0.12 - 9.0.10 - 1.4.197 - 2.23.0 - - + spring-boot-persistence - - src/main/resources - true - + + src/main/resources + true + @@ -79,4 +65,14 @@ + + + UTF-8 + 1.8 + 8.0.12 + 9.0.10 + 1.4.197 + 2.23.0 + + 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 ef90714347..547a905d91 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 @@ -18,7 +18,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration -@EnableJpaRepositories(basePackages = { "org.baeldung.boot.repository", "org.baeldung.repository" }) +@EnableJpaRepositories(basePackages = { "com.baeldung.boot.repository", "com.baeldung.repository" }) @PropertySource("classpath:persistence-generic-entity.properties") @EnableTransactionManagement public class H2JpaConfig { @@ -41,7 +41,7 @@ public class H2JpaConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.boot.domain" }); + em.setPackagesToScan(new String[] { "com.baeldung.boot.domain" }); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; diff --git a/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java similarity index 95% rename from persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java index f1c936e432..a2a676200a 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/domain/GenericEntity.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/domain/GenericEntity.java @@ -1,4 +1,4 @@ -package org.baeldung.boot.domain; +package com.baeldung.boot.domain; import javax.persistence.Entity; import javax.persistence.GeneratedValue; diff --git a/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java similarity index 63% rename from persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java rename to persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java index d897e17afe..bbc2865856 100644 --- a/persistence-modules/spring-boot-persistence/src/main/java/org/baeldung/boot/repository/GenericEntityRepository.java +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/boot/repository/GenericEntityRepository.java @@ -1,7 +1,8 @@ -package org.baeldung.boot.repository; +package com.baeldung.boot.repository; -import org.baeldung.boot.domain.GenericEntity; import org.springframework.data.jpa.repository.JpaRepository; +import com.baeldung.boot.domain.GenericEntity; + public interface GenericEntityRepository extends JpaRepository { } diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java index 6479e90113..ecacf62285 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootH2IntegrationTest.java @@ -3,8 +3,6 @@ package com.baeldung; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.baeldung.boot.domain.GenericEntity; -import org.baeldung.boot.repository.GenericEntityRepository; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -12,10 +10,13 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import com.baeldung.boot.config.H2JpaConfig; +import com.baeldung.boot.domain.GenericEntity; +import com.baeldung.boot.repository.GenericEntityRepository; @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = { Application.class, H2JpaConfig.class }) public class SpringBootH2IntegrationTest { + @Autowired private GenericEntityRepository genericEntityRepository; @@ -23,7 +24,9 @@ public class SpringBootH2IntegrationTest { public void givenGenericEntityRepository_whenSaveAndRetreiveEntity_thenOK() { GenericEntity genericEntity = genericEntityRepository.save(new GenericEntity("test")); GenericEntity foundEntity = genericEntityRepository.findById(genericEntity.getId()).orElse(null); + assertNotNull(foundEntity); assertEquals(genericEntity.getValue(), foundEntity.getValue()); } + } \ No newline at end of file diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java index eef9ebe953..01fae2fb4d 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootJPAIntegrationTest.java @@ -3,14 +3,15 @@ package com.baeldung; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.baeldung.boot.domain.GenericEntity; -import org.baeldung.boot.repository.GenericEntityRepository; 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.domain.GenericEntity; +import com.baeldung.boot.repository.GenericEntityRepository; + @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class SpringBootJPAIntegrationTest { diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java index 4c68f1d4a0..65a75d7bfe 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/SpringBootProfileIntegrationTest.java @@ -3,9 +3,6 @@ package com.baeldung; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -import org.baeldung.boot.domain.GenericEntity; -import org.baeldung.boot.repository.GenericEntityRepository; -import org.baeldung.config.H2TestProfileJPAConfig; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; @@ -13,6 +10,10 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; +import com.baeldung.boot.domain.GenericEntity; +import com.baeldung.boot.repository.GenericEntityRepository; +import com.baeldung.config.H2TestProfileJPAConfig; + @RunWith(SpringRunner.class) @SpringBootTest(classes = { Application.class, H2TestProfileJPAConfig.class }) @ActiveProfiles("test") diff --git a/persistence-modules/spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java similarity index 91% rename from persistence-modules/spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java rename to persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java index 7f962e1417..bcbded95fb 100644 --- a/persistence-modules/spring-boot-persistence/src/test/java/org/baeldung/config/H2TestProfileJPAConfig.java +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/config/H2TestProfileJPAConfig.java @@ -1,4 +1,4 @@ -package org.baeldung.config; +package com.baeldung.config; import java.util.Properties; @@ -18,7 +18,7 @@ import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration -@EnableJpaRepositories(basePackages = { "org.baeldung.repository", "org.baeldung.boot.repository" }) +@EnableJpaRepositories(basePackages = { "com.baeldung.repository", "com.baeldung.boot.repository" }) @EnableTransactionManagement public class H2TestProfileJPAConfig { @@ -41,7 +41,7 @@ public class H2TestProfileJPAConfig { public LocalContainerEntityManagerFactoryBean entityManagerFactory() { final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean(); em.setDataSource(dataSource()); - em.setPackagesToScan(new String[] { "org.baeldung.domain", "org.baeldung.boot.domain" }); + em.setPackagesToScan(new String[] { "com.baeldung.domain", "com.baeldung.boot.domain" }); em.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); em.setJpaProperties(additionalProperties()); return em; From 1bb238b908877bc387569513081e5c6538d8b204 Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:32:30 +0200 Subject: [PATCH 321/429] logging fix --- libraries-data/src/main/resources/logback.xml | 2 +- .../jmapper/JMapperIntegrationTest.java | 158 ++++++++---------- 2 files changed, 74 insertions(+), 86 deletions(-) diff --git a/libraries-data/src/main/resources/logback.xml b/libraries-data/src/main/resources/logback.xml index a57d22fcb2..3d2ec51566 100644 --- a/libraries-data/src/main/resources/logback.xml +++ b/libraries-data/src/main/resources/logback.xml @@ -9,7 +9,7 @@ - + \ No newline at end of file diff --git a/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java index 96ed090482..9db7bdb4ac 100644 --- a/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java +++ b/libraries-data/src/test/java/com/baeldung/jmapper/JMapperIntegrationTest.java @@ -15,100 +15,88 @@ import com.googlecode.jmapper.api.JMapperAPI; public class JMapperIntegrationTest { - @Test - public void givenUser_whenUseAnnotation_thenConverted(){ + public void givenUser_whenUseAnnotation_thenConverted() { JMapper userMapper = new JMapper<>(UserDto.class, User.class); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); UserDto result = userMapper.getDestination(user); - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - } - - @Test - public void givenUser_whenUseGlobalMapAnnotation_thenConverted(){ - JMapper userMapper= new JMapper<>(UserDto1.class, User.class); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto1 result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getEmail()); - } - - @Test - public void givenUser_whenUseAnnotationExplicitConversion_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto.class, User.class); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - assertTrue(result.getAge() > 0); - } - - //======================= XML - - @Test - public void givenUser_whenUseXml_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto.class, User.class,"user_jmapper.xml"); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getUsername()); - } - - @Test - public void givenUser_whenUseXmlGlobal_thenConverted(){ - JMapper userMapper = new JMapper<>(UserDto1.class, User.class,"user_jmapper1.xml"); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto1 result = userMapper.getDestination(user); - - System.out.println(result); - assertEquals(user.getId(), result.getId()); - assertEquals(user.getEmail(), result.getEmail()); - } - - // ===== API - - @Test - public void givenUser_whenUseApi_thenConverted(){ - JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class) - .add(attribute("id").value("id")) - .add(attribute("username").value("email")) - ) ; - JMapper userMapper = new JMapper<>(UserDto.class, User.class, jmapperApi); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto result = userMapper.getDestination(user); - - System.out.println(result); assertEquals(user.getId(), result.getId()); assertEquals(user.getEmail(), result.getUsername()); } - - @Test - public void givenUser_whenUseApiGlobal_thenConverted(){ - JMapperAPI jmapperApi = new JMapperAPI() .add(mappedClass(UserDto.class) - .add(global()) - ) ; - JMapper userMapper1 = new JMapper<>(UserDto1.class, User.class,jmapperApi); - - User user = new User(1L,"john@test.com", LocalDate.of(1980,8,20)); - UserDto1 result = userMapper1.getDestination(user); - System.out.println(result); + @Test + public void givenUser_whenUseGlobalMapAnnotation_thenConverted() { + JMapper userMapper = new JMapper<>(UserDto1.class, User.class); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto1 result = userMapper.getDestination(user); + assertEquals(user.getId(), result.getId()); assertEquals(user.getEmail(), result.getEmail()); } + + @Test + public void givenUser_whenUseAnnotationExplicitConversion_thenConverted() { + JMapper userMapper = new JMapper<>(UserDto.class, User.class); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto result = userMapper.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + assertTrue(result.getAge() > 0); + } + + // ======================= XML + + @Test + public void givenUser_whenUseXml_thenConverted() { + JMapper userMapper = new JMapper<>(UserDto.class, User.class, "user_jmapper.xml"); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto result = userMapper.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + } + + @Test + public void givenUser_whenUseXmlGlobal_thenConverted() { + JMapper userMapper = new JMapper<>(UserDto1.class, User.class, "user_jmapper1.xml"); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto1 result = userMapper.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getEmail()); + } + + // ===== API + + @Test + public void givenUser_whenUseApi_thenConverted() { + JMapperAPI jmapperApi = new JMapperAPI().add(mappedClass(UserDto.class).add(attribute("id").value("id")).add(attribute("username").value("email"))); + JMapper userMapper = new JMapper<>(UserDto.class, User.class, jmapperApi); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto result = userMapper.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getUsername()); + } + + @Test + public void givenUser_whenUseApiGlobal_thenConverted() { + JMapperAPI jmapperApi = new JMapperAPI().add(mappedClass(UserDto.class).add(global())); + JMapper userMapper1 = new JMapper<>(UserDto1.class, User.class, jmapperApi); + + User user = new User(1L, "john@test.com", LocalDate.of(1980, 8, 20)); + UserDto1 result = userMapper1.getDestination(user); + + assertEquals(user.getId(), result.getId()); + assertEquals(user.getEmail(), result.getEmail()); + } + } From 8411df4e6b1f405348667396722202b5b1710c2d Mon Sep 17 00:00:00 2001 From: Eugen Paraschiv Date: Tue, 18 Dec 2018 23:50:20 +0200 Subject: [PATCH 322/429] renaming tests --- .../src/main/resources/mongoConfig.xml | 19 +++++++++---------- ... => MongoTransactionReactiveLiveTest.java} | 2 +- ... => MongoTransactionTemplateLiveTest.java} | 2 +- ...t.java => MongoTransactionalLiveTest.java} | 2 +- .../SpringContextIntegrationTest.java | 18 ------------------ 5 files changed, 12 insertions(+), 31 deletions(-) rename persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/{MongoTransactionReactiveIntegrationTest.java => MongoTransactionReactiveLiveTest.java} (96%) rename persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/{MongoTransactionTemplateIntegrationTest.java => MongoTransactionTemplateLiveTest.java} (97%) rename persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/{MongoTransactionalIntegrationTest.java => MongoTransactionalLiveTest.java} (98%) delete mode 100644 persistence-modules/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java diff --git a/persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml b/persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml index 324f7f60c2..d59ebcef6e 100644 --- a/persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml +++ b/persistence-modules/spring-data-mongodb/src/main/resources/mongoConfig.xml @@ -7,33 +7,32 @@ http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context.xsd" -> - - + http://www.springframework.org/schema/context/spring-context.xsd"> + + - + - + - + - + - + - + \ No newline at end of file diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java similarity index 96% rename from persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java index 43aa865e91..70908552fe 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveIntegrationTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionReactiveLiveTest.java @@ -14,7 +14,7 @@ import com.baeldung.model.User; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoReactiveConfig.class) -public class MongoTransactionReactiveIntegrationTest { +public class MongoTransactionReactiveLiveTest { @Autowired private ReactiveMongoOperations reactiveOps; diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java similarity index 97% rename from persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java index 1dbe724d87..20ac6974bc 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateIntegrationTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionTemplateLiveTest.java @@ -26,7 +26,7 @@ import com.baeldung.model.User; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) -public class MongoTransactionTemplateIntegrationTest { +public class MongoTransactionTemplateLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java similarity index 98% rename from persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java rename to persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java index 4d747789a0..0cf86aa43e 100644 --- a/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalIntegrationTest.java +++ b/persistence-modules/spring-data-mongodb/src/test/java/com/baeldung/transaction/MongoTransactionalLiveTest.java @@ -27,7 +27,7 @@ import com.mongodb.MongoCommandException; @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = MongoConfig.class) @FixMethodOrder(MethodSorters.NAME_ASCENDING) -public class MongoTransactionalIntegrationTest { +public class MongoTransactionalLiveTest { @Autowired private MongoTemplate mongoTemplate; diff --git a/persistence-modules/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/persistence-modules/spring-data-mongodb/src/test/java/org/baeldung/SpringContextIntegrationTest.java deleted file mode 100644 index 04d549a288..0000000000 --- a/persistence-modules/spring-data-mongodb/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.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.baeldung.config.MongoConfig; -import com.baeldung.config.SimpleMongoConfig; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { MongoConfig.class, SimpleMongoConfig.class }) -public class SpringContextIntegrationTest { - - @Test - public void whenSpringContextIsBootstrapped_thenNoExceptions() { - } -} From 3064a22a7aea5b5339fc25abb8475574179f54b2 Mon Sep 17 00:00:00 2001 From: Alejandro Gervasio Date: Wed, 19 Dec 2018 10:32:39 -0300 Subject: [PATCH 323/429] BAEL-2413 - Integrating Spring Boot with HSQLDB (#5891) * Initial Commit * Update source file location * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java * Update source files * Update CustomerController.java * Update CustomerController.java * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java * Update index.html * Update persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java Co-Authored-By: alejandrogervasio * Update CustomerController.java * Update CustomerControllerUnitTest.java * Update CustomerController.java * Update CustomerControllerUnitTest.java * Update CustomerControllerUnitTest.java --- .../application/Application.java | 12 ++++ .../controllers/CustomerController.java | 33 ++++++++++ .../application/entities/Customer.java | 55 +++++++++++++++++ .../repositories/CustomerRepository.java | 8 +++ .../src/main/resources/application.properties | 21 ++----- .../src/main/resources/templates/index.html | 2 +- .../tests/CustomerControllerUnitTest.java | 61 +++++++++++++++++++ 7 files changed, 175 insertions(+), 17 deletions(-) create mode 100644 persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java create mode 100644 persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java create mode 100644 persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java create mode 100644 persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java create mode 100644 persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java new file mode 100644 index 0000000000..c5a5c291c6 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/Application.java @@ -0,0 +1,12 @@ +package com.baeldung.springboothsqldb.application; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java new file mode 100644 index 0000000000..8229a1d1c0 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/controllers/CustomerController.java @@ -0,0 +1,33 @@ +package com.baeldung.springboothsqldb.application.controllers; + +import com.baeldung.springboothsqldb.application.entities.Customer; +import com.baeldung.springboothsqldb.application.repositories.CustomerRepository; +import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class CustomerController { + + private final CustomerRepository customerRepository; + + @Autowired + public CustomerController(CustomerRepository customerRepository) { + this.customerRepository = customerRepository; + } + + @PostMapping("/customers") + public Customer addCustomer(@RequestBody Customer customer) { + customerRepository.save(customer); + return customer; + } + + @GetMapping("/customers") + public List getCustomers() { + return (List) customerRepository.findAll(); + } +} diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java new file mode 100644 index 0000000000..636a80e272 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/entities/Customer.java @@ -0,0 +1,55 @@ +package com.baeldung.springboothsqldb.application.entities; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "customers") +public class Customer { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private long id; + + private String name; + private String email; + + public Customer() {} + + public Customer(String name, String email) { + this.name = name; + this.email = email; + } + + public void setId(long id) { + this.id = id; + } + + public long getId() { + return id; + } + + public void setName(String name) { + this.name = name; + } + + public String getName() { + return name; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getEmail() { + return email; + } + + @Override + public String toString() { + return "Customer{" + "id=" + id + ", name=" + name + ", email=" + email + '}'; + } +} diff --git a/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java new file mode 100644 index 0000000000..a81aa62c43 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/main/java/com/baeldung/springboothsqldb/application/repositories/CustomerRepository.java @@ -0,0 +1,8 @@ +package com.baeldung.springboothsqldb.application.repositories; + +import com.baeldung.springboothsqldb.application.entities.Customer; +import org.springframework.data.repository.CrudRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CustomerRepository extends CrudRepository {} diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/application.properties b/persistence-modules/spring-boot-persistence/src/main/resources/application.properties index 303ce33c25..b0caf4a809 100644 --- a/persistence-modules/spring-boot-persistence/src/main/resources/application.properties +++ b/persistence-modules/spring-boot-persistence/src/main/resources/application.properties @@ -1,16 +1,5 @@ -spring.datasource.tomcat.initial-size=15 -spring.datasource.tomcat.max-wait=20000 -spring.datasource.tomcat.max-active=50 -spring.datasource.tomcat.max-idle=15 -spring.datasource.tomcat.min-idle=8 -spring.datasource.tomcat.default-auto-commit=true -spring.datasource.url=jdbc:h2:mem:test -spring.datasource.username=root -spring.datasource.password= -spring.datasource.driver-class-name=org.h2.Driver - -spring.jpa.show-sql=false -spring.jpa.hibernate.ddl-auto=update -spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy -spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect -spring.jpa.properties.hibernate.id.new_generator_mappings=false +spring.datasource.driver-class-name = org.hsqldb.jdbc.JDBCDriver +spring.datasource.url = jdbc:hsqldb:mem:test;DB_CLOSE_DELAY=-1 +spring.datasource.username = sa +spring.datasource.password = +spring.jpa.hibernate.ddl-auto = create diff --git a/persistence-modules/spring-boot-persistence/src/main/resources/templates/index.html b/persistence-modules/spring-boot-persistence/src/main/resources/templates/index.html index 2634e10380..344d4e59f5 100644 --- a/persistence-modules/spring-boot-persistence/src/main/resources/templates/index.html +++ b/persistence-modules/spring-boot-persistence/src/main/resources/templates/index.html @@ -40,4 +40,4 @@ - \ No newline at end of file + diff --git a/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java new file mode 100644 index 0000000000..33891e3d43 --- /dev/null +++ b/persistence-modules/spring-boot-persistence/src/test/java/com/baeldung/springboothsqldb/application/tests/CustomerControllerUnitTest.java @@ -0,0 +1,61 @@ +package com.baeldung.springboothsqldb.application.tests; + +import com.baeldung.springboothsqldb.application.entities.Customer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.ObjectWriter; +import com.fasterxml.jackson.databind.SerializationFeature; +import java.nio.charset.Charset; +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.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class CustomerControllerUnitTest { + + private static MediaType MEDIA_TYPE_JSON; + + @Autowired + private MockMvc mockMvc; + + @Before + public void setUpJsonMediaType() { + MEDIA_TYPE_JSON = new MediaType(MediaType.APPLICATION_JSON.getType(), MediaType.APPLICATION_JSON.getSubtype(), Charset.forName("utf8")); + + } + + @Test + public void whenPostHttpRequesttoCustomers_thenStatusOK() throws Exception { + Customer customer = new Customer("John", "john@domain.com"); + ObjectMapper mapper = new ObjectMapper(); + mapper.configure(SerializationFeature.WRAP_ROOT_VALUE, false); + ObjectWriter objectWriter = mapper.writer().withDefaultPrettyPrinter(); + String requestJson = objectWriter.writeValueAsString(customer); + + this.mockMvc + .perform(MockMvcRequestBuilders.post("/customers") + .contentType(MEDIA_TYPE_JSON) + .content(requestJson) + ) + + .andExpect(MockMvcResultMatchers.status().isOk()); + } + + @Test + public void whenGetHttpRequesttoCustomers_thenStatusOK() throws Exception { + this.mockMvc + .perform(MockMvcRequestBuilders.get("/customers")) + + .andExpect(MockMvcResultMatchers.content().contentType(MEDIA_TYPE_JSON)) + .andExpect(MockMvcResultMatchers.status().isOk()); + } +} From 5996de6af1a681d8c9a6c9c930a57b498daab92b Mon Sep 17 00:00:00 2001 From: "EZZEDDINE.ELHAZATI" Date: Wed, 19 Dec 2018 16:04:46 +0100 Subject: [PATCH 324/429] rename test class. --- ....java => BootstrapAPIIntegrationTest.java} | 30 +++---------------- 1 file changed, 4 insertions(+), 26 deletions(-) rename persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/{Hibernate5BootstrapAPITest.java => BootstrapAPIIntegrationTest.java} (62%) diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/BootstrapAPIIntegrationTest.java similarity index 62% rename from persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java rename to persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/BootstrapAPIIntegrationTest.java index 39111f6256..19988b45be 100644 --- a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/Hibernate5BootstrapAPITest.java +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/bootstrap/BootstrapAPIIntegrationTest.java @@ -1,7 +1,6 @@ package com.baeldung.hibernate.bootstrap; import com.baeldung.hibernate.pojo.Movie; -import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; @@ -10,22 +9,18 @@ import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.service.ServiceRegistry; import org.junit.After; -import org.junit.Before; import org.junit.Test; import java.io.IOException; -import java.util.List; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; -public class Hibernate5BootstrapAPITest { +public class BootstrapAPIIntegrationTest { SessionFactory sessionFactory = null; - Session session = null; - @Before - public void setUp() throws IOException { + @Test + public void whenServiceRegistryAndMetadata_thenSessionFactory() throws IOException { BootstrapServiceRegistry bootstrapRegistry = new BootstrapServiceRegistryBuilder() .build(); @@ -41,29 +36,12 @@ public class Hibernate5BootstrapAPITest { Metadata metadata = metadataSources.getMetadataBuilder().build(); sessionFactory = metadata.buildSessionFactory(); - } - - @Test - public void testBuildSessionFactory() { assertNotNull(sessionFactory); - session = sessionFactory.openSession(); - assertNotNull(session); - - //Persist Movie - session.getTransaction().begin(); - Movie movie = new Movie(); - movie.setId(100L); - session.persist(movie); - session.getTransaction().commit(); - - List movies = session.createQuery("FROM Movie").list(); - assertNotNull(movies); - assertEquals(movies.size(), 1L); + sessionFactory.close(); } @After public void clean() throws IOException { - session.close(); sessionFactory.close(); } } From c28fa5541d4be07e2e7006dc8465748efe597a82 Mon Sep 17 00:00:00 2001 From: Urvy Agrawal Date: Thu, 20 Dec 2018 00:26:14 +0530 Subject: [PATCH 325/429] BAEL-2323 Adding files for native keyword tutorial (#5913) * BAEL-2323 Adding files for native keyword tutorial * junit test files and native library * update test method name --- core-java/native/nativedatetimeutils.dll | Bin 0 -> 72050 bytes .../baeldung/nativekeyword/DateTimeUtils.java | 10 +++++++ .../baeldung/nativekeyword/NativeMainApp.java | 11 +++++++ .../DateTimeUtilsManualTest.java | 27 ++++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 core-java/native/nativedatetimeutils.dll create mode 100644 core-java/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java create mode 100644 core-java/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java create mode 100644 core-java/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java diff --git a/core-java/native/nativedatetimeutils.dll b/core-java/native/nativedatetimeutils.dll new file mode 100644 index 0000000000000000000000000000000000000000..ecdd3883806f95f1c309debac6fefd2897b77a10 GIT binary patch literal 72050 zcmeFa3w%`7wLg9)GZQ9|aDpTn6=c+)i9$?xC{fTHG6QFD5@Hfwf=)sn5DiJ1%s^BM z!I=?GkArEet!=HP*0$cOZK<`quIMCzB;YH64-g-SR?jdX4=n^x=l@;%oHH|twD*5M zzt8Xf?!(cOwI6G*z4qE`uf6u;9E$F2=ZqZ3neap+9Jd9Keg*9BKmXH)?BQd!4d-4+ zdhN7uQ&uJq^~n2CHp$nRQuXbxlr6%Fs-W zbcvngsvk<_ZkcfDBJLTEOEq)c3GN!}u!Mw*xurl_k0*`eta!LoD)e|g{bk_{fnVC_OlmaLYgAR`h5(Ue0R_Yg%+a9nv31+?D=j$2B?(SKG0H%Sj) z2&NjitP7+sI>mAQVC^6Ma@;koZe;e?;t#P%ZAUxee-&IwMNW04yAp{(%4oww&2GRG z_bcE^f;r79VlL##wc{aLO>syF7H|~>IZY}aYvTqa65et=alZmCw;-oA4sRne32$W_ z5`qkGaZ3xOmW;%oAcemDYvU?{IW;Q1hba3H9%{#fc;bGHUY&}^`s4&MhvMtT?9CtnAPo#A86~iO>#Qh)_$gifpv5Hgs8hy_2eiVm< zAnKidgQg56l$ERDJvtb#Wcm$x`7H6CVE_fdO9uSOV7%1nH%!c9i7cx`qxaMW@Fq=W zi8(;wDm1*OFMv1sCYH$B+oa+BZZKZK^noeg#s0TQpiJ~0wQl907|KW094AU$qST?x z7=obxpeUJ-c2c7G7=U|ZUQq0z$$}HTJFE-4_%Q|C7ScaGYU4Pee9pYNjHrLFD7{uB z?eKhGHvi;L9On=6>u&|NS21j(LXx=+sd>Q@BLC;~UxI$#Y0)1P<RU($UadzL3qs%_!NKwhCSkw~PLAL9cukw|fXlH!A%C-F($ZU@q)QCbtFp+mi4 ziDs@1X7*{=rM0W5yDV@fm%YJ15NF!l@$FDQ50xX3w#eiaU;FQ z{2)pt5ZzaSQHx)W-d;_+vPiq$koGyHol^SLWgO?3A)9mmKyr8Aty~NBbx2AcaLy|C zUjkk0_MSKLKIj{IfcO0#P&(0Lj=+_GFe4Cg)EsMH^nx;<-w;CV1_FLH>`v5P@KkDQ2) zbbS?x5R?9e)V9K2M^SzZeByxjFF+n+b2mfD$2-^34@9VDAGPhm?z8?<_P6vCDt4jp&Mf0xy&{Y z=d(RlKKuK*Ha^>4fImeg_%o*hf9`6+pWhM=;2&tV2K?&=6>i@MC`y4;A|*XWV^s{8 zKVgaXJ_M7XQlezvF9z&~#K0V@D5XN_W-){kizrnfYTrO+?|2%b*dDCWLi> zlCzXA?j}4ZrF1FRutHAYNao!yf=W6P7;PkUP{ON(F6~Fh=PtyQav+j^%LBpXlv^<@~~P zEWU`c05yiUY2za=IDp-DQR?lAw^tO8wWeL=Z;A-{&ZiMm;l$WkO8td_G+&kU&+a0A z(igW95G$0k7a<_K(Fdzpj#wc|?>eLtiWNS#(t@=1n7vR3mu4k__`003;2D&c-hrv~ z@8Z{!y~eyV6^VHVYulZ&XmRGh-i*niBvmf8I1GCbLMAl^xy}^w9S3J;xlgbDl zCH+B%w1fBkjHpx{bO!1(bDe=n3o&aRfmL;Md}?$Wz7VCtRMk;XUPK`QCLmeZk_(ce zq0cEDLB0h%Y(WVW-1#oY&61tD7EJRrZL&$!mRauYH}U=s;=}wHFbygNR{W%fdL`I^ zp&?YyWEe70ItNanL=|Mt)o~J9u!!TL`ocIyr6s5|{D<0hZ-0Ti+Zk|XjuW;N5QE@V zBt6ds($zqU?2FP>cu-QSD{zlOo$gCmNgL9}#R^9DwGZT=3zhJ`8=>S*Ii(BE_u#6E z3@0P$n+}k{=KaITfTUXx!zB9Fav0=Jr5p2)I$rV)hMHhUA-(&F5V*AfZ8^}2Wm~RA zc>c~PALI3Iu}uB%r@!*5TM8W(QlDU2-!PG*R5nHkOVhQ z%*OcdAF}F~_&aRXM4LSNUr@r1Y1zL41#EKqFIjvq?{8=ElpnJAF3-iFE+K4_jdr+z z9{F~Yf0w60F0)`*^L`$q90N8P1D5wrC5sZ6cE#T?zrh@-(>w~uMt)P7MKtt_hO^#t zsZN>WeOI7y{Mv&+@}9HsJ{zKt;J?P?}H*+%&^OeCuf%Zh5EC!Rt4mv{N4Y`a38fPkR|4JSwW6-foP! zu8dnI{{|)a08O*#>-C6;hW&CXOyTF}T$O!3$k13OeseQX@v{2P!7q|mm5C>Nqj3oUYq zMfveLE^_YK$IEgCkqb5YxR|T+7A1(%$ zTP8g9;rO3jk5CT=8W1syb-6DQ&tTCs`ZdDv?kG^rA^ckrrp_8k?|^-G%GDHHkD#Rr~owQoWi+a_w&J>5jNiq z!h|^aePs2RC&I!dnYdt&dAw%p(1r;JqMskAq{8+S2)3!g{z&@aeN=hM@d{%0?}$Xw zZ^PehLnT8E3L@;8x zX+K8L{X5-}fm5d1vuPOiK%o^8zxEMAOu)V(@B0Y_v3?ACUIinxX{B7MF~a+{Bg%}< zDg;<&qz?`5}tZxK%zVSKGk*9#@OHXR-`d>^2mO+CR*1#`yTO z(L`_aw1)wB|1@OjtyTF~?XK2*o92Wn4X7_KNK3uLuwkSIiZO}J-C3bNq_7PLwN-@- zHMA|7$`~H6rap~ST7Jg)SJC|q<)cJ2O4=!#H#|)v)-zW0A9Guw7F!xgsUAWqdW%yW z5F@1JPSb^N)kY)RUkFUT4~Sc7W_AX~9>XLF6Cs`XLVVUKefDQ7AZD7kX&TQy9-fHt zYkmzlLbvI?Bx&k?d3v&xXq;|w1k&Dv-8P8XN2IwHX@*Jkb|;J8^H%pnj2xv~WdSPW zc?tVEyzhGur1UQK6UeyGo~}d{j9>>R9s;@~vym z78cI5^1k)JW2(D+rlxq~&}9Chw<(=z!d*-gc;6>TVeOU8b*PNwF_YF7%sPsZL;Ctf z9RZG)NOJlJ*ifo#&o@Y=qFYtX?_(B8rJ?Eb>FFl;0!zVU_%Is}q~Gp$__bs&m~Ojw zGri{hBm-Tyr$ws>s#Wm5Qe9BMP($q6mH{reva$1r5@G{3waYzC$`Ykk@^%%bt=+E?S7sws5lDHHlu8=? zcLoYmBk2)j$I*NVLX3oe-p;lrWwRf6(krN!XXb=$X11YLA|)~MOBng|r->lEu2FJA z{(etNxY#ChLjHdDwQL(;IvO1G97UmWR_F&Pq!U!_6P&eFQJRIPLusGQ=w~xj7f{3d zL>VL`^Q}~i)E7R0mBZ02TBXixPNyYrg>Ez0lGjH2iMug(q0(B}97G5cg9k1}%9{xH znEw@j=@&`g@G8i6*0#&$pEG>-wTx1ac`c$OT9P*W0jwj`{GTW%VPwLOfYv&szz-k_ zyOo2K`eQa%(Vx6v?V9|eJKaObJpn&r)g4ns!=5$ybdcvcLfQ9a3`^i24eI#<@;ms= zLK+qVh75kQBhkOho#hR|^-Pwqe(KGV#biP1b>#Q0uoy)wxOX=X!@4uencwUABro{I zfc3PtxeRAP`B^cwqTjOOUhq8W00w~zeGKccP^?O?KpeJmGyy{&zqtg}FG@xA1&P4O z$0jt^Fl}OBWmi@>36?WU%s=nGO7()Va3Z5AfIb9$SlzK8qYZhHai$Fn7KQy}`b6vZ zK+2!@gN64ntWW_qj#7S&I9BRn_HKqBI!Pl=*ACs@F@H3W;-Rv%Fv#1B(j&zx^RK9M zAbk-4zqvdi5gr!xSX_Mqm8npQ!nA z|H0Lt$@e6ShQEuL4s|o6+GlK$$C7GQ`vJ4_!mprwC=034QAo7?dAkA&49W~BBISOM z-<0Y-{9)Un1%NT(1$ObFC-;FAvkC3fn2@T&NyO1xLlaU#kk34MzAN+X0 zb`%M(5GABFJdIR9q8cF>ewlj%Oj3yW%r3yF*0c`~?Ha zw==5~mo_*a`WPFrQR~v)9y&NM4*e5p2LT&p`feFk1P*DBDD7rG{Z_7m8j3}LV!aq4 z>@>$!NA`3Iu&J~aMNpO%P`*rOxKrYBi4EY-$NKZ&bqD_Tiw_UIzyI_OgZuK+J50Rq zK`0jnl?Ce!n-Sr>z2WrQc4T>G>&Zw(@>s5o7FSPX0&s$4B=$wx=gY-or5z(1dTAd# zOdENojQ1j`Px%NtDqw$p*XbPv?rU|L2_Ukq>tz_>-_v-Y+D%BxgV!Jad2PFnMkZbA zTyr?Gn&Z|SxwQbjP8y-jchfOL?*mznMJ~rp4|?Y>Ss$K%xH<6C)qm7+-~TA1n&wwm*I^0O7W zFgbtc_g7~tIGQL-UX^&dFv;Y8z<+F2IluYhSXp?l3CakR^#@no%xv{a+Gngb(r3RRn4al)&~#Wyz~QMa%SMa8F?} zawFlj*#A=uU?gS_Sz!=Sx?t?6yh!D5PxgEonu{V)e@T!FFmb;wy@h78)^+Nw;{#Z$ zaC!@~sfC`a)oQ?Blz!D<`T={ye+&~+qQN~S#t;9}aMs>#gOZ05V*WRtqjAkzby>8* z7ik3J8?2sc>COEm$p_=Xzf0&TNF@olp^4B*yFB00jR7*=8MwnBct5t<^L9<=H<^Zd z4}EA$+F!WNG}PhkFgUztjh@dOfl?#c?Ng`^!)3>mE-EgZ=_0qnoyrIjvFnLg_|L-W zt^)U^(NyR^QhyP(mn_2}?GCR~{UzPr>xV)%I7l|^OJhEg-gZc@VCPTZ9YNttCs`j` zK)l2~tk!$K6&CO#)GyCS7VaUIvT|;W+Wlg7 zKRJON=WY`_j@$|_!+QvV!8F~EqsB=nK;xBmCE(ix<{KPmJ^~)Bf$2x0Aqacv?Z|~^ zDXhcT+~fI~O`eg8#;v+Rl=`tpDj0$kyHX(Sm-f#Jlp761ubaz7y9_i(e>p3#2pf3$ z=Xu|9wdp9ZfabdFcMYBL42yrSG&gzGtbYk2*PV#@A5nQO_7M4XIP2iZbd8tiCI@Ck zfLWZp%F4#iDRumGL1>VsI)3J2{D9yyZSKZy<9N2v%>S?@kLeSf2I&<4(lF(RB&p##J809JRR2u3s`;4-r1`5!^PfNm+hkX=J^wwMv>)2PBToBo?q}K$7Y_zB6N~nI z2*EDB?UX(iyq{Xb!yNlU>&hZU@XD{Yk+0KbuwB_3D1pC`zv^Re@FwKjl1?ChU17xY zz9auV-gg=mf*pSST?ja(Ls5n0*VB1oywZM4VV(IO^S;M`CGEFm9}@Dr`1NPdO1t#F zkiFCHKW38}lUHR4-gAxa^wTqwEN)&1*uSC5en_OHoi=$UjTC+z85|+ti7?y|40o7q z-N^1j19e0KXsx;hsW=)Eq`zzZCt$L`5K(pfLx={%4gTQj&uoDPY%O6u?dS#{L>7!L zPh(E8bdL1<&%j2S=O_`rLZj#XJVve^2!RkfyY6hGvm| z^vq;a(Mt$Ngzfkf35~~}sC}fi@%~<9Q~P)yA?k|uJi_u!%UIIwX{u@;LlQNSI+9EV zOh0@byC3F^}0FwF| zof7gg94`JmDc5^n+SiyQ)!jsX^BozrScu#$R?SFrNS{Q_^Uway6x128f7N6E3aS8S za}jxK2bAICmc9!uBwk7j>- z8VR=VpXY zF?$u=541@=w3+d?AJTcnE(^*0`bRL*Z23KW;6~Ea?0&l>Bs0yW^K-aGw)`L;xQykI zwYR|&;n!b+IBEN*C`<#%A7SZ_3_*HrJJ42L=|9H%-l1a1*2=k)u?=&2MKns@9-v%g`CHwcT8i}kp#qnK?9DigxX{j?%W#!iwA_4ZD-;~JqCVfHo z5dNiJIA+kPca`6w&%DP$nQmP$2ajK0i6C_vX@wuYQ>y#wP!-bt0g1&R0VK^qOI@w6 zs_D{JOdmDhMc6_^!yn<-pNF2or%L60w4Sc@J^%yg`xL>z>;yK*FfE)NbLL3)ZaNiQ zPiI&p^7XVYW|M;1eV9GN7e&Vx<@p{4mn2IeKj`_Kq#b$;*v!61-K)QRsrrLa_li2< z37`?icv6-h0weS!QdIWX{H3zD8HrN=nPXBv8~g!NDU`zhYox+GU^{wF=_BRORQ_Qk zqHEZk&HJuLEOascMEM163-2fPAPmfxyzk!-HuU4fJ<4w`abpBEc*(7whkhDgp2?z> z#x3a%^fBZ{Bqnca4bGA{rRxh+-G@B#8_JS(f1mOh{of!z&JkVxX}tD4vJ(Xd^3y`} z_98hd(Mn2bKniPwBIF}$uefI2Lcc!qF5EwsD0Rf#LV6`Kh2?56j4?^nmd?r6I4kJUzKZoh_ zTwrEGe&^~kP5GR3-Qs}2mafV$9O}xqTjauVXb1!h!Arf~kE|)=WqEhmr9z9c_7uA0 zfn*@iy@_lndOKTJVFxL@6T-yB16`hMzho(Sxd*c`{Zsd>dmL>)xH7YZmWocgg_FCL z7Mvok8I;g!5mys%eT1zW+1ipqR%QB0C^#~l*q#;E^mA=+@2hZ;L4=bE_LWldzhVob zRaZy*#|q-gK32RinFI-+N7g4hdw!#LnW>-)X3#i#k zDa3XJm;kKG?I+Y`FN!sr_a(9c-TyWJ@JdjCmBGkf?N-Omdqh(@X#<@p%AA|Yb3(|L z9i$~`D!+~{0-#MGe~QF*InIvb#kMf2zrSWRUqE85*QpX~g~X^%54uFF?{E29eHeYH zjp{)qs7kq-4ULn^Epdfme<5$Q1@fl9q4zOHy!WOW!ri+54D65X$VW>+Ih0S+)EL$h zt#=I2%J37+{PXKCL$;xhOdTx*W8;gi=4orNrA#9a1koqCY&WEKEN8Es#^Ijplh8+g z^UBOA(%Cg1(RK&#zZwi`dnOv58RtX5t6lS1WHs*_iG1q7+}btABe%(AsorzLSL9=p ztksO=(0%8(4rk4zy$x}XlD((nqXfskLrw$6Ll&q2XDg39mLcv_P*B9>qXOP{D{^fZ zk)rgu9TTs#TUhfkXCZ@r*c#45MVRf_;-@TC>`<`n=U(hRo3!d)0j{k*sn519kxgne z4`8nh3$~!(J;Xy{Y*L3ODCU2@VmNN6c#>@Lz3_~Vts2sun8Qk7>wWo%z`O|9mENHf zT7*}ef)BaN^CT5Ri7J%%r1dwbDmVNSHs03Evb3R=&>r*@*>5J2Ji7gc5kS+}%Lzf` zJbVzrZ3YCTcWC1l5;`5~K^h42zI!n)&`_JaFj;t!#t2=XS^paZpz6{o8~^h0>?48X z1RBP@{OmnrnQfx`bvEn>C&D@0Mh5ZB5uxMjF|dKs9$R+EeYLQiQrY|oj$t2<3EmwB z3dbsk~ZSkJXal5={$GNe+_^z`3 zD8|g8Xa#>nG~Q?VG>*Lzr5(98Lsjyc+btw;k$?FOqLF=Ewf``n>YX&Y52@_K{2YF$ zour{nGrTWM9gM~>cVarIg-#&FCM`@3b!%B{ZoZbX=unT4t>|_oolq&WFG~(wk-H`v2`Rl#U(BT0UNKWWI50@%UrJ?{sj%OV8>`Dxl-sX?TXD#6X1_OR zlzf>_0NW;=XnQpQ$~;wF4+UBbv|@W6S>Cf_v07v}#AS>-d){81XMR(m!Jdb6jWf=` zqRf?IVEnx}n1qAB7!JNyv5EngVd|ayL%1;ldine#KZk4u@7G3tZ978Vvp4YT*CGI8 z$orkJ0K#@ikHZ$4J6({C&@)`6Zrv6qV$C_F$8U;yOI2+pjc(|V@6OShuQ`2kpyf&V3};-AKGJv z6y;opcZUT>)7l*&Xh7ox+8n3tWso|lOo67c!Gie_jqnV!2_{~l1qa~#vns&CWmaw|dQ#tYC-cFS?w67h1FpsL-;>-9?&9MFJDprF>z#33*fNc|W=N=$QoMB?!+O zL(d}4)@Ou@DG{}0%??#DO3@Mj{(@q+VAbPK4XH8 zK`v)Oo|=0wOYIHV&jJVqL%cv4hh=nV1(aS}Utg&Ffqzo|D_Zp2^v}zOU_Jg({VUR-L9kUL{O3F0~sQejJ+SfQUTiZxltP_ub zbLv#ycPE7Fs4`^|H3xJOvl0qoBMa$BGdZL;u_i}^?haQlIVriMvI{{~CHAK%u`xsp ztXS-FCZp(-s)^XbC^1~I{y8GvvmW;!>1HvUVsNhfF${`Hpcu8k7n1kzeq!xZ*N`5kWlhSt!nQnmfaWVKpi?HkStXzd3k3A#XU{7EFB z3vJLzeY`z`%kGyz3c~xQ%upHvYJR*TGr{PliM04mRg0xB$+NjrX(Fz|XJJ$0iJsDl z9!Egs_Zn2s_=UK2mhMIxtry~p4nZF>eoP2lfZuEN{LE-Rk&CxSQ*Y#b0SIyGMBd*I z*4kDlOyK>WBLrhcGlNlhJ|Xl0;wpXUTf!FfI9`LXDWPYO?vN*C;>N)*L>elp#Ej!|m5E8bzb=l6&>~h7G>_&E z8rq?WXcJkTSV{v@;!OIw)X*x_r1cP31|v^owgECBY=>~UkO_3Xp4Mv0-nqd**q zT1*SHKTnn=R?k+b4jTngUcN*MdS!Dh422BgsJXJeXxk$VQtKk0C0d)J z(Rql*sVP}PRp_B1Xjn1hiurB)uU>Zx%^A1vw91m~_H>2nhy) zL-4-Eie|X4H$xG`D$|3w;}SXCj$0Ba)s3?XF)#xbWI`IcA-~`AnScXJp?gT~wmc#o zs5Gog6}DRuc0x^-j{yzuiupu{7kUg# z9=Mz^17`D%OQ``pp>uE#FgR6vO9e<+aEkvGNCF$HJqfhiq|;I|w1RZSP#3PAiE?$U zoCVzU;Hoih^e7o>ML#6`z@vG?J;jf}WeHj!J&pAOaaq(*p z!RwVe?9v{L26FI8m>nOb8PK7J!NMNz%FLw~7fG+IxKXU4x4r`Dx1u(>8IlE_)W4?P zpx41a^a5<4w?1>JL8ApyObpsUqiA*~ZOvlv^Xuq+Z3t;89qrz)g$>97w!Zw(<}@gM zF8E5~*Y1UV(qd+Q{Tmc}j^&y1f?7J<*ynI0#E<>+rr6>uHh$-XdKDr}Fo>$OFxjXD0KT zC|m7x%0|x@V9}4=5-3N#+sf8Td=bLlPc1Adg=ysVNTH~2FYh}F<{_N=VGt1S|A1mI zu>N6^2g@{C=!Z_I&dkD{){77_Uj|mu7d!a1&tq${WyL_{TVW}k2x;zi`n2J*E zZx%9X>a2-X(7jaDa*Ds(v>OuK;|Q!UKy^FO5qrIzxx%_j5L1@W5&+|5!Cn= za`vDpo&4H2G0UTJB8wgH{7z^Eh55jX=p+;wJq|^}lVkgV1B*X4uy~(deEs)X@ddA- zkGqIFjjMGR(*z)JW#Oq{>@5edSFQG-kcACmUb+Kw)Gj_6Sx9EtFzE~5W)VmkLfUxGJk_HH0=zA1OJm? zC>!1n{2NWPO?WdPF;4&eb zcQ3#8QnV9vp}Wj7vNMDoU;x8r=`AzU_(wKVL2rWcTbiT2nCupd! zGwCkWb$xwig*?xM%~>4WXNU6lXww}Zs5HfOsIM#*gBi0UCS>;sfdYd~8;bfgiQU9Y zG_5eKO37EpDgW@5C?P+`%qK+A1{T@nc}xn@5#>hApia7l+`;H8iKq$V zf+C`_m99CW3Y@xhV=NQ7>?6GYEogyyY5o}!GhR$l_nT1FML=r@8uh_J#`I3T#n4wG zKtF!{MHmuVsh8m)flGI)Y)^y16(8rfuk>el&y2Z#CEE9BW*f4-$4%bP#u(0F6N^Tw z)DIb4M8kJ8a{#EVluptybRrKY_aWsM$Wxi4aYBC0zkzWZ_Tb32V!NDwq#pr|zXX2$ z5h9^0qvsZSA502ugUWCU4@oew!1v#&2$wOrUdptQR4_#6oN;PNmC&emO5c!HlIao7 zycb#wtf;=7c^69Dgd7gGtqmabG^u0s{EEB)8g*pBQjx>v=uo1nvNmuEi;?{>D+$q( z(CK&P04xQ`IkXa(1Jx=zYC?YnBR2U7P2cgBjscPhq}>Y9@#^@vn{^&E&Zc#|lZK5Q z^N2qOV^);Z^#^Ju!K10vR#C<%6Qz23~<&KOIQj=62px71tCuc z=~l&Q&fpnN6K_446W=#**J!D`&I7^QhN+GMUI0PgR-8`2iO^k0NB$$9LWOMWuFqRV#O(TI$XG5245`317(IeLtYQ$;iVlIkL5k9_1>Q)aBLM zMpdIhC)wVkG8Sh;xYmQXAobV+6}iep5*4I_bG&zPKSgOl+=iDiaK1yfgk1u|wlY&6 z@-vOdr;k?T;x5Z)Y(uOKjBv`cBZ+bk-arZaV)F-X7JP{L2pUdWt92;GN%l?{5bEgf zUn+H8uMW<O(~tC;QR zgCfu2rda6Z*!+pEf1LQnFLV=DhgzIe!G0}**@*x(HRQwwQd}kBe-Wi4#36m31ezjE0EcnC%*KaO3ogl8MJ=BHV|Df= z+T7~l(b4{hL{pDir&i-YW!9##@KxIW6{^;iMBz}2t{$jOV{B*&nhuSCR+2j2q8h8! z-FXpcP(8U|Ef{8)mFnTzK8~Q^U6qFZeG`4dZ<-syi@Jl>m{%c(tua+ggGo-E;+V~$ z7k$|z8OOKktEqElRxeyQ^5C$5xQ?#bG0$xQQWkZvRUiHop?$$6cS z?tcNHS3Q5!%_p4^gxJ|J=p9u8u$abW5!qtQBkp+cZ z&|Ty9;M!U;gr~_Xs{;=Ax{INvgu`rHho>7vQmz0Il-UQ5Pjk4daQFu)qZ{CTy*-Qta4>kja?CtT&06F518Z zEi?WEVw&#$Op_cm`bz|h=wjNU%#!fTc8mfxIzy^m#eh(DVR_@sKaP>4rt!9ZpwMSt z{)8NiBDf(KPD%%yPZ~%L>3#MQj*#*O1{`iXJ}Y>?$}f^aB35T5IQd|F?7;m(D>y@i ztm8;bwBTyRC^3XSM-Nhk)a%N+5%JaBPoo&8;g76_CGiXu+CG8uwIHmut(=A^o4mtj ztOv07vnrwr>x-C%tf$Lmszud$9Tnl#yz5m*B9x1c5M+l%c{mw$!w|IMQ!A+;CRX9K zDQ_n(0-F4o^El=547`6qY|{4P2k;s2_Ic>XH1n$#gNLe9`{^3Tx4MP*{VR&v1NE73 zJK-ZU0oc~D`vXy%VF(?q_I;cLz-J@!4A!TRW%kPunFtN0YgSARu=_^+ej3%HA2Xo)i_ip280()z0bLbraBy>} z2~(67HlyphR|COADPlVT{Q9p^js)+XWe-$DEig0PZ%~%HwERA5i3&3G7S2xuc}51g zomNbmWa73118j!&Bd8*^gDHI z;C4Lkr}uwVA&0&~aNz72>L5c)Gny(8{*imtp_E~;UwTY9^OoTKTWV+?(jW`1XP!ii z)u44Jd=kdea*(3;qu>$Z8eJ_`-Ag?qYjF(1tteeLVhbB2^!}0qt1;KZyaQ&`*!1s}I z^G-XYxAFESzKs+~UxT6!`BniNhf8S#2%}1CfUe2ltKOLn`=bc+1 zNCtz#Is?N9-Ai%cYj^49L#51U2q|na-ac|tZ@g0rZi*p|EYe*j-AMZRQ4lnfXCTE@ zLrQoWtF7+#uoWc+hnV|#UWn|O>y6gI^Fl+tkoa!To!gvY8Bq@>`o93T{v}N3$}}w zUy1jmFeln@be-kM-fsh!RtFaNKVWuU>R8=_i*WcF)A^Pmx_+}ad$pJF=*if|!IoQC$Z6oDH=m}o^ z!E0f+8|=QIZ5`Ax=pG%_fBK4&13tG1rxf2$vahq?a|7reqf^4YMf$W5y&fNHujZ=s z%8sx09hO9VoJ#ykDzSuo;DhvW!1){A14LxqPoJ}^$kSN&74$>QYQl~@$Hqk+n_b^_md%xv9v8tOYw97U> zY6yDra2$tAM{#^yF3q9*;^H5B?>mD15xOaM4SjM$GCPUF{vPuN&?94} z>x5n&-=RSc{lZUB|6~5nlGE=;8d$zaHYcMzm4Pj7BP``|wLZGS&FXtZt1lzc$8<|F zAE-c;={JD{D=3?Lk$|_M!!#iD_GR9K?5dOaK(D(1?W^5rII-5uBN35e90Ia@d9(x6 z@h!hV%2Z^rz_Y}}r+>gEgZaHW_0x^`Y{4dMTAxG|-;BU_M$Eep=2j$Qy~5#LYKHHfR!1pu-?!L> zs+S`TTu55=zmX7)93pwL@z0K&(7qdhM&xmtOJkkMTOOTG*nyM@$Yd?N0|EUb5}-oE zH#UB?_Zy_wacOfSjJ)@oq}8Lqf!l>bRd0*(s6KK>7Kt);Q2Sc{ij@kLAX7!(i71KOv4zrw!@ z7SLVjz0Z=gdOX;n?;DC$_%L6N*Bp8R1I0E`b)7HL-qbuB^{HW zX797)@1?;6IRgtaaHqggwO_2-%ldbwoF>BJ66ra_crFm7LJFL zNT_E;>9{fk(jGuB{6~CW`d_2^BfX+-+($?Z7~4ao`58S0Y1(+E&r3w-vqAPd%UM;K z=B#Q4hp#xKckKCJexJwNhVb-?sy=l{Z#b(?<>zW8yzej6 z>rkmcE524z-=0B}UHn~d3k>dhHN`G;GI z)$wANFC*IxOHE&z!Uk*zVzo3uJ#3T=eg*U^xdrnGCSe>gMYu3MlJ8=Hf z`yZE|>HE-lC7btS{Ba%U6TspfqCEMW>Qs5sLLErobKX7GDJQ}scH5j%_vtQ!`zWS+ z+FE7T5!4=Drgh}4klmj1p4Vgj5w984pK3>*#)?gpbLfL$1=?cgbLH1ql!u=rZ$6N| z41<(5Sss_u9#llNN3hGx`^%v!bPpz`Z;YFhiZQBhqLk=8hu zyqbCgY7AwA;@0oM#wqQ3J=hvGe^Cv0>oJ|o8~S_^_x=Y~Z*NFgNxfy0m!x%kW5#hj zc1#4rmqK7srXjy;RWkf<^}b6N?z>D!W$J+7eSS#Rf7%%kGggg4GYfl6Ymh=JWw7OU zuRe~x#AUp{j-o+h!~St#W`_6h7%|{po8i7|ixsH2vz6Tk`gS=Lo(Wu;4to;rdW^8k z8KjsPv?gI+*qPtG;(Y-}J4oN)zF_?)r&4)A8bKte z{IT$>arW0)H7iXP(rnqip6iPP$pNyB&VT^rFCPlu$C(5-(mj=DPhPd$>{az95;XBHc=nM9y$KQa;KTOwc@=oLSy<(>Rqg5Ft;k}MD zsR@>(FoQ(s#MpCGVUl$JI76(O2P?Dkrx|&B)$u3DmkF|kxld@8n0-LZrca{?61+y$ zp^;vJOXJLcXT_UnZ4tReJ|P7r$nKA*&X|is276h8jdsngO(vSxv*c@rv$`wydSggkS!@FCc$3dLN416Mi=kM zV9Uz__%&1_Q7-E*lJ*HwC+-&ybKfRxfqR78Vta72Fgqyh`$+18KQFA=MfZ;ODMC_* zqvIp1Bmax#iGsZFt9@b0-?Q&f(tc-BZ}>6PibIJL_-@1@D{2n=V)jJa-(cfcy(<8{ zfnlP()hy)$x`{_>5>{$aytH*8;x zjeqf=O**hIjKRYD=yv~BD{IAWTlN8rusul!BryXR!oHB;J&Sk9#Zi~;@^)Zw?Ulqd zk4>z?TUlmdO?Uz=CbpNiqna_^Q)9CCNW&pAw!tFsFYeO%8DyyTzyd2MWv~{xUn~qf zI`TDG3h9z<*jVIj+3!lYBchfi`-zz^{9xR86s6uUhFj3UZ=ySL2H!5MfR29={cI1j z_w;e7`=BI_G^r04?ecs10BJWa+yxfNZ1Dx_f*oD2Be2xsUX4vvujM6byR-+&pPcM2i|IUDH#+jem?`mDspW_9{WZ3%(eM9ttvD{8d23d{HX0tB zMp`3BZzra?H!}*D9>M{2{L#n|19xCd*w$n?^E+FzWJdDn~p*p0f-#3fITT8r1pG z@$c5s6E%3ZR&JFB8#LIxQliM5*>8Jl4I9#JUSHsiGZPMa5YVZRMuF~Me z8oXPBI$o_7e_ew!G&om-YPmV;*MY5~RFsO3MdNaUJ(WJ(EVoTDLmy;HDN3bJ_3yB< ze-8m&PCsZV`>C<`xPf%}yPqb3!Sd<5So`kx1}1 zbw7g0;1n_XgN+$d4|Ct1e>Kc};7{B7iN%W8O zx$BnISZgcm>OIXhH)Dy7pHN-hT+`BG9ouAGTG?W4XtdTXt6WkuzNMzhUDw#aS*>&H zn%$nt`a3)|&G)gwHPzPI#%Al-YU|?r+%+xMO1HH#N=4^3TCSwI(G6O9$rW|(rPeC^ zBZ1c3*0HS|=+9}mx1n)GgSDxp##7yBW&bW)CDl#;(4f1qsyr#K@62?~Ns9gW^ za*ONS)|R^aYvS>BzVv?&PmeF-TJX=|RdLOno6F&t_Z@-pt|Un7xcH>%I8TKGi`I^*(^5k88E zlW<=Jd`=6m+!QOX)A^6WN{z-i4JHG=i026{{+_e@Avo(U!FeJ*O$Zm@iS=jyZIy+MRli@m_qM)aD=)UdzeZMLhY1?<3>D>2! zdGYv1r%t$Y<{XNvWlm@iM`Y}0(cmZzrfHCC;|BZ=Y2`T1)l%bjHG14l9=8jlW?7}1 zb1nH+(tyGjhz#aqK>R^iKZ9+)9D(xtE~;YC_s&lltazgtgz13F za`7gDPd$3sGQfhrJ(2qqVEYw2UVIyH(lvj-H@T2&J9N{1T|yzZVZVRgq~(QNZ}F04 z9nTixv)~n<%>Ssc;Nicvj{Z}+t>pOOw?Db;cH58MDoT9gL>oLi_4lH*|EJIIePZgw z-#_!#)u$c#(|-S@?Q8zG6Mp&Ahu^SlTR66`@ww`(#9n<^>&0SFtN)S)^I!kE<;OGr ze)hJIarTs=38Qn*iYp$xbLz`2tKXlUPS+N>OYy*o8SrztT=i8hGB`~zYpz;PLlrk5 zX#n>Bzz8-tZl_I-jT~13_#2#SS`gj{cq#UWGZ3}{HsZ-bxC!v3biB`pa3A3P*y3$N zxDD`8JnInN0Qd%;cESP7$9?3-5iS5M#Pc-5C4l94oLmjerka!Es+9+y?l-82po)e?}Pa zsw+8e6vDX#uj05&gsp&IUk$BBn9Jn2Wq1k@ZUQ`xrv%{>fRBs?zX-PjUV9DxnO1~z z0T<$FLbw9(X*_O(Hv&$>Mqew!1qAW<5N-q9i05I#0kmd8b_f%kiRTG~O9r-T?T}_t0Mmw*x-b4Ea$y z;1)bn5e@=wYXOfG1~jvbA_qNSdtJlSj?Pdx+&LKk}oasS8i*c;QXqmv$ z=8f^sGtTQD$<0@(a0rEPslY?APmt(A4*@Wr4P4o!=E3Tn^a+G z8d8!NH1#DMGNcSKr#zoz)LIgZ@_r$j)aK^6HV-wMhwe=@8gmmW2JkjmHu1a-meb(4 zE?>QUdRvB=xFHi*O-<20&~XNr`DgX%xH{cV3+{#0X3 z8w?|o%p)eG7&XZU&3(p0OkO1W(m}ExEW7x2Q@c8~zNGMBEu1`rOYXGf4yj0NGMAWw z34P!>9(N>ZQ@XBAC6-`fpXpG-3B%>d+~rG$A@9;}=TTdz?NooMCU?@G(n0z|^*p8V zLGpMiZVV89^B{b}c`yz~mo3qmuF;`BNloHX7i;<-IRNKbW|@v_s?2KSks zPW4T{Kz)PpN!HT`$(s0$uZ!ApmDZMc`4OJU#ObY%j?oLW1E}Bq{)1_q?WlBSJu>5 zdm5IwRLpy8?px8=T#p%S#lExWJ9U9*gmi0pU2|0fctJ`t;SQa}8*Q&^+K zrENjlN~G1FjKez%pZ5#+fk@YXHl*3U)MEo-xt3n9LEj*}4O)DQ2KzMli3ZPUF!k>$ zU8@EsX>f)HD>T@o!G|@tL4#W~*sH-0G}y1f;ipylS7~sn21_*9puy!D{DB4^*We2p z?AGAh8q}q6REwX}pyiC3lcB+DG&n(nQ#B}RutbA*YOq>^4H{go!BrYur@?j&KCZ#1 zG`LZN+cdaCgMAu&SA(Bu@Pr1>Y0w1Si2tPyihtMds&xLh^?NGkn$xhNuA$mhc8~KO zS82_XI#~KX=v6rDBG&k2YxN)>lg|iFpwQr|6s<}OJspU(XYbvXe$ngm%@2qTb+nbvkvG%>1 z;zfZA zW09xcT}Q>r8|T$k*Aya)>rlyJ8Y$~s5URDPOp+@f{?j=)seG7y&x3b<-!@XkqheYsE zEv-_NrL!YkGSyR9b2)C9Sr+kP z%Sv!*^tU9qv?6aLxI7IkcfGN4abvTa`>Cc;&j?@}K2S+Ea zmV0ussRUc5J@s{qmsC}`T98qH&-gs%{iPxAKl8cWURrE-PMp9h2WwfV|3B+l*0Q{+ z*{#+*74#rYwqs~tJwD{jMoI3CvUT=hcKVZY4djfj?cksWL1ccO|!B)U` z*Wf7aUPmscrvLY9&3D}Xhb7PkyNyDr8>}00H%!^kwxN9k?Es`AErX>{rW)rqST>|? z$Uy#gzyB!`7>9-=u*O)}U+Z-L;|mYPp$uH+mF-x zzf{wMoSYk?|HEO&U9px%PcxQPH^2oPKPl&?oZK5!fA9u4sI_%VZm63$<;EMT?puNd zU``olyLr*Fmit;3Ep1#@v#6nN{<6x3MXfhZQcI4hQumbtR+~6U~RI*%Kms7$dAWWx;m^H6D;Of z4ogTF(y|l_3F|;KlbL0jRBSaoWFU%V2;F>h--mPT1e03dKm>y&8rQfoRX2KQahPB- z)z&xSf>J`NiLs-l8!dD(++;{dFsn>a#pXKdGqaH7oas)xM%HHI%&{zD zu}lzWaEY!ReS;Y`38&(Py(u${j_5le7LKtg`airS>S=l>^aAgu>fFNo%d6 zxU4vedDTEnRe6}SuO66FzM#bJw3n5kUr|#TmpL$-xXg7;U*Ia4Kf9D08_QHjyQ|1i zhVI2!RR_^EF$DCobN0+RWHF#GOlP@kW7+l+$G5VxV%cS)V@7!%mmN!?Ava@2soh?} zT^CEGzAJUjDaO!H`|bJ*<`vE^o@*~HgC!~B#>FsZ%$`%~nl-1W#N~7pIm)^5v8=K} z(QcdLv~xMJG-6?TId{Xr6i0EP&0fgm#!^erv!(X(Ii;vAZ(wqnIJ>mmHDgXOGi%(0 zST5|OYfA3KDL1*mETl>HZelE(6|@(-<^uuh#!ZT433F#VY_7TXLiC^utiUR9lVjQX zaMMPkqiBwkyD^qs=A1pxMTz)RG;so%aqgynkUfQ)63ZcZyNdE$a~*;Ux{)8tDV|-9 zE-4Wlr2=d;ck{p;l~EdM+%2&jlC9Q+86_kF^cN&B^@14D>}j#=8APEFU5QD?rA{E+ zt+8y3G?y@Q4tHBDNv+Otr`@F*1}+#k&y~%dQ9e(=*ds$|hlZ09Pq!DtDi&hm;5y=P zg}L+dCQONrz0SBSSmv^_*@Z6XsjGZ8841iab|=?$0UWeD9%V-yiW4T8+liadY=*AH z7Gc~B{jA|n`V=jcVkj0;&uG)LmQX^|i8eLICrz2I&BrWpzJQ5TorYO_df7aoM4NP3 z0%OBW&X4BksNP1Z8N0F#ZpZ*`#t=Om^>g3~8F9wkRA19-)t!-Og6^kSqbc!j3cMDV ziwp zMk(}CgVisq#j7ouSMbpic zZn+rgghWM?34)p9`r3~OaY+gKlF}#{3|C#XWI?Xy_9aVlr#Y{>D#3vIo&iz< z_Y_t7f4~72byzOOuR*#0{|i2jqeW}ZQfhW=?T2OYlEwAotK5yvEyz<>$<(C(Nk3XB z(>s9ZiB@a!5X%PEX}I^JHB#?9eLqMTp88;dFg&Bp*f2abC=9oB{!fy||Gu{5)Z(NX z%_cqgCIXE&;Ajhnq}cly@SCB<44joSYC19i0g*fKl;9y8b+jzhP%w*dMi$0(b#5av z86B3g8h@=Oy;Kf6b7mR9K`BEc@@`ZUw7)sHd{(K2sh$h*ld~8H|Jsk$ZUC7 zA)5D$hTK6Ic<-VqhC>uo987(Kem_J!0}s3>;LzUaKq2XJrv1~XoEPJsLqkl`dfS_r zH2y)mV(c&(|FgE!9=_Uk1P1+dex@K@<%bYF1DQt3FYs)rRa;{;;02GkpW4S9_i_{m z{r)WqYJv9w)OL|>e7mK^C^v9N`9IRj|E#4{|D~W#eXI8Jz~0kaajS--_A=q98cXE~ zN7oj-kfPDCQP#J9RiJYsDlwA(z@M&BMCU?v5w0oC z@qn(o&HUg0y1#y}U%&3Z=b!F=I2hT%^r+Y=3_%%HVd#n+WEG z2=9lu6@3!4bB4Wno8rw4dWj;Mfr8xMrOup-y!Rr?c^MVv(u>um(iSr)ncI{+AWUNC z9e~-+)IY=akY4b1++l0rm6UoTi*NT`{1d%qji#hm$U|3JFS2%+BqA;3t5P2dU0k0= zsa~I|`r2@re}p=4eKJk!LsGP<&YWwVI6j<@v)C~KcT9}J`z}D<#Sxnk%JnzM)&J6T zn|j@UA2KN$+K5DYQ9o%K{cJS$x;JSr8;y^n3~p0uuP{lQjsWI1?ZPLjy-(}5?WU6< z1}L%_y_!X1mf6<5kPJ*OrP4FW(vCIwORPRwuKoRhJeR*upRCLl%H2{1TwVM3?;n5+ zbDtmzDuS16YFh_4X6%H4?CrZB< zGTyRqzsR5*_6>YUCFvI#;N)3N`ODA9{k&PZQHGqQb}M^R*t{u44Is>gY&(#$MO5^XYo7jMWWp>iyT~Jt_X{ZDr!!!6y#Wky; z_^K}mV&F_W8=SKh;u8zZG?jVUj-vY{QkqPe8h4?eI z7q><0NJ28)7I+$s`DNl-qA~7Z?a##bX0palByIQrkn4fPMu3n~-i8OLWW*nj zG=OC8lyW4JFgscGQ7D7W2@*-H+7FCdIdRi|6sum9`gF{aXpqFJtI=+3)vn+^U5Hi5 z@@!R-N%c4zk?wq9clYBy>rS-_ zljuH!;f6gbyiZqBA0l$~X-w4eiTaS-`$-{FpG?#Gkj$qcGb>yK;B9N{nh+p=0fc_z z=6l>VAg+cc*Z%;S4`hA{${oK;a%ua#7AE*PlUM$TZwvvroo_gH`f+V4iEs2f-=IDm zCh?67WY{-ICVcu8J1=*3rZQe1G@9tu{fgVS`(pIEDwc1u6`R!O9#@}gf%ck8HGA|+ zs3F%U({jyWH)KXkogrgPlLc}%K&FAvz9hcgKLlhZKt4^m0^|!oG6-Kj*V90T0_0mj zW&`BM(TTf%I+^RWK<337E@FE-lb<$^EsL?UE4kTIfPLDkI{(>cER_5s{xjtK=P+)k zMi3iY$j4Aw^g)<6m84DkU7KR69*JX+E z(&H#_wv0&DVo#xF9F5VysU#L78M?c)BV0!!ap_Ieu%x70$=SFDo`C;6()$qHHb8pv zxE~;W!yvMVT{~T_O74b0kgK<(N^Yo<>CA|*tsaJj_@gg zBws9#qO!8KKE_YX`ZLUzN>wY<34CeC4*U&eq<@V%8~QJ?q$tsA#OWn>{J$@zUesRH zO59!_!LwQO_QG&#)(E*Rd|l)d*+)jLr5zc-VSAArwJEhEx9J&zf+Y5#SjRqwFE~<9 zNdu+Q{q%Ul_Gvz*Xd6yLb!J{Cl8sAu0ca|ZpAH42!i_rb*B6L6Ibf+KWg?bZ0`p+yvca|aDsYOs|BE8t{ zPHlR-cE7O*-9PGdH$Pwuls5=;IKBwoS>}hM`!kEs{ne=eo_bV~V;LHDbR(4A#S_q$P< zAFS@z7NL9RB6R<9O7|*ntm)eQ40P}O8PX;Ly+Rw))mXK-u5W#Bx0_=d5jt}Gs^l`r zUjpf0ZObvp*MZQEgr;PJ%mbMZ5NwEqJv5UttALE$okU&>WT-2NYz5N)nk4cdkh5!& z$Rv=NpHCu>0-@aieSJOvq;qW&`2>)D46$D32_W+p@!!?5#mEyLz#fXIZX)SkfCryc zlBfQ~%&{r5!EoTZnkvPwc&v7wa1JtW2;|n;r;>h@!%ro%`1FoY#*U2tjypUn7|%B< zS?47rjNd{NW_Bbb`{G<7G)o+*Hsk4dYwdR zWGSEA%mFfNL%3)vNhFzbHZ=3kKuTs!-*NUigyo>h%~AF}g1;6^k@_o+QQlmCQC{IC-YZ0G(^09RsXa%LXUx`Bpei66ew z**QO1tf#GvvY=`IUaNZ(KP2+EK&C1(1Vr}(nG2A8K;|7H7UPo1V%?|*^*x_nh{doi z+ih1EhMdL78etNPbuYqVbhdWES#*1+B&ts)yqzlUV-FL@g8HoSs+Sej2HZNnz>A9;(w*^qoDOcMELP+6+)(vEvW0bGe^ zk_>w$J%xrz>^uS)_DmYls8jkRo=M-X*$B|gF{8hSHHP-Fotw=!sKhIfnZdUV#6b0? zqo<>2HbDLxNawHGa*WIp7^y!%RsuP0ktGrBB~rrXI~lQ<$#pkmX7I_k>FWszWHth+ z?zg^Sa%}@L7a$K%E)1&1e~ipKfSe7GG0OFj$W(jzm5TX5uPMk}hmlQtnR4C(r1N3P zMbI%q;w186AR__t2_Um0NtsUrIi5`-e@rr?f{15w>yWo#qtYltgf59^&HynMTj2Xj zXXlP*V9hXz*PVcx>~&{C0bGgK9fk~hUF*5c1<2q()VW7RJMqj>=b7V8W9AoOjSFH8 zRSH+{X_CpMEylTseT&K`7CVjt*kW8#@~@li{N(N9VLwd47VAtFVLpq+=$u`)SnGbe z0p{}Y@Qtd4{t23P=2_EL{q!beBB`^f0gbL1$z>4of)R&^k8#Olv44hCYK*hR0#XnJz*iZ620d0TvM!LTPib?$T)llK^D1flx7)$iV$APSJ4TQER?^wGFt5xds?Y+LM?QAkj7?<0!+sA6BG z*rP%_y3?F3WWS===~+0C={v62m$$`!Rq0Lv7cA$d8K=I zTkMw^s_GU#-|zAnXTRJu4OaoMInpi~W|e{3WG3t#t?W>3g?g-`5uV8l`)e(tWMceO|GT zw8g$wvC}Li(6pyVu|KESC)#4ap)7w!S^k`|{C>q=ZHxUG#eP(=A5-l2D)z%|vD0)W zuygNa#ZD{jflS|HihZUn_7#f#hGM^|*gvV*A8U*Kin9DM#ePDuZ&2*V+hV8LaA4J5 zdXFkVdTuE8lZyRhTkKtmeYNUwU8=`jQ|z;Cv3D!>9>u;{u`l!OWykl&+hU*dyzDnu7OzFNt>3&hMpKVKbdg2Ovtaqhir|$~_nZB-4NuURPE#>Zin8UJ(0P#XhLmhZXym z6#HCT>}M4FfMOq1?B^8wGi|Xyq}Wf3w}@}_(Aplv{Q5>;=Sv)7`{~uT*e4YGdBuKF zvEQfIueZfMtk_Q|_EU=en)DREYSb3{KE-}Yv7c7#&nfn2+hQ*%_KS-Bl42iGmXF5T zd5S!$*l#NKTZ;V~ihX%o?8g-QGS%Z&s2=w+)#EzbVn43fS19(Civ1qNzN#(u6N-JM zVqdM;H!Jo`TkIzl`)bABrPzlQ`E7QK`(ujzmePHhVt-ck_Z@Aq4=VPfiv5_f{FBP^Lv692R_r~> z@|%_J?^BlF*B1L>#ePNUeog5FaxUq-PXZj1d9#ePk(-%#vND)yPS*v~2UVde7=DWCtx zJDfGFjnMMPld8w_Y5i>8`;hdn)-oHP6yN9w-;$$tk+&?iI^FStWT71VMD<6YyZOOV&`%fhJF*R% z#S`Qib}>5(^*o|-HPU@&V~^NSO70m>%k&PyhC!V-4#>(0?NpPaooeVlK=W<^cCx|8 z?%zFGdj5Gq#(|u-Z3+UUIuL0=Mm`9He;=2z<$MYVCA!Ztp96B$_CZGe9LTAl8CQ;+!Ne=u!hRRtH@f6X<};+QlURYC5Jl!5$jC^B5vqD{!fHjMF;_!#|r00>o!Yj_N~F1r>4 z9GwJmG(bKDMAq3j*Et|$XWu$s0`f?Z>nlLQ8h#VVu|Vb~kbacI^^p_7`U7h`51DI0 zt`#fL?l6aM<<|f?g{pB2${Az)ZV$B=rC)@MtQx^S^dsK;hYdU3XPMoQkvTsj4+D|s zFGearB-$|Y8$c-e`g{n8%mG;DGeAN=oCDJ7`WNN@CY2NT#`8cs$hI!g0yzg(E@9zX=&xrQuw^2jrZ~MI286 z30vojKpKI!Tn5q^^ug;u^^T&Wt^Lh5q0=X2F{4|h>pari3p0ap&6 zEQP#iC2SRP?Ew&TLawj7vu1+|Fa_xbPym`f1WPwofEqFvB z?*nq-CCO2E7Kpr8z~y`f$eEzdp9hjLaYHQj6p%I0-|PMjAo6Aim-8(k^QO*}OHPpO zbO_b;`;ZCeKb?0mhu2~)5K0~y0CFy<;chF#u|>|ZeJrq82{Q5?{gQ~!s>PF(laVuI z_c?@Ek0MtI3USGhF{jU-4P-tEnUTPMo&>TisNo!tP}Bbcl5yq8X}W71LhRp%%rVDK z$SbfFP1q~%1tQ+OW_Oe(WtH|f< z=qS!DldDp(T#(OWHF|FYd)vf0b67A>n|I=n89ZQAafWo9Z8WmEi9#ONb`uIrtoP6! zv{ThcBfNd*&MjMbskJNKziZ>$cJ16=o{raV*i|^Rr-2{2kMAA6Z~M?M=c0x0zAZbQ zjd7etJen<(@>AvU7~9_#rwa!QM-EkL`FH@k{0?J-guRU-o_z2S=a0CyKccz~J^$9= zc0$;*5a%rCa8h*KFvn0Ywo2=A)oR4Q?YD<6W7>P9Y@XBbyWJX0DwniSeBuSYmC znNAUiYdGf{HbZtgl9_68C|fsej~|t9>fS_^s>I`^%4inPmvp#5fSBV3BC0MQ5>9@B z4X~!be#Df52CEz_l7rEP(21K1hrrR{>GH4%9N9RAld}1wF>Fofey$$L?U;W5hPuQ!JdmqO0@-}t6(AMmjJB7i z4M4<4-f94r0IJ`93YT0}dXQ)#jNl2Pod}@);ZoonsO<#|vfx{(x+EJn;k>L($RRh2M1%8~X z(z2WR4Zmqi{<%8ACIsTN_jqy?yPr1->o)YP@7oyR%KW0e-c(@Yrl_9G@TMMc)uv-} zK7Bl}VGAzHscZT{s@YK?j^8;|L9eoMTxIP47FVVkXrGw3?7+ZT88x9|eP2|{)*JD3 zwlwAY2RUMk3>((V$dD`$U6SZ|oz;BWwugH>U!Z58!?Da%83FvDmydHeth9_lIgYn_ z9jh1-Vr-z_KwXQ|upJE%Btoi+c2lJWMI5$Cal>c=w;!vOL%ov_GnduwUTT4jy(p(t zpD2zo9LKrIs+G?d$Hwf((G5~^-jz&~FA=RJOK8*(@ZV)}+CCeXau^%(g(?D6OvhkJ zXHMRT&@?ohl`xMH*$E1ICb&C@v(quLG+S_@6bR#Z_ugGNp%AB_?b*I};O#ioZV-o= z+4Hh+&=*wWg)Qh@97V9k--Cr(xlqDMa#=Kz35R7dAl_TXV2(ITqjyZB zVQjYU$1^6_lBaQT>D=f$>jPW2?HMd&^IMNJ3fm7umZ*0(O21OXlq*|ehGZ$n&uAm1KswXYfD@w z8Xs3EC8p4r%|T6AwwS9MYtosqab=7&${nPc1jR-&bFnhYK7)BkAVZru)-Ym{&}8-i zVrYG86bAt}&|9WaD;n5MJJANeSZMdQB5MxdT;N7w8+v0AR(3-#tlXK$;em;o#<5cxN^z;T=!3?m- zDb0rpz_k-C4E<4G@3gEeMK^m^R*b40C>@B`8~3sOR6132GMKY&Vvub&sNcXQuh#Li z)oN@`D3*q-rgTT|oo?YB2ns$x>@L)&Xf_pME@V*CLbc&y?x3APS;wi`r7F|laNSBh z@L8L$Y1f503$UOb0yDCbS|C_@#IcPx3?i5Ep&e+KUFI1$d>b^0?jI@H%QTqVi}#lx>MMi z(wCUX4tH7Px3-+lzNC;fjk{HeaeDLC1tE(RM~??Bcj%66j(UFn0sTT> zkDQAH!y1*48YQ zjuIa+iLxtDJT;cp0nfrt4F4`;Iu8eD$1BnTK`_jeFr_TiaAa+EoM&MR%;aB?_&7IaPyaN#!1#S15V4?90nuY)2bNz+2<)2|7qDT zIdw>xA5((R{>iA7nEEd?S8O)C-fo7Z=hEIVHX_3c(l^BaFm{E*j2*qqaGvZM(f Date: Wed, 19 Dec 2018 20:04:54 +0100 Subject: [PATCH 326/429] moved shedlock code example to module "spring-boot-libraries" --- pom.xml | 1 + spring-boot-libraries/.gitignore | 5 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 49502 bytes spring-boot-libraries/README.MD | 38 +++ spring-boot-libraries/mvnw | 227 ++++++++++++++++++ spring-boot-libraries/mvnw.cmd | 145 +++++++++++ spring-boot-libraries/pom.xml | 144 +++++++++++ .../main/java/com/baeldung/Application.java | 14 ++ .../shedlock/SchedulerConfiguration.java | 0 .../scheduling/shedlock/TaskScheduler.java | 0 10 files changed, 574 insertions(+) create mode 100644 spring-boot-libraries/.gitignore create mode 100644 spring-boot-libraries/.mvn/wrapper/maven-wrapper.jar create mode 100644 spring-boot-libraries/README.MD create mode 100644 spring-boot-libraries/mvnw create mode 100644 spring-boot-libraries/mvnw.cmd create mode 100644 spring-boot-libraries/pom.xml create mode 100644 spring-boot-libraries/src/main/java/com/baeldung/Application.java rename {spring-all/src/main/java/org => spring-boot-libraries/src/main/java/com}/baeldung/scheduling/shedlock/SchedulerConfiguration.java (100%) rename {spring-all/src/main/java/org => spring-boot-libraries/src/main/java/com}/baeldung/scheduling/shedlock/TaskScheduler.java (100%) diff --git a/pom.xml b/pom.xml index 5aa438132e..bc8f8064a6 100644 --- a/pom.xml +++ b/pom.xml @@ -641,6 +641,7 @@ spring-boot-property-exp spring-boot-security spring-boot-vue + spring-boot-libraries spring-cloud spring-cloud-bus diff --git a/spring-boot-libraries/.gitignore b/spring-boot-libraries/.gitignore new file mode 100644 index 0000000000..da7c2c5c0a --- /dev/null +++ b/spring-boot-libraries/.gitignore @@ -0,0 +1,5 @@ +/target/ +.settings/ +.classpath +.project + diff --git a/spring-boot-libraries/.mvn/wrapper/maven-wrapper.jar b/spring-boot-libraries/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..5fd4d5023f1463b5ba3970e33c460c1eb26d748d GIT binary patch literal 49502 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%0A$pwhjXzyA0ZzErH{1@M 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 OJOEd-=rxTO#Qy`$*1Hh^ literal 0 HcmV?d00001 diff --git a/spring-boot-libraries/README.MD b/spring-boot-libraries/README.MD new file mode 100644 index 0000000000..016d2841d7 --- /dev/null +++ b/spring-boot-libraries/README.MD @@ -0,0 +1,38 @@ +### The Course +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) +- [Intro to Building an Application with Spring Boot](http://www.baeldung.com/intro-to-spring-boot) +- [How to Register a Servlet in a Java Web Application](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 DB](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) +- [Guide to @ConfigurationProperties in Spring Boot](http://www.baeldung.com/configuration-properties-in-spring-boot) +- [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) +- [How to Change the Default Port in Spring Boot](http://www.baeldung.com/spring-boot-change-port) +- [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) +- [Spring Boot Integration Testing with Embedded MongoDB](http://www.baeldung.com/spring-boot-embedded-mongodb) +- [Container Configuration in Spring Boot 2](http://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) +- [Introduction to Chaos Monkey](https://www.baeldung.com/spring-boot-chaos-monkey) +- [Spring Component Scanning](https://www.baeldung.com/spring-component-scanning) +- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties) +- [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-boot-libraries/mvnw b/spring-boot-libraries/mvnw new file mode 100644 index 0000000000..e96ccd5fbb --- /dev/null +++ b/spring-boot-libraries/mvnw @@ -0,0 +1,227 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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 +# +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + 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 + + 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 + +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/spring-boot-libraries/mvnw.cmd b/spring-boot-libraries/mvnw.cmd new file mode 100644 index 0000000000..6a6eec39ba --- /dev/null +++ b/spring-boot-libraries/mvnw.cmd @@ -0,0 +1,145 @@ +@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 http://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 + +%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/spring-boot-libraries/pom.xml b/spring-boot-libraries/pom.xml new file mode 100644 index 0000000000..083ab443f9 --- /dev/null +++ b/spring-boot-libraries/pom.xml @@ -0,0 +1,144 @@ + + 4.0.0 + spring-boot + war + spring-boot + This is simple boot application for Spring boot actuator test + + + 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-tomcat + + + org.springframework.boot + spring-boot-starter-test + test + + + + + net.javacrumbs.shedlock + shedlock-spring + 2.1.0 + + + net.javacrumbs.shedlock + shedlock-provider-jdbc-template + 2.1.0 + + + + + + spring-boot + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-war-plugin + + + + pl.project13.maven + git-commit-id-plugin + ${git-commit-id-plugin.version} + + + get-the-git-infos + + revision + + initialize + + + validate-the-git-infos + + validateRevision + + package + + + + true + ${project.build.outputDirectory}/git.properties + + + + + + + + + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*IntTest.java + + + **/AutoconfigurationTest.java + + + + + + + json + + + + + + + + + + + com.baeldung.intro.App + 8.5.11 + 2.4.1.Final + 1.9.0 + 2.0.0 + 5.0.2 + 5.0.2 + 5.2.4 + 18.0 + 2.2.4 + 2.3.2 + + + diff --git a/spring-boot-libraries/src/main/java/com/baeldung/Application.java b/spring-boot-libraries/src/main/java/com/baeldung/Application.java new file mode 100644 index 0000000000..c1b6558b26 --- /dev/null +++ b/spring-boot-libraries/src/main/java/com/baeldung/Application.java @@ -0,0 +1,14 @@ +package org.baeldung.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +@SpringBootApplication +public class Application { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = SpringApplication.run(Application.class, args); + } +} diff --git a/spring-all/src/main/java/org/baeldung/scheduling/shedlock/SchedulerConfiguration.java b/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SchedulerConfiguration.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scheduling/shedlock/SchedulerConfiguration.java rename to spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/SchedulerConfiguration.java diff --git a/spring-all/src/main/java/org/baeldung/scheduling/shedlock/TaskScheduler.java b/spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java similarity index 100% rename from spring-all/src/main/java/org/baeldung/scheduling/shedlock/TaskScheduler.java rename to spring-boot-libraries/src/main/java/com/baeldung/scheduling/shedlock/TaskScheduler.java From 1a955fb01833eb0a61f4589058e393c64532a123 Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Wed, 19 Dec 2018 20:06:17 +0100 Subject: [PATCH 327/429] updated README --- spring-boot-libraries/README.MD | 34 +-------------------------------- 1 file changed, 1 insertion(+), 33 deletions(-) diff --git a/spring-boot-libraries/README.MD b/spring-boot-libraries/README.MD index 016d2841d7..cc32ce8355 100644 --- a/spring-boot-libraries/README.MD +++ b/spring-boot-libraries/README.MD @@ -3,36 +3,4 @@ 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) -- [Intro to Building an Application with Spring Boot](http://www.baeldung.com/intro-to-spring-boot) -- [How to Register a Servlet in a Java Web Application](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 DB](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) -- [Guide to @ConfigurationProperties in Spring Boot](http://www.baeldung.com/configuration-properties-in-spring-boot) -- [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) -- [How to Change the Default Port in Spring Boot](http://www.baeldung.com/spring-boot-change-port) -- [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) -- [Spring Boot Integration Testing with Embedded MongoDB](http://www.baeldung.com/spring-boot-embedded-mongodb) -- [Container Configuration in Spring Boot 2](http://www.baeldung.com/embeddedservletcontainercustomizer-configurableembeddedservletcontainer-spring-boot) -- [Introduction to Chaos Monkey](https://www.baeldung.com/spring-boot-chaos-monkey) -- [Spring Component Scanning](https://www.baeldung.com/spring-component-scanning) -- [Load Spring Boot Properties From a JSON File](https://www.baeldung.com/spring-boot-json-properties) -- [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) +- [Guide to ShedLock with Spring](https://www.baeldung.com/shedlock-spring) From 5aa5e48146252b2297c2a1bcfae626110574cb0c Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Wed, 19 Dec 2018 20:52:35 +0100 Subject: [PATCH 328/429] fixed module name --- spring-boot-libraries/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-boot-libraries/pom.xml b/spring-boot-libraries/pom.xml index 083ab443f9..c28128c5f0 100644 --- a/spring-boot-libraries/pom.xml +++ b/spring-boot-libraries/pom.xml @@ -2,9 +2,9 @@ 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 + spring-boot-libraries war - spring-boot + spring-boot-libraries This is simple boot application for Spring boot actuator test From 6abaf50ab5b90d3dcfec61d8f2c3a29d4fc91f3b Mon Sep 17 00:00:00 2001 From: psevestre Date: Thu, 20 Dec 2018 02:42:16 -0200 Subject: [PATCH 329/429] Code for BAEL-1996 (#5933) * [BAEL-1996] WIP - Initial import * [BAEL-1996] Apply formatting rules * [BAEL-1996] Import UAA modules * [BAEL-1996] New directory structure * Merge upstream and include BAEL-1996 in main build --- jhipster/jhipster-uaa/pom.xml | 22 ++++++++++++++++++++++ jhipster/pom.xml | 1 + 2 files changed, 23 insertions(+) create mode 100644 jhipster/jhipster-uaa/pom.xml diff --git a/jhipster/jhipster-uaa/pom.xml b/jhipster/jhipster-uaa/pom.xml new file mode 100644 index 0000000000..e8ccaabfb0 --- /dev/null +++ b/jhipster/jhipster-uaa/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + com.baeldung.jhipster + jhipster-microservice-uaa + pom + JHipster Microservice with UAA + + + jhipster + com.baeldung.jhipster + 1.0.0-SNAPSHOT + + + + uaa + gateway + quotes + + + diff --git a/jhipster/pom.xml b/jhipster/pom.xml index 2bf7bcb233..5132c6dc95 100644 --- a/jhipster/pom.xml +++ b/jhipster/pom.xml @@ -18,6 +18,7 @@ jhipster-monolithic jhipster-microservice + jhipster-uaa From 547f99925fba49b2cb8515ffe6e8486a35246802 Mon Sep 17 00:00:00 2001 From: Shashank agarwal Date: Thu, 20 Dec 2018 10:19:27 +0530 Subject: [PATCH 330/429] Added the code of Replace char in a string at specific index (#5869) * Added the code of Replace char in a string at specific index * added test cases * Renamed the Test class name end with UnitTest * Renamed the Test class name end with UnitTest * Renamed the Test class name end with UnitTest * Replaced README with the upstream repo --- java-strings/README.md | 2 +- .../string/ReplaceCharacterInString.java | 21 +++++++++++++++++ .../string/ReplaceCharInStringUnitTest.java | 23 +++++++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java create mode 100644 java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java diff --git a/java-strings/README.md b/java-strings/README.md index 2713f69d58..7ff1b0ceea 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -2,7 +2,7 @@ ## Java Strings Cookbooks and Examples -### Relevant Articles: +### 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) diff --git a/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java b/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java new file mode 100644 index 0000000000..e8d1ce2d8b --- /dev/null +++ b/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java @@ -0,0 +1,21 @@ +package com.baeldung.string; + +public class ReplaceCharacterInString { + public String replaceCharSubstring(String str, char ch, int index) { + String myString = str.substring(0, index) + ch + str.substring(index+1); + return myString; + } + + public String replaceCharStringBuilder(String str, char ch, int index) { + StringBuilder myString = new StringBuilder(str); + myString.setCharAt(index, ch); + return myString.toString(); + } + + public String replaceCharStringBuffer(String str, char ch, int index) { + StringBuffer myString = new StringBuffer(str); + myString.setCharAt(index, ch); + return myString.toString(); + } + +} diff --git a/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java new file mode 100644 index 0000000000..07e86bb69b --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.string; + +import org.junit.Test; +import static org.junit.Assert.*; + +public class ReplaceCharInStringUnitTest { + private ReplaceCharacterInString characterInString = new ReplaceCharacterInString(); + + @Test + public void whenReplaceCharAtIndexUsingSubstring_thenSuccess(){ + assertEquals("abcme",characterInString.replaceCharSubstring("abcde",'m',3)); + } + + @Test + public void whenReplaceCharAtIndexUsingStringBuilder_thenSuccess(){ + assertEquals("abcme",characterInString.replaceCharStringBuilder("abcde",'m',3)); + } + + @Test + public void whenReplaceCharAtIndexUsingStringBuffer_thenSuccess(){ + assertEquals("abcme",characterInString.replaceCharStringBuffer("abcde",'m',3)); + } +} From b0f62f4eca44689176c126356066694dd02155ef Mon Sep 17 00:00:00 2001 From: Amitabh Mandal Date: Thu, 20 Dec 2018 11:23:53 +0530 Subject: [PATCH 331/429] BAEL-2168 Java EE 7 batch processing (#5861) * review changes * Fixed public static count * review comments --- .../batch/understanding/CustomCheckPoint.java | 12 ++++++++- .../understanding/InjectSimpleBatchLet.java | 20 +++++++++++++- .../understanding/SimpleChunkItemReader.java | 13 ++++++++-- .../SimpleChunkItemReaderError.java | 9 +++++-- .../understanding/SimpleChunkWriter.java | 3 +++ .../batch-jobs/injectionSimpleBatchLet.xml | 26 +++++++++++-------- .../batch-jobs/partitionSimpleBatchLet.xml | 6 +++++ .../batch/understanding/BatchTestHelper.java | 11 ++++++++ .../CustomCheckPointUnitTest.java | 9 ++++--- .../understanding/SimpleBatchLetUnitTest.java | 7 ----- .../SimpleErrorChunkUnitTest.java | 10 +++---- 11 files changed, 93 insertions(+), 33 deletions(-) diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java index fe6759b365..ba4eeb9da8 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/CustomCheckPoint.java @@ -1,12 +1,22 @@ package com.baeldung.batch.understanding; import javax.batch.api.chunk.AbstractCheckpointAlgorithm; +import javax.batch.runtime.context.JobContext; +import javax.inject.Inject; import javax.inject.Named; @Named public class CustomCheckPoint extends AbstractCheckpointAlgorithm { + + @Inject + JobContext jobContext; + + private Integer counterRead = 0; + @Override public boolean isReadyToCheckpoint() throws Exception { - return SimpleChunkItemReader.COUNT % 5 == 0; + counterRead = (Integer)jobContext.getTransientUserData(); + System.out.println("counterRead : " + counterRead); + return counterRead % 5 == 0; } } diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java index 93eb20708d..ccc052b44b 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/InjectSimpleBatchLet.java @@ -1,20 +1,38 @@ package com.baeldung.batch.understanding; +import java.util.Properties; +import java.util.logging.Logger; + import javax.batch.api.AbstractBatchlet; import javax.batch.api.BatchProperty; import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.context.JobContext; +import javax.batch.runtime.context.StepContext; import javax.inject.Inject; import javax.inject.Named; @Named public class InjectSimpleBatchLet extends AbstractBatchlet { + Logger logger = Logger.getLogger(InjectSimpleBatchLet.class.getName()); + @Inject @BatchProperty(name = "name") private String nameString; + @Inject + StepContext stepContext; + private Properties stepProperties; + @Inject + JobContext jobContext; + private Properties jobProperties; + @Override public String process() throws Exception { - System.out.println("Value passed in = " + nameString); + logger.info("BatchProperty : " + nameString); + stepProperties = stepContext.getProperties(); + jobProperties = jobContext.getProperties(); + logger.info("Step property : "+ stepProperties.getProperty("stepProp1")); + logger.info("job property : "+jobProperties.getProperty("jobProp1")); return BatchStatus.COMPLETED.toString(); } } diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java index 10f81d95d0..7d66edc74c 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReader.java @@ -1,20 +1,28 @@ package com.baeldung.batch.understanding; import java.io.Serializable; +import java.util.Properties; import java.util.StringTokenizer; import javax.batch.api.chunk.AbstractItemReader; +import javax.batch.runtime.BatchStatus; +import javax.batch.runtime.context.JobContext; +import javax.inject.Inject; import javax.inject.Named; @Named public class SimpleChunkItemReader extends AbstractItemReader { private StringTokenizer tokens; - public static int COUNT = 0; + private Integer count=0; + + @Inject + JobContext jobContext; @Override public Integer readItem() throws Exception { if (tokens.hasMoreTokens()) { - COUNT++; + this.count++; String tempTokenize = tokens.nextToken(); + jobContext.setTransientUserData(count); return Integer.valueOf(tempTokenize); } return null; @@ -24,4 +32,5 @@ public class SimpleChunkItemReader extends AbstractItemReader { public void open(Serializable checkpoint) throws Exception { tokens = new StringTokenizer("1,2,3,4,5,6,7,8,9,10", ","); } + } diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java index 92096d0571..f51426339f 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkItemReaderError.java @@ -4,17 +4,22 @@ import java.io.Serializable; import java.util.StringTokenizer; import javax.batch.api.chunk.AbstractItemReader; +import javax.batch.runtime.context.JobContext; +import javax.inject.Inject; import javax.inject.Named; @Named public class SimpleChunkItemReaderError extends AbstractItemReader { + @Inject + JobContext jobContext; private StringTokenizer tokens; - public static int COUNT = 0; + private Integer count = 0; @Override public Integer readItem() throws Exception { if (tokens.hasMoreTokens()) { - COUNT++; + count++; + jobContext.setTransientUserData(count); int token = Integer.valueOf(tokens.nextToken()); if (token == 3) { throw new RuntimeException("Something happened"); diff --git a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java index 909596766d..f21dd77b85 100644 --- a/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java +++ b/jee-7/src/main/java/com/baeldung/batch/understanding/SimpleChunkWriter.java @@ -1,5 +1,6 @@ package com.baeldung.batch.understanding; +import java.util.ArrayList; import java.util.List; import javax.batch.api.chunk.AbstractItemWriter; @@ -7,7 +8,9 @@ import javax.inject.Named; @Named public class SimpleChunkWriter extends AbstractItemWriter { + List processed = new ArrayList<>(); @Override public void writeItems(List items) throws Exception { + items.stream().map(Integer.class::cast).forEach(this.processed::add); } } diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml b/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml index d152f063f6..39cb043dcf 100644 --- a/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml +++ b/jee-7/src/main/resources/META-INF/batch-jobs/injectionSimpleBatchLet.xml @@ -1,13 +1,17 @@ - - - - - - - - + + + + + + + + + + + \ No newline at end of file diff --git a/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml b/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml index 76c64ee899..49495072ea 100644 --- a/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml +++ b/jee-7/src/main/resources/META-INF/batch-jobs/partitionSimpleBatchLet.xml @@ -4,7 +4,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/jobXML_1_0.xsd" version="1.0"> + + + + + + diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java b/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java index 5060bd9b91..56269809f3 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/BatchTestHelper.java @@ -7,6 +7,7 @@ import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; import javax.batch.runtime.Metric; +import javax.batch.runtime.StepExecution; public class BatchTestHelper { private static final int MAX_TRIES = 40; @@ -68,6 +69,16 @@ public class BatchTestHelper { return jobExecution; } + public static long getCommitCount(StepExecution stepExecution) { + Map metricsMap = getMetricsMap(stepExecution.getMetrics()); + return metricsMap.get(Metric.MetricType.COMMIT_COUNT); + } + + public static long getProcessSkipCount(StepExecution stepExecution) { + Map metricsMap = getMetricsMap(stepExecution.getMetrics()); + return metricsMap.get(Metric.MetricType.PROCESS_SKIP_COUNT); + } + public static Map getMetricsMap(Metric[] metrics) { Map metricsMap = new HashMap<>(); for (Metric metric : metrics) { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java index a9488c5c03..dfea878a75 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/CustomCheckPointUnitTest.java @@ -15,7 +15,7 @@ import org.junit.jupiter.api.Test; class CustomCheckPointUnitTest { @Test - public void givenChunk_whenCustomCheckPoint_thenCommitCount_3() throws Exception { + public void givenChunk_whenCustomCheckPoint_thenCommitCountIsThree() throws Exception { JobOperator jobOperator = BatchRuntime.getJobOperator(); Long executionId = jobOperator.start("customCheckPoint", new Properties()); JobExecution jobExecution = jobOperator.getJobExecution(executionId); @@ -23,9 +23,10 @@ class CustomCheckPointUnitTest { for (StepExecution stepExecution : jobOperator.getStepExecutions(executionId)) { if (stepExecution.getStepName() .equals("firstChunkStep")) { - Map metricsMap = BatchTestHelper.getMetricsMap(stepExecution.getMetrics()); - assertEquals(3L, metricsMap.get(Metric.MetricType.COMMIT_COUNT) - .longValue()); + jobOperator.getStepExecutions(executionId) + .stream() + .map(BatchTestHelper::getCommitCount) + .forEach(count -> assertEquals(3L, count.longValue())); } } assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java index 485c997cc6..ade492b1b9 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleBatchLetUnitTest.java @@ -1,18 +1,11 @@ package com.baeldung.batch.understanding; import static org.junit.jupiter.api.Assertions.*; - -import java.util.List; -import java.util.Map; import java.util.Properties; - import javax.batch.operations.JobOperator; import javax.batch.runtime.BatchRuntime; import javax.batch.runtime.BatchStatus; import javax.batch.runtime.JobExecution; -import javax.batch.runtime.Metric; -import javax.batch.runtime.StepExecution; - import org.junit.jupiter.api.Test; class SimpleBatchLetUnitTest { diff --git a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java index 0f6d068888..ded31b6345 100644 --- a/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java +++ b/jee-7/src/test/java/com/baeldung/batch/understanding/SimpleErrorChunkUnitTest.java @@ -1,5 +1,6 @@ package com.baeldung.batch.understanding; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.*; @@ -23,7 +24,6 @@ class SimpleErrorChunkUnitTest { Long executionId = jobOperator.start("simpleErrorChunk", new Properties()); JobExecution jobExecution = jobOperator.getJobExecution(executionId); jobExecution = BatchTestHelper.keepTestFailed(jobExecution); - System.out.println(jobExecution.getBatchStatus()); assertEquals(jobExecution.getBatchStatus(), BatchStatus.FAILED); } @@ -37,10 +37,10 @@ class SimpleErrorChunkUnitTest { for (StepExecution stepExecution : stepExecutions) { if (stepExecution.getStepName() .equals("errorStep")) { - Map metricsMap = BatchTestHelper.getMetricsMap(stepExecution.getMetrics()); - long skipCount = metricsMap.get(MetricType.PROCESS_SKIP_COUNT) - .longValue(); - assertTrue("Skip count=" + skipCount, skipCount == 1l || skipCount == 2l); + jobOperator.getStepExecutions(executionId) + .stream() + .map(BatchTestHelper::getProcessSkipCount) + .forEach(skipCount -> assertEquals(1L, skipCount.longValue())); } } assertEquals(jobExecution.getBatchStatus(), BatchStatus.COMPLETED); From 5550c4d7f3f2b096f5d50112ee395c6dcc2fb5dd Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:11:56 +0800 Subject: [PATCH 332/429] Update README.md --- spring-ldap/README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spring-ldap/README.md b/spring-ldap/README.md index e2517b9d4b..b8163ab44d 100644 --- a/spring-ldap/README.md +++ b/spring-ldap/README.md @@ -3,8 +3,4 @@ ### Relevant articles - [Spring LDAP Overview](http://www.baeldung.com/spring-ldap) -- [Spring LDAP Example Project](http://www.baeldung.com/spring-ldap-overview/) - [Guide to Spring Data LDAP](http://www.baeldung.com/spring-data-ldap) - - - From 8f116b541105bb02165143a9a7347b5e62a66bb5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:12:52 +0800 Subject: [PATCH 333/429] Update README.md --- core-java-8/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-8/README.md b/core-java-8/README.md index 6786b29120..e5fa953cc7 100644 --- a/core-java-8/README.md +++ b/core-java-8/README.md @@ -15,7 +15,6 @@ - [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) -- [Java Base64 Encoding and Decoding](http://www.baeldung.com/java-base64-encode-and-decode) - [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) From 8c758d8a7b05ffd9ea15ba1709b400c559c03b86 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:14:35 +0800 Subject: [PATCH 334/429] Update README.md --- persistence-modules/spring-hibernate4/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/persistence-modules/spring-hibernate4/README.md b/persistence-modules/spring-hibernate4/README.md index b15b7278f4..57a341ed45 100644 --- a/persistence-modules/spring-hibernate4/README.md +++ b/persistence-modules/spring-hibernate4/README.md @@ -7,12 +7,10 @@ - [The DAO with Spring 3 and Hibernate](http://www.baeldung.com/persistence-layer-with-spring-and-hibernate) - [Hibernate Pagination](http://www.baeldung.com/hibernate-pagination) - [Sorting with Hibernate](http://www.baeldung.com/hibernate-sort) -- [Auditing with JPA, Hibernate, and Spring Data JPA](http://www.baeldung.com/database-auditing-jpa) - [Stored Procedures with Hibernate](http://www.baeldung.com/stored-procedures-with-hibernate-tutorial) - [Hibernate: save, persist, update, merge, saveOrUpdate](http://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate) - [Eager/Lazy Loading In Hibernate](http://www.baeldung.com/hibernate-lazy-eager-loading) - [Hibernate One to Many Annotation Tutorial](http://www.baeldung.com/hibernate-one-to-many) -- [Guide to @Immutable Annotation in Hibernate](http://www.baeldung.com/hibernate-immutable) - [The DAO with Spring and Hibernate](http://www.baeldung.com/persistence-layer-with-spring-and-hibernate) ### Quick Start From ba2619c9e3d235c15d6b37e1702bf63d71a3b0d5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:17:23 +0800 Subject: [PATCH 335/429] Update README.md --- testing-modules/mockito/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index e1b9c27523..d344704712 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -14,8 +14,6 @@ - [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 Text Matchers](http://www.baeldung.com/hamcrest-text-matchers) -- [Hamcrest File Matchers](http://www.baeldung.com/hamcrest-file-matchers) - [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) From d7f8d7f105babd33e1174d5ecb28d3702cb2f022 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:19:46 +0800 Subject: [PATCH 336/429] Update README.md --- guava/src/test/java/org/baeldung/hamcrest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/guava/src/test/java/org/baeldung/hamcrest/README.md b/guava/src/test/java/org/baeldung/hamcrest/README.md index 456108d78a..7266ecda3a 100644 --- a/guava/src/test/java/org/baeldung/hamcrest/README.md +++ b/guava/src/test/java/org/baeldung/hamcrest/README.md @@ -1,3 +1,2 @@ ### Relevant Articles: - [Testing with Hamcrest](http://www.baeldung.com/java-junit-hamcrest-guide) -- [Hamcrest File Matchers](http://www.baeldung.com/hamcrest-file-matchers) From 903b405fb8d3e2b7ca37da5e625fe31b4ac3acba Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:22:45 +0800 Subject: [PATCH 337/429] Update README.md --- core-java-sun/src/main/java/com/baeldung/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-sun/src/main/java/com/baeldung/README.md b/core-java-sun/src/main/java/com/baeldung/README.md index 51809b2882..7d843af9ea 100644 --- a/core-java-sun/src/main/java/com/baeldung/README.md +++ b/core-java-sun/src/main/java/com/baeldung/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [SHA-256 Hashing in Java](http://www.baeldung.com/sha-256-hashing-java) From 0032ec40ebf556a239e8858074388165d44f1867 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:27:02 +0800 Subject: [PATCH 338/429] Update README.md --- core-java/src/main/java/com/baeldung/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java/src/main/java/com/baeldung/README.md b/core-java/src/main/java/com/baeldung/README.md index 51809b2882..7d843af9ea 100644 --- a/core-java/src/main/java/com/baeldung/README.md +++ b/core-java/src/main/java/com/baeldung/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [SHA-256 Hashing in Java](http://www.baeldung.com/sha-256-hashing-java) From d240caf482cf08542a07b9bea91e614d7a8126f5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:30:59 +0800 Subject: [PATCH 339/429] Update README.md --- guava/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/guava/README.md b/guava/README.md index 56e6aff50c..0346d34903 100644 --- a/guava/README.md +++ b/guava/README.md @@ -17,3 +17,5 @@ - [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) +- [SHA-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) From 2e9f02addfaf70ff7fe45c9be1771228181ddc68 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:43:34 +0800 Subject: [PATCH 340/429] Update README.md --- core-java/README.md | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/core-java/README.md b/core-java/README.md index 20f6ef5ea7..30d8bbde49 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -14,25 +14,20 @@ - [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java) - [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) - [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) -- [How to Design a Genetic Algorithm in Java](http://www.baeldung.com/java-genetic-algorithm) - [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions) -- [AWS Lambda With Java](http://www.baeldung.com/java-aws-lambda) - [Introduction to Nashorn](http://www.baeldung.com/java-nashorn) - [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) - [JVM Log Forging](http://www.baeldung.com/jvm-log-forging) - [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) - [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) - [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend) -- [Kotlin Java Interoperability](http://www.baeldung.com/kotlin-java-interoperability) - [How to Find all Getters Returning Null](http://www.baeldung.com/java-getters-returning-null) - [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method) -- [Converting a Stack Trace to a String in Java](http://www.baeldung.com/java-stacktrace-to-string) - [Introduction to Java Serialization](http://www.baeldung.com/java-serialization) - [Guide to UUID in Java](http://www.baeldung.com/java-uuid) - [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char) - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) - [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast) -- [Period and Duration in Java](http://www.baeldung.com/java-period-duration) - [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) @@ -43,7 +38,7 @@ - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) - [The Trie Data Structure in Java](http://www.baeldung.com/trie-java) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) -- [Guide to Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) +- [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) - [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat) - [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os) - [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java) From 6c9e1a64e57deff51e0a3d4efebc25feab7b1ca5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:45:33 +0800 Subject: [PATCH 341/429] Update README.md --- spring-rest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-rest/README.md b/spring-rest/README.md index efa0dbab60..08dd4b22ba 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -6,7 +6,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring ### Relevant Articles: - [Spring @RequestMapping](http://www.baeldung.com/spring-requestmapping) - [Http Message Converters with the Spring Framework](http://www.baeldung.com/spring-httpmessageconverter-rest) -- [Redirect in Spring](http://www.baeldung.com/spring-redirect-and-forward) - [Returning Custom Status Codes from Spring Controllers](http://www.baeldung.com/spring-mvc-controller-custom-http-status-code) - [A Guide to OkHttp](http://www.baeldung.com/guide-to-okhttp) - [Binary Data Formats in a Spring REST API](http://www.baeldung.com/spring-rest-api-with-binary-data-formats) From e26d75150afa64b1baf8eee87f9a103393d2f213 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:47:46 +0800 Subject: [PATCH 342/429] Update README.md --- spring-rest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-rest/README.md b/spring-rest/README.md index 08dd4b22ba..4921ab012c 100644 --- a/spring-rest/README.md +++ b/spring-rest/README.md @@ -14,7 +14,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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) -- [RequestBody and ResponseBody Annotations](http://www.baeldung.com/requestbody-and-responsebody-annotations) - [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) From 8605ea03af032f0f27102fded90ec1a551ac6f79 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:48:25 +0800 Subject: [PATCH 343/429] Update README.md --- data-structures/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/data-structures/README.md b/data-structures/README.md index b3b1196ce0..ff12555376 100644 --- a/data-structures/README.md +++ b/data-structures/README.md @@ -1,4 +1 @@ ## Relevant articles: - -- [The Trie Data Structure in Java](http://www.baeldung.com/trie-java) -- [Implementing a Binary Tree in Java](http://www.baeldung.com/java-binary-tree) From 1b31e2fa4396c2a38121af94291bec64b54197eb Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:51:10 +0800 Subject: [PATCH 344/429] Update README.md --- core-java-9/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-9/README.md b/core-java-9/README.md index 38816471aa..c96267dc95 100644 --- a/core-java-9/README.md +++ b/core-java-9/README.md @@ -9,7 +9,6 @@ - [Java 9 Convenience Factory Methods for Collections](http://www.baeldung.com/java-9-collections-factory-methods) - [New Stream Collectors in Java 9](http://www.baeldung.com/java9-stream-collectors) - [Java 9 CompletableFuture API Improvements](http://www.baeldung.com/java-9-completablefuture) -- [Spring Security – Redirect to the Previous URL After Login](http://www.baeldung.com/spring-security-redirect-login) - [Java 9 Process API Improvements](http://www.baeldung.com/java-9-process-api) - [Introduction to Java 9 StackWalking API](http://www.baeldung.com/java-9-stackwalking-api) - [Introduction to Project Jigsaw](http://www.baeldung.com/project-jigsaw-java-modularity) From e4d81a258fceb6778cbbc081a75975ff157a14f5 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:52:22 +0800 Subject: [PATCH 345/429] Update README.md --- resteasy/bin/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/resteasy/bin/README.md b/resteasy/bin/README.md index 722f1dfe93..f4dba1493a 100644 --- a/resteasy/bin/README.md +++ b/resteasy/bin/README.md @@ -4,5 +4,3 @@ ### Relevant Articles: -- [A Guide to RESTEasy](http://www.baeldung.com/resteasy-tutorial) -- [RESTEasy Client API](http://www.baeldung.com/resteasy-client-tutorial) From cdbf8288b93f447334b65256729f9f5f8da864ad Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:57:32 +0800 Subject: [PATCH 346/429] Update README.md --- libraries/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/libraries/README.md b/libraries/README.md index c1f16df6b4..b247caedda 100644 --- a/libraries/README.md +++ b/libraries/README.md @@ -18,7 +18,6 @@ - [Guide to the HyperLogLog Algorithm](http://www.baeldung.com/java-hyperloglog) - [Introduction to Neuroph](http://www.baeldung.com/neuroph) - [Quick Guide to RSS with Rome](http://www.baeldung.com/rome-rss) -- [Introduction to NoException](http://www.baeldung.com/introduction-to-noexception) - [Introduction to PCollections](http://www.baeldung.com/java-pcollections) - [Introduction to Hoverfly in Java](http://www.baeldung.com/hoverfly) - [Introduction to Eclipse Collections](http://www.baeldung.com/eclipse-collections) @@ -34,7 +33,6 @@ - [Introduction to Retrofit](http://www.baeldung.com/retrofit) - [Using Pairs in Java](http://www.baeldung.com/java-pairs) - [Introduction to Caffeine](http://www.baeldung.com/java-caching-caffeine) -- [Introduction to Chronicle Queue](http://www.baeldung.com/java-chronicle-queue) - [Introduction To Docx4J](http://www.baeldung.com/docx4j) - [Introduction to StreamEx](http://www.baeldung.com/streamex) - [Introduction to BouncyCastle with Java](http://www.baeldung.com/java-bouncy-castle) From 86adb21009e4ab6f99e27386dd5b1585da0a0487 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:57:50 +0800 Subject: [PATCH 347/429] Update README.md --- vavr/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/vavr/README.md b/vavr/README.md index b7ba72229b..0857765ec6 100644 --- a/vavr/README.md +++ b/vavr/README.md @@ -9,6 +9,5 @@ - [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 VRaptor in Java](http://www.baeldung.com/vraptor) - [Introduction to Vavr’s Either](http://www.baeldung.com/vavr-either) - [Interoperability Between Java and Vavr](http://www.baeldung.com/java-vavr) From c3f1d4dd491bd4ddc6e81c775fb0cdf806901488 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 21:58:43 +0800 Subject: [PATCH 348/429] Update README.md --- java-dates/src/main/java/com/baeldung/datetime/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/java-dates/src/main/java/com/baeldung/datetime/README.md b/java-dates/src/main/java/com/baeldung/datetime/README.md index 1e4adbb612..7d843af9ea 100644 --- a/java-dates/src/main/java/com/baeldung/datetime/README.md +++ b/java-dates/src/main/java/com/baeldung/datetime/README.md @@ -1,2 +1 @@ ### Relevant Articles: -- [Introduction to the Java 8 Date/Time API](http://www.baeldung.com/java-8-date-time-intro) From 81cda95e71bef4c2fe237fdf17968c872d44344d Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:02:28 +0800 Subject: [PATCH 349/429] Update README.md --- java-strings/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/java-strings/README.md b/java-strings/README.md index 7ff1b0ceea..cbc32d0015 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -10,7 +10,7 @@ - [Java – Generate Random String](http://www.baeldung.com/java-random-string) - [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) -- [How to Convert String to different data types in Java](http://www.baeldung.com/java-string-conversions) +- [Java String Conversions](https://www.baeldung.com/java-string-conversions) - [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) - [Count Occurrences of a Char in a String](http://www.baeldung.com/java-count-chars) @@ -27,7 +27,6 @@ - [Compact Strings in Java 9](http://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) -- [String Not Empty Test Assertions in Java](https://www.baeldung.com/java-assert-string-not-empty) - [Get Substring from String in Java](https://www.baeldung.com/java-substring) - [Converting a Stack Trace to a String in Java](https://www.baeldung.com/java-stacktrace-to-string) - [Sorting a String Alphabetically in Java](https://www.baeldung.com/java-sort-string-alphabetically) @@ -43,4 +42,4 @@ - [Convert String to Byte Array and Reverse in Java](https://www.baeldung.com/java-string-to-byte-array) - [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string) - [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) \ No newline at end of file +- [Remove or Replace part of a String in Java](https://www.baeldung.com/java-remove-replace-string-part) From 20c061130d226b8aeaebf82b8274267bd2fe21a1 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:06:51 +0800 Subject: [PATCH 350/429] Update README.md --- spring-security-mvc-persisted-remember-me/README.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/spring-security-mvc-persisted-remember-me/README.md b/spring-security-mvc-persisted-remember-me/README.md index f910c3f62b..e505537be1 100644 --- a/spring-security-mvc-persisted-remember-me/README.md +++ b/spring-security-mvc-persisted-remember-me/README.md @@ -7,9 +7,6 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com ### Relevant Articles: - [Spring Security Persisted Remember Me](http://www.baeldung.com/spring-security-persistent-remember-me) -- [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) - ### Build the Project ``` From 7eaf4d50ef95b78246017c5cc56e7c4c146f2f30 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:07:22 +0800 Subject: [PATCH 351/429] Update README.md --- kotlin-libraries/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md index d1ef77aa46..bef951c363 100644 --- a/kotlin-libraries/README.md +++ b/kotlin-libraries/README.md @@ -5,7 +5,6 @@ - [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 Ktor](http://www.baeldung.com/kotlin-ktor) - [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) From b390c744f6a47ee92054546e57e84c90a1f67af4 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:11:11 +0800 Subject: [PATCH 352/429] Update README.md --- testing-modules/mockito/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/testing-modules/mockito/README.md b/testing-modules/mockito/README.md index d344704712..158a1918e7 100644 --- a/testing-modules/mockito/README.md +++ b/testing-modules/mockito/README.md @@ -17,3 +17,4 @@ - [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) From b07afa2c4e8ecc2a0327d665d1afefa1478c6ca4 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:16:26 +0800 Subject: [PATCH 353/429] Update README.MD --- spring-boot/README.MD | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-boot/README.MD b/spring-boot/README.MD index 016d2841d7..2a6a935cc1 100644 --- a/spring-boot/README.MD +++ b/spring-boot/README.MD @@ -25,7 +25,6 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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) -- [How to Change the Default Port in Spring Boot](http://www.baeldung.com/spring-boot-change-port) - [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) From 5248c5b68d8237d5f4199e127254ebadeb4bb7ab Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:17:44 +0800 Subject: [PATCH 354/429] Update README.MD --- spring-security-thymeleaf/README.MD | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-thymeleaf/README.MD b/spring-security-thymeleaf/README.MD index c5deeb9946..36007bce62 100644 --- a/spring-security-thymeleaf/README.MD +++ b/spring-security-thymeleaf/README.MD @@ -4,4 +4,3 @@ Jira BAEL-1556 ### Relevant Articles: - [Spring Security with Thymeleaf](http://www.baeldung.com/spring-security-thymeleaf) -- [Working with Select and Option in Thymeleaf](http://www.baeldung.com/thymeleaf-select-option) From 5a12974a3c3241ddf804edb9561e10cfab64d175 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:31:57 +0800 Subject: [PATCH 355/429] Update README.md --- spring-session/spring-session-redis/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-session/spring-session-redis/README.md b/spring-session/spring-session-redis/README.md index 0d802a4715..5e9304d778 100644 --- a/spring-session/spring-session-redis/README.md +++ b/spring-session/spring-session-redis/README.md @@ -3,4 +3,4 @@ ## Spring Session Examples ### Relevant Articles: -- [Introduction to Spring Session](http://www.baeldung.com/spring-session) +- [Guide to Spring Session](http://www.baeldung.com/spring-session) From 0654ec855748e6892b7bee23b17103ac48146e36 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:43:14 +0800 Subject: [PATCH 356/429] Update README.md --- persistence-modules/spring-hibernate-5/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/persistence-modules/spring-hibernate-5/README.md b/persistence-modules/spring-hibernate-5/README.md index 75d23f7532..5e287919f1 100644 --- a/persistence-modules/spring-hibernate-5/README.md +++ b/persistence-modules/spring-hibernate-5/README.md @@ -1,6 +1,5 @@ ### Relevant articles -- [@Immutable in Hibernate](http://www.baeldung.com/hibernate-immutable) - [Hibernate Many to Many Annotation Tutorial](http://www.baeldung.com/hibernate-many-to-many) - [Programmatic Transactions in the Spring TestContext Framework](http://www.baeldung.com/spring-test-programmatic-transactions) - [Hibernate Criteria Queries](http://www.baeldung.com/hibernate-criteria-queries) From c2ac3c36e33315aa19409b2400a44f51fbb5f4ee Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Thu, 20 Dec 2018 22:48:08 +0800 Subject: [PATCH 357/429] Update README.md --- spring-security-rest/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/spring-security-rest/README.md b/spring-security-rest/README.md index c396948a59..f71eead9ae 100644 --- a/spring-security-rest/README.md +++ b/spring-security-rest/README.md @@ -15,5 +15,4 @@ The "Learn Spring Security" Classes: http://github.learnspringsecurity.com - [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) -- [Error Handling for REST with Spring](https://www.baeldung.com/exception-handling-for-rest-with-spring) - [Spring Security for a REST API](http://www.baeldung.com/securing-a-restful-web-service-with-spring-security) From 87b23b4d44ba4d8153c67fb67a5109a8b6d69e0b Mon Sep 17 00:00:00 2001 From: Tom Hombergs Date: Thu, 20 Dec 2018 21:54:20 +0100 Subject: [PATCH 358/429] Spock (#5952) * BAEL-2364: Adds Spring Boot IntegrationTests with Spock Framework * Adds o.b.boot.controller.rest.WebController as example controller * Adds one Load Application Context Test * Adds one WebMvcTest * updated pom.xml's and README * fixed module name --- pom.xml | 1 + spring-boot-testing/.gitignore | 5 + .../.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 47610 bytes .../.mvn/wrapper/maven-wrapper.properties | 1 + spring-boot-testing/README.MD | 6 + spring-boot-testing/mvnw | 227 ++++++++++++++++++ spring-boot-testing/mvnw.cmd | 145 +++++++++++ spring-boot-testing/pom.xml | 150 ++++++++++++ .../java/com/baeldung/boot/Application.java | 14 ++ .../boot/controller/rest/WebController.java | 36 +++ .../org/baeldung/boot/LoadContextTest.groovy | 23 ++ .../baeldung/boot/WebControllerTest.groovy | 43 ++++ 12 files changed, 651 insertions(+) create mode 100644 spring-boot-testing/.gitignore create mode 100644 spring-boot-testing/.mvn/wrapper/maven-wrapper.jar create mode 100644 spring-boot-testing/.mvn/wrapper/maven-wrapper.properties create mode 100644 spring-boot-testing/README.MD create mode 100644 spring-boot-testing/mvnw create mode 100644 spring-boot-testing/mvnw.cmd create mode 100644 spring-boot-testing/pom.xml create mode 100644 spring-boot-testing/src/main/java/com/baeldung/boot/Application.java create mode 100644 spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java create mode 100644 spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy create mode 100644 spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy diff --git a/pom.xml b/pom.xml index 5aa438132e..2f7212a28c 100644 --- a/pom.xml +++ b/pom.xml @@ -640,6 +640,7 @@ spring-boot-ops spring-boot-property-exp spring-boot-security + spring-boot-testing spring-boot-vue spring-cloud diff --git a/spring-boot-testing/.gitignore b/spring-boot-testing/.gitignore new file mode 100644 index 0000000000..da7c2c5c0a --- /dev/null +++ b/spring-boot-testing/.gitignore @@ -0,0 +1,5 @@ +/target/ +.settings/ +.classpath +.project + diff --git a/spring-boot-testing/.mvn/wrapper/maven-wrapper.jar b/spring-boot-testing/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..9cc84ea9b4d95453115d0c26488d6a78694e0bc6 GIT binary patch literal 47610 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 literal 0 HcmV?d00001 diff --git a/spring-boot-testing/.mvn/wrapper/maven-wrapper.properties b/spring-boot-testing/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000000..a447c9fa81 --- /dev/null +++ b/spring-boot-testing/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1 @@ +distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip \ No newline at end of file diff --git a/spring-boot-testing/README.MD b/spring-boot-testing/README.MD new file mode 100644 index 0000000000..a609b5bf09 --- /dev/null +++ b/spring-boot-testing/README.MD @@ -0,0 +1,6 @@ +### The Course +The "REST With Spring" Classes: http://bit.ly/restwithspring + +### Relevant Articles: + +- [Testing with Spring and Spock](https://www.baeldung.com/spring-spock-testing) diff --git a/spring-boot-testing/mvnw b/spring-boot-testing/mvnw new file mode 100644 index 0000000000..e96ccd5fbb --- /dev/null +++ b/spring-boot-testing/mvnw @@ -0,0 +1,227 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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 +# +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven2 Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + 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 + + 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 + +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/spring-boot-testing/mvnw.cmd b/spring-boot-testing/mvnw.cmd new file mode 100644 index 0000000000..6a6eec39ba --- /dev/null +++ b/spring-boot-testing/mvnw.cmd @@ -0,0 +1,145 @@ +@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 http://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 + +%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/spring-boot-testing/pom.xml b/spring-boot-testing/pom.xml new file mode 100644 index 0000000000..2a498e54c5 --- /dev/null +++ b/spring-boot-testing/pom.xml @@ -0,0 +1,150 @@ + + 4.0.0 + spring-boot-testing + war + spring-boot-testing + This is simple boot application for demonstrating testing features. + + + 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-tomcat + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.spockframework + spock-core + ${spock.version} + test + + + + org.spockframework + spock-spring + ${spock.version} + test + + + + + spring-boot + + + src/main/resources + true + + + + + + + org.apache.maven.plugins + maven-war-plugin + + + + pl.project13.maven + git-commit-id-plugin + ${git-commit-id-plugin.version} + + + get-the-git-infos + + revision + + initialize + + + validate-the-git-infos + + validateRevision + + package + + + + true + ${project.build.outputDirectory}/git.properties + + + + + org.codehaus.gmavenplus + gmavenplus-plugin + 1.6 + + + + compileTests + + + + + + + + + + + autoconfiguration + + + + org.apache.maven.plugins + maven-surefire-plugin + + + integration-test + + test + + + + **/*LiveTest.java + **/*IntegrationTest.java + **/*IntTest.java + + + **/AutoconfigurationTest.java + + + + + + + json + + + + + + + + + + + org.baeldung.boot.Application + 2.2.4 + 1.2-groovy-2.4 + + + diff --git a/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java b/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java new file mode 100644 index 0000000000..c1b6558b26 --- /dev/null +++ b/spring-boot-testing/src/main/java/com/baeldung/boot/Application.java @@ -0,0 +1,14 @@ +package org.baeldung.boot; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationContext; + +@SpringBootApplication +public class Application { + private static ApplicationContext applicationContext; + + public static void main(String[] args) { + applicationContext = SpringApplication.run(Application.class, args); + } +} diff --git a/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java b/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java new file mode 100644 index 0000000000..5b65599e00 --- /dev/null +++ b/spring-boot-testing/src/main/java/com/baeldung/boot/controller/rest/WebController.java @@ -0,0 +1,36 @@ +package org.baeldung.boot.controller.rest; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Optional; + +@RestController +@RequestMapping("/hello") +public class WebController { + + private String name; + + @GetMapping + public String salutation() { + return "Hello " + Optional.ofNullable(name).orElse("world") + '!'; + } + + @PutMapping + @ResponseStatus(HttpStatus.NO_CONTENT) + public void setName(@RequestBody final String name) { + this.name = name; + } + + @DeleteMapping + @ResponseStatus(HttpStatus.NO_CONTENT) + public void resetToDefault() { + this.name = null; + } +} \ No newline at end of file diff --git a/spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy b/spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy new file mode 100644 index 0000000000..2d4a7ca2cf --- /dev/null +++ b/spring-boot-testing/src/test/groovy/org/baeldung/boot/LoadContextTest.groovy @@ -0,0 +1,23 @@ +package org.baeldung.boot + +import org.baeldung.boot.controller.rest.WebController +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import spock.lang.Narrative +import spock.lang.Specification +import spock.lang.Title + +@Title("Application Specification") +@Narrative("Specification which beans are expected") +@SpringBootTest +class LoadContextTest extends Specification { + + @Autowired(required = false) + private WebController webController + + + def "when context is loaded then all expected beans are created"() { + expect: "the WebController is created" + webController + } +} diff --git a/spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy b/spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy new file mode 100644 index 0000000000..fe1b34ab8c --- /dev/null +++ b/spring-boot-testing/src/test/groovy/org/baeldung/boot/WebControllerTest.groovy @@ -0,0 +1,43 @@ +package org.baeldung.boot + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest +import org.springframework.test.web.servlet.MockMvc +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders +import org.springframework.test.web.servlet.result.MockMvcResultMatchers +import spock.lang.Narrative +import spock.lang.Specification +import spock.lang.Title + +@Title("WebController Specification") +@Narrative("The Specification of the behaviour of the WebController. It can greet a person, change the name and reset it to 'world'") +@AutoConfigureMockMvc +@WebMvcTest +class WebControllerTest extends Specification { + + @Autowired + private MockMvc mvc + + def "when get is performed then the response has status 200 and content is 'Hello world!'"() { + expect: "Status is 200 and the response is 'Hello world!'" + mvc.perform(MockMvcRequestBuilders.get("/hello")).andExpect(MockMvcResultMatchers.status().isOk()).andReturn().response.contentAsString == "Hello world!" + } + + def "when set and delete are performed then the response has status 204 and content changes as expected"() { + given: "a new name" + def NAME = "Emmy" + + when: "the name is set" + mvc.perform(MockMvcRequestBuilders.put("/hello").content(NAME)).andExpect(MockMvcResultMatchers.status().isNoContent()) + + then: "the salutation uses the new name" + mvc.perform(MockMvcRequestBuilders.get("/hello")).andExpect(MockMvcResultMatchers.status().isOk()).andReturn().response.contentAsString == "Hello $NAME!" + + when: "the name is deleted" + mvc.perform(MockMvcRequestBuilders.delete("/hello")).andExpect(MockMvcResultMatchers.status().isNoContent()) + + then: "the salutation uses the default name" + mvc.perform(MockMvcRequestBuilders.get("/hello")).andExpect(MockMvcResultMatchers.status().isOk()).andReturn().response.contentAsString == "Hello world!" + } +} From 1b7ac954d11c2e613aaf6ade5fc2f912cd5240c6 Mon Sep 17 00:00:00 2001 From: rodolforfq <31481067+rodolforfq@users.noreply.github.com> Date: Fri, 21 Dec 2018 04:23:16 -0400 Subject: [PATCH 359/429] Article improvements (#5961) Added 3 methods used to improve the examples on the article. The new methods are simpler to understand for the target audience. --- .../com/baeldung/controlstructures/Loops.java | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java index 83f2a27ea7..bb858ffe22 100644 --- a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java +++ b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java @@ -30,6 +30,16 @@ public class Loops { } while (count < 50); } + /** + * Splits a sentence in words, and prints each word in a new line. + * @param sentence Sentence to print as independent words. + */ + public static void printWordByWord(String sentence) { + for (String word : sentence.split(" ")) { + System.out.println(word); + } + } + /** * Prints text an N amount of times. Shows usage of the {@code break} branching statement. * @param textToPrint Text to repeatedly print. @@ -45,6 +55,21 @@ public class Loops { } } + /** + * Prints text an N amount of times, up to 50. Shows usage of the {@code break} branching statement. + * @param textToPrint Text to repeatedly print. + * @param times Amount to times to print received text. If times is higher than 50, textToPrint will only be printed 50 times. + */ + public static void printTextNTimesUpTo50(String textToPrint, int times) { + int counter = 1; + while (counter < 50) { + System.out.println(textToPrint); + if (counter == times) { + break; + } + } + } + /** * Prints an specified amount of even numbers. Shows usage of both {@code break} and {@code continue} branching statements. * @param amountToPrint Amount of even numbers to print. @@ -70,4 +95,29 @@ public class Loops { } } + /** + * Prints an specified amount of even numbers, up to 100. Shows usage of both {@code break} and {@code continue} branching statements. + * @param amountToPrint Amount of even numbers to print. + */ + public static void printEvenNumbersToAMaxOf100(int amountToPrint) { + if (amountToPrint <= 0) { // Invalid input + return; + } + int iterator = 0; + int amountPrinted = 0; + while (amountPrinted < 100) { + if (iterator % 2 == 0) { // Is an even number + System.out.println(iterator); + amountPrinted++; + iterator++; + } else { + iterator++; + continue; // Won't print + } + if (amountPrinted == amountToPrint) { + break; + } + } + } + } From a6f807e74ad17231c1d050163f02c4bd4f7cc0e4 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Fri, 21 Dec 2018 17:58:22 +0800 Subject: [PATCH 360/429] Update README.md --- core-java/README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/core-java/README.md b/core-java/README.md index 30d8bbde49..4fbc8bbc6e 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -36,7 +36,6 @@ - [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) -- [The Trie Data Structure in Java](http://www.baeldung.com/trie-java) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) - [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) - [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat) @@ -79,7 +78,6 @@ - [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks) - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) -- [Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree) - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) From c50eb350517b005d579f57e9192c12c8091e7221 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Fri, 21 Dec 2018 17:59:20 +0800 Subject: [PATCH 361/429] Update README.md --- data-structures/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data-structures/README.md b/data-structures/README.md index ff12555376..2d92068390 100644 --- a/data-structures/README.md +++ b/data-structures/README.md @@ -1 +1,4 @@ ## Relevant articles: + +[The Trie Data Structure in Java](https://www.baeldung.com/trie-java) +[Implementing a Binary Tree in Java](https://www.baeldung.com/java-binary-tree) From 6ee1c1c26d4b73080450a0be2d80508f784bb4a8 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Fri, 21 Dec 2018 18:00:08 +0800 Subject: [PATCH 362/429] Update README.md --- core-kotlin/README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/core-kotlin/README.md b/core-kotlin/README.md index 828293ec90..05f07e7e7e 100644 --- a/core-kotlin/README.md +++ b/core-kotlin/README.md @@ -34,7 +34,6 @@ - [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) -- [Kotlin with Ktor](https://www.baeldung.com/kotlin-ktor) - [Fuel HTTP Library with Kotlin](https://www.baeldung.com/kotlin-fuel) - [Introduction to Kovenant Library for Kotlin](https://www.baeldung.com/kotlin-kovenant) - [Converting Kotlin Data Class from JSON using GSON](https://www.baeldung.com/kotlin-json-convert-data-class) From cc9292fafd20677f71ba3ff56a2df7d141a68f03 Mon Sep 17 00:00:00 2001 From: charlesgonzales <39999268+charlesgonzales@users.noreply.github.com> Date: Fri, 21 Dec 2018 18:00:43 +0800 Subject: [PATCH 363/429] Update README.md --- kotlin-libraries/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/kotlin-libraries/README.md b/kotlin-libraries/README.md index bef951c363..4110bfe12e 100644 --- a/kotlin-libraries/README.md +++ b/kotlin-libraries/README.md @@ -8,3 +8,4 @@ - [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) From 25c270a7892c2270021fa41764feb431029380c8 Mon Sep 17 00:00:00 2001 From: j-bennett Date: Fri, 21 Dec 2018 10:54:04 -0500 Subject: [PATCH 364/429] BAEL-2353: Persist a JSON object using Hibernate (#5960) * BAEL-2353: Persist a JSON object using Hibernate * BAEL-2353: Persist a JSON object using Hibernate - Updated dependencies to latest versions --- persistence-modules/hibernate5/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index f5a3a7e4c9..11aca01573 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -79,12 +79,12 @@ - 5.3.6.Final + 5.3.7.Final 6.0.6 2.2.3 1.4.196 3.8.0 - 2.8.11.3 + 2.9.7 From fa190f96f641dbc186906c5e8fce170506ba70fb Mon Sep 17 00:00:00 2001 From: raghav-jha Date: Fri, 21 Dec 2018 23:03:40 +0530 Subject: [PATCH 365/429] BAEL-2436 Criteria Queries Using Hibernate Metamodel * BAEL-2436 Type Safe Criteria Queries Using Hibernate Metamodel * Formattng fixes * Formatting fixes --- persistence-modules/hibernate5/pom.xml | 14 ++- .../criteriaquery/HibernateUtil.java | 61 +++++++++++++ .../hibernate/criteriaquery/Student.java | 58 ++++++++++++ .../TypeSafeCriteriaIntegrationTest.java | 89 +++++++++++++++++++ 4 files changed, 219 insertions(+), 3 deletions(-) create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java create mode 100644 persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java create mode 100644 persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 11aca01573..9bfea14d30 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -1,11 +1,12 @@ - + 4.0.0 com.baeldung hibernate5 0.0.1-SNAPSHOT - hibernate5 + hibernate5 com.baeldung @@ -66,6 +67,13 @@ byte-buddy 1.9.5 + + + org.hibernate + hibernate-jpamodelgen + ${hibernate.version} + provided + diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java new file mode 100644 index 0000000000..0d11ea1567 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java @@ -0,0 +1,61 @@ +package com.baeldung.hibernate.criteriaquery; + +import com.baeldung.hibernate.customtypes.LocalDateStringType; +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.service.ServiceRegistry; + +import java.io.FileInputStream; +import java.io.IOException; +import java.net.URL; +import java.util.Properties; + +public class HibernateUtil { + private static SessionFactory sessionFactory; + + private HibernateUtil() { + } + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + sessionFactory = buildSessionFactory(); + } + return sessionFactory; + } + + private static SessionFactory buildSessionFactory() { + try { + ServiceRegistry serviceRegistry = configureServiceRegistry(); + + MetadataSources metadataSources = new MetadataSources(serviceRegistry); + + metadataSources.addAnnotatedClass(Student.class); + Metadata metadata = metadataSources.getMetadataBuilder() + .applyBasicType(LocalDateStringType.INSTANCE) + .build(); + + return metadata.getSessionFactoryBuilder().build(); + } catch (IOException ex) { + throw new ExceptionInInitializerError(ex); + } + } + + + private static ServiceRegistry configureServiceRegistry() throws IOException { + Properties properties = getProperties(); + return new StandardServiceRegistryBuilder().applySettings(properties).build(); + } + + private static Properties getProperties() throws IOException { + Properties properties = new Properties(); + URL propertiesURL = Thread.currentThread() + .getContextClassLoader() + .getResource("hibernate.properties"); + try (FileInputStream inputStream = new FileInputStream(propertiesURL.getFile())) { + properties.load(inputStream); + } + return properties; + } +} diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java new file mode 100644 index 0000000000..314e7ca557 --- /dev/null +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/Student.java @@ -0,0 +1,58 @@ +package com.baeldung.hibernate.criteriaquery; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "students") +public class Student { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + private int id; + + @Column(name = "first_name") + private String firstName; + + @Column(name = "last_name") + private String lastName; + + @Column(name = "grad_year") + private int gradYear; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public int getGradYear() { + return gradYear; + } + + public void setGradYear(int gradYear) { + this.gradYear = gradYear; + } +} diff --git a/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java new file mode 100644 index 0000000000..9d368fa27e --- /dev/null +++ b/persistence-modules/hibernate5/src/test/java/com/baeldung/hibernate/criteriaquery/TypeSafeCriteriaIntegrationTest.java @@ -0,0 +1,89 @@ +package com.baeldung.hibernate.criteriaquery; + +import com.baeldung.hibernate.criteriaquery.HibernateUtil; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.query.Query; +import org.junit.After; +import org.junit.AfterClass; +import org.junit.Before; +import org.junit.BeforeClass; +import org.junit.Test; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + + +public class TypeSafeCriteriaIntegrationTest { + + private static SessionFactory sessionFactory; + + private Session session; + + @BeforeClass + public static void beforeTests() throws IOException { + sessionFactory = HibernateUtil.getSessionFactory(); + } + + @Before + public void setUp() { + session = sessionFactory.openSession(); + session.beginTransaction(); + } + + @Test + public void givenStudentData_whenUsingTypeSafeCriteriaQuery_thenSearchAllStudentsOfAGradYear() { + + prepareData(); + CriteriaBuilder cb = session.getCriteriaBuilder(); + CriteriaQuery criteriaQuery = cb.createQuery(Student.class); + + Root root = criteriaQuery.from(Student.class); + criteriaQuery.select(root).where(cb.equal(root.get(Student_.gradYear), 1965)); + + Query query = session.createQuery(criteriaQuery); + List results = query.getResultList(); + + assertNotNull(results); + assertEquals(1, results.size()); + + Student student = results.get(0); + + assertEquals("Ken", student.getFirstName()); + assertEquals("Thompson", student.getLastName()); + assertEquals(1965, student.getGradYear()); + } + + private void prepareData() { + Student student1 = new Student(); + student1.setFirstName("Ken"); + student1.setLastName("Thompson"); + student1.setGradYear(1965); + + session.save(student1); + + Student student2 = new Student(); + student2.setFirstName("Dennis"); + student2.setLastName("Ritchie"); + student2.setGradYear(1963); + + session.save(student2); + session.getTransaction().commit(); + } + + @After + public void tearDown() { + session.close(); + } + + @AfterClass + public static void afterTests() { + sessionFactory.close(); + } +} From 5e02becb5e0f7a7f3e82e431c7ce9346226e850a Mon Sep 17 00:00:00 2001 From: cror <37755757+cror@users.noreply.github.com> Date: Sat, 22 Dec 2018 03:21:08 +0100 Subject: [PATCH 366/429] BAEL-2445: adding example for the intersection of two lists (#5968) --- .../baeldung/java/lists/ListJUnitTest.java | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java b/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java index 7dddf6c2ce..f9c9d3fda8 100644 --- a/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java +++ b/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java @@ -5,6 +5,10 @@ import org.junit.Test; import java.util.Arrays; import java.util.List; +import java.util.Set; +import java.util.HashSet; + +import java.util.stream.Collectors; public class ListJUnitTest { @@ -18,4 +22,26 @@ public class ListJUnitTest { Assert.assertNotSame(list1, list2); Assert.assertNotEquals(list1, list3); } + + @Test + public void whenIntersection_ShouldReturnCommonElements() throws Exception { + List list = Arrays.asList("red", "blue", "blue", "green", "red"); + List otherList = Arrays.asList("red", "green", "green", "yellow"); + + Set commonElements = new HashSet(Arrays.asList("red", "green")); + + Set result = list.stream() + .distinct() + .filter(otherList::contains) + .collect(Collectors.toSet()); + + Assert.assertEquals(commonElements, result); + + Set inverseResult = otherList.stream() + .distinct() + .filter(list::contains) + .collect(Collectors.toSet()); + + Assert.assertEquals(commonElements, inverseResult); + } } From 29b4110b34701c1ac004d03bc8e8555158a40e31 Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 28 Nov 2018 12:17:30 -0200 Subject: [PATCH 367/429] just migrated poms, nothing checked --- mustache/pom.xml | 4 ++-- spring-amqp-simple/pom.xml | 4 ++-- spring-aop/pom.xml | 4 ++-- spring-cucumber/pom.xml | 4 ++-- spring-jooq/pom.xml | 4 ++-- spring-kafka/pom.xml | 4 ++-- spring-mockito/pom.xml | 4 ++-- spring-protobuf/pom.xml | 4 ++-- spring-quartz/pom.xml | 4 ++-- spring-reactor/pom.xml | 4 ++-- spring-remoting/pom.xml | 4 ++-- spring-sleuth/pom.xml | 4 ++-- spring-vertx/pom.xml | 4 ++-- spring-zuul/pom.xml | 4 ++-- 14 files changed, 28 insertions(+), 28 deletions(-) diff --git a/mustache/pom.xml b/mustache/pom.xml index a276dfbf43..0c35345100 100644 --- a/mustache/pom.xml +++ b/mustache/pom.xml @@ -7,10 +7,10 @@ mustache - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-amqp-simple/pom.xml b/spring-amqp-simple/pom.xml index 57d84acee6..45cdc066a0 100644 --- a/spring-amqp-simple/pom.xml +++ b/spring-amqp-simple/pom.xml @@ -8,10 +8,10 @@ spring-amqp-simple - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-aop/pom.xml b/spring-aop/pom.xml index 368f3ada14..9e2f97916a 100644 --- a/spring-aop/pom.xml +++ b/spring-aop/pom.xml @@ -6,10 +6,10 @@ spring-aop - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-cucumber/pom.xml b/spring-cucumber/pom.xml index 64b543bb6c..2bc3201775 100644 --- a/spring-cucumber/pom.xml +++ b/spring-cucumber/pom.xml @@ -10,10 +10,10 @@ Demo project for Spring Boot - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml index bbd6025418..c1f9dbff5b 100644 --- a/spring-jooq/pom.xml +++ b/spring-jooq/pom.xml @@ -5,10 +5,10 @@ spring-jooq - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index 3060dc00b3..e710f1ac03 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -8,10 +8,10 @@ Intro to Kafka with Spring - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-mockito/pom.xml b/spring-mockito/pom.xml index d1fa7f410e..481c818f39 100644 --- a/spring-mockito/pom.xml +++ b/spring-mockito/pom.xml @@ -11,10 +11,10 @@ Injecting Mockito Mocks into Spring Beans - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-protobuf/pom.xml b/spring-protobuf/pom.xml index 1ab5048d27..3d7b7efd7c 100644 --- a/spring-protobuf/pom.xml +++ b/spring-protobuf/pom.xml @@ -7,10 +7,10 @@ spring-protobuf - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-quartz/pom.xml b/spring-quartz/pom.xml index 47ffeccba9..77424c219e 100644 --- a/spring-quartz/pom.xml +++ b/spring-quartz/pom.xml @@ -11,10 +11,10 @@ Demo project for Scheduling in Spring with Quartz - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index e828c44f74..9ab512cddb 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -9,10 +9,10 @@ http://maven.apache.org - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index 9f05bc91d2..6fa2846130 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -10,10 +10,10 @@ Parent for all projects related to Spring Remoting. - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-sleuth/pom.xml b/spring-sleuth/pom.xml index dd4477c551..c693466ab0 100644 --- a/spring-sleuth/pom.xml +++ b/spring-sleuth/pom.xml @@ -9,10 +9,10 @@ spring-sleuth - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-vertx/pom.xml b/spring-vertx/pom.xml index 14ed77d359..7a0bdc81d0 100644 --- a/spring-vertx/pom.xml +++ b/spring-vertx/pom.xml @@ -8,10 +8,10 @@ A demo project with vertx spring integration - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 diff --git a/spring-zuul/pom.xml b/spring-zuul/pom.xml index 266c20adee..b662b2ef6a 100644 --- a/spring-zuul/pom.xml +++ b/spring-zuul/pom.xml @@ -9,10 +9,10 @@ pom - parent-boot-1 + parent-boot-2 com.baeldung 0.0.1-SNAPSHOT - ../parent-boot-1 + ../parent-boot-2 From a1b5d77656e8582fd4f094ceef19098816c353e5 Mon Sep 17 00:00:00 2001 From: geroza Date: Wed, 19 Dec 2018 16:37:10 -0200 Subject: [PATCH 368/429] Migrated the following modules, nos using parent-boot-2: spring-protobuf spring-mockito spring-mustache spring-kafka spring-jooq spring-cucumber spring-aop spring-amqp-simple --- .../baeldung/springamqpsimple/SpringAmqpConfig.java | 2 +- .../springamqpsimple/broadcast/BroadcastConfig.java | 2 +- .../src/test/resources/application.yaml | 5 +++++ spring-jooq/pom.xml | 7 ++++--- spring-kafka/pom.xml | 2 -- .../com/baeldung/spring/kafka/KafkaApplication.java | 8 ++++---- .../com/baeldung/NameServiceTestConfiguration.java | 2 +- spring-protobuf/pom.xml | 13 +------------ .../java/com/baeldung/protobuf/Application.java | 6 ++++++ 9 files changed, 23 insertions(+), 24 deletions(-) create mode 100644 spring-amqp-simple/src/test/resources/application.yaml diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java index f6c82b635e..3bb0dbf33c 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java @@ -35,7 +35,7 @@ public class SpringAmqpConfig { } @Bean - SimpleMessageListenerContainer container(ConnectionFactory connectionFactory, + SimpleMessageListenerContainer SpringAmqpContainer(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java index 1d02b4dad9..c1df053c02 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java @@ -61,7 +61,7 @@ public class BroadcastConfig { } @Bean - public SimpleRabbitListenerContainerFactory container(ConnectionFactory connectionFactory, SimpleRabbitListenerContainerFactoryConfigurer configurer) { + public SimpleRabbitListenerContainerFactory BroadcastContainer(ConnectionFactory connectionFactory, SimpleRabbitListenerContainerFactoryConfigurer configurer) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); return factory; diff --git a/spring-amqp-simple/src/test/resources/application.yaml b/spring-amqp-simple/src/test/resources/application.yaml new file mode 100644 index 0000000000..aa7a91bac5 --- /dev/null +++ b/spring-amqp-simple/src/test/resources/application.yaml @@ -0,0 +1,5 @@ +spring: + rabbitmq: + username: guest + password: guest + host: localhost \ No newline at end of file diff --git a/spring-jooq/pom.xml b/spring-jooq/pom.xml index c1f9dbff5b..8bce500a86 100644 --- a/spring-jooq/pom.xml +++ b/spring-jooq/pom.xml @@ -129,6 +129,9 @@ com.baeldung.jooq.introduction.db src/main/java + + + @@ -185,14 +188,12 @@ - 3.8.6 + 3.11.7 1.4.193 - 4.3.17.RELEASE 1.0.0 1.5 1.0.0 - 1.5.13.RELEASE org.jooq.example.spring.Application diff --git a/spring-kafka/pom.xml b/spring-kafka/pom.xml index e710f1ac03..67e732d819 100644 --- a/spring-kafka/pom.xml +++ b/spring-kafka/pom.xml @@ -30,11 +30,9 @@ com.fasterxml.jackson.core jackson-databind - - 1.1.3.RELEASE 2.6.7 diff --git a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java index 50978d5ea9..4ee7f40335 100644 --- a/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java +++ b/spring-kafka/src/main/java/com/baeldung/spring/kafka/KafkaApplication.java @@ -22,7 +22,7 @@ public class KafkaApplication { public static void main(String[] args) throws Exception { ConfigurableApplicationContext context = SpringApplication.run(KafkaApplication.class, args); - + MessageProducer producer = context.getBean(MessageProducer.class); MessageListener listener = context.getBean(MessageListener.class); /* @@ -102,7 +102,7 @@ public class KafkaApplication { } public void sendMessageToPartion(String message, int partition) { - kafkaTemplate.send(partionedTopicName, partition, message); + kafkaTemplate.send(partionedTopicName, partition, null, message); } public void sendMessageToFiltered(String message) { @@ -124,13 +124,13 @@ public class KafkaApplication { private CountDownLatch greetingLatch = new CountDownLatch(1); - @KafkaListener(topics = "${message.topic.name}", group = "foo", containerFactory = "fooKafkaListenerContainerFactory") + @KafkaListener(topics = "${message.topic.name}", groupId = "foo", containerFactory = "fooKafkaListenerContainerFactory") public void listenGroupFoo(String message) { System.out.println("Received Messasge in group 'foo': " + message); latch.countDown(); } - @KafkaListener(topics = "${message.topic.name}", group = "bar", containerFactory = "barKafkaListenerContainerFactory") + @KafkaListener(topics = "${message.topic.name}", groupId = "bar", containerFactory = "barKafkaListenerContainerFactory") public void listenGroupBar(String message) { System.out.println("Received Messasge in group 'bar': " + message); latch.countDown(); diff --git a/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java b/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java index 2c63ff6203..c50377a22a 100644 --- a/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java +++ b/spring-mockito/src/test/java/com/baeldung/NameServiceTestConfiguration.java @@ -11,7 +11,7 @@ import org.springframework.context.annotation.Profile; public class NameServiceTestConfiguration { @Bean @Primary - public NameService nameService() { + public NameService nameServiceTest() { return Mockito.mock(NameService.class); } } diff --git a/spring-protobuf/pom.xml b/spring-protobuf/pom.xml index 3d7b7efd7c..372f969bd7 100644 --- a/spring-protobuf/pom.xml +++ b/spring-protobuf/pom.xml @@ -36,21 +36,10 @@ - - - - org.springframework.boot - spring-boot-maven-plugin - - true - - - - - 3.1.0 1.4 + com.baeldung.protobuf.Application diff --git a/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java b/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java index 76f0e45244..d8aa34eb7c 100644 --- a/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java +++ b/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java @@ -4,7 +4,9 @@ import com.baeldung.protobuf.BaeldungTraining.Course; import com.baeldung.protobuf.BaeldungTraining.Student; import com.baeldung.protobuf.BaeldungTraining.Student.PhoneNumber; import com.baeldung.protobuf.BaeldungTraining.Student.PhoneType; + import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.context.annotation.Bean; import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; import org.springframework.web.client.RestTemplate; @@ -17,6 +19,10 @@ import java.util.Map; @SpringBootApplication public class Application { + + public static void main(String[] args) { + new SpringApplicationBuilder(Application.class).run(args); + } @Bean RestTemplate restTemplate(ProtobufHttpMessageConverter hmc) { From dcc054d6de77dce144d58129b6a437a113776907 Mon Sep 17 00:00:00 2001 From: geroza Date: Fri, 21 Dec 2018 13:39:11 -0200 Subject: [PATCH 369/429] Migrated the following modules to parent-boot-2: spring-reactor spring-quartz --- spring-reactor/pom.xml | 7 ++++++- .../com/baeldung/controller/NotificationController.java | 8 +++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/spring-reactor/pom.xml b/spring-reactor/pom.xml index 9ab512cddb..c6ad99aea7 100644 --- a/spring-reactor/pom.xml +++ b/spring-reactor/pom.xml @@ -27,7 +27,12 @@ io.projectreactor reactor-bus + 2.0.8.RELEASE + + + io.projectreactor + reactor-core + 2.0.8.RELEASE - diff --git a/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java b/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java index b17691498e..8665f247b0 100644 --- a/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java +++ b/spring-reactor/src/main/java/com/baeldung/controller/NotificationController.java @@ -1,14 +1,16 @@ package com.baeldung.controller; -import com.baeldung.doman.NotificationData; import org.springframework.beans.factory.annotation.Autowired; -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.RestController; + +import com.baeldung.doman.NotificationData; + import reactor.bus.Event; import reactor.bus.EventBus; -@Controller +@RestController public class NotificationController { @Autowired From cb4470edea53c68dd48688a6bc01901bbf133275 Mon Sep 17 00:00:00 2001 From: geroza Date: Sat, 22 Dec 2018 10:30:08 -0200 Subject: [PATCH 370/429] migration of modules: spring-zuul spring-vertx spring-sleuth --- spring-remoting/pom.xml | 5 +++-- .../remoting-hessian-burlap/pom.xml | 6 ++++-- spring-zuul/pom.xml | 18 +++++++++++++++--- .../config/ResourceServerApplication.java | 2 +- .../config/ResourceServerWebConfig.java | 4 ++-- .../src/main/resources/application.properties | 4 ++-- spring-zuul/spring-zuul-ui/pom.xml | 2 +- .../org/baeldung/config/UiApplication.java | 2 +- .../java/org/baeldung/config/UiWebConfig.java | 5 ++--- 9 files changed, 31 insertions(+), 17 deletions(-) diff --git a/spring-remoting/pom.xml b/spring-remoting/pom.xml index 6fa2846130..060f33837c 100644 --- a/spring-remoting/pom.xml +++ b/spring-remoting/pom.xml @@ -7,7 +7,8 @@ pom 1.0-SNAPSHOT spring-remoting - Parent for all projects related to Spring Remoting. + Parent for all projects related to Spring Remoting, except remoting-hessian-burlap + parent-boot-2 @@ -28,8 +29,8 @@ - remoting-http remoting-hessian-burlap + remoting-http remoting-amqp remoting-jms remoting-rmi diff --git a/spring-remoting/remoting-hessian-burlap/pom.xml b/spring-remoting/remoting-hessian-burlap/pom.xml index e63d0ee22e..8c30e76296 100644 --- a/spring-remoting/remoting-hessian-burlap/pom.xml +++ b/spring-remoting/remoting-hessian-burlap/pom.xml @@ -6,11 +6,13 @@ remoting-hessian-burlap pom remoting-hessian-burlap + 1.0-SNAPSHOT - spring-remoting + parent-boot-1 com.baeldung - 1.0-SNAPSHOT + 0.0.1-SNAPSHOT + ../../parent-boot-1 diff --git a/spring-zuul/pom.xml b/spring-zuul/pom.xml index b662b2ef6a..a8c891cd89 100644 --- a/spring-zuul/pom.xml +++ b/spring-zuul/pom.xml @@ -1,7 +1,8 @@ - 4.0.0 - + com.baeldung spring-zuul 1.0.0-SNAPSHOT @@ -38,11 +39,22 @@ - 1.2.7.RELEASE + 2.1.0.RC3 3.5 2.6 + + + spring-milestones + Spring Milestones + http://repo.spring.io/milestone + + false + + + + \ No newline at end of file diff --git a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java index 9f1d2e162b..77eabe771b 100644 --- a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java +++ b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerApplication.java @@ -2,7 +2,7 @@ package org.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class ResourceServerApplication extends SpringBootServletInitializer { diff --git a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerWebConfig.java b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerWebConfig.java index c040c8ac42..1a45d20edb 100644 --- a/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerWebConfig.java +++ b/spring-zuul/spring-zuul-foos-resource/src/main/java/org/baeldung/config/ResourceServerWebConfig.java @@ -3,11 +3,11 @@ package org.baeldung.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc @ComponentScan({ "org.baeldung.web.controller" }) -public class ResourceServerWebConfig extends WebMvcConfigurerAdapter { +public class ResourceServerWebConfig implements WebMvcConfigurer { } diff --git a/spring-zuul/spring-zuul-foos-resource/src/main/resources/application.properties b/spring-zuul/spring-zuul-foos-resource/src/main/resources/application.properties index 94c0984ac3..9298027030 100644 --- a/spring-zuul/spring-zuul-foos-resource/src/main/resources/application.properties +++ b/spring-zuul/spring-zuul-foos-resource/src/main/resources/application.properties @@ -1,2 +1,2 @@ -server.contextPath=/spring-zuul-foos-resource -server.port=8081 \ No newline at end of file +server.servlet.context-path=/spring-zuul-foos-resource +server.port=8081 diff --git a/spring-zuul/spring-zuul-ui/pom.xml b/spring-zuul/spring-zuul-ui/pom.xml index 6090f5f8b8..159decd331 100644 --- a/spring-zuul/spring-zuul-ui/pom.xml +++ b/spring-zuul/spring-zuul-ui/pom.xml @@ -15,7 +15,7 @@ org.springframework.cloud - spring-cloud-starter-zuul + spring-cloud-starter-netflix-zuul ${spring-cloud.version} diff --git a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java index b8eda25960..d3e13639ef 100644 --- a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java +++ b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiApplication.java @@ -2,7 +2,7 @@ package org.baeldung.config; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.web.support.SpringBootServletInitializer; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @EnableZuulProxy diff --git a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiWebConfig.java b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiWebConfig.java index 0732182354..7cda1f0e95 100644 --- a/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiWebConfig.java +++ b/spring-zuul/spring-zuul-ui/src/main/java/org/baeldung/config/UiWebConfig.java @@ -7,11 +7,11 @@ import org.springframework.web.servlet.config.annotation.DefaultServletHandlerCo import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration @EnableWebMvc -public class UiWebConfig extends WebMvcConfigurerAdapter { +public class UiWebConfig implements WebMvcConfigurer { @Bean public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { @@ -25,7 +25,6 @@ public class UiWebConfig extends WebMvcConfigurerAdapter { @Override public void addViewControllers(final ViewControllerRegistry registry) { - super.addViewControllers(registry); registry.addViewController("/").setViewName("forward:/index"); registry.addViewController("/index"); registry.addViewController("/login"); From 832a3dc1761fdfbb0c9fed276863a6f222389548 Mon Sep 17 00:00:00 2001 From: geroza Date: Sat, 22 Dec 2018 10:30:56 -0200 Subject: [PATCH 371/429] Fixed deprecation usage in spring-boot --- .../main/java/com/baeldung/properties/ConfigProperties.java | 2 +- .../main/java/org/baeldung/properties/ConfigProperties.java | 2 +- .../demo/boottest/EmployeeControllerIntegrationTest.java | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-boot/src/main/java/com/baeldung/properties/ConfigProperties.java b/spring-boot/src/main/java/com/baeldung/properties/ConfigProperties.java index 863510738b..35b0239287 100644 --- a/spring-boot/src/main/java/com/baeldung/properties/ConfigProperties.java +++ b/spring-boot/src/main/java/com/baeldung/properties/ConfigProperties.java @@ -5,10 +5,10 @@ import java.util.Map; import javax.validation.constraints.Max; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; -import org.hibernate.validator.constraints.NotBlank; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; diff --git a/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java b/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java index 2c815fe998..2d3e56100c 100644 --- a/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java +++ b/spring-boot/src/main/java/org/baeldung/properties/ConfigProperties.java @@ -5,10 +5,10 @@ import java.util.Map; import javax.validation.constraints.Max; import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; import javax.validation.constraints.Pattern; import org.hibernate.validator.constraints.Length; -import org.hibernate.validator.constraints.NotBlank; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; diff --git a/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java index 640a8b322a..2d70583a54 100644 --- a/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java +++ b/spring-boot/src/test/java/org/baeldung/demo/boottest/EmployeeControllerIntegrationTest.java @@ -45,10 +45,10 @@ public class EmployeeControllerIntegrationTest { @Test public void whenPostEmployee_thenCreateEmployee() throws Exception { Employee alex = new Employee("alex"); - given(service.save(Mockito.anyObject())).willReturn(alex); + given(service.save(Mockito.any())).willReturn(alex); mvc.perform(post("/api/employees").contentType(MediaType.APPLICATION_JSON).content(JsonUtil.toJson(alex))).andExpect(status().isCreated()).andExpect(jsonPath("$.name", is("alex"))); - verify(service, VerificationModeFactory.times(1)).save(Mockito.anyObject()); + verify(service, VerificationModeFactory.times(1)).save(Mockito.any()); reset(service); } From cb259f6f6ca97806cfb391bb38edf77ad0f324d1 Mon Sep 17 00:00:00 2001 From: geroza Date: Sat, 22 Dec 2018 11:05:38 -0200 Subject: [PATCH 372/429] minor fixes: fixed method naming added dirtiesContext annotation to classes that shouldnt share the app context state using SpringApplication instead of unnecessary SpringApplicationBuilder --- .../springamqpsimple/SpringAmqpConfig.java | 2 +- .../broadcast/BroadcastConfig.java | 2 +- .../com/baeldung/protobuf/Application.java | 24 +++++++++---------- .../protobuf/ApplicationIntegrationTest.java | 2 ++ .../SpringContextIntegrationTest.java | 2 ++ 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java index 3bb0dbf33c..92fa28ed6f 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/SpringAmqpConfig.java @@ -35,7 +35,7 @@ public class SpringAmqpConfig { } @Bean - SimpleMessageListenerContainer SpringAmqpContainer(ConnectionFactory connectionFactory, + SimpleMessageListenerContainer springAmqpContainer(ConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) { SimpleMessageListenerContainer container = new SimpleMessageListenerContainer(); container.setConnectionFactory(connectionFactory); diff --git a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java index c1df053c02..868cfff0ac 100644 --- a/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java +++ b/spring-amqp-simple/src/main/java/com/baeldung/springamqpsimple/broadcast/BroadcastConfig.java @@ -61,7 +61,7 @@ public class BroadcastConfig { } @Bean - public SimpleRabbitListenerContainerFactory BroadcastContainer(ConnectionFactory connectionFactory, SimpleRabbitListenerContainerFactoryConfigurer configurer) { + public SimpleRabbitListenerContainerFactory broadcastContainer(ConnectionFactory connectionFactory, SimpleRabbitListenerContainerFactoryConfigurer configurer) { SimpleRabbitListenerContainerFactory factory = new SimpleRabbitListenerContainerFactory(); configurer.configure(factory, connectionFactory); return factory; diff --git a/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java b/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java index d8aa34eb7c..fd36986549 100644 --- a/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java +++ b/spring-protobuf/src/main/java/com/baeldung/protobuf/Application.java @@ -1,27 +1,27 @@ package com.baeldung.protobuf; -import com.baeldung.protobuf.BaeldungTraining.Course; -import com.baeldung.protobuf.BaeldungTraining.Student; -import com.baeldung.protobuf.BaeldungTraining.Student.PhoneNumber; -import com.baeldung.protobuf.BaeldungTraining.Student.PhoneType; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.builder.SpringApplicationBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; -import org.springframework.web.client.RestTemplate; - import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter; +import org.springframework.web.client.RestTemplate; + +import com.baeldung.protobuf.BaeldungTraining.Course; +import com.baeldung.protobuf.BaeldungTraining.Student; +import com.baeldung.protobuf.BaeldungTraining.Student.PhoneNumber; +import com.baeldung.protobuf.BaeldungTraining.Student.PhoneType; + @SpringBootApplication public class Application { public static void main(String[] args) { - new SpringApplicationBuilder(Application.class).run(args); + SpringApplication.run(Application.class, args); } @Bean diff --git a/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java b/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java index 4b9f41ace3..f0e2473ec4 100644 --- a/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java +++ b/spring-protobuf/src/test/java/com/baeldung/protobuf/ApplicationIntegrationTest.java @@ -16,12 +16,14 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest.WebEnvironment; import org.springframework.http.ResponseEntity; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.web.client.RestTemplate; import com.baeldung.protobuf.BaeldungTraining.Course; import com.googlecode.protobuf.format.JsonFormat; +@DirtiesContext @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = Application.class, webEnvironment = WebEnvironment.DEFINED_PORT) public class ApplicationIntegrationTest { diff --git a/spring-protobuf/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-protobuf/src/test/java/org/baeldung/SpringContextIntegrationTest.java index 615ebd5f4a..6d021eb400 100644 --- a/spring-protobuf/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-protobuf/src/test/java/org/baeldung/SpringContextIntegrationTest.java @@ -3,10 +3,12 @@ package org.baeldung; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.junit4.SpringRunner; import com.baeldung.protobuf.Application; +@DirtiesContext @RunWith(SpringRunner.class) @SpringBootTest(classes = Application.class) public class SpringContextIntegrationTest { From 023bf2c5b58523215ac4b0d0fda8aa4795ef6c37 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 22 Dec 2018 21:02:12 +0530 Subject: [PATCH 373/429] [BAEL-10839] - Create core-java-lang-oop module --- core-java-lang-oop/.gitignore | 26 ++ core-java-lang-oop/README.md | 23 ++ core-java-lang-oop/pom.xml | 91 +++++ .../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 .../java/com/baeldung/casting/Animal.java | 0 .../com/baeldung/casting/AnimalFeeder.java | 0 .../baeldung/casting/AnimalFeederGeneric.java | 0 .../main/java/com/baeldung/casting/Cat.java | 0 .../main/java/com/baeldung/casting/Dog.java | 0 .../main/java/com/baeldung/casting/Mew.java | 0 .../baeldung/constructors/BankAccount.java | 0 .../baeldung/constructors/Transaction.java | 0 .../java/com/baeldung/deepcopy/Address.java | 0 .../main/java/com/baeldung/deepcopy/User.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 .../com/baeldung/finalkeyword/BlackCat.java | 0 .../com/baeldung/finalkeyword/BlackDog.java | 0 .../java/com/baeldung/finalkeyword/Cat.java | 0 .../java/com/baeldung/finalkeyword/Dog.java | 0 .../com/baeldung/hashcode/entities/User.java | 0 .../baeldung/immutableobjects/Currency.java | 0 .../com/baeldung/immutableobjects/Money.java | 0 .../com/baeldung/inheritance/ArmoredCar.java | 0 .../java/com/baeldung/inheritance/BMW.java | 0 .../java/com/baeldung/inheritance/Car.java | 0 .../com/baeldung/inheritance/Employee.java | 0 .../com/baeldung/inheritance/Floatable.java | 0 .../com/baeldung/inheritance/Flyable.java | 0 .../com/baeldung/inheritance/SpaceCar.java | 0 .../baeldung/inheritance/SpaceTraveller.java | 0 .../application/Application.java | 0 .../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 .../baeldung/initializationguide/User.java | 0 .../com/baeldung/keyword/KeywordDemo.java | 0 .../keyword/superkeyword/SuperBase.java | 0 .../keyword/superkeyword/SuperSub.java | 0 .../keyword/thiskeyword/KeywordUnitTest.java | 0 .../application/Application.java | 0 .../model/Car.java | 0 .../model/Vehicle.java | 0 .../util/Multiplier.java | 0 .../baeldung/polymorphism/FileManager.java | 0 .../baeldung/polymorphism/GenericFile.java | 0 .../com/baeldung/polymorphism/ImageFile.java | 0 .../com/baeldung/polymorphism/TextFile.java | 0 .../scope/method/BaseMethodClass.java | 0 .../scope/method/ChildMethodClass.java | 0 .../scope/method/MethodHidingDemo.java | 0 .../scope/variable/ChildVariable.java | 0 .../baeldung/scope/variable/HideVariable.java | 0 .../scope/variable/ParentVariable.java | 0 .../scope/variable/VariableHidingDemo.java | 0 .../java/com/baeldung/staticdemo/Car.java | 0 .../com/baeldung/staticdemo/Singleton.java | 0 .../com/baeldung/staticdemo/StaticBlock.java | 0 .../typeerasure/ArrayContentPrintUtil.java | 0 .../com/baeldung/typeerasure/BoundStack.java | 0 .../baeldung/typeerasure/IntegerStack.java | 0 .../java/com/baeldung/typeerasure/Stack.java | 0 .../src/main/resources/logback.xml | 19 + .../com/baeldung/casting/CastingUnitTest.java | 0 .../constructors/ConstructorUnitTest.java | 0 .../baeldung/deepcopy/DeepCopyUnitTest.java | 0 .../deepcopy/ShallowCopyUnitTest.java | 0 .../equalshashcode/MoneyUnitTest.java | 0 .../baeldung/equalshashcode/TeamUnitTest.java | 0 .../entities/ComplexClassUnitTest.java | 0 .../entities/PrimitiveClassUnitTest.java | 0 .../entities/SquareClassUnitTest.java | 0 .../baeldung/finalkeyword/FinalUnitTest.java | 0 .../application/ApplicationUnitTest.java | 0 .../hashcode/entities/UserUnitTest.java | 0 .../com/baeldung/inheritance/AppUnitTest.java | 0 .../test/ActressUnitTest.java | 0 .../test/CompositionUnitTest.java | 0 .../test/InheritanceUnitTest.java | 0 .../test/PersonUnitTest.java | 0 .../test/WaitressUnitTest.java | 0 .../initializationguide/UserUnitTest.java | 0 .../test/MethodOverloadingUnitTest.java | 0 .../test/MethodOverridingUnitTest.java | 0 .../NonPrimitivesUnitTest.java | 0 .../parameterpassing/PrimitivesUnitTest.java | 0 .../polymorphism/PolymorphismUnitTest.java | 0 .../staticdemo/CarIntegrationTest.java | 0 .../staticdemo/SingletonIntegrationTest.java | 0 .../StaticBlockIntegrationTest.java | 0 .../typeerasure/TypeErasureUnitTest.java | 0 .../src/test/resources/.gitignore | 13 + core-java-lang/README.md | 18 - core-java-lang/pom.xml | 344 ------------------ pom.xml | 2 + 115 files changed, 174 insertions(+), 362 deletions(-) create mode 100644 core-java-lang-oop/.gitignore create mode 100644 core-java-lang-oop/README.md create mode 100644 core-java-lang-oop/pom.xml rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/Public.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/SubClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/Animal.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/AnimalFeeder.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/Cat.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/Dog.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/casting/Mew.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/constructors/BankAccount.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/constructors/Transaction.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/deepcopy/Address.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/deepcopy/User.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/Money.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/Team.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/Voucher.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/WrongTeam.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/Shape.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/equalshashcode/entities/Square.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/finalkeyword/BlackCat.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/finalkeyword/BlackDog.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/finalkeyword/Cat.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/finalkeyword/Dog.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/hashcode/entities/User.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/immutableobjects/Currency.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/immutableobjects/Money.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/ArmoredCar.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/BMW.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/Car.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/Employee.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/Floatable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/Flyable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/SpaceCar.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritance/SpaceTraveller.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/application/Application.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Person.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/initializationguide/User.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/keyword/KeywordDemo.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/polymorphism/FileManager.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/polymorphism/GenericFile.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/polymorphism/ImageFile.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/polymorphism/TextFile.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/method/BaseMethodClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/method/ChildMethodClass.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/variable/ChildVariable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/variable/HideVariable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/variable/ParentVariable.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/staticdemo/Car.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/staticdemo/Singleton.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/staticdemo/StaticBlock.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/typeerasure/BoundStack.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/typeerasure/IntegerStack.java (100%) rename {core-java-lang => core-java-lang-oop}/src/main/java/com/baeldung/typeerasure/Stack.java (100%) create mode 100644 core-java-lang-oop/src/main/resources/logback.xml rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/casting/CastingUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritance/AppUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/initializationguide/UserUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java (100%) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java (100%) create mode 100644 core-java-lang-oop/src/test/resources/.gitignore diff --git a/core-java-lang-oop/.gitignore b/core-java-lang-oop/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/core-java-lang-oop/.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-lang-oop/README.md b/core-java-lang-oop/README.md new file mode 100644 index 0000000000..665178452c --- /dev/null +++ b/core-java-lang-oop/README.md @@ -0,0 +1,23 @@ +========= + +## 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) +- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization) +- [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) +- [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) \ No newline at end of file diff --git a/core-java-lang-oop/pom.xml b/core-java-lang-oop/pom.xml new file mode 100644 index 0000000000..262408c024 --- /dev/null +++ b/core-java-lang-oop/pom.xml @@ -0,0 +1,91 @@ + + 4.0.0 + com.baeldung + core-java-lang-oop + 0.1.0-SNAPSHOT + jar + core-java-lang-oop + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.google.code.gson + gson + ${gson.version} + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + nl.jqno.equalsverifier + equalsverifier + ${equalsverifier.version} + test + + + + + core-java-lang-oop + + + src/main/resources + true + + + + + + + + 2.8.5 + 2.8.2 + + + 3.5 + 1.16.12 + + 3.10.0 + 3.0.3 + + + diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/Public.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/Public.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/SubClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SubClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/SuperPublic.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherPublic.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSubClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java b/core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java rename to core-java-lang-oop/src/main/java/com/baeldung/accessmodifiers/another/AnotherSuperPublic.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Animal.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Animal.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/Animal.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Animal.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeeder.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/AnimalFeeder.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeeder.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/AnimalFeederGeneric.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Cat.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Cat.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/Cat.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Cat.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Dog.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Dog.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/Dog.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Dog.java diff --git a/core-java-lang/src/main/java/com/baeldung/casting/Mew.java b/core-java-lang-oop/src/main/java/com/baeldung/casting/Mew.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/casting/Mew.java rename to core-java-lang-oop/src/main/java/com/baeldung/casting/Mew.java diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java b/core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/constructors/BankAccount.java rename to core-java-lang-oop/src/main/java/com/baeldung/constructors/BankAccount.java diff --git a/core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java b/core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/constructors/Transaction.java rename to core-java-lang-oop/src/main/java/com/baeldung/constructors/Transaction.java diff --git a/core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java b/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/Address.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/deepcopy/Address.java rename to core-java-lang-oop/src/main/java/com/baeldung/deepcopy/Address.java diff --git a/core-java-lang/src/main/java/com/baeldung/deepcopy/User.java b/core-java-lang-oop/src/main/java/com/baeldung/deepcopy/User.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/deepcopy/User.java rename to core-java-lang-oop/src/main/java/com/baeldung/deepcopy/User.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/Money.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Money.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/Team.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Team.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/Voucher.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/Voucher.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongTeam.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongTeam.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/WrongVoucher.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/ComplexClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/PrimitiveClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Rectangle.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Shape.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Shape.java diff --git a/core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java b/core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/equalshashcode/entities/Square.java rename to core-java-lang-oop/src/main/java/com/baeldung/equalshashcode/entities/Square.java diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackCat.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackCat.java rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackCat.java diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackDog.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/BlackDog.java rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/BlackDog.java diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Cat.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/Cat.java rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Cat.java diff --git a/core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java b/core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Dog.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/finalkeyword/Dog.java rename to core-java-lang-oop/src/main/java/com/baeldung/finalkeyword/Dog.java diff --git a/core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java b/core-java-lang-oop/src/main/java/com/baeldung/hashcode/entities/User.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/hashcode/entities/User.java rename to core-java-lang-oop/src/main/java/com/baeldung/hashcode/entities/User.java diff --git a/core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java b/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/immutableobjects/Currency.java rename to core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Currency.java diff --git a/core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java b/core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/immutableobjects/Money.java rename to core-java-lang-oop/src/main/java/com/baeldung/immutableobjects/Money.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/ArmoredCar.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/ArmoredCar.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/ArmoredCar.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/BMW.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/BMW.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/BMW.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Car.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Car.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/Car.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Car.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Employee.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/Employee.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Employee.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Floatable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/Floatable.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Floatable.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/Flyable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/Flyable.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/Flyable.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceCar.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/SpaceCar.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceCar.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceTraveller.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritance/SpaceTraveller.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritance/SpaceTraveller.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/application/Application.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/application/Application.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Actress.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Computer.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Memory.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Person.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Person.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Processor.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/SoundCard.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardMemory.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardProcessor.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/StandardSoundCard.java diff --git a/core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java b/core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java rename to core-java-lang-oop/src/main/java/com/baeldung/inheritancecomposition/model/Waitress.java diff --git a/core-java-lang/src/main/java/com/baeldung/initializationguide/User.java b/core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/initializationguide/User.java rename to core-java-lang-oop/src/main/java/com/baeldung/initializationguide/User.java diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/keyword/KeywordDemo.java rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/KeywordDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperBase.java diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/superkeyword/SuperSub.java diff --git a/core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java b/core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java rename to core-java-lang-oop/src/main/java/com/baeldung/keyword/thiskeyword/KeywordUnitTest.java diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/application/Application.java diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Car.java diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/model/Vehicle.java diff --git a/core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java b/core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java rename to core-java-lang-oop/src/main/java/com/baeldung/methodoverloadingoverriding/util/Multiplier.java diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/FileManager.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/polymorphism/FileManager.java rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/FileManager.java diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/GenericFile.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/polymorphism/GenericFile.java rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/GenericFile.java diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/ImageFile.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/polymorphism/ImageFile.java rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/ImageFile.java diff --git a/core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java b/core-java-lang-oop/src/main/java/com/baeldung/polymorphism/TextFile.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/polymorphism/TextFile.java rename to core-java-lang-oop/src/main/java/com/baeldung/polymorphism/TextFile.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/method/BaseMethodClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/method/BaseMethodClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/method/BaseMethodClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/method/ChildMethodClass.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/method/ChildMethodClass.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/method/ChildMethodClass.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/method/MethodHidingDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ChildVariable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/variable/ChildVariable.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ChildVariable.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/HideVariable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/variable/HideVariable.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/HideVariable.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ParentVariable.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/variable/ParentVariable.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/ParentVariable.java diff --git a/core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java b/core-java-lang-oop/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java rename to core-java-lang-oop/src/main/java/com/baeldung/scope/variable/VariableHidingDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java b/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Car.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/staticdemo/Car.java rename to core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Car.java diff --git a/core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java b/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Singleton.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/staticdemo/Singleton.java rename to core-java-lang-oop/src/main/java/com/baeldung/staticdemo/Singleton.java diff --git a/core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java b/core-java-lang-oop/src/main/java/com/baeldung/staticdemo/StaticBlock.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/staticdemo/StaticBlock.java rename to core-java-lang-oop/src/main/java/com/baeldung/staticdemo/StaticBlock.java diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/ArrayContentPrintUtil.java diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/BoundStack.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/typeerasure/BoundStack.java rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/BoundStack.java diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/IntegerStack.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/typeerasure/IntegerStack.java rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/IntegerStack.java diff --git a/core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java b/core-java-lang-oop/src/main/java/com/baeldung/typeerasure/Stack.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/typeerasure/Stack.java rename to core-java-lang-oop/src/main/java/com/baeldung/typeerasure/Stack.java diff --git a/core-java-lang-oop/src/main/resources/logback.xml b/core-java-lang-oop/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-lang-oop/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-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/casting/CastingUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/casting/CastingUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/casting/CastingUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/constructors/ConstructorUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/deepcopy/DeepCopyUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/deepcopy/ShallowCopyUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/MoneyUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/TeamUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/ComplexClassUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/PrimitiveClassUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/equalshashcode/entities/SquareClassUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/finalkeyword/FinalUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/hashcode/application/ApplicationUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/hashcode/entities/UserUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritance/AppUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritance/AppUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritance/AppUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/ActressUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/CompositionUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/InheritanceUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/PersonUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/inheritancecomposition/test/WaitressUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/initializationguide/UserUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverloadingUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/methodoverloadingoverriding/test/MethodOverridingUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/NonPrimitivesUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/parameterpassing/PrimitivesUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/polymorphism/PolymorphismUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java b/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/staticdemo/CarIntegrationTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java b/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/staticdemo/SingletonIntegrationTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java b/core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/staticdemo/StaticBlockIntegrationTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/typeerasure/TypeErasureUnitTest.java diff --git a/core-java-lang-oop/src/test/resources/.gitignore b/core-java-lang-oop/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-lang-oop/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-lang/README.md b/core-java-lang/README.md index 69209bb193..56de6d2e82 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -13,35 +13,19 @@ - [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 hashCode() in Java](http://www.baeldung.com/java-hashcode) - [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator) -- [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static) - [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable) - [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break) -- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization) - [Nested Classes in Java](http://www.baeldung.com/java-nested-classes) - [A Guide to Java Loops](http://www.baeldung.com/java-loops) - [Varargs in Java](http://www.baeldung.com/java-varargs) - [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces) -- [Polymorphism in Java](http://www.baeldung.com/java-polymorphism) - [Recursion In Java](http://www.baeldung.com/java-recursion) - [A Guide to the finalize Method in Java](http://www.baeldung.com/java-finalize) -- [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) - [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) -- [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure) - [Using Java Assertions](http://www.baeldung.com/java-assert) -- [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) - [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) @@ -55,7 +39,5 @@ - [Ternary Operator In Java](https://www.baeldung.com/java-ternary-operator) - [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) -- [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) - [Retrieving a Class Name in Java](https://www.baeldung.com/java-class-name) - [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) diff --git a/core-java-lang/pom.xml b/core-java-lang/pom.xml index 2f307859f1..e1663c0df7 100644 --- a/core-java-lang/pom.xml +++ b/core-java-lang/pom.xml @@ -56,22 +56,11 @@ ${assertj-core.version} test - - org.springframework - spring-web - ${springframework.spring-web.version} - javax.mail mail ${javax.mail.version} - - nl.jqno.equalsverifier - equalsverifier - ${equalsverifier.version} - test - @@ -82,330 +71,8 @@ true - - - - org.apache.maven.plugins - maven-surefire-plugin - - - **/*LiveTest.java - **/*IntegrationTest.java - **/*IntTest.java - **/*LongRunningUnitTest.java - **/*ManualTest.java - - true - - - - - org.apache.maven.plugins - maven-dependency-plugin - - - copy-dependencies - prepare-package - - copy-dependencies - - - ${project.build.directory}/libs - - - - - - - org.apache.maven.plugins - maven-jar-plugin - ${maven-jar-plugin.version} - - - - true - libs/ - org.baeldung.executable.ExecutableMavenJar - - - - - - - org.apache.maven.plugins - maven-assembly-plugin - - - package - - single - - - ${project.basedir} - - - org.baeldung.executable.ExecutableMavenJar - - - - jar-with-dependencies - - - - - - - - org.apache.maven.plugins - maven-shade-plugin - ${maven-shade-plugin.version} - - - - shade - - - true - - - org.baeldung.executable.ExecutableMavenJar - - - - - - - - - com.jolira - onejar-maven-plugin - ${onejar-maven-plugin.version} - - - - org.baeldung.executable.ExecutableMavenJar - true - ${project.build.finalName}-onejar.${project.packaging} - - - one-jar - - - - - - - org.springframework.boot - spring-boot-maven-plugin - ${spring-boot-maven-plugin.version} - - - - repackage - - - spring-boot - org.baeldung.executable.ExecutableMavenJar - - - - - - - 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} - - 1.8 - 1.8 - - - - - - integration - - - - org.apache.maven.plugins - maven-surefire-plugin - - - integration-test - - test - - - - **/*ManualTest.java - - - **/*IntegrationTest.java - **/*IntTest.java - - - - - - - json - - - - - org.codehaus.mojo - exec-maven-plugin - ${exec-maven-plugin.version} - - - run-benchmarks - - none - - exec - - - test - java - - -classpath - - org.openjdk.jmh.Main - .* - - - - - - - - - - - - buildAgentLoader - - - - org.apache.maven.plugins - maven-jar-plugin - - - package - - jar - - - agentLoader - target/classes - - - true - - ${project.build.outputDirectory}/META-INF/MANIFEST.MF - - - - com/baeldung/instrumentation/application/AgentLoader.class - com/baeldung/instrumentation/application/Launcher.class - - - - - - - - - - buildApplication - - - - org.apache.maven.plugins - maven-jar-plugin - - - package - - jar - - - application - target/classes - - - true - - ${project.build.outputDirectory}/META-INF/MANIFEST.MF - - - - com/baeldung/instrumentation/application/MyAtm.class - com/baeldung/instrumentation/application/MyAtmApplication.class - com/baeldung/instrumentation/application/Launcher.class - - - - - - - - - - buildAgent - - - - org.apache.maven.plugins - maven-jar-plugin - - - package - - jar - - - agent - target/classes - - - true - - ${project.build.outputDirectory}/META-INF/MANIFEST.MF - - - - com/baeldung/instrumentation/agent/AtmTransformer.class - com/baeldung/instrumentation/agent/MyInstrumentationAgent.class - - - - - - - - - - @@ -420,17 +87,6 @@ 3.10.0 - - - 2.21.0 - 4.3.4.RELEASE - 3.0.0-M1 - 3.0.2 - 1.4.4 - 3.1.1 - 2.0.3.RELEASE - 1.6.0 - 3.0.3 diff --git a/pom.xml b/pom.xml index d3a665b4e1..f133f3b2be 100644 --- a/pom.xml +++ b/pom.xml @@ -382,6 +382,7 @@ core-java-concurrency-collections core-java-io core-java-lang + core-java-lang-oop core-java-networking core-java-sun core-scala @@ -1089,6 +1090,7 @@ core-java-concurrency-collections core-java-io core-java-lang + core-java-lang-oop core-java-networking core-java-sun core-scala From 12bf5e9f3bbb631dab6c7f84472f15f7e96d83e9 Mon Sep 17 00:00:00 2001 From: fanatixan Date: Sat, 22 Dec 2018 18:13:09 +0100 Subject: [PATCH 374/429] bael-2437 (#5972) --- .../dynamicobject/ProductJsonAnySetter.java | 39 +++++++++++ .../dynamicobject/ProductJsonNode.java | 35 ++++++++++ .../dynamicobject/ProductMap.java | 35 ++++++++++ .../DynamicObjectDeserializationUnitTest.java | 69 +++++++++++++++++++ .../deserialize-dynamic-object/embedded.json | 8 +++ .../deserialize-dynamic-object/flat.json | 6 ++ 6 files changed, 192 insertions(+) create mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java create mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonNode.java create mode 100644 jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductMap.java create mode 100644 jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java create mode 100644 jackson/src/test/resources/deserialize-dynamic-object/embedded.json create mode 100644 jackson/src/test/resources/deserialize-dynamic-object/flat.json diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java new file mode 100644 index 0000000000..13c21e37af --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonAnySetter.java @@ -0,0 +1,39 @@ +package com.baeldung.jackson.deserialization.dynamicobject; + +import java.util.LinkedHashMap; +import java.util.Map; + +import com.fasterxml.jackson.annotation.JsonAnySetter; + +public class ProductJsonAnySetter { + + private String name; + private String category; + private Map details = new LinkedHashMap<>(); + + 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 Map getDetails() { + return details; + } + + @JsonAnySetter + public void setDetail(String key, Object value) { + details.put(key, value); + } + +} diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonNode.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonNode.java new file mode 100644 index 0000000000..729d542df3 --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductJsonNode.java @@ -0,0 +1,35 @@ +package com.baeldung.jackson.deserialization.dynamicobject; + +import com.fasterxml.jackson.databind.JsonNode; + +public class ProductJsonNode { + + private String name; + private String category; + private JsonNode details; + + 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 JsonNode getDetails() { + return details; + } + + public void setDetails(JsonNode details) { + this.details = details; + } + +} diff --git a/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductMap.java b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductMap.java new file mode 100644 index 0000000000..65d225f49b --- /dev/null +++ b/jackson/src/main/java/com/baeldung/jackson/deserialization/dynamicobject/ProductMap.java @@ -0,0 +1,35 @@ +package com.baeldung.jackson.deserialization.dynamicobject; + +import java.util.Map; + +public class ProductMap { + + private String name; + private String category; + private Map details; + + 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 Map getDetails() { + return details; + } + + public void setDetails(Map details) { + this.details = details; + } + +} diff --git a/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java new file mode 100644 index 0000000000..d49677c1a2 --- /dev/null +++ b/jackson/src/test/java/com/baeldung/jackson/deserialization/dynamicobject/DynamicObjectDeserializationUnitTest.java @@ -0,0 +1,69 @@ +package com.baeldung.jackson.deserialization.dynamicobject; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.IOException; +import java.util.Scanner; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +public class DynamicObjectDeserializationUnitTest { + + private ObjectMapper objectMapper; + + @BeforeEach + void setup() { + objectMapper = new ObjectMapper(); + } + + private String readResource(String path) { + try (Scanner scanner = new Scanner(getClass().getResourceAsStream(path), "UTF-8")) { + return scanner.useDelimiter("\\A").next(); + } + } + + @Test + void givenJsonString_whenParsingToJsonNode_thenItMustContainDynamicProperties() throws JsonParseException, JsonMappingException, IOException { + // given + String json = readResource("/deserialize-dynamic-object/embedded.json"); + + // when + ProductJsonNode product = objectMapper.readValue(json, ProductJsonNode.class); + + // then + assertThat(product.getName()).isEqualTo("Pear yPhone 72"); + assertThat(product.getDetails().get("audioConnector").asText()).isEqualTo("none"); + } + + @Test + void givenJsonString_whenParsingToMap_thenItMustContainDynamicProperties() throws JsonParseException, JsonMappingException, IOException { + // given + String json = readResource("/deserialize-dynamic-object/embedded.json"); + + // when + ProductMap product = objectMapper.readValue(json, ProductMap.class); + + // then + assertThat(product.getName()).isEqualTo("Pear yPhone 72"); + assertThat(product.getDetails().get("audioConnector")).isEqualTo("none"); + } + + @Test + void givenJsonString_whenParsingWithJsonAnySetter_thenItMustContainDynamicProperties() throws JsonParseException, JsonMappingException, IOException { + // given + String json = readResource("/deserialize-dynamic-object/flat.json"); + + // when + ProductJsonAnySetter product = objectMapper.readValue(json, ProductJsonAnySetter.class); + + // then + assertThat(product.getName()).isEqualTo("Pear yPhone 72"); + assertThat(product.getDetails().get("audioConnector")).isEqualTo("none"); + } + +} diff --git a/jackson/src/test/resources/deserialize-dynamic-object/embedded.json b/jackson/src/test/resources/deserialize-dynamic-object/embedded.json new file mode 100644 index 0000000000..e4f11f7f1f --- /dev/null +++ b/jackson/src/test/resources/deserialize-dynamic-object/embedded.json @@ -0,0 +1,8 @@ +{ + "name": "Pear yPhone 72", + "category": "cellphone", + "details": { + "displayAspectRatio": "97:3", + "audioConnector": "none" + } +} \ No newline at end of file diff --git a/jackson/src/test/resources/deserialize-dynamic-object/flat.json b/jackson/src/test/resources/deserialize-dynamic-object/flat.json new file mode 100644 index 0000000000..799ea9339d --- /dev/null +++ b/jackson/src/test/resources/deserialize-dynamic-object/flat.json @@ -0,0 +1,6 @@ +{ + "name": "Pear yPhone 72", + "category": "cellphone", + "displayAspectRatio": "97:3", + "audioConnector": "none" +} \ No newline at end of file From e0d24b67802d516abcd476ee68107cc58674fab3 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Sat, 22 Dec 2018 11:40:24 -0600 Subject: [PATCH 375/429] BAEL-2363 BAEL-2337 BAEL-1996 BAEL-2277 Update README (#5973) * 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 --- algorithms-miscellaneous-1/README.md | 4 +++- jhipster/README.md | 1 + spring-5-reactive/README.md | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/algorithms-miscellaneous-1/README.md b/algorithms-miscellaneous-1/README.md index a04874c4d2..a725bbd141 100644 --- a/algorithms-miscellaneous-1/README.md +++ b/algorithms-miscellaneous-1/README.md @@ -10,4 +10,6 @@ - [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) \ No newline at end of file +- [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) \ No newline at end of file diff --git a/jhipster/README.md b/jhipster/README.md index f3655f8ec1..91ba54bf60 100644 --- a/jhipster/README.md +++ b/jhipster/README.md @@ -2,3 +2,4 @@ - [JHipster with a Microservice Architecture](http://www.baeldung.com/jhipster-microservices) - [Intro to JHipster](http://www.baeldung.com/jhipster) +- [Building a Basic UAA-Secured JHipster Microservice](https://www.baeldung.com/jhipster-uaa-secured-micro-service) diff --git a/spring-5-reactive/README.md b/spring-5-reactive/README.md index fc898a56dc..2a4ee017f4 100644 --- a/spring-5-reactive/README.md +++ b/spring-5-reactive/README.md @@ -17,4 +17,4 @@ The "REST With Spring" Classes: http://bit.ly/restwithspring - [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 0459f337cd5d1a97896c234300c6a7a3ed49a155 Mon Sep 17 00:00:00 2001 From: sandy03934 Date: Sun, 23 Dec 2018 01:04:29 +0530 Subject: [PATCH 376/429] Passing Parameters to a Thread Issue: BAEL-2417 --- .../parameter/AverageCalculator.java | 20 +++++++++ .../parameter/ParameterizedThreadExample.java | 32 ++++++++++++++ .../ParameterizedThreadUnitTest.java | 43 +++++++++++++++++++ 3 files changed, 95 insertions(+) create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java create mode 100644 core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java create mode 100644 core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java new file mode 100644 index 0000000000..a548b5d4a7 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java @@ -0,0 +1,20 @@ +package com.baeldung.concurrent.parameter; + +import java.util.concurrent.Callable; +import java.util.stream.IntStream; + +public class AverageCalculator implements Callable { + + int[] numbers; + + public AverageCalculator(int... parameter) { + this.numbers = parameter == null ? new int[0] : parameter; + } + + @Override + public Double call() throws Exception { + return IntStream.of(this.numbers) + .average() + .orElse(0d); + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java b/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java new file mode 100644 index 0000000000..73c61f3fb1 --- /dev/null +++ b/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java @@ -0,0 +1,32 @@ +package com.baeldung.concurrent.parameter; + +import java.util.concurrent.Callable; +import java.util.stream.IntStream; + +public class ParameterizedThreadExample { + + public static void parameterisedThreadAnonymousClass() { + final String parameter = "123"; + Thread parameterizedThread = new Thread(new Runnable() { + + @Override + public void run() { + System.out.println(Thread.currentThread() + .getName() + " : " + parameter); + } + }); + + parameterizedThread.start(); + } + + public static Callable sumCalculator(int... numbers) { + return () -> numbers != null ? IntStream.of(numbers) + .sum() : 0; + } + + public static Callable averageCalculator(int... numbers) { + return () -> numbers != null ? IntStream.of(numbers) + .average() + .orElse(0d) : 0d; + } +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java new file mode 100644 index 0000000000..21b374e609 --- /dev/null +++ b/core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.parameters; + +import com.baeldung.concurrent.parameter.AverageCalculator; +import org.junit.Test; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.stream.IntStream; + +import static org.junit.Assert.assertEquals; + +public class ParameterizedThreadUnitTest { + + @Test + public void whenSendingParameterToCallable_thenSuccessful() throws Exception { + ExecutorService executorService = Executors.newSingleThreadExecutor(); + Future result = executorService.submit(new AverageCalculator(1, 2, 3)); + try { + assertEquals(Double.valueOf(2.0), result.get()); + } finally { + executorService.shutdown(); + } + } + + @Test + public void whenParametersToThreadWithLamda_thenParametersPassedCorrectly() throws Exception { + ExecutorService executorService = Executors.newFixedThreadPool(2); + int[] numbers = new int[] { 4, 5, 6 }; + try { + Future sumResult = executorService.submit(() -> IntStream.of(numbers) + .sum()); + Future averageResult = executorService.submit(() -> IntStream.of(numbers) + .average() + .orElse(0d)); + assertEquals(Integer.valueOf(15), sumResult.get()); + assertEquals(Double.valueOf(5.0), averageResult.get()); + } finally { + executorService.shutdown(); + } + } + +} From be2e45b0a5429bb3670f103051523f3a2495e240 Mon Sep 17 00:00:00 2001 From: Josh Cummings Date: Sat, 22 Dec 2018 12:39:35 -0700 Subject: [PATCH 377/429] Two More Examples for Break and Continue (#5974) Issue: BAEL-2432 --- .../com/baeldung/controlstructures/Loops.java | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java index bb858ffe22..bc4515bfc7 100644 --- a/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java +++ b/core-java-lang/src/main/java/com/baeldung/controlstructures/Loops.java @@ -70,6 +70,40 @@ public class Loops { } } + /** + * Finds the index of {@code name} in a list + * @param name The name to look for + * @param names The list of names + * @return The index where the name was found or -1 otherwise + */ + public static int findFirstInstanceOfName(String name, String[] names) { + int index = 0; + for ( ; index < names.length; index++) { + if (names[index].equals(name)) { + break; + } + } + return index == names.length ? -1 : index; + } + + /** + * Takes several names and makes a list, skipping the specified {@code name}. + * + * @param name The name to skip + * @param names The list of names + * @return The list of names as a single string, missing the specified {@code name}. + */ + public static String makeListSkippingName(String name, String[] names) { + String list = ""; + for (int i = 0; i < names.length; i++) { + if (names[i].equals(name)) { + continue; + } + list += names[i]; + } + return list; + } + /** * Prints an specified amount of even numbers. Shows usage of both {@code break} and {@code continue} branching statements. * @param amountToPrint Amount of even numbers to print. From bba9a99f3231cec6e31e07cd1b7366bac8bcfdf2 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 23 Dec 2018 01:15:24 +0530 Subject: [PATCH 378/429] [BAEL-10836] - Create core-java-collections-list module --- core-java-collections-list/README.md | 28 +++++++++++ core-java-collections-list/pom.xml | 48 +++++++++++++++++++ .../ClassCastException.java | 0 .../com/baeldung/findanelement/Customer.java | 0 .../FindACustomerInGivenList.java | 0 .../baeldung/java/list/CopyListService.java | 0 .../com/baeldung/java/list/CustomList.java | 0 .../java/com/baeldung/java/list/Flower.java | 0 .../baeldung/java/list/ReverseIterator.java | 0 .../com/baeldung/java/list/WaysToIterate.java | 0 .../com/baeldung/java_8_features/Car.java | 0 .../com/baeldung/java_8_features/Person.java | 0 .../com/baeldung/list/listoflist/Pen.java | 0 .../com/baeldung/list/listoflist/Pencil.java | 0 .../com/baeldung/list/listoflist/Rubber.java | 0 .../baeldung/list/listoflist/Stationery.java | 0 .../ArrayListOfArrayList.java | 0 .../ThreeDimensionalArrayList.java | 0 .../baeldung/list/removeall/RemoveAll.java | 0 .../src/main/resources/logback.xml | 13 +++++ .../converter/ArrayConvertToListUnitTest.java | 0 .../collection/ClearVsRemoveAllUnitTest.java | 0 .../baeldung/collection/CollectionsEmpty.java | 0 .../FindItemsBasedOnOtherStreamUnitTest.java | 0 .../FindACustomerInGivenListUnitTest.java | 0 .../java/list/CopyListServiceUnitTest.java | 0 .../java/list/CustomListUnitTest.java | 0 .../java/list/ReverseIteratorUnitTest.java | 0 .../java/list/WaysToIterateUnitTest.java | 0 .../ListInitializationUnitTest.java | 0 .../baeldung/java8/Java8MaxMinUnitTest.java | 0 .../FlattenNestedListUnitTest.java | 0 .../listoflist/AddElementsToListUnitTest.java | 0 .../list/listoflist/ListOfListsUnitTest.java | 0 .../list/removeall/RemoveAllUnitTest.java | 0 .../RemoveFirstElementUnitTest.java | 0 .../baeldung/RandomListElementUnitTest.java | 2 +- .../java/collections/ArrayListUnitTest.java | 0 .../CoreJavaCollectionsUnitTest.java | 0 .../JavaCollectionCleanupUnitTest.java | 0 .../java/lists/ListAssertJUnitTest.java | 0 .../baeldung/java/lists/ListJUnitTest.java | 0 .../java/lists/ListTestNgUnitTest.java | 0 .../java/org/baeldung/java/lists/README.md | 0 core-java-collections/README.md | 25 +--------- pom.xml | 2 + 46 files changed, 93 insertions(+), 25 deletions(-) create mode 100644 core-java-collections-list/README.md create mode 100644 core-java-collections-list/pom.xml rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/classcastexception/ClassCastException.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/findanelement/Customer.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/CopyListService.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/CustomList.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/Flower.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/ReverseIterator.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java/list/WaysToIterate.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java_8_features/Car.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/java_8_features/Person.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/listoflist/Pen.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/listoflist/Pencil.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/listoflist/Rubber.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/listoflist/Stationery.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java (100%) rename {core-java-collections => core-java-collections-list}/src/main/java/com/baeldung/list/removeall/RemoveAll.java (100%) create mode 100644 core-java-collections-list/src/main/resources/logback.xml rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/collection/CollectionsEmpty.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/list/CustomListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java (100%) rename {core-java/src/test/java/com => core-java-collections-list/src/test/java/org}/baeldung/RandomListElementUnitTest.java (98%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/lists/ListJUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java (100%) rename {core-java-collections => core-java-collections-list}/src/test/java/org/baeldung/java/lists/README.md (100%) diff --git a/core-java-collections-list/README.md b/core-java-collections-list/README.md new file mode 100644 index 0000000000..cb6999277c --- /dev/null +++ b/core-java-collections-list/README.md @@ -0,0 +1,28 @@ +========= + +## Core Java Collections List Cookbooks and Examples + +### Relevant Articles: +- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list) +- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist) +- [Random List Element](http://www.baeldung.com/java-random-list-element) +- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list) +- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list) +- [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list) +- [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards) +- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list) +- [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) +- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist) +- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) +- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items) +- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist) +- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception) +- [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) +- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist) +- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) \ No newline at end of file diff --git a/core-java-collections-list/pom.xml b/core-java-collections-list/pom.xml new file mode 100644 index 0000000000..ee99e470d0 --- /dev/null +++ b/core-java-collections-list/pom.xml @@ -0,0 +1,48 @@ + + 4.0.0 + core-java-collections-list + 0.1.0-SNAPSHOT + jar + core-java-collections-list + + + 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 + + + + + 4.1 + 3.8.1 + 1.7.0 + 3.11.1 + 1.16.12 + + diff --git a/core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java b/core-java-collections-list/src/main/java/com/baeldung/classcastexception/ClassCastException.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/classcastexception/ClassCastException.java rename to core-java-collections-list/src/main/java/com/baeldung/classcastexception/ClassCastException.java diff --git a/core-java-collections/src/main/java/com/baeldung/findanelement/Customer.java b/core-java-collections-list/src/main/java/com/baeldung/findanelement/Customer.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/findanelement/Customer.java rename to core-java-collections-list/src/main/java/com/baeldung/findanelement/Customer.java diff --git a/core-java-collections/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java b/core-java-collections-list/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java rename to core-java-collections-list/src/main/java/com/baeldung/findanelement/FindACustomerInGivenList.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/CopyListService.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/CopyListService.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/CopyListService.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/CustomList.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/CustomList.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/CustomList.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/CustomList.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/Flower.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/Flower.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/Flower.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/ReverseIterator.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/ReverseIterator.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/ReverseIterator.java diff --git a/core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java b/core-java-collections-list/src/main/java/com/baeldung/java/list/WaysToIterate.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java/list/WaysToIterate.java rename to core-java-collections-list/src/main/java/com/baeldung/java/list/WaysToIterate.java diff --git a/core-java-collections/src/main/java/com/baeldung/java_8_features/Car.java b/core-java-collections-list/src/main/java/com/baeldung/java_8_features/Car.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java_8_features/Car.java rename to core-java-collections-list/src/main/java/com/baeldung/java_8_features/Car.java diff --git a/core-java-collections/src/main/java/com/baeldung/java_8_features/Person.java b/core-java-collections-list/src/main/java/com/baeldung/java_8_features/Person.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/java_8_features/Person.java rename to core-java-collections-list/src/main/java/com/baeldung/java_8_features/Person.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Pen.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pen.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Pen.java rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pen.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Pencil.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pencil.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Pencil.java rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Pencil.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Rubber.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Rubber.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Rubber.java rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Rubber.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/listoflist/Stationery.java b/core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Stationery.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/listoflist/Stationery.java rename to core-java-collections-list/src/main/java/com/baeldung/list/listoflist/Stationery.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java rename to core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java rename to core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ThreeDimensionalArrayList.java diff --git a/core-java-collections/src/main/java/com/baeldung/list/removeall/RemoveAll.java b/core-java-collections-list/src/main/java/com/baeldung/list/removeall/RemoveAll.java similarity index 100% rename from core-java-collections/src/main/java/com/baeldung/list/removeall/RemoveAll.java rename to core-java-collections-list/src/main/java/com/baeldung/list/removeall/RemoveAll.java diff --git a/core-java-collections-list/src/main/resources/logback.xml b/core-java-collections-list/src/main/resources/logback.xml new file mode 100644 index 0000000000..7d900d8ea8 --- /dev/null +++ b/core-java-collections-list/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-collections/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/array/converter/ArrayConvertToListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/collection/ClearVsRemoveAllUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/collection/CollectionsEmpty.java b/core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/collection/CollectionsEmpty.java rename to core-java-collections-list/src/test/java/com/baeldung/collection/CollectionsEmpty.java diff --git a/core-java-collections/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/findItems/FindItemsBasedOnOtherStreamUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/findanelement/FindACustomerInGivenListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/list/CopyListServiceUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/CustomListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/CustomListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/list/CustomListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/list/CustomListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/list/ReverseIteratorUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/list/WaysToIterateUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java/listInitialization/ListInitializationUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java8/Java8MaxMinUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/flattennestedlist/FlattenNestedListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/listoflist/AddElementsToListUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/listoflist/ListOfListsUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/removeall/RemoveAllUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/removefirst/RemoveFirstElementUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/RandomListElementUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/RandomListElementUnitTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/RandomListElementUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/RandomListElementUnitTest.java index 6ae7c40f4d..4f5ba0f82f 100644 --- a/core-java/src/test/java/com/baeldung/RandomListElementUnitTest.java +++ b/core-java-collections-list/src/test/java/org/baeldung/RandomListElementUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung; +package org.baeldung; import com.google.common.collect.Lists; import org.junit.Test; diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/collections/ArrayListUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/collections/CoreJavaCollectionsUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/collections/JavaCollectionCleanupUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/ListAssertJUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListJUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/lists/ListJUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/ListJUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java b/core-java-collections-list/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/ListTestNgUnitTest.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/lists/README.md b/core-java-collections-list/src/test/java/org/baeldung/java/lists/README.md similarity index 100% rename from core-java-collections/src/test/java/org/baeldung/java/lists/README.md rename to core-java-collections-list/src/test/java/org/baeldung/java/lists/README.md diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 4c0b24cd5d..15be81156c 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -3,36 +3,21 @@ ## Core Java Collections Cookbooks and Examples ### Relevant Articles: -- [Immutable ArrayList in Java](http://www.baeldung.com/java-immutable-list) -- [Guide to the Java ArrayList](http://www.baeldung.com/java-arraylist) -- [Random List Element](http://www.baeldung.com/java-random-list-element) - [Java - Combine Multiple Collections](http://www.baeldung.com/java-combine-multiple-collections) -- [Removing all nulls from a List in Java](http://www.baeldung.com/java-remove-nulls-from-list) -- [Removing all duplicates from a List in Java](http://www.baeldung.com/java-remove-duplicates-from-list) -- [Flattening Nested Collections in Java](http://www.baeldung.com/java-flatten-nested-collections) - [HashSet and TreeSet Comparison](http://www.baeldung.com/java-hashset-vs-treeset) - [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) - [A Guide to HashSet in Java](http://www.baeldung.com/java-hashset) - [A Guide to TreeSet in Java](http://www.baeldung.com/java-tree-set) -- [How to TDD a List Implementation in Java](http://www.baeldung.com/java-test-driven-list) - [Getting the Size of an Iterable in Java](http://www.baeldung.com/java-iterable-size) -- [Iterating Backward Through a List](http://www.baeldung.com/java-list-iterate-backwards) - [How to Filter a Collection in Java](http://www.baeldung.com/java-collection-filtering) -- [Add Multiple Items to an Java ArrayList](http://www.baeldung.com/java-add-items-array-list) -- [Remove the First Element from a List](http://www.baeldung.com/java-remove-first-element-from-list) - [Initializing HashSet at the Time of Construction](http://www.baeldung.com/java-initialize-hashset) - [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) -- [How to Find an Element in a List with Java](http://www.baeldung.com/find-list-element-java) - [An Introduction to Java.util.Hashtable Class](http://www.baeldung.com/java-hash-table) -- [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) - [Java Null-Safe Streams from Collections](https://www.baeldung.com/java-null-safe-streams-from-collections) -- [Remove All Occurrences of a Specific Value from a List](https://www.baeldung.com/java-remove-value-from-list) - [Thread Safe LIFO Data Structure Implementations](https://www.baeldung.com/java-lifo-thread-safe) -- [Collections.emptyList() vs. New List Instance](https://www.baeldung.com/java-collections-emptylist-new-list) - [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) @@ -40,15 +25,7 @@ - [An Introduction to Synchronized Java Collections](https://www.baeldung.com/java-synchronized-collections) - [Guide to EnumSet](https://www.baeldung.com/java-enumset) - [Removing Elements from Java Collections](https://www.baeldung.com/java-collection-remove-elements) -- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist) -- [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items) - [Combining Different Types of Collections in Java](https://www.baeldung.com/java-combine-collections) - [Sorting in Java](http://www.baeldung.com/java-sorting) -- [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist) -- [Java List UnsupportedOperationException](http://www.baeldung.com/java-list-unsupported-operation-exception) - [Join and Split Arrays and Collections in Java](http://www.baeldung.com/java-join-and-split) -- [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) -- [Java List Initialization in One Line](https://www.baeldung.com/java-init-list-one-line) -- [ClassCastException: Arrays$ArrayList cannot be cast to ArrayList](https://www.baeldung.com/java-classcastexception-arrays-arraylist) -- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) -- [Ways to Iterate Over a List in Java](https://www.baeldung.com/java-iterate-list) +- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) \ No newline at end of file diff --git a/pom.xml b/pom.xml index d3a665b4e1..03cc78c9a9 100644 --- a/pom.xml +++ b/pom.xml @@ -379,6 +379,7 @@ core-java-arrays core-java-collections + core-java-collections-list core-java-concurrency-collections core-java-io core-java-lang @@ -1086,6 +1087,7 @@ core-java-arrays core-java-collections + core-java-collections-list core-java-concurrency-collections core-java-io core-java-lang From e8b07fea1dc1b44fcb904c3d0d33ae27ffd4ecd3 Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Sun, 23 Dec 2018 12:05:51 +0530 Subject: [PATCH 379/429] unit tests for nest based access control --- .../src/main/java/com/baeldung/Outer.java | 24 +++++++++ .../test/java/com/baeldung/OuterUnitTest.java | 50 +++++++++++++++++++ 2 files changed, 74 insertions(+) create mode 100644 core-java-11/src/main/java/com/baeldung/Outer.java create mode 100644 core-java-11/src/test/java/com/baeldung/OuterUnitTest.java diff --git a/core-java-11/src/main/java/com/baeldung/Outer.java b/core-java-11/src/main/java/com/baeldung/Outer.java new file mode 100644 index 0000000000..e2f1479ab1 --- /dev/null +++ b/core-java-11/src/main/java/com/baeldung/Outer.java @@ -0,0 +1,24 @@ +package com.baeldung; + +import java.lang.reflect.Method; + +public class Outer { + + public void outerPublic() { + } + + private void outerPrivate() { + } + + class Inner { + + public void innerPublic() { + outerPrivate(); + } + + public void innerPublicReflection(Outer ob) throws Exception { + Method method = ob.getClass().getDeclaredMethod("outerPrivate"); + method.invoke(ob); + } + } +} \ No newline at end of file diff --git a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java new file mode 100644 index 0000000000..a954416f68 --- /dev/null +++ b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java @@ -0,0 +1,50 @@ +package com.baeldung; + +import static org.hamcrest.CoreMatchers.is; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.Test; + +public class OuterUnitTest { + + private static final String NEST_HOST_NAME = "com.baeldung.Outer"; + + @Test + public void whenGetNestHostFromOuter_thenGetNestHost() { + is(Outer.class.getNestHost().getName()).equals(NEST_HOST_NAME); + } + + @Test + public void whenGetNestHostFromInner_thenGetNestHost() { + is(Outer.Inner.class.getNestHost().getName()).equals(NEST_HOST_NAME); + } + + @Test + public void whenCheckNestmatesForNestedClasses_thenGetTrue() { + is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(true); + } + + @Test + public void whenCheckNestmatesForUnrelatedClasses_thenGetFalse() { + is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(false); + } + + @Test + public void whenGetNestMembersForNestedClasses_thenGetAllNestedClasses() { + List nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) + .map(Class::getName) + .collect(Collectors.toList()); + + is(nestMembers.size()).equals(2); + + boolean containsOuter = nestMembers.stream() + .anyMatch("com.baeldung.Outer"::equals); + is(containsOuter).equals(true); + + boolean containsInner = nestMembers.stream() + .anyMatch("com.baeldung.Outer$Inner"::equals); + is(containsInner).equals(true); + } +} \ No newline at end of file From 338b0bc80cf15eb20e9f9201e8efafc3d2a65eab Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Sun, 23 Dec 2018 12:08:36 +0530 Subject: [PATCH 380/429] format --- .../src/main/java/com/baeldung/Outer.java | 30 +++++----- .../test/java/com/baeldung/OuterUnitTest.java | 60 +++++++++---------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/core-java-11/src/main/java/com/baeldung/Outer.java b/core-java-11/src/main/java/com/baeldung/Outer.java index e2f1479ab1..1d3cd72b44 100644 --- a/core-java-11/src/main/java/com/baeldung/Outer.java +++ b/core-java-11/src/main/java/com/baeldung/Outer.java @@ -4,21 +4,21 @@ import java.lang.reflect.Method; public class Outer { - public void outerPublic() { - } - - private void outerPrivate() { - } - - class Inner { - - public void innerPublic() { - outerPrivate(); + public void outerPublic() { } - public void innerPublicReflection(Outer ob) throws Exception { - Method method = ob.getClass().getDeclaredMethod("outerPrivate"); - method.invoke(ob); - } - } + private void outerPrivate() { + } + + class Inner { + + public void innerPublic() { + outerPrivate(); + } + + public void innerPublicReflection(Outer ob) throws Exception { + Method method = ob.getClass().getDeclaredMethod("outerPrivate"); + method.invoke(ob); + } + } } \ No newline at end of file diff --git a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java index a954416f68..6680a8d518 100644 --- a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java +++ b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java @@ -9,42 +9,42 @@ import org.junit.Test; public class OuterUnitTest { - private static final String NEST_HOST_NAME = "com.baeldung.Outer"; + private static final String NEST_HOST_NAME = "com.baeldung.Outer"; - @Test - public void whenGetNestHostFromOuter_thenGetNestHost() { - is(Outer.class.getNestHost().getName()).equals(NEST_HOST_NAME); - } + @Test + public void whenGetNestHostFromOuter_thenGetNestHost() { + is(Outer.class.getNestHost().getName()).equals(NEST_HOST_NAME); + } - @Test - public void whenGetNestHostFromInner_thenGetNestHost() { - is(Outer.Inner.class.getNestHost().getName()).equals(NEST_HOST_NAME); - } + @Test + public void whenGetNestHostFromInner_thenGetNestHost() { + is(Outer.Inner.class.getNestHost().getName()).equals(NEST_HOST_NAME); + } - @Test - public void whenCheckNestmatesForNestedClasses_thenGetTrue() { - is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(true); - } + @Test + public void whenCheckNestmatesForNestedClasses_thenGetTrue() { + is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(true); + } - @Test - public void whenCheckNestmatesForUnrelatedClasses_thenGetFalse() { - is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(false); - } + @Test + public void whenCheckNestmatesForUnrelatedClasses_thenGetFalse() { + is(Outer.Inner.class.isNestmateOf(Outer.class)).equals(false); + } - @Test - public void whenGetNestMembersForNestedClasses_thenGetAllNestedClasses() { - List nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) - .map(Class::getName) - .collect(Collectors.toList()); + @Test + public void whenGetNestMembersForNestedClasses_thenGetAllNestedClasses() { + List nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) + .map(Class::getName) + .collect(Collectors.toList()); - is(nestMembers.size()).equals(2); + is(nestMembers.size()).equals(2); - boolean containsOuter = nestMembers.stream() - .anyMatch("com.baeldung.Outer"::equals); - is(containsOuter).equals(true); + boolean containsOuter = nestMembers.stream() + .anyMatch("com.baeldung.Outer"::equals); + is(containsOuter).equals(true); - boolean containsInner = nestMembers.stream() - .anyMatch("com.baeldung.Outer$Inner"::equals); - is(containsInner).equals(true); - } + boolean containsInner = nestMembers.stream() + .anyMatch("com.baeldung.Outer$Inner"::equals); + is(containsInner).equals(true); + } } \ No newline at end of file From ec53cb77ac9f342c71b495999c817116038a406f Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 23 Dec 2018 16:32:19 +0530 Subject: [PATCH 381/429] [BAEL-9044] - Moved articles out of core-java --- core-java-concurrency/README.md | 3 +++ core-java-concurrency/pom.xml | 12 ++++++++++++ .../forkjoin/CustomRecursiveAction.java | 0 .../forkjoin/CustomRecursiveTask.java | 0 .../com/baeldung/forkjoin/util/PoolUtil.java | 0 .../ThreadLocalRandomBenchMarkRunner.java | 0 .../ThreadLocalRandomBenchMarker.java | 0 .../java8/Java8ForkJoinIntegrationTest.java | 0 .../thread/join/ThreadJoinUnitTest.java | 0 .../ThreadLocalRandomIntegrationTest.java | 0 core-java-networking/README.md | 4 ++++ core-java-networking/pom.xml | 12 ++++++++++++ .../baeldung/console/ConsoleConsoleClass.java | 0 .../baeldung/console/ConsoleScannerClass.java | 0 .../java/com/baeldung/mail/EmailService.java | 0 .../java/com/baeldung/networking/README.md | 0 .../cookies/PersistentCookieStore.java | 0 .../cookies/ProxyAcceptCookiePolicy.java | 0 .../baeldung/networking/udp/EchoClient.java | 0 .../baeldung/networking/udp/EchoServer.java | 0 .../udp/broadcast/BroadcastingClient.java | 0 .../udp/broadcast/BroadcastingEchoServer.java | 0 .../udp/multicast/MulticastEchoServer.java | 0 .../udp/multicast/MulticastingClient.java | 0 .../src/main/resources/logback.xml | 19 +++++++++++++++++++ .../baeldung/networking/udp/UDPLiveTest.java | 0 .../udp/broadcast/BroadcastLiveTest.java | 0 .../udp/multicast/MulticastLiveTest.java | 0 core-java/README.md | 14 -------------- core-java/pom.xml | 6 ------ patterns/README.md | 8 +++++++- .../application/Application.java | 0 .../entities/User.java | 0 .../UserUnitTest.java | 0 34 files changed, 57 insertions(+), 21 deletions(-) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java (100%) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java (100%) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java (100%) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java (100%) rename {core-java => core-java-concurrency}/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java (100%) rename {core-java => core-java-concurrency}/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java (100%) rename {core-java => core-java-concurrency}/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java (100%) rename {core-java => core-java-concurrency}/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/console/ConsoleConsoleClass.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/console/ConsoleScannerClass.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/mail/EmailService.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/README.md (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/EchoClient.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/EchoServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java (100%) create mode 100644 core-java-networking/src/main/resources/logback.xml rename {core-java => core-java-networking}/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java (100%) rename {core-java => patterns/design-patterns}/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java (100%) rename {core-java => patterns/design-patterns}/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java (100%) rename {core-java => patterns/design-patterns}/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java (100%) diff --git a/core-java-concurrency/README.md b/core-java-concurrency/README.md index 2db7b91cde..e8693a0231 100644 --- a/core-java-concurrency/README.md +++ b/core-java-concurrency/README.md @@ -31,3 +31,6 @@ - [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield) - [Print Even and Odd Numbers Using 2 Threads](https://www.baeldung.com/java-even-odd-numbers-with-2-threads) - [Java CyclicBarrier vs CountDownLatch](https://www.baeldung.com/java-cyclicbarrier-countdownlatch) +- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join) +- [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random) +- [The Thread.join() Method in Java](http://www.baeldung.com/java-thread-join) \ No newline at end of file diff --git a/core-java-concurrency/pom.xml b/core-java-concurrency/pom.xml index bd22253c2c..5dde4d5820 100644 --- a/core-java-concurrency/pom.xml +++ b/core-java-concurrency/pom.xml @@ -47,6 +47,16 @@ ${avaitility.version} test + + org.openjdk.jmh + jmh-core + ${jmh-core.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh-generator-annprocess.version} + @@ -69,6 +79,8 @@ 3.6.1 1.7.0 + 1.19 + 1.19 diff --git a/core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java b/core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java similarity index 100% rename from core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java rename to core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java diff --git a/core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java b/core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java similarity index 100% rename from core-java/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java rename to core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java diff --git a/core-java/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java b/core-java-concurrency/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java similarity index 100% rename from core-java/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java rename to core-java-concurrency/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java b/core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java similarity index 100% rename from core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java rename to core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java diff --git a/core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java b/core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java similarity index 100% rename from core-java/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java rename to core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java diff --git a/core-java/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java rename to core-java-concurrency/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java b/core-java-concurrency/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java rename to core-java-concurrency/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java b/core-java-concurrency/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java rename to core-java-concurrency/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java diff --git a/core-java-networking/README.md b/core-java-networking/README.md index 626ea794e6..2cb2c52d3d 100644 --- a/core-java-networking/README.md +++ b/core-java-networking/README.md @@ -5,3 +5,7 @@ ### Relevant Articles - [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) +- [Console I/O in Java](http://www.baeldung.com/java-console-input-output) \ No newline at end of file diff --git a/core-java-networking/pom.xml b/core-java-networking/pom.xml index 178295e1ec..7d7bf4bc95 100644 --- a/core-java-networking/pom.xml +++ b/core-java-networking/pom.xml @@ -13,7 +13,19 @@ ../parent-java + + + javax.mail + mail + ${javax.mail.version} + + + core-java-networking + + + 1.5.0-b01 + diff --git a/core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java b/core-java-networking/src/main/java/com/baeldung/console/ConsoleConsoleClass.java similarity index 100% rename from core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java rename to core-java-networking/src/main/java/com/baeldung/console/ConsoleConsoleClass.java diff --git a/core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java b/core-java-networking/src/main/java/com/baeldung/console/ConsoleScannerClass.java similarity index 100% rename from core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java rename to core-java-networking/src/main/java/com/baeldung/console/ConsoleScannerClass.java diff --git a/core-java/src/main/java/com/baeldung/mail/EmailService.java b/core-java-networking/src/main/java/com/baeldung/mail/EmailService.java similarity index 100% rename from core-java/src/main/java/com/baeldung/mail/EmailService.java rename to core-java-networking/src/main/java/com/baeldung/mail/EmailService.java diff --git a/core-java/src/main/java/com/baeldung/networking/README.md b/core-java-networking/src/main/java/com/baeldung/networking/README.md similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/README.md rename to core-java-networking/src/main/java/com/baeldung/networking/README.md diff --git a/core-java/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java b/core-java-networking/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java rename to core-java-networking/src/main/java/com/baeldung/networking/cookies/PersistentCookieStore.java diff --git a/core-java/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java b/core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java rename to core-java-networking/src/main/java/com/baeldung/networking/cookies/ProxyAcceptCookiePolicy.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/EchoClient.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/EchoClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/EchoClient.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/EchoClient.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/EchoServer.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/EchoServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/EchoServer.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/EchoServer.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingClient.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/broadcast/BroadcastingEchoServer.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastEchoServer.java diff --git a/core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java b/core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java rename to core-java-networking/src/main/java/com/baeldung/networking/udp/multicast/MulticastingClient.java diff --git a/core-java-networking/src/main/resources/logback.xml b/core-java-networking/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-networking/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/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/udp/UDPLiveTest.java diff --git a/core-java/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/udp/broadcast/BroadcastLiveTest.java diff --git a/core-java/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/udp/multicast/MulticastLiveTest.java diff --git a/core-java/README.md b/core-java/README.md index 4fbc8bbc6e..961ca45cce 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -7,7 +7,6 @@ - [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java) - [MD5 Hashing in Java](http://www.baeldung.com/java-md5) - [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets) -- [Guide to the Fork/Join Framework in Java](http://www.baeldung.com/java-fork-join) - [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) @@ -27,13 +26,11 @@ - [Guide to UUID in Java](http://www.baeldung.com/java-uuid) - [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char) - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) -- [Broadcasting and Multicasting in Java](http://www.baeldung.com/java-broadcast-multicast) - [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) - [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) - [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) -- [A Guide to ThreadLocalRandom in Java](http://www.baeldung.com/java-thread-local-random) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) @@ -42,31 +39,20 @@ - [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os) - [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java) - [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid) -- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) - [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle) - [Class Loaders in Java](http://www.baeldung.com/java-classloaders) -- [Sending Emails with Java](http://www.baeldung.com/java-email) - [Introduction to SSL in Java](http://www.baeldung.com/java-ssl) - [Java KeyStore API](http://www.baeldung.com/java-keystore) - [Double-Checked Locking with Singleton](http://www.baeldung.com/java-singleton-double-checked-locking) - [Guide to Java Clock Class](http://www.baeldung.com/java-clock) -- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) -- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns) -- [Singletons in Java](http://www.baeldung.com/java-singleton) -- [Flyweight Pattern in Java](http://www.baeldung.com/java-flyweight) -- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern) -- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern) -- [The Thread.join() Method in Java](http://www.baeldung.com/java-thread-join) - [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class) - [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension) -- [Console I/O in Java](http://www.baeldung.com/java-console-input-output) - [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler) - [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream) - [How to Get the Size of an Object in Java](http://www.baeldung.com/java-size-of-object) - [Guide to Java Instrumentation](http://www.baeldung.com/java-instrumentation) - [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type) - [Common Java Exceptions](http://www.baeldung.com/java-common-exceptions) -- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) - [Throw Exception in Optional in Java 8](https://www.baeldung.com/java-optional-throw-exception) - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) - [Calculating the nth Root in Java](https://www.baeldung.com/java-nth-root) diff --git a/core-java/pom.xml b/core-java/pom.xml index 64345ab14c..e5786f65c3 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -131,11 +131,6 @@ h2 ${h2database.version} - - javax.mail - mail - ${javax.mail.version} - org.apache.tika @@ -514,7 +509,6 @@ 1.19 3.0.0-M1 - 1.5.0-b01 3.0.2 1.4.4 3.1.1 diff --git a/patterns/README.md b/patterns/README.md index 221cba6456..9653558f43 100644 --- a/patterns/README.md +++ b/patterns/README.md @@ -5,4 +5,10 @@ - [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) - [The DAO Pattern in Java](http://www.baeldung.com/java-dao-pattern) - +- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) +- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns) +- [Singletons in Java](http://www.baeldung.com/java-singleton) +- [Flyweight Pattern in Java](http://www.baeldung.com/java-flyweight) +- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern) +- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern) +- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java b/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java similarity index 100% rename from core-java/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java rename to patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/application/Application.java diff --git a/core-java/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java b/patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java similarity index 100% rename from core-java/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java rename to patterns/design-patterns/src/main/java/com/baeldung/constructorsstaticfactorymethods/entities/User.java diff --git a/core-java/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java b/patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java rename to patterns/design-patterns/src/test/java/com/baeldung/constructorsstaticfactorymethods/UserUnitTest.java From 5deb87325bdbf3e330d38efbc6802b86b72b9b2f Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 23 Dec 2018 16:59:32 +0530 Subject: [PATCH 382/429] [BAEL-10985] - Removed vavr-validation submodule --- .../baeldung/vavrvalidation/application/Application.java | 6 +++--- .../main/java/com/baeldung/vavrvalidation/model/User.java | 0 .../baeldung/vavrvalidation/validator/UserValidator.java | 0 .../vavrvalidation/validator/UserValidatorUnitTest.java} | 2 +- .../vavrvalidation/validator/ValidationUnitTest.java} | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) rename vavr/{vavr-validation => }/src/main/java/com/baeldung/vavrvalidation/application/Application.java (95%) rename vavr/{vavr-validation => }/src/main/java/com/baeldung/vavrvalidation/model/User.java (100%) rename vavr/{vavr-validation => }/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java (100%) rename vavr/{vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorTest.java => src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorUnitTest.java} (95%) rename vavr/{vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/ValidationTest.java => src/test/java/com/baeldung/vavrvalidation/validator/ValidationUnitTest.java} (98%) diff --git a/vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/application/Application.java b/vavr/src/main/java/com/baeldung/vavrvalidation/application/Application.java similarity index 95% rename from vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/application/Application.java rename to vavr/src/main/java/com/baeldung/vavrvalidation/application/Application.java index 8acc4522af..a23ed185c8 100644 --- a/vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/application/Application.java +++ b/vavr/src/main/java/com/baeldung/vavrvalidation/application/Application.java @@ -8,10 +8,10 @@ import io.vavr.control.Validation; public class Application { public static void main(String[] args) { - + UserValidator userValidator = new UserValidator(); Validation, User> validation = userValidator.validateUser("John", "john@domain.com"); - + // process validation results here - } + } } diff --git a/vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/model/User.java b/vavr/src/main/java/com/baeldung/vavrvalidation/model/User.java similarity index 100% rename from vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/model/User.java rename to vavr/src/main/java/com/baeldung/vavrvalidation/model/User.java diff --git a/vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java b/vavr/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java similarity index 100% rename from vavr/vavr-validation/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java rename to vavr/src/main/java/com/baeldung/vavrvalidation/validator/UserValidator.java diff --git a/vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorTest.java b/vavr/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorUnitTest.java similarity index 95% rename from vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorTest.java rename to vavr/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorUnitTest.java index cb9557fa53..8ac6100b27 100644 --- a/vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorTest.java +++ b/vavr/src/test/java/com/baeldung/vavrvalidation/validator/UserValidatorUnitTest.java @@ -7,7 +7,7 @@ import com.baeldung.vavrvalidation.validator.UserValidator; import io.vavr.control.Validation.Invalid; import io.vavr.control.Validation.Valid; -public class UserValidatorTest { +public class UserValidatorUnitTest { @Test public void givenValidUserParams_whenValidated_thenInstanceOfValid() { diff --git a/vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/ValidationTest.java b/vavr/src/test/java/com/baeldung/vavrvalidation/validator/ValidationUnitTest.java similarity index 98% rename from vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/ValidationTest.java rename to vavr/src/test/java/com/baeldung/vavrvalidation/validator/ValidationUnitTest.java index c89b43b5e3..7b8c551aeb 100644 --- a/vavr/vavr-validation/src/test/java/com/baeldung/vavrvalidation/validator/ValidationTest.java +++ b/vavr/src/test/java/com/baeldung/vavrvalidation/validator/ValidationUnitTest.java @@ -11,7 +11,7 @@ import io.vavr.control.Either.Right; import io.vavr.control.Validation.Invalid; import io.vavr.control.Validation.Valid; -public class ValidationTest { +public class ValidationUnitTest { private static UserValidator userValidator; From fda7ff2690dc19b616e3a2e7ff1291d447321491 Mon Sep 17 00:00:00 2001 From: Shashank agarwal Date: Sun, 23 Dec 2018 20:57:01 +0530 Subject: [PATCH 383/429] Added Character Array method (#5965) * Added the code of Replace char in a string at specific index * added test cases * Renamed the Test class name end with UnitTest * Renamed the Test class name end with UnitTest * Renamed the Test class name end with UnitTest * Replaced README with the upstream repo * Added Char Array Method --- .../string/ReplaceCharacterInString.java | 14 +++++++++++--- .../string/ReplaceCharInStringUnitTest.java | 18 ++++++++++++------ 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java b/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java index e8d1ce2d8b..2cc67f0b51 100644 --- a/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java +++ b/java-strings/src/main/java/com/baeldung/string/ReplaceCharacterInString.java @@ -1,12 +1,20 @@ package com.baeldung.string; public class ReplaceCharacterInString { - public String replaceCharSubstring(String str, char ch, int index) { - String myString = str.substring(0, index) + ch + str.substring(index+1); + + public String replaceCharSubstring(String str, char ch, int index) { + String myString = str.substring(0, index) + ch + str.substring(index + 1); return myString; } - public String replaceCharStringBuilder(String str, char ch, int index) { + public String replaceCharUsingCharArray(String str, char ch, int index) { + char[] chars = str.toCharArray(); + chars[index] = ch; + return String.valueOf(chars); + } + + + public String replaceCharStringBuilder(String str, char ch, int index) { StringBuilder myString = new StringBuilder(str); myString.setCharAt(index, ch); return myString.toString(); diff --git a/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java b/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java index 07e86bb69b..c234c6953c 100644 --- a/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/ReplaceCharInStringUnitTest.java @@ -1,23 +1,29 @@ package com.baeldung.string; import org.junit.Test; + import static org.junit.Assert.*; public class ReplaceCharInStringUnitTest { private ReplaceCharacterInString characterInString = new ReplaceCharacterInString(); @Test - public void whenReplaceCharAtIndexUsingSubstring_thenSuccess(){ - assertEquals("abcme",characterInString.replaceCharSubstring("abcde",'m',3)); + public void whenReplaceCharAtIndexUsingSubstring_thenSuccess() { + assertEquals("abcme", characterInString.replaceCharSubstring("abcde", 'm', 3)); } @Test - public void whenReplaceCharAtIndexUsingStringBuilder_thenSuccess(){ - assertEquals("abcme",characterInString.replaceCharStringBuilder("abcde",'m',3)); + public void whenReplaceCharAtIndexUsingCharArray_thenSuccess() { + assertEquals("abcme", characterInString.replaceCharUsingCharArray("abcde", 'm', 3)); } @Test - public void whenReplaceCharAtIndexUsingStringBuffer_thenSuccess(){ - assertEquals("abcme",characterInString.replaceCharStringBuffer("abcde",'m',3)); + public void whenReplaceCharAtIndexUsingStringBuilder_thenSuccess() { + assertEquals("abcme", characterInString.replaceCharStringBuilder("abcde", 'm', 3)); + } + + @Test + public void whenReplaceCharAtIndexUsingStringBuffer_thenSuccess() { + assertEquals("abcme", characterInString.replaceCharStringBuffer("abcde", 'm', 3)); } } From 7bc513561c21863aa882cfd901950a47cb0198fd Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 23 Dec 2018 23:31:21 +0530 Subject: [PATCH 384/429] [BAEL-10968] - Updated Jackson Dates article --- .../baeldung/jackson/test/JacksonDateUnitTest.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateUnitTest.java b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateUnitTest.java index 390030d0d4..672ff5c6fd 100644 --- a/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateUnitTest.java +++ b/jackson/src/test/java/com/baeldung/jackson/test/JacksonDateUnitTest.java @@ -11,7 +11,6 @@ import java.time.LocalDateTime; import java.util.Date; import java.util.TimeZone; -import com.fasterxml.jackson.databind.util.ISO8601DateFormat; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; import org.junit.Test; @@ -24,8 +23,9 @@ import com.baeldung.jackson.date.EventWithSerializer; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.util.StdDateFormat; import com.fasterxml.jackson.datatype.joda.JodaModule; -import com.fasterxml.jackson.datatype.jsr310.JSR310Module; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; public class JacksonDateUnitTest { @@ -54,10 +54,12 @@ public class JacksonDateUnitTest { final ObjectMapper mapper = new ObjectMapper(); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - mapper.setDateFormat(new ISO8601DateFormat()); + + // StdDateFormat is ISO8601 since jackson 2.9 + mapper.setDateFormat(new StdDateFormat().withColonInTimeZone(true)); final String result = mapper.writeValueAsString(event); - assertThat(result, containsString("1970-01-01T02:30:00Z")); + assertThat(result, containsString("1970-01-01T02:30:00.000+00:00")); } @Test @@ -152,7 +154,7 @@ public class JacksonDateUnitTest { final LocalDateTime date = LocalDateTime.of(2014, 12, 20, 2, 30); final ObjectMapper mapper = new ObjectMapper(); - mapper.registerModule(new JSR310Module()); + mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); final String result = mapper.writeValueAsString(date); From 8cf3e3f41a348249b8b12502ca09350b065ef2f4 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Mon, 24 Dec 2018 01:10:15 +0530 Subject: [PATCH 385/429] [BAEL-10838] - Created core-java-lang-syntax module --- core-java-lang-syntax/.gitignore | 25 +++++++++ core-java-lang-syntax/README.md | 19 +++++++ core-java-lang-syntax/pom.xml | 53 +++++++++++++++++++ .../baeldung/breakcontinue/BreakContinue.java | 0 .../main/java/com/baeldung/enums/Pizza.java | 0 .../baeldung/enums/PizzaDeliveryStrategy.java | 0 .../PizzaDeliverySystemConfiguration.java | 0 .../main/java/com/baeldung/enums/README.md | 0 .../java/com/baeldung/generics/Building.java | 0 .../java/com/baeldung/generics/Generics.java | 0 .../java/com/baeldung/generics/House.java | 0 .../baeldung/initializationguide/User.java | 0 .../com/baeldung/loops/InfiniteLoops.java | 0 .../java/com/baeldung/loops/LoopsInJava.java | 0 .../switchstatement/SwitchStatement.java | 0 .../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 .../breakcontinue/BreakContinueUnitTest.java | 0 .../com/baeldung/enums/PizzaUnitTest.java | 0 .../baeldung/generics/GenericsUnitTest.java | 0 .../initializationguide/UserUnitTest.java | 0 .../java/com/baeldung/java/diamond/Car.java | 0 .../java/diamond/DiamondOperatorUnitTest.java | 0 .../com/baeldung/java/diamond/Diesel.java | 0 .../com/baeldung/java/diamond/Engine.java | 0 .../com/baeldung/java/diamond/Vehicle.java | 0 .../java/doublebrace/DoubleBraceUnitTest.java | 0 .../com/baeldung/loops/WhenUsingLoops.java | 0 .../com/baeldung/modulo/ModuloUnitTest.java | 0 .../PrimitiveConversionsJUnitTest.java | 0 .../SwitchStatementUnitTest.java | 0 .../system/DateTimeServiceUnitTest.java | 0 .../system/EnvironmentVariablesUnitTest.java | 0 .../system/SystemArrayCopyUnitTest.java | 0 .../baeldung/system/SystemNanoUnitTest.java | 0 .../system/SystemPropertiesUnitTest.java | 0 .../TernaryOperatorUnitTest.java | 0 .../baeldung/varargs/FormatterUnitTest.java | 0 core-java-lang/README.md | 14 ----- pom.xml | 2 + 45 files changed, 99 insertions(+), 14 deletions(-) create mode 100644 core-java-lang-syntax/.gitignore create mode 100644 core-java-lang-syntax/README.md create mode 100644 core-java-lang-syntax/pom.xml rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/breakcontinue/BreakContinue.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/enums/Pizza.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/enums/README.md (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/generics/Building.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/generics/Generics.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/generics/House.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/initializationguide/User.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/loops/InfiniteLoops.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/loops/LoopsInJava.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/switchstatement/SwitchStatement.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/ChatWindow.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/DateTimeService.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/EnvironmentVariables.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/SystemErrDemo.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/SystemExitDemo.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/SystemOutDemo.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/main/java/com/baeldung/system/UserCredentials.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/enums/PizzaUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/generics/GenericsUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/initializationguide/UserUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/Car.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/Diesel.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/Engine.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/diamond/Vehicle.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/loops/WhenUsingLoops.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/modulo/ModuloUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/SystemNanoUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java (100%) rename {core-java-lang => core-java-lang-syntax}/src/test/java/com/baeldung/varargs/FormatterUnitTest.java (100%) diff --git a/core-java-lang-syntax/.gitignore b/core-java-lang-syntax/.gitignore new file mode 100644 index 0000000000..374c8bf907 --- /dev/null +++ b/core-java-lang-syntax/.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-lang-syntax/README.md b/core-java-lang-syntax/README.md new file mode 100644 index 0000000000..a7c1b7cc4a --- /dev/null +++ b/core-java-lang-syntax/README.md @@ -0,0 +1,19 @@ +========= + +## Core Java Lang Syntax Cookbooks and Examples + +### Relevant Articles: +- [Introduction to 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 Java Initialization](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) +- [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) \ No newline at end of file diff --git a/core-java-lang-syntax/pom.xml b/core-java-lang-syntax/pom.xml new file mode 100644 index 0000000000..9481f29459 --- /dev/null +++ b/core-java-lang-syntax/pom.xml @@ -0,0 +1,53 @@ + + 4.0.0 + com.baeldung + core-java-lang-syntax + 0.1.0-SNAPSHOT + jar + core-java-lang-syntax + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + + log4j + log4j + ${log4j.version} + + + org.slf4j + log4j-over-slf4j + ${org.slf4j.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + + core-java-lang-syntax + + + src/main/resources + true + + + + + + + 3.10.0 + + + diff --git a/core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java b/core-java-lang-syntax/src/main/java/com/baeldung/breakcontinue/BreakContinue.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/breakcontinue/BreakContinue.java rename to core-java-lang-syntax/src/main/java/com/baeldung/breakcontinue/BreakContinue.java diff --git a/core-java-lang/src/main/java/com/baeldung/enums/Pizza.java b/core-java-lang-syntax/src/main/java/com/baeldung/enums/Pizza.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/enums/Pizza.java rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/Pizza.java diff --git a/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java b/core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliveryStrategy.java diff --git a/core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java b/core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/PizzaDeliverySystemConfiguration.java diff --git a/core-java-lang/src/main/java/com/baeldung/enums/README.md b/core-java-lang-syntax/src/main/java/com/baeldung/enums/README.md similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/enums/README.md rename to core-java-lang-syntax/src/main/java/com/baeldung/enums/README.md diff --git a/core-java-lang/src/main/java/com/baeldung/generics/Building.java b/core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/generics/Building.java rename to core-java-lang-syntax/src/main/java/com/baeldung/generics/Building.java diff --git a/core-java-lang/src/main/java/com/baeldung/generics/Generics.java b/core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/generics/Generics.java rename to core-java-lang-syntax/src/main/java/com/baeldung/generics/Generics.java diff --git a/core-java-lang/src/main/java/com/baeldung/generics/House.java b/core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/generics/House.java rename to core-java-lang-syntax/src/main/java/com/baeldung/generics/House.java diff --git a/core-java-lang/src/main/java/com/baeldung/initializationguide/User.java b/core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/initializationguide/User.java rename to core-java-lang-syntax/src/main/java/com/baeldung/initializationguide/User.java diff --git a/core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java b/core-java-lang-syntax/src/main/java/com/baeldung/loops/InfiniteLoops.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/loops/InfiniteLoops.java rename to core-java-lang-syntax/src/main/java/com/baeldung/loops/InfiniteLoops.java diff --git a/core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java b/core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/loops/LoopsInJava.java rename to core-java-lang-syntax/src/main/java/com/baeldung/loops/LoopsInJava.java diff --git a/core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java b/core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/switchstatement/SwitchStatement.java rename to core-java-lang-syntax/src/main/java/com/baeldung/switchstatement/SwitchStatement.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/ChatWindow.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/ChatWindow.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/DateTimeService.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/DateTimeService.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/EnvironmentVariables.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/EnvironmentVariables.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/SystemErrDemo.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/SystemErrDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/SystemExitDemo.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/SystemExitDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/SystemOutDemo.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/SystemOutDemo.java diff --git a/core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java b/core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java similarity index 100% rename from core-java-lang/src/main/java/com/baeldung/system/UserCredentials.java rename to core-java-lang-syntax/src/main/java/com/baeldung/system/UserCredentials.java diff --git a/core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/breakcontinue/BreakContinueUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/enums/PizzaUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/enums/PizzaUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/enums/PizzaUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/generics/GenericsUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/generics/GenericsUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/generics/GenericsUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/initializationguide/UserUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/initializationguide/UserUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/initializationguide/UserUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Car.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Car.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Car.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/DiamondOperatorUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Diesel.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Diesel.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Diesel.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Engine.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Engine.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Engine.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Vehicle.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/diamond/Vehicle.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/diamond/Vehicle.java diff --git a/core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/java/doublebrace/DoubleBraceUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java b/core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/loops/WhenUsingLoops.java rename to core-java-lang-syntax/src/test/java/com/baeldung/loops/WhenUsingLoops.java diff --git a/core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/modulo/ModuloUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/modulo/ModuloUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/modulo/ModuloUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/primitiveconversion/PrimitiveConversionsJUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/switchstatement/SwitchStatementUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/DateTimeServiceUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/EnvironmentVariablesUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/SystemArrayCopyUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/SystemNanoUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/SystemNanoUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/system/SystemPropertiesUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/ternaryoperator/TernaryOperatorUnitTest.java diff --git a/core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java b/core-java-lang-syntax/src/test/java/com/baeldung/varargs/FormatterUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/varargs/FormatterUnitTest.java rename to core-java-lang-syntax/src/test/java/com/baeldung/varargs/FormatterUnitTest.java diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 69209bb193..0ca4d3009f 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -4,24 +4,16 @@ ### Relevant Articles: - [Guide to Java Reflection](http://www.baeldung.com/java-reflection) -- [Introduction to Java Generics](http://www.baeldung.com/java-generics) - [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) -- [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions) - [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 hashCode() in Java](http://www.baeldung.com/java-hashcode) -- [Guide to the Diamond Operator in Java](http://www.baeldung.com/java-diamond-operator) - [A Guide to the Static Keyword in Java](http://www.baeldung.com/java-static) - [Quick Example - Comparator vs Comparable in Java](http://www.baeldung.com/java-comparator-comparable) -- [The Java continue and break Keywords](http://www.baeldung.com/java-continue-and-break) -- [A Guide to Java Initialization](http://www.baeldung.com/java-initialization) - [Nested Classes in Java](http://www.baeldung.com/java-nested-classes) -- [A Guide to Java Loops](http://www.baeldung.com/java-loops) -- [Varargs in Java](http://www.baeldung.com/java-varargs) - [A Guide to Inner Interfaces in Java](http://www.baeldung.com/java-inner-interfaces) - [Polymorphism in Java](http://www.baeldung.com/java-polymorphism) - [Recursion In Java](http://www.baeldung.com/java-recursion) @@ -31,9 +23,6 @@ - [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) -- [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) - [Type Erasure in Java Explained](http://www.baeldung.com/java-type-erasure) - [Using Java Assertions](http://www.baeldung.com/java-assert) - [Pass-By-Value as a Parameter Passing Mechanism in Java](http://www.baeldung.com/java-pass-by-value-or-pass-by-reference) @@ -50,9 +39,6 @@ - [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) -- [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) - [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) - [Inheritance and Composition (Is-a vs Has-a relationship) in Java](http://www.baeldung.com/java-inheritance-composition) diff --git a/pom.xml b/pom.xml index d3a665b4e1..adea3b114d 100644 --- a/pom.xml +++ b/pom.xml @@ -381,6 +381,7 @@ core-java-collections core-java-concurrency-collections core-java-io + core-java-lang-syntax core-java-lang core-java-networking core-java-sun @@ -1088,6 +1089,7 @@ core-java-collections core-java-concurrency-collections core-java-io + core-java-lang-syntax core-java-lang core-java-networking core-java-sun From a444d51ae171378b2716d8577cd0cc904ecdc509 Mon Sep 17 00:00:00 2001 From: myluckagain Date: Mon, 24 Dec 2018 03:30:03 +0500 Subject: [PATCH 386/429] Many To One BAEL-2329 (#5878) * Many To One BAEL-2329 * xml config --- .../main/HibernateManyisOwningSide.java | 71 +++++++++++++++++++ .../main/HibernateOneisOwningSide.java | 67 +++++++++++++++++ .../hibernate/oneToMany/model/CartOIO.java | 42 +++++++++++ .../hibernate/oneToMany/model/ItemsOIO.java | 47 ++++++++++++ .../resources/hibernate-annotation.cfg.xml | 4 +- 5 files changed, 230 insertions(+), 1 deletion(-) create mode 100644 persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java create mode 100644 persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java create mode 100644 persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java create mode 100644 persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java new file mode 100644 index 0000000000..372fb2fc07 --- /dev/null +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateManyisOwningSide.java @@ -0,0 +1,71 @@ +package com.baeldung.hibernate.oneToMany.main; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; + +import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; +import com.baeldung.hibernate.oneToMany.model.Cart; +import com.baeldung.hibernate.oneToMany.model.Items; +import com.baeldung.hibernate.oneToMany.model.ItemsOIO; + +public class HibernateManyisOwningSide { + public static void main(String[] args) { + + Cart cart = new Cart(); + Cart cart2 = new Cart(); + + Items item1 = new Items(cart); + Items item2 = new Items(cart2); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + itemsSet.add(item2); + + cart.setItems(itemsSet); + + + + SessionFactory sessionFactory = null; + Session session = null; + Transaction tx = null; + try { + // Get Session + sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + session = sessionFactory.getCurrentSession(); + System.out.println("Session created"); + // start transaction + tx = session.beginTransaction(); + // Save the Model object + session.save(cart); + session.save(cart2); + session.save(item1); + session.save(item2); + // Commit transaction + tx.commit(); + session = sessionFactory.getCurrentSession(); + tx = session.beginTransaction(); + + item1 = (Items) session.get(Items.class, new Long(1)); + item2 = (Items) session.get(Items.class, new Long(2)); + tx.commit(); + + + System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCart() + .getId()); + System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCart() + .getId()); + + } catch (Exception e) { + System.out.println("Exception occured. " + e.getMessage()); + e.printStackTrace(); + } finally { + if (!sessionFactory.isClosed()) { + System.out.println("Closing SessionFactory"); + sessionFactory.close(); + } + } + } +} diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java new file mode 100644 index 0000000000..0777664dd0 --- /dev/null +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/main/HibernateOneisOwningSide.java @@ -0,0 +1,67 @@ +package com.baeldung.hibernate.oneToMany.main; + +import java.util.HashSet; +import java.util.Set; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; + +import com.baeldung.hibernate.oneToMany.config.HibernateAnnotationUtil; +import com.baeldung.hibernate.oneToMany.model.CartOIO; +import com.baeldung.hibernate.oneToMany.model.ItemsOIO; + +public class HibernateOneisOwningSide { + public static void main(String[] args) { + + CartOIO cart = new CartOIO(); + CartOIO cart2 = new CartOIO(); + + ItemsOIO item1 = new ItemsOIO(cart); + ItemsOIO item2 = new ItemsOIO(cart2); + Set itemsSet = new HashSet(); + itemsSet.add(item1); + itemsSet.add(item2); + + cart.setItems(itemsSet); + + SessionFactory sessionFactory = null; + Session session = null; + Transaction tx = null; + try { + // Get Session + sessionFactory = HibernateAnnotationUtil.getSessionFactory(); + session = sessionFactory.getCurrentSession(); + System.out.println("Session created"); + // start transaction + tx = session.beginTransaction(); + // Save the Model object + session.save(cart); + session.save(cart2); + session.save(item1); + session.save(item2); + // Commit transaction + tx.commit(); + + session = sessionFactory.getCurrentSession(); + tx = session.beginTransaction(); + item1 = (ItemsOIO) session.get(ItemsOIO.class, new Long(1)); + item2 = (ItemsOIO) session.get(ItemsOIO.class, new Long(2)); + tx.commit(); + + System.out.println("item1 ID=" + item1.getId() + ", Foreign Key CartOIO ID=" + item1.getCartOIO() + .getId()); + System.out.println("item2 ID=" + item2.getId() + ", Foreign Key CartOIO ID=" + item2.getCartOIO() + .getId()); + + } catch (Exception e) { + System.out.println("Exception occured. " + e.getMessage()); + e.printStackTrace(); + } finally { + if (!sessionFactory.isClosed()) { + System.out.println("Closing SessionFactory"); + sessionFactory.close(); + } + } + } +} diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java new file mode 100644 index 0000000000..8a5ed5e7a4 --- /dev/null +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/CartOIO.java @@ -0,0 +1,42 @@ +package com.baeldung.hibernate.oneToMany.model; + +import java.util.Set; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.OneToMany; +import javax.persistence.Table; + + + +@Entity +@Table(name = "CARTOIO") +public class CartOIO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @OneToMany + @JoinColumn(name = "cart_id") // we need to duplicate the physical information + private Set items; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public Set getItems() { + return items; + } + + public void setItems(Set items) { + this.items = items; + } + +} diff --git a/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java new file mode 100644 index 0000000000..a3d6a796c5 --- /dev/null +++ b/persistence-modules/spring-hibernate4/src/main/java/com/baeldung/hibernate/oneToMany/model/ItemsOIO.java @@ -0,0 +1,47 @@ +package com.baeldung.hibernate.oneToMany.model; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +@Entity +@Table(name = "ITEMSOIO") +public class ItemsOIO { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private long id; + + @ManyToOne + @JoinColumn(name = "cart_id", insertable = false, updatable = false) + private CartOIO cart; + + // Hibernate requires no-args constructor + public ItemsOIO() { + } + + public ItemsOIO(CartOIO c) { + this.cart = c; + } + + public CartOIO getCartOIO() { + return cart; + } + + public void setCartOIO(CartOIO cart) { + this.cart = cart; + } + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + +} diff --git a/persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml b/persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml index 311300c77c..14d853d3fd 100644 --- a/persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml +++ b/persistence-modules/spring-hibernate4/src/main/resources/hibernate-annotation.cfg.xml @@ -9,11 +9,13 @@ jdbc:mysql://localhost:3306/spring_hibernate_one_to_many?createDatabaseIfNotExist=true myuser org.hibernate.dialect.MySQLDialect - + create thread true + + From b4eee1e23131221b59b516665f87d5984cc2bfa8 Mon Sep 17 00:00:00 2001 From: Sam Millington Date: Mon, 24 Dec 2018 13:02:29 +0000 Subject: [PATCH 387/429] BAEL-2419: Added String Concatenation Unit Tests (#5898) --- .../baeldung/StringConcatenationUnitTest.java | 105 ++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java b/java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java new file mode 100644 index 0000000000..c25d4ce8f9 --- /dev/null +++ b/java-strings/src/test/java/com/baeldung/StringConcatenationUnitTest.java @@ -0,0 +1,105 @@ +package com.baeldung; + +import org.junit.Test; + +import java.util.Arrays; +import java.util.List; +import java.util.StringJoiner; +import java.util.stream.Collectors; + +import static org.junit.Assert.assertEquals; + +public class StringConcatenationUnitTest { + + @Test + public void givenMultipleStrings_whenConcatUsingStringBuilder_checkStringCorrect() { + + StringBuilder stringBuilder = new StringBuilder(100); + stringBuilder.append("Baeldung"); + stringBuilder.append(" is"); + stringBuilder.append(" awesome"); + + assertEquals("Baeldung is awesome", stringBuilder.toString()); + + } + + @Test + public void givenMultipleString_whenConcatUsingAdditionOperator_checkStringCorrect() { + + String myString = "The " + "quick " + "brown " + "fox..."; + + assertEquals("The quick brown fox...", myString); + } + + + @Test + public void givenMultipleStrings_whenConcatUsingStringFormat_checkStringCorrect() { + + String myString = String.format("%s %s %.2f %s %s, %s...", "I", + "ate", + 2.5056302, + "blueberry", + "pies", + "oops"); + + + assertEquals("I ate 2.51 blueberry pies, oops...", myString); + } + + @Test + public void givenMultipleStrings_whenStringConcatUsed_checkStringCorrect() { + + String myString = "Both".concat(" fickle") + .concat(" dwarves") + .concat(" jinx") + .concat(" my") + .concat(" pig") + .concat(" quiz"); + + assertEquals("Both fickle dwarves jinx my pig quiz", myString); + + + } + + @Test + public void givenMultipleStrings_whenStringJoinUsed_checkStringCorrect() { + + String[] strings = {"I'm", "running", "out", "of", "pangrams!"}; + + String myString = String.join(" ", strings); + + assertEquals("I'm running out of pangrams!", myString); + + } + + @Test + public void givenMultipleStrings_whenStringJoinerUsed_checkStringCorrect() { + + StringJoiner fruitJoiner = new StringJoiner(", "); + fruitJoiner.add("Apples"); + fruitJoiner.add("Oranges"); + fruitJoiner.add("Bananas"); + + assertEquals("Apples, Oranges, Bananas", fruitJoiner.toString()); + } + + @Test + public void givenMultipleStrings_whenArrayJoiner_checkStringCorrect() { + + String[] myFavouriteLanguages = {"Java", "JavaScript", "Python"}; + + String toString = Arrays.toString(myFavouriteLanguages); + + assertEquals("[Java, JavaScript, Python]", toString); + } + + @Test + public void givenArrayListOfStrings_whenCollectorsJoin_checkStringCorrect() { + + List awesomeAnimals = Arrays.asList("Shark", "Panda", "Armadillo"); + + String animalString = awesomeAnimals.stream().collect(Collectors.joining(", ")); + + assertEquals("Shark, Panda, Armadillo", animalString); + } +} From cdaf0b46bfe7ea3119c440659cad6bfe53e462d3 Mon Sep 17 00:00:00 2001 From: Fabian Rivera Date: Mon, 24 Dec 2018 17:44:09 -0600 Subject: [PATCH 388/429] BAEL-2454 Reading the error response and building the full response BAEL-2454 Add examples for reading response content on failed requests. Add example on how to build full response string. --- .../baeldung/http/FullResponseBuilder.java | 65 ++++++++++++++++++ .../baeldung/http/HttpRequestLiveTest.java | 66 +++++++++++++++++-- 2 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java diff --git a/core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java b/core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java new file mode 100644 index 0000000000..394255bd70 --- /dev/null +++ b/core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java @@ -0,0 +1,65 @@ +package com.baeldung.http; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.net.HttpURLConnection; +import java.util.Iterator; +import java.util.List; + +public class FullResponseBuilder { + public static String getFullResponse(HttpURLConnection con) throws IOException { + StringBuilder fullResponseBuilder = new StringBuilder(); + + fullResponseBuilder.append(con.getResponseCode()) + .append(" ") + .append(con.getResponseMessage()) + .append("\n"); + + con.getHeaderFields() + .entrySet() + .stream() + .filter(entry -> entry.getKey() != null) + .forEach(entry -> { + + fullResponseBuilder.append(entry.getKey()) + .append(": "); + + List headerValues = entry.getValue(); + Iterator it = headerValues.iterator(); + if (it.hasNext()) { + fullResponseBuilder.append(it.next()); + + while (it.hasNext()) { + fullResponseBuilder.append(", ") + .append(it.next()); + } + } + + fullResponseBuilder.append("\n"); + }); + + Reader streamReader = null; + + if (con.getResponseCode() > 299) { + streamReader = new InputStreamReader(con.getErrorStream()); + } else { + streamReader = new InputStreamReader(con.getInputStream()); + } + + BufferedReader in = new BufferedReader(streamReader); + String inputLine; + StringBuilder content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + + in.close(); + + fullResponseBuilder.append("Response: ") + .append(content); + + return fullResponseBuilder.toString(); + } +} diff --git a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java index acd6536ac4..37e9f0d752 100644 --- a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java +++ b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java @@ -7,6 +7,7 @@ import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.io.Reader; import java.net.CookieManager; import java.net.HttpCookie; import java.net.HttpURLConnection; @@ -48,7 +49,8 @@ public class HttpRequestLiveTest { in.close(); assertEquals("status code incorrect", status, 200); - assertTrue("content incorrect", content.toString().contains("Example Domain")); + assertTrue("content incorrect", content.toString() + .contains("Example Domain")); } @Test @@ -89,18 +91,24 @@ public class HttpRequestLiveTest { Optional usernameCookie = null; if (cookiesHeader != null) { List cookies = HttpCookie.parse(cookiesHeader); - cookies.forEach(cookie -> cookieManager.getCookieStore().add(null, cookie)); - usernameCookie = cookies.stream().findAny().filter(cookie -> cookie.getName().equals("username")); + cookies.forEach(cookie -> cookieManager.getCookieStore() + .add(null, cookie)); + usernameCookie = cookies.stream() + .findAny() + .filter(cookie -> cookie.getName() + .equals("username")); } if (usernameCookie == null) { - cookieManager.getCookieStore().add(null, new HttpCookie("username", "john")); + cookieManager.getCookieStore() + .add(null, new HttpCookie("username", "john")); } con.disconnect(); con = (HttpURLConnection) url.openConnection(); - con.setRequestProperty("Cookie", StringUtils.join(cookieManager.getCookieStore().getCookies(), ";")); + con.setRequestProperty("Cookie", StringUtils.join(cookieManager.getCookieStore() + .getCookies(), ";")); int status = con.getResponseCode(); @@ -125,4 +133,52 @@ public class HttpRequestLiveTest { assertEquals("status code incorrect", con.getResponseCode(), 200); } + @Test + public void whenFailedRequest_thenOk() throws IOException { + URL url = new URL("http://example.com"); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + + int status = con.getResponseCode(); + + Reader streamReader = null; + + if (status > 299) { + streamReader = new InputStreamReader(con.getErrorStream()); + } else { + streamReader = new InputStreamReader(con.getInputStream()); + } + + BufferedReader in = new BufferedReader(streamReader); + String inputLine; + StringBuilder content = new StringBuilder(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + + assertEquals("status code incorrect", status, 411); + assertTrue("error content", content.toString() + .contains("411 - Length Required")); + } + + @Test + public void whenGetRequestFullResponse_thenOk() throws IOException { + URL url = new URL("http://example.com"); + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + + con.setConnectTimeout(5000); + con.setReadTimeout(5000); + + String fullResponse = FullResponseBuilder.getFullResponse(con); + + assertEquals("status code incorrect", con.getResponseCode(), 200); + assertTrue("header incorrect", fullResponse.contains("Content-Type: text/html; charset=UTF-8")); + assertTrue("response incorrect", fullResponse.contains("")); + } + } From 48c0b83978c8f799e2ea2c0ba5b0e715277b34a4 Mon Sep 17 00:00:00 2001 From: Fabian Rivera Date: Mon, 24 Dec 2018 17:46:12 -0600 Subject: [PATCH 389/429] BAEL-2454 Add missing disconnect call on open connections --- .../src/test/java/com/baeldung/http/HttpRequestLiveTest.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java index 37e9f0d752..752a75daa5 100644 --- a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java +++ b/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java @@ -160,6 +160,8 @@ public class HttpRequestLiveTest { } in.close(); + con.disconnect(); + assertEquals("status code incorrect", status, 411); assertTrue("error content", content.toString() .contains("411 - Length Required")); @@ -176,6 +178,8 @@ public class HttpRequestLiveTest { String fullResponse = FullResponseBuilder.getFullResponse(con); + con.disconnect(); + assertEquals("status code incorrect", con.getResponseCode(), 200); assertTrue("header incorrect", fullResponse.contains("Content-Type: text/html; charset=UTF-8")); assertTrue("response incorrect", fullResponse.contains("")); From 10c52bc1b900d46d08d4b7ec51fea74a8894cdc7 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Tue, 25 Dec 2018 16:32:35 +0530 Subject: [PATCH 390/429] [BAEL-10839] - Added missed class and moved articles related to hashcode and equals --- core-java-lang-oop/README.md | 4 +++- .../baeldung/immutableobjects/ImmutableObjectsUnitTest.java | 0 core-java-lang/README.md | 2 -- 3 files changed, 3 insertions(+), 3 deletions(-) rename {core-java-lang => core-java-lang-oop}/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java (100%) diff --git a/core-java-lang-oop/README.md b/core-java-lang-oop/README.md index 665178452c..3531ab9677 100644 --- a/core-java-lang-oop/README.md +++ b/core-java-lang-oop/README.md @@ -20,4 +20,6 @@ - [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) \ No newline at end of file +- [A Guide to Constructors in Java](https://www.baeldung.com/java-constructors) +- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) +- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) \ No newline at end of file diff --git a/core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java b/core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java similarity index 100% rename from core-java-lang/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java rename to core-java-lang-oop/src/test/java/com/baeldung/immutableobjects/ImmutableObjectsUnitTest.java diff --git a/core-java-lang/README.md b/core-java-lang/README.md index 56de6d2e82..68cd7ce452 100644 --- a/core-java-lang/README.md +++ b/core-java-lang/README.md @@ -5,7 +5,6 @@ ### Relevant Articles: - [Guide to Java Reflection](http://www.baeldung.com/java-reflection) - [Introduction to Java Generics](http://www.baeldung.com/java-generics) -- [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) - [Java Primitive Conversions](http://www.baeldung.com/java-primitive-conversions) - [Call Methods at Runtime Using Java Reflection](http://www.baeldung.com/java-method-reflection) @@ -40,4 +39,3 @@ - [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 equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) From fb66f1bc78fd363c0c51c110f98ab97272111d11 Mon Sep 17 00:00:00 2001 From: Loredana Date: Tue, 25 Dec 2018 14:05:10 +0200 Subject: [PATCH 391/429] move networking articles, update readme --- core-java-networking/README.md | 4 +++- core-java-networking/pom.xml | 6 ++++++ .../src/main/java/com/baeldung/networking/README.md | 5 ----- .../main/java/com/baeldung/networking}/uriurl/URIDemo.java | 2 +- .../main/java/com/baeldung/networking}/uriurl/URLDemo.java | 2 +- .../networking/interfaces/NetworkInterfaceManualTest.java | 2 +- .../com/baeldung/networking/uriurl}/URIDemoLiveTest.java | 4 ++-- .../com/baeldung/networking}/uriurl/URIvsURLUnitTest.java | 2 +- .../com/baeldung/networking/uriurl}/URLDemoLiveTest.java | 4 ++-- .../test/java/com/baeldung}/networking/url/UrlUnitTest.java | 2 +- core-java/README.md | 1 + .../main/java/com/baeldung/console/ConsoleConsoleClass.java | 0 .../main/java/com/baeldung/console/ConsoleScannerClass.java | 0 13 files changed, 19 insertions(+), 15 deletions(-) delete mode 100644 core-java-networking/src/main/java/com/baeldung/networking/README.md rename {core-java/src/main/java/com/baeldung/javanetworking => core-java-networking/src/main/java/com/baeldung/networking}/uriurl/URIDemo.java (98%) rename {core-java/src/main/java/com/baeldung/javanetworking => core-java-networking/src/main/java/com/baeldung/networking}/uriurl/URLDemo.java (98%) rename {core-java/src/test/java/com/baeldung/java => core-java-networking/src/test/java/com/baeldung}/networking/interfaces/NetworkInterfaceManualTest.java (98%) rename {core-java/src/test/java/com/baeldung/javanetworking/uriurl/test => core-java-networking/src/test/java/com/baeldung/networking/uriurl}/URIDemoLiveTest.java (95%) rename {core-java/src/test/java/com/baeldung/javanetworking => core-java-networking/src/test/java/com/baeldung/networking}/uriurl/URIvsURLUnitTest.java (98%) rename {core-java/src/test/java/com/baeldung/javanetworking/uriurl/test => core-java-networking/src/test/java/com/baeldung/networking/uriurl}/URLDemoLiveTest.java (97%) rename {core-java/src/test/java/com/baeldung/java => core-java-networking/src/test/java/com/baeldung}/networking/url/UrlUnitTest.java (98%) rename {core-java-networking => core-java}/src/main/java/com/baeldung/console/ConsoleConsoleClass.java (100%) rename {core-java-networking => core-java}/src/main/java/com/baeldung/console/ConsoleScannerClass.java (100%) diff --git a/core-java-networking/README.md b/core-java-networking/README.md index 2cb2c52d3d..4b77aa3c1f 100644 --- a/core-java-networking/README.md +++ b/core-java-networking/README.md @@ -8,4 +8,6 @@ - [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) -- [Console I/O in Java](http://www.baeldung.com/java-console-input-output) \ No newline at end of file +- [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) diff --git a/core-java-networking/pom.xml b/core-java-networking/pom.xml index 7d7bf4bc95..c7fa2af180 100644 --- a/core-java-networking/pom.xml +++ b/core-java-networking/pom.xml @@ -19,6 +19,11 @@ mail ${javax.mail.version} + + commons-io + commons-io + ${commons-io.version} + @@ -27,5 +32,6 @@ 1.5.0-b01 + 2.5 diff --git a/core-java-networking/src/main/java/com/baeldung/networking/README.md b/core-java-networking/src/main/java/com/baeldung/networking/README.md deleted file mode 100644 index b9e827f085..0000000000 --- a/core-java-networking/src/main/java/com/baeldung/networking/README.md +++ /dev/null @@ -1,5 +0,0 @@ -### Relevant Articles: -- [A Guide To UDP In Java](http://www.baeldung.com/udp-in-java) -- [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) diff --git a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URIDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URIDemo.java similarity index 98% rename from core-java/src/main/java/com/baeldung/javanetworking/uriurl/URIDemo.java rename to core-java-networking/src/main/java/com/baeldung/networking/uriurl/URIDemo.java index 121e0f5d72..91f6e21293 100644 --- a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URIDemo.java +++ b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URIDemo.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl; +package com.baeldung.networking.uriurl; import java.io.BufferedReader; import java.io.IOException; diff --git a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URLDemo.java b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URLDemo.java similarity index 98% rename from core-java/src/main/java/com/baeldung/javanetworking/uriurl/URLDemo.java rename to core-java-networking/src/main/java/com/baeldung/networking/uriurl/URLDemo.java index 109a9951d2..d257e7a295 100644 --- a/core-java/src/main/java/com/baeldung/javanetworking/uriurl/URLDemo.java +++ b/core-java-networking/src/main/java/com/baeldung/networking/uriurl/URLDemo.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl; +package com.baeldung.networking.uriurl; import java.io.BufferedReader; import java.io.IOException; diff --git a/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java b/core-java-networking/src/test/java/com/baeldung/networking/interfaces/NetworkInterfaceManualTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/interfaces/NetworkInterfaceManualTest.java index 8635a24f18..47a598f599 100644 --- a/core-java/src/test/java/com/baeldung/java/networking/interfaces/NetworkInterfaceManualTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/interfaces/NetworkInterfaceManualTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.networking.interfaces; +package com.baeldung.networking.interfaces; import org.junit.Test; diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URIDemoLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIDemoLiveTest.java similarity index 95% rename from core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URIDemoLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIDemoLiveTest.java index 0c312ff613..3b73cc0943 100644 --- a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URIDemoLiveTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIDemoLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl.test; +package com.baeldung.networking.uriurl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -20,7 +20,7 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.baeldung.javanetworking.uriurl.URLDemo; +import com.baeldung.networking.uriurl.URLDemo; @FixMethodOrder public class URIDemoLiveTest { diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIvsURLUnitTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIvsURLUnitTest.java index 8837dc5556..ec1cb4c0c9 100644 --- a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/URIvsURLUnitTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URIvsURLUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl; +package com.baeldung.networking.uriurl; import java.io.IOException; import java.net.MalformedURLException; diff --git a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URLDemoLiveTest.java b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URLDemoLiveTest.java similarity index 97% rename from core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URLDemoLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/uriurl/URLDemoLiveTest.java index 15f53ed878..a9104311e6 100644 --- a/core-java/src/test/java/com/baeldung/javanetworking/uriurl/test/URLDemoLiveTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/uriurl/URLDemoLiveTest.java @@ -1,4 +1,4 @@ -package com.baeldung.javanetworking.uriurl.test; +package com.baeldung.networking.uriurl; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -18,7 +18,7 @@ import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import com.baeldung.javanetworking.uriurl.URLDemo; +import com.baeldung.networking.uriurl.URLDemo; @FixMethodOrder public class URLDemoLiveTest { diff --git a/core-java/src/test/java/com/baeldung/java/networking/url/UrlUnitTest.java b/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java similarity index 98% rename from core-java/src/test/java/com/baeldung/java/networking/url/UrlUnitTest.java rename to core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java index 505d9595ab..112f2cf53f 100644 --- a/core-java/src/test/java/com/baeldung/java/networking/url/UrlUnitTest.java +++ b/core-java-networking/src/test/java/com/baeldung/networking/url/UrlUnitTest.java @@ -1,4 +1,4 @@ -package com.baeldung.java.networking.url; +package com.baeldung.networking.url; import static org.junit.Assert.assertEquals; diff --git a/core-java/README.md b/core-java/README.md index 961ca45cce..b0e8f81e1f 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -71,3 +71,4 @@ - [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) - [Graphs in Java](https://www.baeldung.com/java-graphs) +- [Console I/O in Java](http://www.baeldung.com/java-console-input-output) diff --git a/core-java-networking/src/main/java/com/baeldung/console/ConsoleConsoleClass.java b/core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java similarity index 100% rename from core-java-networking/src/main/java/com/baeldung/console/ConsoleConsoleClass.java rename to core-java/src/main/java/com/baeldung/console/ConsoleConsoleClass.java diff --git a/core-java-networking/src/main/java/com/baeldung/console/ConsoleScannerClass.java b/core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java similarity index 100% rename from core-java-networking/src/main/java/com/baeldung/console/ConsoleScannerClass.java rename to core-java/src/main/java/com/baeldung/console/ConsoleScannerClass.java From e02f08eb8c334e836df78827c891daa598b99c84 Mon Sep 17 00:00:00 2001 From: Loredana Date: Tue, 25 Dec 2018 14:13:34 +0200 Subject: [PATCH 392/429] update readmes --- patterns/README.md | 11 ----------- patterns/design-patterns/README.md | 4 ++++ 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/patterns/README.md b/patterns/README.md index 9653558f43..9a15cdff02 100644 --- a/patterns/README.md +++ b/patterns/README.md @@ -1,14 +1,3 @@ ### Relevant Articles: - [A Guide to the Front Controller Pattern in Java](http://www.baeldung.com/java-front-controller-pattern) - [Introduction to Intercepting Filter Pattern in Java](http://www.baeldung.com/intercepting-filter-pattern-in-java) -- [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) -- [The DAO Pattern in Java](http://www.baeldung.com/java-dao-pattern) -- [Introduction to Creational Design Patterns](http://www.baeldung.com/creational-design-patterns) -- [Proxy, Decorator, Adapter and Bridge Patterns](http://www.baeldung.com/java-structural-design-patterns) -- [Singletons in Java](http://www.baeldung.com/java-singleton) -- [Flyweight Pattern in Java](http://www.baeldung.com/java-flyweight) -- [The Observer Pattern in Java](http://www.baeldung.com/java-observer-pattern) -- [Service Locator Pattern](http://www.baeldung.com/java-service-locator-pattern) -- [Java Constructors vs Static Factory Methods](https://www.baeldung.com/java-constructors-vs-static-factory-methods) \ No newline at end of file diff --git a/patterns/design-patterns/README.md b/patterns/design-patterns/README.md index e56872b3fd..8046d2034b 100644 --- a/patterns/design-patterns/README.md +++ b/patterns/design-patterns/README.md @@ -14,3 +14,7 @@ - [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) From 55158e59c9d46e96de7468b262e83326cdf2290b Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Tue, 25 Dec 2018 15:54:29 +0200 Subject: [PATCH 393/429] Update README.md --- core-java-lang-oop/README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core-java-lang-oop/README.md b/core-java-lang-oop/README.md index 3531ab9677..bbc3d26c99 100644 --- a/core-java-lang-oop/README.md +++ b/core-java-lang-oop/README.md @@ -21,5 +21,4 @@ - [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) -- [Generate equals() and hashCode() with Eclipse](http://www.baeldung.com/java-eclipse-equals-and-hashcode) -- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) \ No newline at end of file +- [Java equals() and hashCode() Contracts](https://www.baeldung.com/java-equals-hashcode-contracts) From 45ba2a9387df43f5d50115fd24274ab8202f194e Mon Sep 17 00:00:00 2001 From: amit2103 Date: Tue, 25 Dec 2018 21:54:46 +0530 Subject: [PATCH 394/429] [BAEL-10837] - Splitted core-java-concurrency module --- .../.gitignore | 0 .../README.md | 14 +--- .../pom.xml | 6 +- .../atomic/SafeCounterWithLock.java | 26 +++---- .../atomic/SafeCounterWithoutLock.java | 42 +++++----- .../concurrent/atomic/UnsafeCounter.java | 26 +++---- .../countdownlatch/BrokenWorker.java | 0 .../CountdownLatchCountExample.java | 0 .../CountdownLatchResetExample.java | 0 .../countdownlatch/WaitingWorker.java | 0 .../concurrent/countdownlatch/Worker.java | 0 .../CyclicBarrierCompletionMethodExample.java | 0 .../CyclicBarrierCountExample.java | 0 .../cyclicbarrier/CyclicBarrierDemo.java | 0 .../CyclicBarrierResetExample.java | 0 .../daemon/MultipleThreadsExample.java | 0 .../baeldung/concurrent/daemon/NewThread.java | 0 .../daemon/SingleThreadExample.java | 0 .../DiningPhilosophers.java | 0 .../diningphilosophers/Philosopher.java | 0 .../evenandodd/PrintEvenOddSemaphore.java | 0 .../evenandodd/PrintEvenOddWaitNotify.java | 0 .../locks/ReentrantLockWithCondition.java | 0 .../locks/SharedObjectWithLock.java | 0 .../concurrent/locks/StampedLockDemo.java | 0 .../locks/SynchronizedHashMapWithRWLock.java | 0 .../parameter/AverageCalculator.java | 0 .../parameter/ParameterizedThreadExample.java | 0 .../concurrent/phaser/LongRunningAction.java | 0 .../concurrent/prioritytaskexecution/Job.java | 0 .../prioritytaskexecution/JobPriority.java | 0 .../PriorityJobScheduler.java | 0 .../semaphores/CounterUsingMutex.java | 0 .../DelayQueueUsingTimedSemaphore.java | 0 .../semaphores/LoginQueueUsingSemaphore.java | 0 .../volatilekeyword/SharedObject.java | 0 .../concurrent/yield/ThreadYield.java | 0 .../forkjoin/CustomRecursiveAction.java | 0 .../forkjoin/CustomRecursiveTask.java | 0 .../com/baeldung/forkjoin/util/PoolUtil.java | 0 .../com/baeldung/threadlocal/Context.java | 0 .../threadlocal/SharedMapWithUserContext.java | 0 .../ThreadLocalWithUserContext.java | 0 .../baeldung/threadlocal/UserRepository.java | 0 .../ThreadLocalRandomBenchMarkRunner.java | 0 .../ThreadLocalRandomBenchMarker.java | 0 .../com/baeldung/threadpool/CountingTask.java | 0 .../ExitingExecutorServiceExample.java | 0 .../com/baeldung/threadpool/TreeNode.java | 0 .../src/main/java/log4j.properties | 0 .../src/main/resources/logback.xml | 0 .../accumulator/LongAccumulatorUnitTest.java | 0 .../concurrent/adder/LongAdderUnitTest.java | 0 .../ThreadSafeCounterIntegrationTest.java | 76 +++++++++---------- .../atomic/ThreadUnsafeCounterManualTest.java | 66 ++++++++-------- .../CountdownLatchCountExampleUnitTest.java | 0 .../CountdownLatchExampleIntegrationTest.java | 0 .../CountdownLatchResetExampleUnitTest.java | 0 ...arrierCompletionMethodExampleUnitTest.java | 0 .../CyclicBarrierCountExampleUnitTest.java | 0 .../CyclicBarrierResetExampleUnitTest.java | 0 .../daemon/DaemonThreadUnitTest.java | 0 .../locks/SharedObjectWithLockManualTest.java | 0 ...nchronizedHashMapWithRWLockManualTest.java | 0 .../concurrent/phaser/PhaserUnitTest.java | 0 .../PriorityJobSchedulerUnitTest.java | 0 .../semaphores/SemaphoresManualTest.java | 0 .../SharedObjectManualTest.java | 0 .../java8/Java8ForkJoinIntegrationTest.java | 0 .../ParameterizedThreadUnitTest.java | 0 .../thread/join/ThreadJoinUnitTest.java | 0 .../ThreadLocalIntegrationTest.java | 0 .../ThreadLocalRandomIntegrationTest.java | 0 .../CoreThreadPoolIntegrationTest.java | 0 .../GuavaThreadPoolIntegrationTest.java | 0 .../src/test/resources/.gitignore | 0 core-java-concurrency-basic/.gitignore | 26 +++++++ core-java-concurrency-basic/README.md | 17 +++++ core-java-concurrency-basic/pom.xml | 55 ++++++++++++++ .../ScheduledExecutorServiceDemo.java | 0 .../concurrent/callable/FactorialTask.java | 0 .../cyclicbarrier/CyclicBarrierExample.java | 0 .../concurrent/cyclicbarrier/Task.java | 0 .../concurrent/executor/ExecutorDemo.java | 0 .../baeldung/concurrent/executor/Invoker.java | 0 .../executorservice/DelayedCallable.java | 0 .../executorservice/ExecutorServiceDemo.java | 0 .../concurrent/executorservice/Task.java | 0 .../future/FactorialSquareCalculator.java | 0 .../concurrent/future/FutureDemo.java | 0 .../concurrent/future/SquareCalculator.java | 0 .../concurrent/runnable/EventLoggingTask.java | 0 .../concurrent/runnable/TaskRunner.java | 0 .../concurrent/semaphore/SemaPhoreDemo.java | 0 .../concurrent/sleepwait/ThreadA.java | 0 .../concurrent/sleepwait/ThreadB.java | 0 .../sleepwait/WaitSleepExample.java | 0 .../concurrent/stopping/ControlSubThread.java | 0 .../BaeldungSynchronizedBlocks.java | 0 .../BaeldungSynchronizedMethods.java | 0 .../threadfactory/BaeldungThreadFactory.java | 0 .../concurrent/threadfactory/Demo.java | 0 .../concurrent/threadfactory/Task.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 +++++ .../CompletableFutureLongRunningUnitTest.java | 0 .../callable/FactorialTaskManualTest.java | 0 .../WaitingForThreadsToFinishManualTest.java | 0 .../FactorialSquareCalculatorUnitTest.java | 0 .../SquareCalculatorIntegrationTest.java | 0 .../runnable/RunnableVsThreadLiveTest.java | 0 .../stopping/StopThreadManualTest.java | 0 .../BaeldungSychronizedBlockUnitTest.java | 0 .../BaeldungSynchronizeMethodsUnitTest.java | 0 .../waitandnotify/NetworkIntegrationTest.java | 0 .../Java8ExecutorServiceIntegrationTest.java | 0 .../src/test/resources/.gitignore | 13 ++++ pom.xml | 6 +- 127 files changed, 256 insertions(+), 136 deletions(-) rename {core-java-concurrency => core-java-concurrency-advanced}/.gitignore (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/README.md (60%) rename {core-java-concurrency => core-java-concurrency-advanced}/pom.xml (94%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java (94%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java (96%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java (94%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/daemon/NewThread.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocal/Context.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocal/UserRepository.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadpool/CountingTask.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/com/baeldung/threadpool/TreeNode.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/java/log4j.properties (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/main/resources/logback.xml (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java (97%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java (97%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-advanced}/src/test/resources/.gitignore (100%) create mode 100644 core-java-concurrency-basic/.gitignore create mode 100644 core-java-concurrency-basic/README.md create mode 100644 core-java-concurrency-basic/pom.xml rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executor/Invoker.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/executorservice/Task.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/future/FutureDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadfactory/Task.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java (100%) create mode 100644 core-java-concurrency-basic/src/main/resources/logback.xml rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java (100%) rename {core-java-concurrency => core-java-concurrency-basic}/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java (100%) create mode 100644 core-java-concurrency-basic/src/test/resources/.gitignore diff --git a/core-java-concurrency/.gitignore b/core-java-concurrency-advanced/.gitignore similarity index 100% rename from core-java-concurrency/.gitignore rename to core-java-concurrency-advanced/.gitignore diff --git a/core-java-concurrency/README.md b/core-java-concurrency-advanced/README.md similarity index 60% rename from core-java-concurrency/README.md rename to core-java-concurrency-advanced/README.md index e8693a0231..bcbec9d687 100644 --- a/core-java-concurrency/README.md +++ b/core-java-concurrency-advanced/README.md @@ -1,33 +1,21 @@ ========= -## Core Java Concurrency Examples +## Core Java Concurrency Advanced 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) - [Introduction to Thread Pools in Java](http://www.baeldung.com/thread-pool-java-and-guava) -- [Guide to java.util.concurrent.Future](http://www.baeldung.com/java-future) - [Guide to CountDownLatch in Java](http://www.baeldung.com/java-countdown-latch) - [Guide to java.util.concurrent.Locks](http://www.baeldung.com/java-concurrent-locks) - [An Introduction to ThreadLocal in Java](http://www.baeldung.com/java-threadlocal) -- [Difference Between Wait and Sleep in Java](http://www.baeldung.com/java-wait-and-sleep) - [LongAdder and LongAccumulator in Java](http://www.baeldung.com/java-longadder-and-longaccumulator) - [The Dining Philosophers Problem in Java](http://www.baeldung.com/java-dining-philoshophers) - [Guide to the Java Phaser](http://www.baeldung.com/java-phaser) -- [Guide to Synchronized Keyword in Java](http://www.baeldung.com/java-synchronized) - [An Introduction to Atomic Variables in Java](http://www.baeldung.com/java-atomic-variables) - [CyclicBarrier in Java](http://www.baeldung.com/java-cyclic-barrier) - [Guide to Volatile Keyword in Java](http://www.baeldung.com/java-volatile) -- [Overview of the java.util.concurrent](http://www.baeldung.com/java-util-concurrent) - [Semaphores in Java](http://www.baeldung.com/java-semaphore) - [Daemon Threads in Java](http://www.baeldung.com/java-daemon-thread) -- [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) - [Priority-based Job Scheduling in Java](http://www.baeldung.com/java-priority-job-schedule) -- [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) - [Brief Introduction to Java Thread.yield()](https://www.baeldung.com/java-thread-yield) - [Print Even and Odd Numbers Using 2 Threads](https://www.baeldung.com/java-even-odd-numbers-with-2-threads) - [Java CyclicBarrier vs CountDownLatch](https://www.baeldung.com/java-cyclicbarrier-countdownlatch) diff --git a/core-java-concurrency/pom.xml b/core-java-concurrency-advanced/pom.xml similarity index 94% rename from core-java-concurrency/pom.xml rename to core-java-concurrency-advanced/pom.xml index 5dde4d5820..1209cba619 100644 --- a/core-java-concurrency/pom.xml +++ b/core-java-concurrency-advanced/pom.xml @@ -2,10 +2,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 - core-java-concurrency + core-java-concurrency-advanced 0.1.0-SNAPSHOT jar - core-java-concurrency + core-java-concurrency-advanced com.baeldung @@ -60,7 +60,7 @@ - core-java-concurrency + core-java-concurrency-advanced src/main/resources diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java similarity index 94% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java index e3a1629ce1..ef6b7ee8c8 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java +++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithLock.java @@ -1,13 +1,13 @@ -package com.baeldung.concurrent.atomic; - -public class SafeCounterWithLock { - private volatile int counter; - - int getValue() { - return counter; - } - - synchronized void increment() { - counter++; - } -} +package com.baeldung.concurrent.atomic; + +public class SafeCounterWithLock { + private volatile int counter; + + int getValue() { + return counter; + } + + synchronized void increment() { + counter++; + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java similarity index 96% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java index 18ade35efb..8b2aebba7c 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java +++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/SafeCounterWithoutLock.java @@ -1,21 +1,21 @@ -package com.baeldung.concurrent.atomic; - -import java.util.concurrent.atomic.AtomicInteger; - -public class SafeCounterWithoutLock { - private final AtomicInteger counter = new AtomicInteger(0); - - int getValue() { - return counter.get(); - } - - void increment() { - while(true) { - int existingValue = getValue(); - int newValue = existingValue + 1; - if(counter.compareAndSet(existingValue, newValue)) { - return; - } - } - } -} +package com.baeldung.concurrent.atomic; + +import java.util.concurrent.atomic.AtomicInteger; + +public class SafeCounterWithoutLock { + private final AtomicInteger counter = new AtomicInteger(0); + + int getValue() { + return counter.get(); + } + + void increment() { + while(true) { + int existingValue = getValue(); + int newValue = existingValue + 1; + if(counter.compareAndSet(existingValue, newValue)) { + return; + } + } + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java similarity index 94% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java index 500ef5bd7e..290c26b73d 100644 --- a/core-java-concurrency/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java +++ b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/atomic/UnsafeCounter.java @@ -1,13 +1,13 @@ -package com.baeldung.concurrent.atomic; - -public class UnsafeCounter { - private int counter; - - int getValue() { - return counter; - } - - void increment() { - counter++; - } -} +package com.baeldung.concurrent.atomic; + +public class UnsafeCounter { + private int counter; + + int getValue() { + return counter; + } + + void increment() { + counter++; + } +} diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/BrokenWorker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/WaitingWorker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/countdownlatch/Worker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/MultipleThreadsExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/NewThread.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/NewThread.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/NewThread.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/daemon/SingleThreadExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/DiningPhilosophers.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/diningphilosophers/Philosopher.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddSemaphore.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/evenandodd/PrintEvenOddWaitNotify.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/ReentrantLockWithCondition.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SharedObjectWithLock.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/StampedLockDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLock.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/AverageCalculator.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/parameter/ParameterizedThreadExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/phaser/LongRunningAction.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/Job.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/JobPriority.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobScheduler.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/CounterUsingMutex.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/DelayQueueUsingTimedSemaphore.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/semaphores/LoginQueueUsingSemaphore.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/volatilekeyword/SharedObject.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/concurrent/yield/ThreadYield.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveAction.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/CustomRecursiveTask.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/forkjoin/util/PoolUtil.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/Context.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/Context.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/Context.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/Context.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/SharedMapWithUserContext.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/ThreadLocalWithUserContext.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocal/UserRepository.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/UserRepository.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocal/UserRepository.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocal/UserRepository.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarkRunner.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadlocalrandom/ThreadLocalRandomBenchMarker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/CountingTask.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/CountingTask.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadpool/CountingTask.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/CountingTask.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/ExitingExecutorServiceExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java b/core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/TreeNode.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/threadpool/TreeNode.java rename to core-java-concurrency-advanced/src/main/java/com/baeldung/threadpool/TreeNode.java diff --git a/core-java-concurrency/src/main/java/log4j.properties b/core-java-concurrency-advanced/src/main/java/log4j.properties similarity index 100% rename from core-java-concurrency/src/main/java/log4j.properties rename to core-java-concurrency-advanced/src/main/java/log4j.properties diff --git a/core-java-concurrency/src/main/resources/logback.xml b/core-java-concurrency-advanced/src/main/resources/logback.xml similarity index 100% rename from core-java-concurrency/src/main/resources/logback.xml rename to core-java-concurrency-advanced/src/main/resources/logback.xml diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/accumulator/LongAccumulatorUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/adder/LongAdderUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java similarity index 97% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java index 4eead471f8..c3c44b40cf 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java +++ b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadSafeCounterIntegrationTest.java @@ -1,38 +1,38 @@ -package com.baeldung.concurrent.atomic; - -import static org.junit.Assert.assertEquals; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; - -import org.junit.Test; - -public class ThreadSafeCounterIntegrationTest { - - @Test - public void givenMultiThread_whenSafeCounterWithLockIncrement() throws InterruptedException { - ExecutorService service = Executors.newFixedThreadPool(3); - SafeCounterWithLock safeCounter = new SafeCounterWithLock(); - - IntStream.range(0, 1000) - .forEach(count -> service.submit(safeCounter::increment)); - service.awaitTermination(100, TimeUnit.MILLISECONDS); - - assertEquals(1000, safeCounter.getValue()); - } - - @Test - public void givenMultiThread_whenSafeCounterWithoutLockIncrement() throws InterruptedException { - ExecutorService service = Executors.newFixedThreadPool(3); - SafeCounterWithoutLock safeCounter = new SafeCounterWithoutLock(); - - IntStream.range(0, 1000) - .forEach(count -> service.submit(safeCounter::increment)); - service.awaitTermination(100, TimeUnit.MILLISECONDS); - - assertEquals(1000, safeCounter.getValue()); - } - -} +package com.baeldung.concurrent.atomic; + +import static org.junit.Assert.assertEquals; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import org.junit.Test; + +public class ThreadSafeCounterIntegrationTest { + + @Test + public void givenMultiThread_whenSafeCounterWithLockIncrement() throws InterruptedException { + ExecutorService service = Executors.newFixedThreadPool(3); + SafeCounterWithLock safeCounter = new SafeCounterWithLock(); + + IntStream.range(0, 1000) + .forEach(count -> service.submit(safeCounter::increment)); + service.awaitTermination(100, TimeUnit.MILLISECONDS); + + assertEquals(1000, safeCounter.getValue()); + } + + @Test + public void givenMultiThread_whenSafeCounterWithoutLockIncrement() throws InterruptedException { + ExecutorService service = Executors.newFixedThreadPool(3); + SafeCounterWithoutLock safeCounter = new SafeCounterWithoutLock(); + + IntStream.range(0, 1000) + .forEach(count -> service.submit(safeCounter::increment)); + service.awaitTermination(100, TimeUnit.MILLISECONDS); + + assertEquals(1000, safeCounter.getValue()); + } + +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java similarity index 97% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java index cc7cc18bb5..bf451e58de 100644 --- a/core-java-concurrency/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java +++ b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/atomic/ThreadUnsafeCounterManualTest.java @@ -1,33 +1,33 @@ -package com.baeldung.concurrent.atomic; - -import static org.junit.Assert.assertEquals; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.TimeUnit; -import java.util.stream.IntStream; - -import org.junit.Test; - -/** - * This test shows the behaviour of a thread-unsafe class in a multithreaded scenario. We are calling - * the increment methods 1000 times from a pool of 3 threads. In most of the cases, the counter will - * less than 1000, because of lost updates, however, occasionally it may reach 1000, when no threads - * called the method simultaneously. This may cause the build to fail occasionally. Hence excluding this - * test from build by adding this in manual test - */ -public class ThreadUnsafeCounterManualTest { - - @Test - public void givenMultiThread_whenUnsafeCounterIncrement() throws InterruptedException { - ExecutorService service = Executors.newFixedThreadPool(3); - UnsafeCounter unsafeCounter = new UnsafeCounter(); - - IntStream.range(0, 1000) - .forEach(count -> service.submit(unsafeCounter::increment)); - service.awaitTermination(100, TimeUnit.MILLISECONDS); - - assertEquals(1000, unsafeCounter.getValue()); - } - -} +package com.baeldung.concurrent.atomic; + +import static org.junit.Assert.assertEquals; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import org.junit.Test; + +/** + * This test shows the behaviour of a thread-unsafe class in a multithreaded scenario. We are calling + * the increment methods 1000 times from a pool of 3 threads. In most of the cases, the counter will + * less than 1000, because of lost updates, however, occasionally it may reach 1000, when no threads + * called the method simultaneously. This may cause the build to fail occasionally. Hence excluding this + * test from build by adding this in manual test + */ +public class ThreadUnsafeCounterManualTest { + + @Test + public void givenMultiThread_whenUnsafeCounterIncrement() throws InterruptedException { + ExecutorService service = Executors.newFixedThreadPool(3); + UnsafeCounter unsafeCounter = new UnsafeCounter(); + + IntStream.range(0, 1000) + .forEach(count -> service.submit(unsafeCounter::increment)); + service.awaitTermination(100, TimeUnit.MILLISECONDS); + + assertEquals(1000, unsafeCounter.getValue()); + } + +} diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchCountExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchExampleIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/countdownlatch/CountdownLatchResetExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCompletionMethodExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierCountExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierResetExampleUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/daemon/DaemonThreadUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SharedObjectWithLockManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/locks/SynchronizedHashMapWithRWLockManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/phaser/PhaserUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/prioritytaskexecution/PriorityJobSchedulerUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/semaphores/SemaphoresManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/concurrent/volatilekeyword/SharedObjectManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/java8/Java8ForkJoinIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/parameters/ParameterizedThreadUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/thread/join/ThreadJoinUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocal/ThreadLocalIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadlocalrandom/ThreadLocalRandomIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/CoreThreadPoolIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java b/core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java rename to core-java-concurrency-advanced/src/test/java/com/baeldung/threadpool/GuavaThreadPoolIntegrationTest.java diff --git a/core-java-concurrency/src/test/resources/.gitignore b/core-java-concurrency-advanced/src/test/resources/.gitignore similarity index 100% rename from core-java-concurrency/src/test/resources/.gitignore rename to core-java-concurrency-advanced/src/test/resources/.gitignore diff --git a/core-java-concurrency-basic/.gitignore b/core-java-concurrency-basic/.gitignore new file mode 100644 index 0000000000..3de4cc647e --- /dev/null +++ b/core-java-concurrency-basic/.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-concurrency-basic/README.md b/core-java-concurrency-basic/README.md new file mode 100644 index 0000000000..1c43149d03 --- /dev/null +++ b/core-java-concurrency-basic/README.md @@ -0,0 +1,17 @@ +========= + +## 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 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) \ No newline at end of file diff --git a/core-java-concurrency-basic/pom.xml b/core-java-concurrency-basic/pom.xml new file mode 100644 index 0000000000..3544403aca --- /dev/null +++ b/core-java-concurrency-basic/pom.xml @@ -0,0 +1,55 @@ + + 4.0.0 + com.baeldung + core-java-concurrency-basic + 0.1.0-SNAPSHOT + jar + core-java-concurrency-basic + + + 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 + + + com.jayway.awaitility + awaitility + ${avaitility.version} + test + + + + + core-java-concurrency-basic + + + src/main/resources + true + + + + + + + 3.5 + + 3.6.1 + 1.7.0 + + + diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/Scheduledexecutorservice/ScheduledExecutorServiceDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/callable/FactorialTask.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/CyclicBarrierExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/cyclicbarrier/Task.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/ExecutorDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/Invoker.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/Invoker.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executor/Invoker.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executor/Invoker.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/DelayedCallable.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/ExecutorServiceDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/Task.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/Task.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/executorservice/Task.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/executorservice/Task.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FactorialSquareCalculator.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FutureDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FutureDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/future/FutureDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/FutureDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/future/SquareCalculator.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/EventLoggingTask.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/runnable/TaskRunner.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/semaphore/SemaPhoreDemo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadA.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/ThreadB.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/sleepwait/WaitSleepExample.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/stopping/ControlSubThread.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedBlocks.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizedMethods.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/BaeldungThreadFactory.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Demo.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Task.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Task.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadfactory/Task.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadfactory/Task.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/BlockedState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/NewState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/RunnableState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TerminatedState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/TimedWaitingState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/threadlifecycle/WaitingState.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Data.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/NetworkDriver.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Receiver.java diff --git a/core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java b/core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java similarity index 100% rename from core-java-concurrency/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java rename to core-java-concurrency-basic/src/main/java/com/baeldung/concurrent/waitandnotify/Sender.java diff --git a/core-java-concurrency-basic/src/main/resources/logback.xml b/core-java-concurrency-basic/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-concurrency-basic/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-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/callable/FactorialTaskManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/executorservice/WaitingForThreadsToFinishManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/FactorialSquareCalculatorUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/future/SquareCalculatorIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/runnable/RunnableVsThreadLiveTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/stopping/StopThreadManualTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSychronizedBlockUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/synchronize/BaeldungSynchronizeMethodsUnitTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/concurrent/waitandnotify/NetworkIntegrationTest.java diff --git a/core-java-concurrency/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java b/core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java similarity index 100% rename from core-java-concurrency/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java rename to core-java-concurrency-basic/src/test/java/com/baeldung/java8/Java8ExecutorServiceIntegrationTest.java diff --git a/core-java-concurrency-basic/src/test/resources/.gitignore b/core-java-concurrency-basic/src/test/resources/.gitignore new file mode 100644 index 0000000000..83c05e60c8 --- /dev/null +++ b/core-java-concurrency-basic/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 51c94458fb..6fc3e7910b 100644 --- a/pom.xml +++ b/pom.xml @@ -379,6 +379,7 @@ core-java-arrays core-java-collections + core-java-concurrency-basic core-java-concurrency-collections core-java-io core-java-lang-syntax @@ -990,7 +991,7 @@ parent-kotlin core-java - core-java-concurrency + core-java-concurrency-advanced core-kotlin jenkins/hello-world @@ -1088,6 +1089,7 @@ core-java-arrays core-java-collections + core-java-concurrency-basic core-java-concurrency-collections core-java-io core-java-lang-syntax @@ -1535,7 +1537,7 @@ parent-kotlin core-java - core-java-concurrency + core-java-concurrency-advanced core-kotlin jenkins/hello-world From 21bde94745d09a128bd3ce612ce3b525e10a0d93 Mon Sep 17 00:00:00 2001 From: kyleandari <44148335+kyleandari@users.noreply.github.com> Date: Tue, 25 Dec 2018 14:58:14 -0500 Subject: [PATCH 395/429] Java Interfaces Examples (#5992) * Implementing Hexagonal Architecture in java * Implementing multi-inheritance and Polymorphism using interfaces * Removing hexagonal code * Deleting hexagonal architecture code * fix for unit test names * Java Interfaces examples --- .../com/baeldung/interfaces/Electronic.java | 22 ++++++++++++++++++ .../com/baeldung/interfaces/Employee.java | 15 ++++++++++++ .../interfaces/EmployeeSalaryComparator.java | 18 +++++++++++++++ .../com/baeldung/interfaces/HasColor.java | 5 ++++ .../com/baeldung/interfaces/Motorcycle.java | 10 ++++++++ .../java/com/baeldung/interfaces/Truck.java | 8 +++++++ .../java/com/baeldung/interfaces/Vehicle.java | 6 +++++ .../interfaces/multiinheritance/Car.java | 13 +++++++++++ .../multiinheritance/Transform.java | 5 ++++ .../interfaces/polymorphysim/Circle.java | 4 ++++ .../polymorphysim/DisplayShape.java | 4 ++++ .../polymorphysim/FunctionalMain.java | 23 +++++++++++++++++++ .../interfaces/polymorphysim/Shape.java | 5 +++- .../interfaces/polymorphysim/Square.java | 5 ++++ 14 files changed, 142 insertions(+), 1 deletion(-) create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Employee.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Truck.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java create mode 100644 core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java b/core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java new file mode 100644 index 0000000000..bfbc381483 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Electronic.java @@ -0,0 +1,22 @@ +package com.baeldung.interfaces; + +public interface Electronic { + //Constant variable + public static final String LED = "LED"; + + //Abstract method + public int getElectricityUse(); + + // Static method + public static boolean isEnergyEfficient(String electtronicType) { + if (electtronicType.equals(LED)) { + return true; + } + return false; + } + + //Default method + public default void printDescription() { + System.out.println("Electronic Description"); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Employee.java b/core-java-8/src/main/java/com/baeldung/interfaces/Employee.java new file mode 100644 index 0000000000..903bc81e6f --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Employee.java @@ -0,0 +1,15 @@ +package com.baeldung.interfaces; + +public class Employee { + + private double salary; + + public double getSalary() { + return salary; + } + + public void setSalary(double salary) { + this.salary = salary; + } + +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java b/core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java new file mode 100644 index 0000000000..cfa4226c1a --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/EmployeeSalaryComparator.java @@ -0,0 +1,18 @@ +package com.baeldung.interfaces; + +import java.util.Comparator; + +public class EmployeeSalaryComparator implements Comparator { + + @Override + public int compare(Employee employeeA, Employee employeeB) { + + if(employeeA.getSalary() < employeeB.getSalary()){ + return -1; + }else if(employeeA.getSalary() > employeeB.getSalary()){ + return 1; + }else{ + return 0; + } + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java b/core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java new file mode 100644 index 0000000000..6eface2d47 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/HasColor.java @@ -0,0 +1,5 @@ +package com.baeldung.interfaces; + +public interface HasColor { + public String getColor(); +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java b/core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java new file mode 100644 index 0000000000..6003f476a3 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Motorcycle.java @@ -0,0 +1,10 @@ +package com.baeldung.interfaces; + +import com.baeldung.interfaces.multiinheritance.Transform; + +public class Motorcycle implements Transform { + @Override + public void transform() { + // Implementation + } +} \ No newline at end of file diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Truck.java b/core-java-8/src/main/java/com/baeldung/interfaces/Truck.java new file mode 100644 index 0000000000..d78de23371 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Truck.java @@ -0,0 +1,8 @@ +package com.baeldung.interfaces; + +public class Truck extends Vehicle { + @Override + public void transform() { + // implementation + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java b/core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java new file mode 100644 index 0000000000..8b4662e1a3 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/Vehicle.java @@ -0,0 +1,6 @@ +package com.baeldung.interfaces; + +import com.baeldung.interfaces.multiinheritance.Transform; + +public abstract class Vehicle implements Transform { +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java new file mode 100644 index 0000000000..b951fc0273 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Car.java @@ -0,0 +1,13 @@ +package com.baeldung.interfaces.multiinheritance; + +public class Car implements Fly, Transform { + @Override + public void fly() { + System.out.println("I can Fly!!"); + } + + @Override + public void transform() { + System.out.println("I can Transform!!"); + } +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java index a18bbafdc1..8bdba43a05 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/multiinheritance/Transform.java @@ -1,5 +1,10 @@ package com.baeldung.interfaces.multiinheritance; public interface Transform { + void transform(); + + default void printSpecs(){ + System.out.println("Transform Specification"); + } } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java index bf0e613567..afb3142d96 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Circle.java @@ -18,4 +18,8 @@ public class Circle implements Shape { return Math.PI * (radius * radius); } + @Override + public String getColor() { + return "green"; + } } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java index 2cf4fafee1..d9c9dd107a 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/DisplayShape.java @@ -6,6 +6,10 @@ public class DisplayShape { private ArrayList shapes; + public ArrayList getShapes() { + return shapes; + } + public DisplayShape() { shapes = new ArrayList<>(); } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java new file mode 100644 index 0000000000..5316dd7db7 --- /dev/null +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/FunctionalMain.java @@ -0,0 +1,23 @@ +package com.baeldung.interfaces.polymorphysim; + +import java.util.function.Predicate; + +public class FunctionalMain { + +public static void main(String[] args) { + Shape circleShape = new Circle(2); + Shape squareShape = new Square(2); + + DisplayShape DisplayShape = new DisplayShape(); + DisplayShape.add(circleShape); + DisplayShape.add(squareShape); + + Predicate checkArea = (shape) -> shape.area() < 5; + + for (Shape shape : DisplayShape.getShapes()) { + if (checkArea.test(shape)) { + System.out.println(shape.name() + " " + shape.area()); + } + } +} +} diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java index fcb0c65e7b..560e07a80a 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Shape.java @@ -1,6 +1,9 @@ package com.baeldung.interfaces.polymorphysim; -public interface Shape { +import com.baeldung.interfaces.HasColor; + +public interface Shape extends HasColor { + public abstract String name(); public abstract double area(); } diff --git a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java index 9c440150b5..00b75ace20 100644 --- a/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java +++ b/core-java-8/src/main/java/com/baeldung/interfaces/polymorphysim/Square.java @@ -17,4 +17,9 @@ public class Square implements Shape { public double area() { return width * width; } + + @Override + public String getColor() { + return "red"; + } } From 0a0701c947c5aad67d70742f308591e74b8f5055 Mon Sep 17 00:00:00 2001 From: Loredana Date: Wed, 26 Dec 2018 20:42:28 +0200 Subject: [PATCH 396/429] new module core-java-perf --- core-java-perf/README.md | 3 ++ core-java-perf/pom.xml | 33 +++++++++++++++++++ .../gc/VerboseGarbageCollectorRunner.java | 0 pom.xml | 4 ++- 4 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 core-java-perf/README.md create mode 100644 core-java-perf/pom.xml rename {core-java => core-java-perf}/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java (100%) diff --git a/core-java-perf/README.md b/core-java-perf/README.md new file mode 100644 index 0000000000..bd76388310 --- /dev/null +++ b/core-java-perf/README.md @@ -0,0 +1,3 @@ +## Core Java Performance + +### Relevant Articles: diff --git a/core-java-perf/pom.xml b/core-java-perf/pom.xml new file mode 100644 index 0000000000..062f76db77 --- /dev/null +++ b/core-java-perf/pom.xml @@ -0,0 +1,33 @@ + + 4.0.0 + com.baeldung + core-java-perf + 0.1.0-SNAPSHOT + jar + core-java-perf + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + + + + + 3.8.1 + + + + diff --git a/core-java/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java b/core-java-perf/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java similarity index 100% rename from core-java/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java rename to core-java-perf/src/main/java/com/baeldung/gc/VerboseGarbageCollectorRunner.java diff --git a/pom.xml b/pom.xml index 51c94458fb..a4588bf546 100644 --- a/pom.xml +++ b/pom.xml @@ -384,7 +384,8 @@ core-java-lang-syntax core-java-lang core-java-lang-oop - core-java-networking + core-java-networking + core-java-perf core-java-sun core-scala couchbase @@ -1094,6 +1095,7 @@ core-java-lang core-java-lang-oop core-java-networking + core-java-perf core-java-sun core-scala couchbase From a5cf9e4343a8f909a20c8a3036a96c3477cd7d32 Mon Sep 17 00:00:00 2001 From: greg Date: Thu, 27 Dec 2018 04:46:39 +0100 Subject: [PATCH 397/429] BAEL-2438 Difference between HashMap and HashTable (#5931) * BAEL-2368 convert string array to string * BAEL-2368 Convert array to string code * BAEL-2368 Change package * Fix for test * BAEL-2438 Difference between HashMap and HashTable --- .../HashmapVsHashtableDifferenceUnitTest.java | 98 +++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java diff --git a/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java b/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java new file mode 100644 index 0000000000..5218332d60 --- /dev/null +++ b/core-java-collections/src/test/java/com/baeldung/hashmapvshashtable/HashmapVsHashtableDifferenceUnitTest.java @@ -0,0 +1,98 @@ +package com.baeldung.hashmapvshashtable; + +import static org.junit.Assert.assertEquals; + +import java.util.Collections; +import java.util.ConcurrentModificationException; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.Hashtable; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +import org.junit.Test; + +import com.google.common.collect.Lists; + +public class HashmapVsHashtableDifferenceUnitTest { + + // null values + @Test(expected = NullPointerException.class) + public void givenHashtable_whenAddNullKey_thenNullPointerExceptionThrown() { + Hashtable table = new Hashtable(); + table.put(null, "value"); + } + + @Test(expected = NullPointerException.class) + public void givenHashtable_whenAddNullValue_thenNullPointerExceptionThrown() { + Hashtable table = new Hashtable(); + table.put("key", null); + } + + @Test + public void givenHashmap_whenAddNullKeyAndValue_thenObjectAdded() { + HashMap map = new HashMap(); + map.put(null, "value"); + map.put("key1", null); + map.put("key2", null); + + assertEquals(3, map.size()); + } + + // fail-fast iterator + @Test(expected = ConcurrentModificationException.class) + public void givenHashmap_whenModifyUnderlyingCollection_thenConcurrentModificationExceptionThrown() { + HashMap map = new HashMap(); + map.put("key1", "value1"); + map.put("key2", "value2"); + map.put("key3", "value3"); + + Iterator iterator = map.keySet().iterator(); + while(iterator.hasNext()){ + iterator.next(); + map.put("key4", "value4"); + } + } + + @Test + public void givenHashtable_whenModifyUnderlyingCollection_thenItHasNoEffectOnIteratedCollection() { + Hashtable table = new Hashtable(); + table.put("key1", "value1"); + table.put("key2", "value2"); + + List keysSelected = Lists.newArrayList(); + Enumeration keys = table.keys(); + while (keys.hasMoreElements()) { + String key = keys.nextElement(); + keysSelected.add(key); + + if (key.equals("key1")) { + table.put("key3", "value3"); + } + } + + assertEquals(2, keysSelected.size()); + } + + // synchronized map + @Test + public void givenHashmap_thenCreateSynchronizedMap() { + HashMap map = new HashMap(); + map.put("key1", "value1"); + map.put("key2", "value2"); + map.put("key3", "value3"); + + Set> set = map.entrySet(); + synchronized (map) { + Iterator> it = set.iterator(); + while(it.hasNext()) { + Map.Entry elem = (Map.Entry)it.next(); + } + } + + Map syncMap = Collections.synchronizedMap(map); + } +} From 67d011540ef655e03faef2a2dc795653c0806fbc Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Thu, 27 Dec 2018 12:35:01 +0200 Subject: [PATCH 398/429] Update README.md --- core-java-perf/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/core-java-perf/README.md b/core-java-perf/README.md index bd76388310..6af1c82a0a 100644 --- a/core-java-perf/README.md +++ b/core-java-perf/README.md @@ -1,3 +1,4 @@ ## Core Java Performance ### Relevant Articles: +- [Verbose Garbage Collection in Java](https://www.baeldung.com/java-verbose-gc) From 9e23ea5abee98cd5dfd874bb31619045e35e62fd Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Thu, 27 Dec 2018 17:02:37 +0530 Subject: [PATCH 399/429] simplier asserts --- .../src/test/java/com/baeldung/OuterUnitTest.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java index 6680a8d518..798736149a 100644 --- a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java +++ b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java @@ -1,9 +1,11 @@ package com.baeldung; +import static org.junit.Assert.assertTrue; import static org.hamcrest.CoreMatchers.is; import java.util.Arrays; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import org.junit.Test; @@ -33,18 +35,13 @@ public class OuterUnitTest { @Test public void whenGetNestMembersForNestedClasses_thenGetAllNestedClasses() { - List nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) + Set nestMembers = Arrays.stream(Outer.Inner.class.getNestMembers()) .map(Class::getName) - .collect(Collectors.toList()); + .collect(Collectors.toSet()); is(nestMembers.size()).equals(2); - boolean containsOuter = nestMembers.stream() - .anyMatch("com.baeldung.Outer"::equals); - is(containsOuter).equals(true); - - boolean containsInner = nestMembers.stream() - .anyMatch("com.baeldung.Outer$Inner"::equals); - is(containsInner).equals(true); + assertTrue(nestMembers.contains("com.baeldung.Outer")); + assertTrue(nestMembers.contains("com.baeldung.Outer$Inner")); } } \ No newline at end of file From 6ae59f8f8d36a8a20612fe449a7a33ec683c869b Mon Sep 17 00:00:00 2001 From: Ganesh Pagade Date: Thu, 27 Dec 2018 17:08:34 +0530 Subject: [PATCH 400/429] clean up --- core-java-11/src/test/java/com/baeldung/OuterUnitTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java index 798736149a..9e6bd72680 100644 --- a/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java +++ b/core-java-11/src/test/java/com/baeldung/OuterUnitTest.java @@ -4,7 +4,6 @@ import static org.junit.Assert.assertTrue; import static org.hamcrest.CoreMatchers.is; import java.util.Arrays; -import java.util.List; import java.util.Set; import java.util.stream.Collectors; import org.junit.Test; From 07f762dfc8838acb09bf53ce1d4bf960d117baf7 Mon Sep 17 00:00:00 2001 From: raghav-jha Date: Fri, 28 Dec 2018 04:22:09 +0530 Subject: [PATCH 401/429] BAEL-2436 * BAEL-2436 Type Safe Criteria Queries Using Hibernate Metamodel * Formattng fixes * Formatting fixes --- persistence-modules/hibernate5/pom.xml | 1 - .../java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java | 1 - 2 files changed, 2 deletions(-) diff --git a/persistence-modules/hibernate5/pom.xml b/persistence-modules/hibernate5/pom.xml index 9bfea14d30..af94025a73 100644 --- a/persistence-modules/hibernate5/pom.xml +++ b/persistence-modules/hibernate5/pom.xml @@ -72,7 +72,6 @@ org.hibernate hibernate-jpamodelgen ${hibernate.version} - provided diff --git a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java index 0d11ea1567..35cfe55ba6 100644 --- a/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java +++ b/persistence-modules/hibernate5/src/main/java/com/baeldung/hibernate/criteriaquery/HibernateUtil.java @@ -35,7 +35,6 @@ public class HibernateUtil { Metadata metadata = metadataSources.getMetadataBuilder() .applyBasicType(LocalDateStringType.INSTANCE) .build(); - return metadata.getSessionFactoryBuilder().build(); } catch (IOException ex) { throw new ExceptionInInitializerError(ex); From 5cc9a60c591e249d281ef97c55662eb780785f61 Mon Sep 17 00:00:00 2001 From: KevinGilmore Date: Fri, 28 Dec 2018 00:05:55 -0600 Subject: [PATCH 402/429] BAEL-2367: update README (#6006) * 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 --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index cbc32d0015..4d735490ce 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -43,3 +43,4 @@ - [Pad a String with Zeros or Spaces in Java](https://www.baeldung.com/java-pad-string) - [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) From 15071b6d49ef751184dbf7fbd033553257a69400 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Fri, 28 Dec 2018 10:44:23 +0200 Subject: [PATCH 403/429] Update README.md --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index b6e112b5fc..c066ccb50b 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -21,3 +21,4 @@ - [Custom Types in Hibernate](https://www.baeldung.com/hibernate-custom-types) - [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions) - [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) +- [Hibernate 5 Bootstrapping API](https://www.baeldung.com/hibernate-5-bootstrapping-api) From 5aed1b89bbceaa2d91b49675779a72c3d80578ff Mon Sep 17 00:00:00 2001 From: Ali Dehghani Date: Fri, 28 Dec 2018 17:17:13 +0330 Subject: [PATCH 404/429] Added a test for Optional#isEmpty. (#5938) --- .../baeldung/optional/OptionalUnitTest.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java diff --git a/core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java b/core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java new file mode 100644 index 0000000000..281155138d --- /dev/null +++ b/core-java-11/src/test/java/com/baeldung/optional/OptionalUnitTest.java @@ -0,0 +1,23 @@ +package com.baeldung.optional; + +import org.junit.Test; + +import java.util.Optional; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +/** + * Unit tests for {@link Optional} in Java 11. + */ +public class OptionalUnitTest { + + @Test + public void givenAnEmptyOptional_isEmpty_thenBehavesAsExpected() { + Optional opt = Optional.of("Baeldung"); + assertFalse(opt.isEmpty()); + + opt = Optional.ofNullable(null); + assertTrue(opt.isEmpty()); + } +} From 415ecc6421ff449dba0fc09458f2aa896c54af16 Mon Sep 17 00:00:00 2001 From: Loredana Date: Fri, 28 Dec 2018 16:22:03 +0200 Subject: [PATCH 405/429] remove completablefuture --- .../controllers/EthereumRestController.java | 16 +++++------ .../baeldung/web3j/services/Web3Service.java | 28 +++++++++---------- .../services/EthereumContractUnitTest.java | 10 +++---- 3 files changed, 26 insertions(+), 28 deletions(-) diff --git a/ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java b/ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java index e05517bc79..3238a19ff9 100644 --- a/ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java +++ b/ethereum/src/main/java/com/baeldung/web3j/controllers/EthereumRestController.java @@ -32,8 +32,8 @@ public class EthereumRestController { return CompletableFuture.supplyAsync(() -> { try { - CompletableFuture result = web3Service.getBlockNumber(); - responseTransfer.setMessage(result.get().toString()); + EthBlockNumber result = web3Service.getBlockNumber(); + responseTransfer.setMessage(result.toString()); } catch (Exception e) { responseTransfer.setMessage(GENERIC_EXCEPTION); } @@ -51,8 +51,8 @@ public class EthereumRestController { return CompletableFuture.supplyAsync(() -> { try { - CompletableFuture result = web3Service.getEthAccounts(); - responseTransfer.setMessage(result.get().toString()); + EthAccounts result = web3Service.getEthAccounts(); + responseTransfer.setMessage(result.toString()); } catch (Exception e) { responseTransfer.setMessage(GENERIC_EXCEPTION); } @@ -70,8 +70,8 @@ public class EthereumRestController { Instant start = TimeHelper.start(); return CompletableFuture.supplyAsync(() -> { try { - CompletableFuture result = web3Service.getTransactionCount(); - responseTransfer.setMessage(result.get().toString()); + EthGetTransactionCount result = web3Service.getTransactionCount(); + responseTransfer.setMessage(result.toString()); } catch (Exception e) { responseTransfer.setMessage(GENERIC_EXCEPTION); } @@ -88,8 +88,8 @@ public class EthereumRestController { Instant start = TimeHelper.start(); return CompletableFuture.supplyAsync(() -> { try { - CompletableFuture result = web3Service.getEthBalance(); - responseTransfer.setMessage(result.get().toString()); + EthGetBalance result = web3Service.getEthBalance(); + responseTransfer.setMessage(result.toString()); } catch (Exception e) { responseTransfer.setMessage(GENERIC_EXCEPTION); } diff --git a/ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java b/ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java index c943ee4006..4b7d01e52b 100644 --- a/ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java +++ b/ethereum/src/main/java/com/baeldung/web3j/services/Web3Service.java @@ -47,47 +47,47 @@ public class Web3Service { return "0x" + binary; } - public CompletableFuture getBlockNumber() { + public EthBlockNumber getBlockNumber() { EthBlockNumber result = new EthBlockNumber(); try { result = this.web3j.ethBlockNumber().sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } - return CompletableFuture.completedFuture(result); + return result; } - public CompletableFuture getEthAccounts() { + public EthAccounts getEthAccounts() { EthAccounts result = new EthAccounts(); try { result = this.web3j.ethAccounts().sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } - return CompletableFuture.completedFuture(result); + return result; } - public CompletableFuture getTransactionCount() { + public EthGetTransactionCount getTransactionCount() { EthGetTransactionCount result = new EthGetTransactionCount(); try { result = this.web3j.ethGetTransactionCount(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } - return CompletableFuture.completedFuture(result); + return result; } - public CompletableFuture getEthBalance() { + public EthGetBalance getEthBalance() { EthGetBalance result = new EthGetBalance(); try { result = this.web3j.ethGetBalance(DEFAULT_ADDRESS, DefaultBlockParameter.valueOf("latest")).sendAsync().get(); } catch (Exception ex) { System.out.println(GENERIC_EXCEPTION); } - return CompletableFuture.completedFuture(result); + return result; } - public CompletableFuture fromScratchContractExample() { + public String fromScratchContractExample() { String contractAddress = ""; @@ -108,13 +108,13 @@ public class Web3Service { } catch (Exception ex) { System.out.println(PLEASE_SUPPLY_REAL_DATA); - return CompletableFuture.completedFuture(PLEASE_SUPPLY_REAL_DATA); + return PLEASE_SUPPLY_REAL_DATA; } - return CompletableFuture.completedFuture(contractAddress); + return contractAddress; } @Async - public CompletableFuture sendTx() { + public String sendTx() { String transactionHash = ""; try { @@ -135,10 +135,10 @@ public class Web3Service { } catch (Exception ex) { System.out.println(PLEASE_SUPPLY_REAL_DATA); - return CompletableFuture.completedFuture(PLEASE_SUPPLY_REAL_DATA); + return PLEASE_SUPPLY_REAL_DATA; } - return CompletableFuture.completedFuture(transactionHash); + return transactionHash; } } diff --git a/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java b/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java index 382c96e985..ff02659bd5 100644 --- a/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java +++ b/ethereum/src/test/java/com/baeldung/web3j/services/EthereumContractUnitTest.java @@ -4,8 +4,6 @@ import org.junit.After; import org.junit.Before; import org.junit.Test; -import java.util.concurrent.CompletableFuture; - public class EthereumContractUnitTest { private Web3Service web3Service; @@ -17,14 +15,14 @@ public class EthereumContractUnitTest { @Test public void testContract() { - CompletableFuture result = web3Service.fromScratchContractExample(); - assert (result instanceof CompletableFuture); + String result = web3Service.fromScratchContractExample(); + assert (result instanceof String); } @Test public void sendTx() { - CompletableFuture result = web3Service.sendTx(); - assert (result instanceof CompletableFuture); + String result = web3Service.sendTx(); + assert (result instanceof String); } @After From 4d6cb52be4642c22cfa57ed52162c695ebe6b2f5 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Fri, 28 Dec 2018 21:57:38 +0530 Subject: [PATCH 406/429] BAEL-1978: Added a test to demostrate classpath resource with relative path --- .../SpringResourceIntegrationTest.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java index 38e8304f0f..284776fdfa 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java @@ -7,6 +7,8 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.net.URL; +import java.net.URLClassLoader; import java.nio.file.Files; import java.util.stream.Collectors; @@ -23,6 +25,8 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.util.ResourceUtils; +import com.baeldung.dependson.config.TestConfig; + /** * Test class illustrating various methods of accessing a file from the classpath using Resource. * @author tritty @@ -98,4 +102,19 @@ public class SpringResourceIntegrationTest { final String employees = new String(Files.readAllBytes(resource.toPath())); assertEquals(EMPLOYEES_EXPECTED, employees); } + + @Test + public void whenClassPathResourceWithAbsoultePath_thenReadSuccessful() throws IOException { + final File resource = new ClassPathResource("/data/employees.dat", this.getClass()).getFile(); + final String employees = new String(Files.readAllBytes(resource.toPath())); + assertEquals(EMPLOYEES_EXPECTED, employees); + } + + @Test + public void whenClassPathResourceWithRelativePath_thenReadSuccessful() throws IOException { +// final File resource = new ClassPathResource("../../../data/employees.dat", SpringResourceIntegrationTest.class).getFile(); + final File resource = new ClassPathResource("/data/employees.dat", SpringResourceIntegrationTest.class).getFile(); + final String employees = new String(Files.readAllBytes(resource.toPath())); + assertEquals(EMPLOYEES_EXPECTED, employees); + } } From c3eb5c939fff07533096eabb859096970eb147ad Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Fri, 28 Dec 2018 22:00:35 +0530 Subject: [PATCH 407/429] BAEL-1978: Added a test to demostrate classpath resource with relative path --- .../com/baeldung/resource/SpringResourceIntegrationTest.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java index 284776fdfa..c1464feded 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java @@ -7,8 +7,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLClassLoader; import java.nio.file.Files; import java.util.stream.Collectors; @@ -25,8 +23,6 @@ import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import org.springframework.test.context.support.AnnotationConfigContextLoader; import org.springframework.util.ResourceUtils; -import com.baeldung.dependson.config.TestConfig; - /** * Test class illustrating various methods of accessing a file from the classpath using Resource. * @author tritty From 3220d1b958446f47ac7d4a4c259f94405b306beb Mon Sep 17 00:00:00 2001 From: Loredana Date: Sat, 29 Dec 2018 00:27:55 +0200 Subject: [PATCH 408/429] fix spring-core mockito issue --- spring-core/pom.xml | 1 + .../com/baeldung/resource/SpringResourceIntegrationTest.java | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/spring-core/pom.xml b/spring-core/pom.xml index 60f3262f08..f1e2e2a748 100644 --- a/spring-core/pom.xml +++ b/spring-core/pom.xml @@ -85,6 +85,7 @@ 1.16.12 2.5 1.5.2.RELEASE + 1.10.19 \ No newline at end of file diff --git a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java index c1464feded..a7a2a9032a 100644 --- a/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java +++ b/spring-core/src/test/java/com/baeldung/resource/SpringResourceIntegrationTest.java @@ -108,8 +108,7 @@ public class SpringResourceIntegrationTest { @Test public void whenClassPathResourceWithRelativePath_thenReadSuccessful() throws IOException { -// final File resource = new ClassPathResource("../../../data/employees.dat", SpringResourceIntegrationTest.class).getFile(); - final File resource = new ClassPathResource("/data/employees.dat", SpringResourceIntegrationTest.class).getFile(); + final File resource = new ClassPathResource("../../../data/employees.dat", SpringResourceIntegrationTest.class).getFile(); final String employees = new String(Files.readAllBytes(resource.toPath())); assertEquals(EMPLOYEES_EXPECTED, employees); } From a1b1e02e71df82eb3ff6d267efdd3db7643ea804 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Fri, 28 Dec 2018 16:11:16 -0700 Subject: [PATCH 409/429] BAEL-2421 Update readme (#6014) --- java-strings/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/java-strings/README.md b/java-strings/README.md index 4d735490ce..60131e392d 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -44,3 +44,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) +- [Convert a Comma Separated String to a List in Java](https://www.baeldung.com/java-string-with-separator-to-list) From 2c801888e7f3e538f2371d6ad1627ebc761128ca Mon Sep 17 00:00:00 2001 From: FrancoCorleone Date: Sat, 29 Dec 2018 00:18:30 +0100 Subject: [PATCH 410/429] BAEL-2090 Insert with JPA * Adding inserts for JPA objects repositories * Refactor tests * Small refactor * Small refactor * Remove redundant @Repository annotation * Refactor tests * Change to simple entity manager implementation * Refactor changes * Remove Spring repositories, Add simple implementation using EntityManager * Remove redundant Interface * Remove redundant files * Update persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonInsertRepository.java Co-Authored-By: FrancoCorleone --- .../dao/repositories/InsertRepository.java | 5 -- .../PersonEntityManagerInsertRepository.java | 7 -- .../PersonEntityManagerRepository.java | 10 --- .../PersonQueryInsertRepository.java | 7 -- .../repositories/PersonQueryRepository.java | 16 ----- ...rsonEntityManagerInsertRepositoryImpl.java | 21 ------ ...yImpl.java => PersonInsertRepository.java} | 18 +++-- ...PersonInsertRepositoryIntegrationTest.java | 67 +++++++------------ 8 files changed, 35 insertions(+), 116 deletions(-) delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java delete mode 100644 persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java rename persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/{PersonQueryInsertRepositoryImpl.java => PersonInsertRepository.java} (60%) diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java deleted file mode 100644 index 6a74e067fe..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/InsertRepository.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.baeldung.dao.repositories; - -public interface InsertRepository { - void insert(S entity); -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java deleted file mode 100644 index 6d3cbb07df..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerInsertRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.dao.repositories; - -import com.baeldung.domain.Person; - -public interface PersonEntityManagerInsertRepository { - void insert(Person person); -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java deleted file mode 100644 index cbf3d59620..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonEntityManagerRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.baeldung.dao.repositories; - -import com.baeldung.domain.Person; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface PersonEntityManagerRepository extends JpaRepository, PersonEntityManagerInsertRepository { - -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java deleted file mode 100644 index be01e9883a..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryInsertRepository.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.baeldung.dao.repositories; - -import com.baeldung.domain.Person; - -public interface PersonQueryInsertRepository { - void insert(Person person); -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java deleted file mode 100644 index 1516c38443..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/PersonQueryRepository.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.baeldung.dao.repositories; - -import com.baeldung.domain.Person; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Modifying; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface PersonQueryRepository extends JpaRepository, PersonQueryInsertRepository { - - @Modifying - @Query(value = "INSERT INTO person (id, first_name, last_name) VALUES (:id,:firstName,:lastName)", nativeQuery = true) - void insertWithAnnotation(@Param("id") Long id, @Param("firstName") String firstName, @Param("lastName") String lastName); -} diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java deleted file mode 100644 index c14cc44125..0000000000 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonEntityManagerInsertRepositoryImpl.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.baeldung.dao.repositories.impl; - -import com.baeldung.dao.repositories.PersonEntityManagerInsertRepository; -import com.baeldung.domain.Person; -import org.springframework.transaction.annotation.Transactional; - -import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; - -@Transactional -public class PersonEntityManagerInsertRepositoryImpl implements PersonEntityManagerInsertRepository { - - @PersistenceContext - private EntityManager entityManager; - - @Override - public void insert(Person person) { - this.entityManager.persist(person); - } -} - diff --git a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonInsertRepository.java similarity index 60% rename from persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java rename to persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonInsertRepository.java index 341db1615d..d809385456 100644 --- a/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonQueryInsertRepositoryImpl.java +++ b/persistence-modules/spring-data-jpa/src/main/java/com/baeldung/dao/repositories/impl/PersonInsertRepository.java @@ -1,24 +1,30 @@ package com.baeldung.dao.repositories.impl; -import com.baeldung.dao.repositories.PersonQueryInsertRepository; import com.baeldung.domain.Person; +import org.springframework.stereotype.Repository; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.transaction.Transactional; -@Transactional -public class PersonQueryInsertRepositoryImpl implements PersonQueryInsertRepository { +@Repository +public class PersonInsertRepository { @PersistenceContext private EntityManager entityManager; - @Override - public void insert(Person person) { - entityManager.createNativeQuery("INSERT INTO person (id,first_name, last_name) VALUES (?,?,?)") + @Transactional + public void insertWithQuery(Person person) { + entityManager.createNativeQuery("INSERT INTO person (id, first_name, last_name) VALUES (?,?,?)") .setParameter(1, person.getId()) .setParameter(2, person.getFirstName()) .setParameter(3, person.getLastName()) .executeUpdate(); } + + @Transactional + public void insertWithEntityManager(Person person) { + this.entityManager.persist(person); + } + } diff --git a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java index 476554f6d6..b248cf8bf1 100644 --- a/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java +++ b/persistence-modules/spring-data-jpa/src/test/java/com/baeldung/dao/repositories/PersonInsertRepositoryIntegrationTest.java @@ -1,21 +1,24 @@ package com.baeldung.dao.repositories; +import com.baeldung.dao.repositories.impl.PersonInsertRepository; import com.baeldung.domain.Person; import org.junit.Test; -import org.junit.jupiter.api.BeforeEach; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; -import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.context.annotation.Import; import org.springframework.test.context.junit4.SpringRunner; -import java.util.Optional; +import javax.persistence.EntityExistsException; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceException; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import static org.assertj.core.api.AssertionsForClassTypes.assertThat; @RunWith(SpringRunner.class) @DataJpaTest +@Import(PersonInsertRepository.class) public class PersonInsertRepositoryIntegrationTest { private static final Long ID = 1L; @@ -24,43 +27,23 @@ public class PersonInsertRepositoryIntegrationTest { private static final Person PERSON = new Person(ID, FIRST_NAME, LAST_NAME); @Autowired - private PersonQueryRepository personQueryRepository; + private PersonInsertRepository personInsertRepository; @Autowired - private PersonEntityManagerRepository personEntityManagerRepository; - - @BeforeEach - public void clearDB() { - personQueryRepository.deleteAll(); - } + private EntityManager entityManager; @Test public void givenPersonEntity_whenInsertWithNativeQuery_ThenPersonIsPersisted() { - insertPerson(); + insertWithQuery(); assertPersonPersisted(); } @Test - public void givenPersonEntity_whenInsertedTwiceWithNativeQuery_thenDataIntegrityViolationExceptionIsThrown() { - assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { - insertPerson(); - insertPerson(); - }); - } - - @Test - public void givenPersonEntity_whenInsertWithQueryAnnotation_thenPersonIsPersisted() { - insertPersonWithQueryAnnotation(); - - assertPersonPersisted(); - } - - @Test - public void givenPersonEntity_whenInsertedTwiceWithQueryAnnotation_thenDataIntegrityViolationExceptionIsThrown() { - assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { - insertPersonWithQueryAnnotation(); - insertPersonWithQueryAnnotation(); + public void givenPersonEntity_whenInsertedTwiceWithNativeQuery_thenPersistenceExceptionExceptionIsThrown() { + assertThatExceptionOfType(PersistenceException.class).isThrownBy(() -> { + insertWithQuery(); + insertWithQuery(); }); } @@ -72,31 +55,27 @@ public class PersonInsertRepositoryIntegrationTest { } @Test - public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenDataIntegrityViolationExceptionIsThrown() { - assertThatExceptionOfType(DataIntegrityViolationException.class).isThrownBy(() -> { + public void givenPersonEntity_whenInsertedTwiceWithEntityManager_thenEntityExistsExceptionIsThrown() { + assertThatExceptionOfType(EntityExistsException.class).isThrownBy(() -> { insertPersonWithEntityManager(); insertPersonWithEntityManager(); }); } - private void insertPerson() { - personQueryRepository.insert(PERSON); - } - - private void insertPersonWithQueryAnnotation() { - personQueryRepository.insertWithAnnotation(ID, FIRST_NAME, LAST_NAME); + private void insertWithQuery() { + personInsertRepository.insertWithQuery(PERSON); } private void insertPersonWithEntityManager() { - personEntityManagerRepository.insert(new Person(ID, FIRST_NAME, LAST_NAME)); + personInsertRepository.insertWithEntityManager(new Person(ID, FIRST_NAME, LAST_NAME)); } private void assertPersonPersisted() { - Optional personOptional = personQueryRepository.findById(PERSON.getId()); + Person person = entityManager.find(Person.class, ID); - assertThat(personOptional.isPresent()).isTrue(); - assertThat(personOptional.get().getId()).isEqualTo(PERSON.getId()); - assertThat(personOptional.get().getFirstName()).isEqualTo(PERSON.getFirstName()); - assertThat(personOptional.get().getLastName()).isEqualTo(PERSON.getLastName()); + assertThat(person).isNotNull(); + assertThat(person.getId()).isEqualTo(PERSON.getId()); + assertThat(person.getFirstName()).isEqualTo(PERSON.getFirstName()); + assertThat(person.getLastName()).isEqualTo(PERSON.getLastName()); } } From 33ba36dc4140f9dec604eea6adc0155b6c287643 Mon Sep 17 00:00:00 2001 From: Yatendra Goel Date: Sat, 29 Dec 2018 13:30:46 +0530 Subject: [PATCH 411/429] BAEL-2307: Added Code to add SAN needed by Chrome to the X509 Certificate --- .../keystore/JavaKeyStoreUnitTest.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java b/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java index cb2a9f1c49..7473c52a35 100644 --- a/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java +++ b/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java @@ -4,15 +4,24 @@ import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; + import sun.security.x509.AlgorithmId; import sun.security.x509.CertificateAlgorithmId; import sun.security.x509.CertificateSerialNumber; import sun.security.x509.CertificateValidity; import sun.security.x509.CertificateVersion; import sun.security.x509.CertificateX509Key; +import sun.security.x509.SubjectAlternativeNameExtension; import sun.security.x509.X500Name; import sun.security.x509.X509CertImpl; import sun.security.x509.X509CertInfo; +import sun.security.x509.CertificateExtensions; +import sun.security.x509.GeneralNames; +import sun.security.x509.GeneralName; +import sun.security.x509.GeneralNameInterface; +import sun.security.x509.DNSName; +import sun.security.x509.IPAddressName; +import sun.security.util.DerOutputStream; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; @@ -188,6 +197,23 @@ public class JavaKeyStoreUnitTest { Date validTo = new Date(validFrom.getTime() + 50L * 365L * 24L * 60L * 60L * 1000L); //50 years CertificateValidity validity = new CertificateValidity(validFrom, validTo); certInfo.set(X509CertInfo.VALIDITY, validity); + + GeneralNameInterface dnsName = new DNSName("baeldung.com"); + DerOutputStream dnsNameOutputStream = new DerOutputStream(); + dnsName.encode(dnsNameOutputStream); + + GeneralNameInterface ipAddress = new IPAddressName("127.0.0.1"); + DerOutputStream ipAddressOutputStream = new DerOutputStream(); + ipAddress.encode(ipAddressOutputStream); + + GeneralNames generalNames = new GeneralNames(); + generalNames.add(new GeneralName(dnsName)); + generalNames.add(new GeneralName(ipAddress)); + + CertificateExtensions ext = new CertificateExtensions(); + ext.set(SubjectAlternativeNameExtension.NAME, new SubjectAlternativeNameExtension(generalNames)); + + certInfo.set(X509CertInfo.EXTENSIONS, ext); // Create certificate and sign it X509CertImpl cert = new X509CertImpl(certInfo); @@ -202,4 +228,5 @@ public class JavaKeyStoreUnitTest { return newCert; } + } \ No newline at end of file From cf3d7b69e6e43f9f4d232b97e69c09a400f3d24a Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 29 Dec 2018 20:11:40 +0530 Subject: [PATCH 412/429] [BAEL-10836] - Moved Java8CollectionCleanupUnitTest, AddElementsUnitTest and articles --- core-java-collections-list/README.md | 1 - .../src/main/java/com/baeldung/list/Flower.java | 0 .../java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java | 0 .../src/test/java/com/baeldung/list/AddElementsUnitTest.java | 0 java-collections-conversions/README.md | 1 + 5 files changed, 1 insertion(+), 1 deletion(-) rename {core-java-8 => core-java-collections-list}/src/main/java/com/baeldung/list/Flower.java (100%) rename {core-java-8 => core-java-collections-list}/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java (100%) rename {core-java-8 => core-java-collections-list}/src/test/java/com/baeldung/list/AddElementsUnitTest.java (100%) diff --git a/core-java-collections-list/README.md b/core-java-collections-list/README.md index cb6999277c..aba53f5b30 100644 --- a/core-java-collections-list/README.md +++ b/core-java-collections-list/README.md @@ -17,7 +17,6 @@ - [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) -- [Converting a Collection to ArrayList in Java](https://www.baeldung.com/java-convert-collection-arraylist) - [Check If Two Lists are Equal in Java](http://www.baeldung.com/java-test-a-list-for-ordinality-and-equality) - [Java 8 Streams: Find Items From One List Based On Values From Another List](https://www.baeldung.com/java-streams-find-list-items) - [A Guide to the Java LinkedList](http://www.baeldung.com/java-linkedlist) diff --git a/core-java-8/src/main/java/com/baeldung/list/Flower.java b/core-java-collections-list/src/main/java/com/baeldung/list/Flower.java similarity index 100% rename from core-java-8/src/main/java/com/baeldung/list/Flower.java rename to core-java-collections-list/src/main/java/com/baeldung/list/Flower.java diff --git a/core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/java8/Java8CollectionCleanupUnitTest.java diff --git a/core-java-8/src/test/java/com/baeldung/list/AddElementsUnitTest.java b/core-java-collections-list/src/test/java/com/baeldung/list/AddElementsUnitTest.java similarity index 100% rename from core-java-8/src/test/java/com/baeldung/list/AddElementsUnitTest.java rename to core-java-collections-list/src/test/java/com/baeldung/list/AddElementsUnitTest.java diff --git a/java-collections-conversions/README.md b/java-collections-conversions/README.md index 0f89e07d63..31fead3c42 100644 --- a/java-collections-conversions/README.md +++ b/java-collections-conversions/README.md @@ -10,3 +10,4 @@ - [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) - [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) \ No newline at end of file From 8b65216ba33e90c6f4c3d4cf3a3a85e773a85eed Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Sat, 29 Dec 2018 08:13:10 -0700 Subject: [PATCH 413/429] BAEL-2436 update readme (#6019) --- persistence-modules/hibernate5/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/hibernate5/README.md b/persistence-modules/hibernate5/README.md index c066ccb50b..2b948a683a 100644 --- a/persistence-modules/hibernate5/README.md +++ b/persistence-modules/hibernate5/README.md @@ -22,3 +22,4 @@ - [Criteria API – An Example of IN Expressions](https://www.baeldung.com/jpa-criteria-api-in-expressions) - [Difference Between @JoinColumn and mappedBy](https://www.baeldung.com/jpa-joincolumn-vs-mappedby) - [Hibernate 5 Bootstrapping API](https://www.baeldung.com/hibernate-5-bootstrapping-api) +- [Criteria Queries Using JPA Metamodel](https://www.baeldung.com/hibernate-criteria-queries-metamodel) From c61ac5101e8732677f44b4b9efe5956dcdcb34ed Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 29 Dec 2018 21:54:59 +0530 Subject: [PATCH 414/429] [BAEL-11401] - Moved articles out of core-java (part 2) --- core-java-networking/README.md | 3 +++ core-java-networking/pom.xml | 12 ++++++++++++ .../baeldung/http/FullResponseBuilder.java | 0 .../baeldung/http/ParameterStringBuilder.java | 0 .../java/com/baeldung/socket/EchoClient.java | 0 .../com/baeldung/socket/EchoMultiServer.java | 0 .../java/com/baeldung/socket/EchoServer.java | 0 .../java/com/baeldung/socket/GreetClient.java | 0 .../java/com/baeldung/socket/GreetServer.java | 0 .../EncoderDecoderUnitTest.java | 0 .../baeldung/http/HttpRequestLiveTest.java | 2 +- .../baeldung/socket/EchoIntegrationTest.java | 0 .../socket/GreetServerIntegrationTest.java | 0 .../SocketEchoMultiIntegrationTest.java | 0 core-java-perf/README.md | 4 ++++ .../java/com/baeldung/heapdump/HeapDump.java | 0 .../src/main/java/com/baeldung/jmx/Game.java | 0 .../main/java/com/baeldung/jmx/GameMBean.java | 0 .../baeldung/jmx/JMXTutorialMainlauncher.java | 0 .../memoryleaks/equalshashcode/Person.java | 0 .../equalshashcode/PersonOptimized.java | 0 .../memoryleaks/finalize/BulkyObject.java | 0 .../finalize/BulkyObjectOptimized.java | 0 .../memoryleaks/innerclass/BulkyObject.java | 0 .../innerclass/InnerClassDriver.java | 0 .../innerclass/InnerClassWrapper.java | 0 .../innerclass/StaticNestedClassWrapper.java | 0 .../internedstrings/InternedString.java | 0 .../ReadStringFromFileUtil.java | 0 .../internedstrings/StringObject.java | 0 .../staticfields/NonStaticFieldsDemo.java | 0 .../staticfields/StaticFieldsDemo.java | 0 .../OutOfMemoryGCLimitExceed.java | 0 core-java-perf/src/main/resources/logback.xml | 19 +++++++++++++++++++ .../PersonMemoryLeakUnitTest.java | 0 .../finalize/FinalizeMemoryLeakUnitTest.java | 0 .../StaticInnerClassMemoryLeakUnitTest.java | 0 .../StringInternMemoryLeakUnitTest.java | 0 .../NonStaticFieldsMemoryLeakUnitTest.java | 0 .../StaticFieldsMemoryLeakUnitTest.java | 0 core-java-sun/README.md | 1 + .../java/com/baeldung/unsafe/CASCounter.java | 0 .../com/baeldung/unsafe/OffHeapArray.java | 0 .../com/baeldung/unsafe/UnsafeUnitTest.java | 0 core-java/README.md | 8 -------- 45 files changed, 40 insertions(+), 9 deletions(-) rename {core-java => core-java-networking}/src/main/java/com/baeldung/http/FullResponseBuilder.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/http/ParameterStringBuilder.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/EchoClient.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/EchoMultiServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/EchoServer.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/GreetClient.java (100%) rename {core-java => core-java-networking}/src/main/java/com/baeldung/socket/GreetServer.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/http/HttpRequestLiveTest.java (99%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/socket/EchoIntegrationTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java (100%) rename {core-java => core-java-networking}/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/heapdump/HeapDump.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/jmx/Game.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/jmx/GameMBean.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java (100%) rename {core-java => core-java-perf}/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java (100%) create mode 100644 core-java-perf/src/main/resources/logback.xml rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java (100%) rename {core-java => core-java-perf}/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java (100%) rename {core-java => core-java-sun}/src/test/java/com/baeldung/unsafe/CASCounter.java (100%) rename {core-java => core-java-sun}/src/test/java/com/baeldung/unsafe/OffHeapArray.java (100%) rename {core-java => core-java-sun}/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java (100%) diff --git a/core-java-networking/README.md b/core-java-networking/README.md index 4b77aa3c1f..b2367782b6 100644 --- a/core-java-networking/README.md +++ b/core-java-networking/README.md @@ -11,3 +11,6 @@ - [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) +- [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) +- [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) \ No newline at end of file diff --git a/core-java-networking/pom.xml b/core-java-networking/pom.xml index c7fa2af180..d9c7c691e9 100644 --- a/core-java-networking/pom.xml +++ b/core-java-networking/pom.xml @@ -24,6 +24,16 @@ commons-io ${commons-io.version} + + org.springframework + spring-web + ${springframework.spring-web.version} + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + @@ -33,5 +43,7 @@ 1.5.0-b01 2.5 + 3.5 + 4.3.4.RELEASE diff --git a/core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java b/core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java similarity index 100% rename from core-java/src/main/java/com/baeldung/http/FullResponseBuilder.java rename to core-java-networking/src/main/java/com/baeldung/http/FullResponseBuilder.java diff --git a/core-java/src/main/java/com/baeldung/http/ParameterStringBuilder.java b/core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java similarity index 100% rename from core-java/src/main/java/com/baeldung/http/ParameterStringBuilder.java rename to core-java-networking/src/main/java/com/baeldung/http/ParameterStringBuilder.java diff --git a/core-java/src/main/java/com/baeldung/socket/EchoClient.java b/core-java-networking/src/main/java/com/baeldung/socket/EchoClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/EchoClient.java rename to core-java-networking/src/main/java/com/baeldung/socket/EchoClient.java diff --git a/core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java b/core-java-networking/src/main/java/com/baeldung/socket/EchoMultiServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/EchoMultiServer.java rename to core-java-networking/src/main/java/com/baeldung/socket/EchoMultiServer.java diff --git a/core-java/src/main/java/com/baeldung/socket/EchoServer.java b/core-java-networking/src/main/java/com/baeldung/socket/EchoServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/EchoServer.java rename to core-java-networking/src/main/java/com/baeldung/socket/EchoServer.java diff --git a/core-java/src/main/java/com/baeldung/socket/GreetClient.java b/core-java-networking/src/main/java/com/baeldung/socket/GreetClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/GreetClient.java rename to core-java-networking/src/main/java/com/baeldung/socket/GreetClient.java diff --git a/core-java/src/main/java/com/baeldung/socket/GreetServer.java b/core-java-networking/src/main/java/com/baeldung/socket/GreetServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/socket/GreetServer.java rename to core-java-networking/src/main/java/com/baeldung/socket/GreetServer.java diff --git a/core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java b/core-java-networking/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java rename to core-java-networking/src/test/java/com/baeldung/encoderdecoder/EncoderDecoderUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java b/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java similarity index 99% rename from core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java rename to core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java index 752a75daa5..bd6c0a4410 100644 --- a/core-java/src/test/java/com/baeldung/http/HttpRequestLiveTest.java +++ b/core-java-networking/src/test/java/com/baeldung/http/HttpRequestLiveTest.java @@ -1,6 +1,6 @@ package com.baeldung.http; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.junit.Test; import java.io.BufferedReader; diff --git a/core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java b/core-java-networking/src/test/java/com/baeldung/socket/EchoIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/socket/EchoIntegrationTest.java rename to core-java-networking/src/test/java/com/baeldung/socket/EchoIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java b/core-java-networking/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java rename to core-java-networking/src/test/java/com/baeldung/socket/GreetServerIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java b/core-java-networking/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java rename to core-java-networking/src/test/java/com/baeldung/socket/SocketEchoMultiIntegrationTest.java diff --git a/core-java-perf/README.md b/core-java-perf/README.md index 6af1c82a0a..252ee4cc45 100644 --- a/core-java-perf/README.md +++ b/core-java-perf/README.md @@ -2,3 +2,7 @@ ### 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) +- [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks) +- [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded) +- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/heapdump/HeapDump.java b/core-java-perf/src/main/java/com/baeldung/heapdump/HeapDump.java similarity index 100% rename from core-java/src/main/java/com/baeldung/heapdump/HeapDump.java rename to core-java-perf/src/main/java/com/baeldung/heapdump/HeapDump.java diff --git a/core-java/src/main/java/com/baeldung/jmx/Game.java b/core-java-perf/src/main/java/com/baeldung/jmx/Game.java similarity index 100% rename from core-java/src/main/java/com/baeldung/jmx/Game.java rename to core-java-perf/src/main/java/com/baeldung/jmx/Game.java diff --git a/core-java/src/main/java/com/baeldung/jmx/GameMBean.java b/core-java-perf/src/main/java/com/baeldung/jmx/GameMBean.java similarity index 100% rename from core-java/src/main/java/com/baeldung/jmx/GameMBean.java rename to core-java-perf/src/main/java/com/baeldung/jmx/GameMBean.java diff --git a/core-java/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java b/core-java-perf/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java similarity index 100% rename from core-java/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java rename to core-java-perf/src/main/java/com/baeldung/jmx/JMXTutorialMainlauncher.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/equalshashcode/Person.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/equalshashcode/PersonOptimized.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObject.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/finalize/BulkyObjectOptimized.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/BulkyObject.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassDriver.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/InnerClassWrapper.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/innerclass/StaticNestedClassWrapper.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/InternedString.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/ReadStringFromFileUtil.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/internedstrings/StringObject.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsDemo.java diff --git a/core-java/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java b/core-java-perf/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java similarity index 100% rename from core-java/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java rename to core-java-perf/src/main/java/com/baeldung/memoryleaks/staticfields/StaticFieldsDemo.java diff --git a/core-java/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java b/core-java-perf/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java similarity index 100% rename from core-java/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java rename to core-java-perf/src/main/java/com/baeldung/outofmemoryerror/OutOfMemoryGCLimitExceed.java diff --git a/core-java-perf/src/main/resources/logback.xml b/core-java-perf/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-perf/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/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/equalshashcode/PersonMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/finalize/FinalizeMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/innerclass/StaticInnerClassMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/internedstrings/StringInternMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/staticfields/NonStaticFieldsMemoryLeakUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java b/core-java-perf/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java rename to core-java-perf/src/test/java/com/baeldung/memoryleaks/staticfields/StaticFieldsMemoryLeakUnitTest.java diff --git a/core-java-sun/README.md b/core-java-sun/README.md index 9cf8b26f1b..e2dba76b41 100644 --- a/core-java-sun/README.md +++ b/core-java-sun/README.md @@ -4,3 +4,4 @@ ### 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-java/src/test/java/com/baeldung/unsafe/CASCounter.java b/core-java-sun/src/test/java/com/baeldung/unsafe/CASCounter.java similarity index 100% rename from core-java/src/test/java/com/baeldung/unsafe/CASCounter.java rename to core-java-sun/src/test/java/com/baeldung/unsafe/CASCounter.java diff --git a/core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java b/core-java-sun/src/test/java/com/baeldung/unsafe/OffHeapArray.java similarity index 100% rename from core-java/src/test/java/com/baeldung/unsafe/OffHeapArray.java rename to core-java-sun/src/test/java/com/baeldung/unsafe/OffHeapArray.java diff --git a/core-java/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java b/core-java-sun/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java rename to core-java-sun/src/test/java/com/baeldung/unsafe/UnsafeUnitTest.java diff --git a/core-java/README.md b/core-java/README.md index b0e8f81e1f..21c58bb880 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -6,19 +6,14 @@ - [Java Timer](http://www.baeldung.com/java-timer-and-timertask) - [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java) - [MD5 Hashing in Java](http://www.baeldung.com/java-md5) -- [A Guide to Java Sockets](http://www.baeldung.com/a-guide-to-java-sockets) - [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) - [Pattern Search with Grep in Java](http://www.baeldung.com/grep-in-java) -- [URL Encoding and Decoding in Java](http://www.baeldung.com/java-url-encoding-decoding) - [How to Create an Executable JAR with Maven](http://www.baeldung.com/executable-jar-with-maven) -- [Basic Introduction to JMX](http://www.baeldung.com/java-management-extensions) - [Introduction to Nashorn](http://www.baeldung.com/java-nashorn) - [Java Money and the Currency API](http://www.baeldung.com/java-money-and-currency) - [JVM Log Forging](http://www.baeldung.com/jvm-log-forging) -- [Guide to sun.misc.Unsafe](http://www.baeldung.com/java-unsafe) -- [How to Perform a Simple HTTP Request in Java](http://www.baeldung.com/java-http-request) - [How to Add a Single Element to a Stream](http://www.baeldung.com/java-stream-append-prepend) - [How to Find all Getters Returning Null](http://www.baeldung.com/java-getters-returning-null) - [How to Get a Name of a Method Being Executed?](http://www.baeldung.com/java-name-of-executing-method) @@ -26,7 +21,6 @@ - [Guide to UUID in Java](http://www.baeldung.com/java-uuid) - [Guide to Escaping Characters in Java RegExps](http://www.baeldung.com/java-regexp-escape-char) - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) -- [OutOfMemoryError: GC Overhead Limit Exceeded](http://www.baeldung.com/java-gc-overhead-limit-exceeded) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) - [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) @@ -57,11 +51,9 @@ - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) - [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) -- [Different Ways to Capture Java Heap Dumps](https://www.baeldung.com/java-heap-dump-capture) - [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) - [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [Understanding Memory Leaks in Java](https://www.baeldung.com/java-memory-leaks) - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) From 9def7653f7cd2ce7e53a3d40af5ddb3fb3620783 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sat, 29 Dec 2018 21:59:01 +0530 Subject: [PATCH 415/429] [BAEL-11401] - Removed spring web dependency from core-java --- core-java/pom.xml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/core-java/pom.xml b/core-java/pom.xml index 442d378dab..b4f0643aa8 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -121,11 +121,6 @@ jmh-generator-annprocess ${jmh-generator-annprocess.version} - - org.springframework - spring-web - ${springframework.spring-web.version} - com.h2database h2 @@ -500,7 +495,6 @@ 2.21.0 - 4.3.4.RELEASE 1.1 1.4.197 From ef0c49beaa4a49aa8390947ae2d606fa42ac61e2 Mon Sep 17 00:00:00 2001 From: eric-martin Date: Sat, 29 Dec 2018 10:32:29 -0600 Subject: [PATCH 416/429] Fixed TestLauncher test name and config property name --- .../junit-5/src/test/java/com/baeldung/TestLauncher.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java b/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java index f9766d2bd9..2e477084aa 100644 --- a/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java +++ b/testing-modules/junit-5/src/test/java/com/baeldung/TestLauncher.java @@ -18,9 +18,9 @@ public class TestLauncher { //@formatter:off LauncherDiscoveryRequest request = LauncherDiscoveryRequestBuilder.request() - .selectors(selectClass("com.baeldung.EmployeesTest")) + .selectors(selectClass("com.baeldung.EmployeesUnitTest")) .configurationParameter("junit.conditions.deactivate", "com.baeldung.extensions.*") - .configurationParameter("junit.extensions.autodetection.enabled", "true") + .configurationParameter("junit.jupiter.extensions.autodetection.enabled", "true") .build(); //@formatter:on From d1fb8935e794e1c171754defb478762954f8d5cd Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 30 Dec 2018 00:00:21 +0530 Subject: [PATCH 417/429] [BAEL-10836] - Removed CollectionsEmpty from core-java-collections module --- .../java/collections/CollectionsEmpty.java | 26 ------------------- 1 file changed, 26 deletions(-) delete mode 100644 core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java diff --git a/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java b/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java deleted file mode 100644 index 09ecebe47b..0000000000 --- a/core-java-collections/src/test/java/org/baeldung/java/collections/CollectionsEmpty.java +++ /dev/null @@ -1,26 +0,0 @@ -package org.baeldung.java.collections; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import org.junit.Assert; -import org.junit.Test; - -class CollectionsEmpty { - - @Test - public void givenArrayList_whenAddingElement_addsNewElement() { - ArrayList mutableList = new ArrayList<>(); - mutableList.add("test"); - - Assert.assertEquals(mutableList.size(), 1); - Assert.assertEquals(mutableList.get(0), "test"); - } - - @Test(expected = UnsupportedOperationException.class) - public void givenCollectionsEmptyList_whenAddingElement_throwsUnsupportedOperationException() { - List immutableList = Collections.emptyList(); - immutableList.add("test"); - } - -} From b4ff5c46f08a21ea01ffdca6859286a3e351bdb3 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 30 Dec 2018 01:19:12 +0530 Subject: [PATCH 418/429] [BAEL-11402] - Moved articles out of core-java (part 3) --- core-java-io/README.md | 2 + core-java-io/pom.xml | 14 +++++ .../com/baeldung/extension/Extension.java | 0 .../baeldung/extension/ExtensionUnitTest.java | 0 .../java/mimetype/MimeTypeUnitTest.java | 0 .../src/test/resources/META-INF/mime.types | 0 .../src/test/resources/product.png | Bin core-java-security/README.md | 11 ++++ core-java-security/pom.xml | 55 ++++++++++++++++++ .../java/com/baeldung/cipher/Encryptor.java | 0 .../encrypt/FileEncrypterDecrypter.java | 0 .../com/baeldung/hashing/SHA256Hashing.java | 0 .../com/baeldung/keystore/JavaKeyStore.java | 0 .../passwordhashing/PBKDF2Hasher.java | 0 .../passwordhashing/SHA512Hasher.java | 0 .../passwordhashing/SimplePBKDF2Hasher.java | 0 .../com/baeldung/ssl/SecureConnection.java | 0 .../baeldung/ssl/example/SimpleClient.java | 0 .../baeldung/ssl/example/SimpleServer.java | 0 .../src/main/resources/logback.xml | 19 ++++++ .../baeldung/cipher/EncryptorUnitTest.java | 0 ...FileEncrypterDecrypterIntegrationTest.java | 0 .../hashing/SHA256HashingUnitTest.java | 0 .../keystore/JavaKeyStoreUnitTest.java | 0 .../passwordhashing/PBKDF2HasherUnitTest.java | 0 .../passwordhashing/SHA512HasherUnitTest.java | 0 .../baeldung/java/md5/JavaMD5UnitTest.java | 0 .../src/test/resources/test_md5.txt | 0 core-java/README.md | 9 --- core-java/pom.xml | 27 --------- guava/README.md | 1 - pom.xml | 2 + 32 files changed, 103 insertions(+), 37 deletions(-) rename {core-java => core-java-io}/src/main/java/com/baeldung/extension/Extension.java (100%) rename {core-java => core-java-io}/src/test/java/com/baeldung/extension/ExtensionUnitTest.java (100%) rename {core-java => core-java-io}/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java (100%) rename {core-java => core-java-io}/src/test/resources/META-INF/mime.types (100%) rename {core-java => core-java-io}/src/test/resources/product.png (100%) create mode 100644 core-java-security/README.md create mode 100644 core-java-security/pom.xml rename {core-java => core-java-security}/src/main/java/com/baeldung/cipher/Encryptor.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/hashing/SHA256Hashing.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/keystore/JavaKeyStore.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/ssl/SecureConnection.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/ssl/example/SimpleClient.java (100%) rename {core-java => core-java-security}/src/main/java/com/baeldung/ssl/example/SimpleServer.java (100%) create mode 100644 core-java-security/src/main/resources/logback.xml rename {core-java => core-java-security}/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java (100%) rename {core-java => core-java-security}/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java (100%) rename {core-java => core-java-security}/src/test/resources/test_md5.txt (100%) diff --git a/core-java-io/README.md b/core-java-io/README.md index 3d028783ed..2ad980ca6a 100644 --- a/core-java-io/README.md +++ b/core-java-io/README.md @@ -35,3 +35,5 @@ - [Guide to Java OutputStream](https://www.baeldung.com/java-outputstream) - [Reading a CSV File into an Array](https://www.baeldung.com/java-csv-file-array) - [Guide to BufferedReader](https://www.baeldung.com/java-buffered-reader) +- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension) +- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type) \ No newline at end of file diff --git a/core-java-io/pom.xml b/core-java-io/pom.xml index ac5f1f7c2e..1f2d52de81 100644 --- a/core-java-io/pom.xml +++ b/core-java-io/pom.xml @@ -160,6 +160,17 @@ ${opencsv.version} test + + + org.apache.tika + tika-core + ${tika.version} + + + net.sf.jmimemagic + jmimemagic + ${jmime-magic.version} + @@ -264,6 +275,9 @@ 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/src/main/java/com/baeldung/extension/Extension.java b/core-java-io/src/main/java/com/baeldung/extension/Extension.java similarity index 100% rename from core-java/src/main/java/com/baeldung/extension/Extension.java rename to core-java-io/src/main/java/com/baeldung/extension/Extension.java diff --git a/core-java/src/test/java/com/baeldung/extension/ExtensionUnitTest.java b/core-java-io/src/test/java/com/baeldung/extension/ExtensionUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/extension/ExtensionUnitTest.java rename to core-java-io/src/test/java/com/baeldung/extension/ExtensionUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java b/core-java-io/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java rename to core-java-io/src/test/java/com/baeldung/java/mimetype/MimeTypeUnitTest.java diff --git a/core-java/src/test/resources/META-INF/mime.types b/core-java-io/src/test/resources/META-INF/mime.types similarity index 100% rename from core-java/src/test/resources/META-INF/mime.types rename to core-java-io/src/test/resources/META-INF/mime.types diff --git a/core-java/src/test/resources/product.png b/core-java-io/src/test/resources/product.png similarity index 100% rename from core-java/src/test/resources/product.png rename to core-java-io/src/test/resources/product.png diff --git a/core-java-security/README.md b/core-java-security/README.md new file mode 100644 index 0000000000..415171094b --- /dev/null +++ b/core-java-security/README.md @@ -0,0 +1,11 @@ +## 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) +- [Introduction to SSL in Java](http://www.baeldung.com/java-ssl) +- [Java KeyStore API](http://www.baeldung.com/java-keystore) +- [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream) +- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) +- [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) +- [SHA-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) \ No newline at end of file diff --git a/core-java-security/pom.xml b/core-java-security/pom.xml new file mode 100644 index 0000000000..cf91121465 --- /dev/null +++ b/core-java-security/pom.xml @@ -0,0 +1,55 @@ + + 4.0.0 + com.baeldung + core-java-security + 0.1.0-SNAPSHOT + jar + core-java-security + + + com.baeldung + parent-java + 0.0.1-SNAPSHOT + ../parent-java + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + + org.assertj + assertj-core + ${assertj-core.version} + test + + + + commons-codec + commons-codec + ${commons-codec.version} + + + org.bouncycastle + bcprov-jdk15on + ${bouncycastle.version} + + + + + + + 3.8.1 + 1.55 + 1.10 + + + 3.10.0 + + + + diff --git a/core-java/src/main/java/com/baeldung/cipher/Encryptor.java b/core-java-security/src/main/java/com/baeldung/cipher/Encryptor.java similarity index 100% rename from core-java/src/main/java/com/baeldung/cipher/Encryptor.java rename to core-java-security/src/main/java/com/baeldung/cipher/Encryptor.java diff --git a/core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java b/core-java-security/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java similarity index 100% rename from core-java/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java rename to core-java-security/src/main/java/com/baeldung/encrypt/FileEncrypterDecrypter.java diff --git a/core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java b/core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java similarity index 100% rename from core-java/src/main/java/com/baeldung/hashing/SHA256Hashing.java rename to core-java-security/src/main/java/com/baeldung/hashing/SHA256Hashing.java diff --git a/core-java/src/main/java/com/baeldung/keystore/JavaKeyStore.java b/core-java-security/src/main/java/com/baeldung/keystore/JavaKeyStore.java similarity index 100% rename from core-java/src/main/java/com/baeldung/keystore/JavaKeyStore.java rename to core-java-security/src/main/java/com/baeldung/keystore/JavaKeyStore.java diff --git a/core-java/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java b/core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java similarity index 100% rename from core-java/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java rename to core-java-security/src/main/java/com/baeldung/passwordhashing/PBKDF2Hasher.java diff --git a/core-java/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java b/core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java similarity index 100% rename from core-java/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java rename to core-java-security/src/main/java/com/baeldung/passwordhashing/SHA512Hasher.java diff --git a/core-java/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java b/core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java similarity index 100% rename from core-java/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java rename to core-java-security/src/main/java/com/baeldung/passwordhashing/SimplePBKDF2Hasher.java diff --git a/core-java/src/main/java/com/baeldung/ssl/SecureConnection.java b/core-java-security/src/main/java/com/baeldung/ssl/SecureConnection.java similarity index 100% rename from core-java/src/main/java/com/baeldung/ssl/SecureConnection.java rename to core-java-security/src/main/java/com/baeldung/ssl/SecureConnection.java diff --git a/core-java/src/main/java/com/baeldung/ssl/example/SimpleClient.java b/core-java-security/src/main/java/com/baeldung/ssl/example/SimpleClient.java similarity index 100% rename from core-java/src/main/java/com/baeldung/ssl/example/SimpleClient.java rename to core-java-security/src/main/java/com/baeldung/ssl/example/SimpleClient.java diff --git a/core-java/src/main/java/com/baeldung/ssl/example/SimpleServer.java b/core-java-security/src/main/java/com/baeldung/ssl/example/SimpleServer.java similarity index 100% rename from core-java/src/main/java/com/baeldung/ssl/example/SimpleServer.java rename to core-java-security/src/main/java/com/baeldung/ssl/example/SimpleServer.java diff --git a/core-java-security/src/main/resources/logback.xml b/core-java-security/src/main/resources/logback.xml new file mode 100644 index 0000000000..56af2d397e --- /dev/null +++ b/core-java-security/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/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java b/core-java-security/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java rename to core-java-security/src/test/java/com/baeldung/cipher/EncryptorUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java b/core-java-security/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java rename to core-java-security/src/test/java/com/baeldung/encrypt/FileEncrypterDecrypterIntegrationTest.java diff --git a/core-java/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java b/core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java rename to core-java-security/src/test/java/com/baeldung/hashing/SHA256HashingUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java b/core-java-security/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java rename to core-java-security/src/test/java/com/baeldung/keystore/JavaKeyStoreUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java b/core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java rename to core-java-security/src/test/java/com/baeldung/passwordhashing/PBKDF2HasherUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java b/core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java rename to core-java-security/src/test/java/com/baeldung/passwordhashing/SHA512HasherUnitTest.java diff --git a/core-java/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java b/core-java-security/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java similarity index 100% rename from core-java/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java rename to core-java-security/src/test/java/org/baeldung/java/md5/JavaMD5UnitTest.java diff --git a/core-java/src/test/resources/test_md5.txt b/core-java-security/src/test/resources/test_md5.txt similarity index 100% rename from core-java/src/test/resources/test_md5.txt rename to core-java-security/src/test/resources/test_md5.txt diff --git a/core-java/README.md b/core-java/README.md index 21c58bb880..a3dd7fb2b7 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -5,7 +5,6 @@ ### Relevant Articles: - [Java Timer](http://www.baeldung.com/java-timer-and-timertask) - [How to Run a Shell Command in Java](http://www.baeldung.com/run-shell-command-in-java) -- [MD5 Hashing in Java](http://www.baeldung.com/java-md5) - [How to Print Screen in Java](http://www.baeldung.com/print-screen-in-java) - [A Guide To Java Regular Expressions API](http://www.baeldung.com/regular-expressions-java) - [Getting Started with Java Properties](http://www.baeldung.com/java-properties) @@ -24,7 +23,6 @@ - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) - [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) -- [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) @@ -35,27 +33,20 @@ - [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid) - [A Guide to the ResourceBundle](http://www.baeldung.com/java-resourcebundle) - [Class Loaders in Java](http://www.baeldung.com/java-classloaders) -- [Introduction to SSL in Java](http://www.baeldung.com/java-ssl) -- [Java KeyStore API](http://www.baeldung.com/java-keystore) - [Double-Checked Locking with Singleton](http://www.baeldung.com/java-singleton-double-checked-locking) - [Guide to Java Clock Class](http://www.baeldung.com/java-clock) - [Importance of Main Manifest Attribute in a Self-Executing JAR](http://www.baeldung.com/java-jar-executable-manifest-main-class) -- [How to Get the File Extension of a File in Java](http://www.baeldung.com/java-file-extension) - [Java Global Exception Handler](http://www.baeldung.com/java-global-exception-handler) -- [Encrypting and Decrypting Files in Java](http://www.baeldung.com/java-cipher-input-output-stream) - [How to Get the Size of an Object in Java](http://www.baeldung.com/java-size-of-object) - [Guide to Java Instrumentation](http://www.baeldung.com/java-instrumentation) -- [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type) - [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) - [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) - [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) - [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) -- [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) - [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) -- [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) - [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) diff --git a/core-java/pom.xml b/core-java/pom.xml index b4f0643aa8..6c58653d5a 100644 --- a/core-java/pom.xml +++ b/core-java/pom.xml @@ -24,11 +24,6 @@ commons-lang3 ${commons-lang3.version} - - org.bouncycastle - bcprov-jdk15on - ${bouncycastle.version} - org.unix4j unix4j-command @@ -75,12 +70,6 @@ ${assertj-core.version} test - - - commons-codec - commons-codec - ${commons-codec.version} - org.javamoney moneta @@ -126,17 +115,6 @@ h2 ${h2database.version} - - - org.apache.tika - tika-core - ${tika.version} - - - net.sf.jmimemagic - jmimemagic - ${jmime-magic.version} - org.javassist @@ -477,8 +455,6 @@ 3.5 - 1.55 - 1.10 2.5 3.6.1 1.0.3 @@ -509,9 +485,6 @@ 2.0.3.RELEASE 1.6.0 61.1 - - 1.18 - 0.1.5 3.21.0-GA diff --git a/guava/README.md b/guava/README.md index 0346d34903..60754dbe57 100644 --- a/guava/README.md +++ b/guava/README.md @@ -18,4 +18,3 @@ - [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) -- [SHA-256 Hashing in Java](https://www.baeldung.com/sha-256-hashing-java) diff --git a/pom.xml b/pom.xml index 923cbab302..e8ff86665c 100644 --- a/pom.xml +++ b/pom.xml @@ -383,6 +383,7 @@ core-java-concurrency-basic core-java-concurrency-collections core-java-io + core-java-security core-java-lang-syntax core-java-lang core-java-lang-oop @@ -1095,6 +1096,7 @@ core-java-concurrency-basic core-java-concurrency-collections core-java-io + core-java-security core-java-lang-syntax core-java-lang core-java-lang-oop From 40e26514f431478b98e98f42c4a61faed23f908e Mon Sep 17 00:00:00 2001 From: geroza Date: Sat, 29 Dec 2018 19:09:35 -0200 Subject: [PATCH 419/429] * Renamed IntegrationTests that needed manual configurations to run succesfully as ManualTests * Renamed Integrationtests that needed the project (or related project, in case of client-server) as LiveTests * Fixed migration of mustache module to make it compatible with spring-boot 2.1 --- mustache/pom.xml | 5 +++++ mustache/src/main/resources/application.properties | 1 + ...textIntegrationTest.java => SpringContextManualTest.java} | 2 +- ...textIntegrationTest.java => SpringContextManualTest.java} | 2 +- ...textIntegrationTest.java => SpringContextManualTest.java} | 2 +- ...textIntegrationTest.java => SpringContextManualTest.java} | 2 +- ...ontextIntegrationTest.java => SpringContextLiveTest.java} | 2 +- 7 files changed, 11 insertions(+), 5 deletions(-) rename spring-amqp-simple/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextManualTest.java} (90%) rename spring-kafka/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextManualTest.java} (90%) rename spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextManualTest.java} (90%) rename spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextManualTest.java} (90%) rename spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/{SpringContextIntegrationTest.java => SpringContextLiveTest.java} (90%) diff --git a/mustache/pom.xml b/mustache/pom.xml index 0c35345100..1b89997996 100644 --- a/mustache/pom.xml +++ b/mustache/pom.xml @@ -30,6 +30,11 @@ log4j ${log4j.version} + + + org.springframework.boot + spring-boot-starter-web + org.springframework.boot diff --git a/mustache/src/main/resources/application.properties b/mustache/src/main/resources/application.properties index e69de29bb2..011bbae980 100644 --- a/mustache/src/main/resources/application.properties +++ b/mustache/src/main/resources/application.properties @@ -0,0 +1 @@ +spring.mustache.suffix:.html \ No newline at end of file diff --git a/spring-amqp-simple/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-amqp-simple/src/test/java/org/baeldung/SpringContextManualTest.java similarity index 90% rename from spring-amqp-simple/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-amqp-simple/src/test/java/org/baeldung/SpringContextManualTest.java index f134074cf8..03cb34eeb5 100644 --- a/spring-amqp-simple/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-amqp-simple/src/test/java/org/baeldung/SpringContextManualTest.java @@ -9,7 +9,7 @@ import com.baeldung.springamqpsimple.SpringAmqpApplication; @RunWith(SpringRunner.class) @SpringBootTest(classes = SpringAmqpApplication.class) -public class SpringContextIntegrationTest { +public class SpringContextManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-kafka/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-kafka/src/test/java/org/baeldung/SpringContextManualTest.java similarity index 90% rename from spring-kafka/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-kafka/src/test/java/org/baeldung/SpringContextManualTest.java index 40bf86c76f..b8195633fd 100644 --- a/spring-kafka/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-kafka/src/test/java/org/baeldung/SpringContextManualTest.java @@ -9,7 +9,7 @@ import com.baeldung.spring.kafka.KafkaApplication; @RunWith(SpringRunner.class) @SpringBootTest(classes = KafkaApplication.class) -public class SpringContextIntegrationTest { +public class SpringContextManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextManualTest.java similarity index 90% rename from spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextManualTest.java index 5dc6d1df75..a6ee0b6000 100644 --- a/spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-remoting/remoting-amqp/remoting-amqp-server/src/test/java/org/baeldung/SpringContextManualTest.java @@ -9,7 +9,7 @@ import com.baeldung.server.AmqpServer; @RunWith(SpringRunner.class) @SpringBootTest(classes = AmqpServer.class) -public class SpringContextIntegrationTest { +public class SpringContextManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java similarity index 90% rename from spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java index 5c9cc5f872..b806f21c27 100644 --- a/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-remoting/remoting-jms/remoting-jms-server/src/test/java/org/baeldung/SpringContextManualTest.java @@ -9,7 +9,7 @@ import com.baeldung.server.JmsServer; @SpringBootTest(classes = JmsServer.class) @RunWith(SpringRunner.class) -public class SpringContextIntegrationTest { +public class SpringContextManualTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { diff --git a/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java b/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java similarity index 90% rename from spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java rename to spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java index 3460792fc6..3bace4cd1e 100644 --- a/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextIntegrationTest.java +++ b/spring-remoting/remoting-rmi/remoting-rmi-client/src/test/java/org/baeldung/SpringContextLiveTest.java @@ -9,7 +9,7 @@ import com.baeldung.client.RmiClient; @SpringBootTest(classes = RmiClient.class) @RunWith(SpringRunner.class) -public class SpringContextIntegrationTest { +public class SpringContextLiveTest { @Test public void whenSpringContextIsBootstrapped_thenNoExceptions() { From 676f55e8720e8ec6cc00a73e3bcb1526318a948e Mon Sep 17 00:00:00 2001 From: rahusriv Date: Sun, 30 Dec 2018 08:40:43 +0530 Subject: [PATCH 420/429] BAEL-2335 (#6015) * Making examples simple * Changing variable names --- .../ArrayListOfArrayList.java | 26 +++++++++---------- .../ThreeDimensionalArrayList.java | 16 ++++++------ 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java index 72045d6761..2c3da7b1fc 100644 --- a/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java +++ b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java @@ -6,30 +6,28 @@ public class ArrayListOfArrayList { public static void main(String args[]) { - int vertex = 5; - ArrayList> graph = new ArrayList<>(vertex); + int numVertices = 3; + ArrayList> graph = new ArrayList<>(numVertices); //Initializing each element of ArrayList with ArrayList - for(int i=0; i< vertex; i++) { + for(int i=0; i< numVertices; i++) { graph.add(new ArrayList()); } //We can add any number of columns to each row graph.get(0).add(1); - graph.get(0).add(5); - graph.get(1).add(0); graph.get(1).add(2); + graph.get(2).add(0); + graph.get(1).add(0); graph.get(2).add(1); - graph.get(2).add(3); - graph.get(3).add(2); - graph.get(3).add(4); - graph.get(4).add(3); - graph.get(4).add(5); - + graph.get(0).add(2); + //Printing all the edges - for(int i=0; i listOfVertices = graph.get(vertexNo); + for(int i=0; i Date: Sun, 30 Dec 2018 00:38:11 -0300 Subject: [PATCH 421/429] BAEL-2444 Samples (#6002) --- core-java-8/pom.xml | 37 +++++++++++++- .../baeldung/time/LocalDateTimeUnitTest.java | 43 +++++++++++++++++ .../time/LocalDateTimeWithJMockUnitTest.java | 48 +++++++++++++++++++ 3 files changed, 126 insertions(+), 2 deletions(-) create mode 100644 core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java create mode 100644 core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java diff --git a/core-java-8/pom.xml b/core-java-8/pom.xml index 18bdaa15f4..112e8b764d 100644 --- a/core-java-8/pom.xml +++ b/core-java-8/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 com.baeldung core-java-8 @@ -104,6 +104,24 @@ aspectjweaver ${asspectj.version} + + org.powermock + powermock-module-junit4 + ${powermock.version} + test + + + org.powermock + powermock-api-mockito2 + ${powermock.version} + test + + + org.jmockit + jmockit + ${jmockit.version} + test + @@ -119,7 +137,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.1 + ${maven-compiler-plugin.version} 1.8 1.8 @@ -142,6 +160,16 @@ + + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + + true + + @@ -159,9 +187,14 @@ 3.6.1 1.8.9 + 2.0.0-RC.4 + 1.44 1.7.0 1.19 1.19 2.0.4.RELEASE + + 3.8.0 + 2.22.1 diff --git a/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java new file mode 100644 index 0000000000..04c1a0b74e --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeUnitTest.java @@ -0,0 +1,43 @@ +package com.baeldung.time; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import java.time.Clock; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; +import static org.powermock.api.mockito.PowerMockito.mockStatic; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({ LocalDateTime.class }) +public class LocalDateTimeUnitTest { + + @Test + public void givenLocalDateTimeMock_whenNow_thenGetFixedLocalDateTime() { + Clock clock = Clock.fixed(Instant.parse("2014-12-22T10:15:30.00Z"), ZoneId.of("UTC")); + LocalDateTime dateTime = LocalDateTime.now(clock); + mockStatic(LocalDateTime.class); + when(LocalDateTime.now()).thenReturn(dateTime); + String dateTimeExpected = "2014-12-22T10:15:30"; + + LocalDateTime now = LocalDateTime.now(); + + assertThat(now).isEqualTo(dateTimeExpected); + } + + @Test + public void givenFixedClock_whenNow_thenGetFixedLocalDateTime() { + Clock clock = Clock.fixed(Instant.parse("2014-12-22T10:15:30.00Z"), ZoneId.of("UTC")); + String dateTimeExpected = "2014-12-22T10:15:30"; + + LocalDateTime dateTime = LocalDateTime.now(clock); + + assertThat(dateTime).isEqualTo(dateTimeExpected); + } +} diff --git a/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java new file mode 100644 index 0000000000..13861dfd0b --- /dev/null +++ b/core-java-8/src/test/java/com/baeldung/time/LocalDateTimeWithJMockUnitTest.java @@ -0,0 +1,48 @@ +package com.baeldung.time; + +import mockit.Expectations; +import mockit.Mock; +import mockit.MockUp; +import org.junit.jupiter.api.Test; + +import java.time.Clock; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; + +import static org.assertj.core.api.Assertions.assertThat; + +public class LocalDateTimeWithJMockUnitTest { + + @Test + public void givenLocalDateTimeWithJMock_whenNow_thenGetFixedLocalDateTime() { + Clock clock = Clock.fixed(Instant.parse("2014-12-21T10:15:30.00Z"), ZoneId.of("UTC")); + new MockUp() { + @Mock + public LocalDateTime now() { + return LocalDateTime.now(clock); + } + }; + String dateTimeExpected = "2014-12-21T10:15:30"; + + LocalDateTime now = LocalDateTime.now(); + + assertThat(now).isEqualTo(dateTimeExpected); + } + + @Test + public void givenLocalDateTimeWithExpectations_whenNow_thenGetFixedLocalDateTime() { + Clock clock = Clock.fixed(Instant.parse("2014-12-23T10:15:30.00Z"), ZoneId.of("UTC")); + LocalDateTime dateTimeExpected = LocalDateTime.now(clock); + new Expectations(LocalDateTime.class) { + { + LocalDateTime.now(); + result = dateTimeExpected; + } + }; + + LocalDateTime now = LocalDateTime.now(); + + assertThat(now).isEqualTo(dateTimeExpected); + } +} From eb4928b972264c86472576a1673fa7245431a740 Mon Sep 17 00:00:00 2001 From: amit2103 Date: Sun, 30 Dec 2018 16:30:36 +0530 Subject: [PATCH 422/429] [BAEL-11403] - Moved articles out of core-java (part 4) --- core-java-collections/README.md | 3 +- .../baeldung/iteratorguide/IteratorGuide.java | 0 core-java/README.md | 11 --- .../StringReplaceAndRemoveUnitTest.java | 83 ------------------- java-dates/README.md | 2 + .../zoneddatetime/OffsetDateTimeExample.java | 0 .../zoneddatetime/OffsetTimeExample.java | 0 .../zoneddatetime/ZoneDateTimeExample.java | 0 .../com/baeldung/date/DateDiffUnitTest.java | 2 + .../SimpleDateFormatUnitTest.java | 0 .../OffsetDateTimeExampleUnitTest.java | 0 .../OffsetTimeExampleUnitTest.java | 0 .../ZoneDateTimeExampleUnitTest.java | 0 java-numbers/README.md | 6 ++ .../java/com/baeldung/area/circle/Circle.java | 0 .../com/baeldung/area/circle/CircleArea.java | 0 .../root/calculator/NthRootCalculator.java | 0 .../java/com/baeldung/nth/root/main/Main.java | 0 .../DecimalFormatExamplesUnitTest.java | 0 .../com/baeldung/java/math/MathUnitTest.java | 0 .../calculator/NthRootCalculatorUnitTest.java | 0 .../baeldung/nth/root/main/MainUnitTest.java | 0 .../RemovingDecimalsManualTest.java | 0 .../RemovingDecimalsUnitTest.java | 0 java-strings/README.md | 2 + .../string/AppendCharAtPositionX.java | 0 .../string/AppendCharAtPositionXUnitTest.java | 0 .../DateToStringFormatterUnitTest.java | 9 +- 28 files changed, 19 insertions(+), 99 deletions(-) rename {core-java => core-java-collections}/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java (100%) delete mode 100644 core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java rename {core-java => java-dates}/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java (100%) rename {core-java => java-dates}/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java (100%) rename {core-java => java-dates}/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java (100%) rename {core-java => java-dates}/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java (100%) rename {core-java => java-dates}/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java (100%) rename {core-java => java-dates}/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java (100%) rename {core-java => java-dates}/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java (100%) rename {core-java => java-numbers}/src/main/java/com/baeldung/area/circle/Circle.java (100%) rename {core-java => java-numbers}/src/main/java/com/baeldung/area/circle/CircleArea.java (100%) rename {core-java => java-numbers}/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java (100%) rename {core-java => java-numbers}/src/main/java/com/baeldung/nth/root/main/Main.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/java/math/MathUnitTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java (100%) rename {core-java => java-numbers}/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java (100%) rename {core-java => java-strings}/src/main/java/com/baeldung/string/AppendCharAtPositionX.java (100%) rename {core-java => java-strings}/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java (100%) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 15be81156c..71d4e6b614 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -28,4 +28,5 @@ - [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) \ No newline at end of file +- [A Guide to EnumMap](https://www.baeldung.com/java-enum-map) +- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java b/core-java-collections/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java similarity index 100% rename from core-java/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java rename to core-java-collections/src/main/java/com/baeldung/iteratorguide/IteratorGuide.java diff --git a/core-java/README.md b/core-java/README.md index 21c58bb880..4f03bac732 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -23,13 +23,10 @@ - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) -- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) - [Guide to the Cipher Class](http://www.baeldung.com/java-cipher-class) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) -- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) - [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) -- [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat) - [How to Detect the OS Using Java](http://www.baeldung.com/java-detect-os) - [ASCII Art in Java](http://www.baeldung.com/ascii-art-in-java) - [What is the serialVersionUID?](http://www.baeldung.com/java-serial-version-uid) @@ -48,19 +45,11 @@ - [Getting a File’s Mime Type in Java](http://www.baeldung.com/java-file-mime-type) - [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) -- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) -- [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) -- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) - [Hashing a Password in Java](https://www.baeldung.com/java-password-hashing) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) - [SSL Handshake Failures](https://www.baeldung.com/java-ssl-handshake-failures) -- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) - [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding) -- [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) - [Graphs in Java](https://www.baeldung.com/java-graphs) - [Console I/O in Java](http://www.baeldung.com/java-console-input-output) diff --git a/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java b/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java deleted file mode 100644 index d952d2383b..0000000000 --- a/core-java/src/test/java/com/baeldung/string/StringReplaceAndRemoveUnitTest.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.baeldung.string; - - -import org.apache.commons.lang3.StringUtils; -import org.junit.Test; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -public class StringReplaceAndRemoveUnitTest { - - - @Test - public void givenTestStrings_whenReplace_thenProcessedString() { - - String master = "Hello World Baeldung!"; - String target = "Baeldung"; - String replacement = "Java"; - String processed = master.replace(target, replacement); - assertTrue(processed.contains(replacement)); - assertFalse(processed.contains(target)); - - } - - @Test - public void givenTestStrings_whenReplaceAll_thenProcessedString() { - - String master2 = "Welcome to Baeldung, Hello World Baeldung"; - String regexTarget= "(Baeldung)$"; - String replacement = "Java"; - String processed2 = master2.replaceAll(regexTarget, replacement); - assertTrue(processed2.endsWith("Java")); - - } - - @Test - public void givenTestStrings_whenStringBuilderMethods_thenProcessedString() { - - String master = "Hello World Baeldung!"; - String target = "Baeldung"; - String replacement = "Java"; - - int startIndex = master.indexOf(target); - int stopIndex = startIndex + target.length(); - - StringBuilder builder = new StringBuilder(master); - - - builder.delete(startIndex, stopIndex); - assertFalse(builder.toString().contains(target)); - - - builder.replace(startIndex, stopIndex, replacement); - assertTrue(builder.toString().contains(replacement)); - - - } - - - @Test - public void givenTestStrings_whenStringUtilsMethods_thenProcessedStrings() { - - String master = "Hello World Baeldung!"; - String target = "Baeldung"; - String replacement = "Java"; - - String processed = StringUtils.replace(master, target, replacement); - assertTrue(processed.contains(replacement)); - - String master2 = "Hello World Baeldung!"; - String target2 = "baeldung"; - String processed2 = StringUtils.replaceIgnoreCase(master2, target2, replacement); - assertFalse(processed2.contains(target)); - - } - - - - - - - -} diff --git a/java-dates/README.md b/java-dates/README.md index 21e54082f4..ac3166d938 100644 --- a/java-dates/README.md +++ b/java-dates/README.md @@ -26,3 +26,5 @@ - [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) - [Convert between String and Timestamp](https://www.baeldung.com/java-string-to-timestamp) +- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) +- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java b/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java similarity index 100% rename from core-java/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java rename to java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetDateTimeExample.java diff --git a/core-java/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java b/java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java similarity index 100% rename from core-java/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java rename to java-dates/src/main/java/com/baeldung/zoneddatetime/OffsetTimeExample.java diff --git a/core-java/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java b/java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java similarity index 100% rename from core-java/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java rename to java-dates/src/main/java/com/baeldung/zoneddatetime/ZoneDateTimeExample.java diff --git a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java index 1234a700de..a35699e469 100644 --- a/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java +++ b/java-dates/src/test/java/com/baeldung/date/DateDiffUnitTest.java @@ -8,6 +8,8 @@ import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.Period; +import java.time.ZoneId; +import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.Date; import java.util.Locale; diff --git a/core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java b/java-dates/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java rename to java-dates/src/test/java/com/baeldung/simpledateformat/SimpleDateFormatUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java b/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java rename to java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetDateTimeExampleUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java b/java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java rename to java-dates/src/test/java/com/baeldung/zoneddatetime/OffsetTimeExampleUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java b/java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java rename to java-dates/src/test/java/com/baeldung/zoneddatetime/ZoneDateTimeExampleUnitTest.java diff --git a/java-numbers/README.md b/java-numbers/README.md index 1138d9a74c..2b1131f325 100644 --- a/java-numbers/README.md +++ b/java-numbers/README.md @@ -13,3 +13,9 @@ - [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) - [Using Math.sin with Degrees](https://www.baeldung.com/java-math-sin-degrees) +- [A Practical Guide to DecimalFormat](http://www.baeldung.com/java-decimalformat) +- [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 diff --git a/core-java/src/main/java/com/baeldung/area/circle/Circle.java b/java-numbers/src/main/java/com/baeldung/area/circle/Circle.java similarity index 100% rename from core-java/src/main/java/com/baeldung/area/circle/Circle.java rename to java-numbers/src/main/java/com/baeldung/area/circle/Circle.java diff --git a/core-java/src/main/java/com/baeldung/area/circle/CircleArea.java b/java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java similarity index 100% rename from core-java/src/main/java/com/baeldung/area/circle/CircleArea.java rename to java-numbers/src/main/java/com/baeldung/area/circle/CircleArea.java diff --git a/core-java/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java b/java-numbers/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java similarity index 100% rename from core-java/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java rename to java-numbers/src/main/java/com/baeldung/nth/root/calculator/NthRootCalculator.java diff --git a/core-java/src/main/java/com/baeldung/nth/root/main/Main.java b/java-numbers/src/main/java/com/baeldung/nth/root/main/Main.java similarity index 100% rename from core-java/src/main/java/com/baeldung/nth/root/main/Main.java rename to java-numbers/src/main/java/com/baeldung/nth/root/main/Main.java diff --git a/core-java/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java b/java-numbers/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java rename to java-numbers/src/test/java/com/baeldung/decimalformat/DecimalFormatExamplesUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java b/java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/java/math/MathUnitTest.java rename to java-numbers/src/test/java/com/baeldung/java/math/MathUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java b/java-numbers/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java rename to java-numbers/src/test/java/com/baeldung/nth/root/calculator/NthRootCalculatorUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java b/java-numbers/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java rename to java-numbers/src/test/java/com/baeldung/nth/root/main/MainUnitTest.java diff --git a/core-java/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java b/java-numbers/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java rename to java-numbers/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsManualTest.java diff --git a/core-java/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java b/java-numbers/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java rename to java-numbers/src/test/java/com/baeldung/removingdecimals/RemovingDecimalsUnitTest.java diff --git a/java-strings/README.md b/java-strings/README.md index 60131e392d..fa048dbb5a 100644 --- a/java-strings/README.md +++ b/java-strings/README.md @@ -45,3 +45,5 @@ - [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) - [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) +- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) \ No newline at end of file diff --git a/core-java/src/main/java/com/baeldung/string/AppendCharAtPositionX.java b/java-strings/src/main/java/com/baeldung/string/AppendCharAtPositionX.java similarity index 100% rename from core-java/src/main/java/com/baeldung/string/AppendCharAtPositionX.java rename to java-strings/src/main/java/com/baeldung/string/AppendCharAtPositionX.java diff --git a/core-java/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java b/java-strings/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java rename to java-strings/src/test/java/com/baeldung/string/AppendCharAtPositionXUnitTest.java diff --git a/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java b/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java index f236c641c3..d760510c73 100644 --- a/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java +++ b/java-strings/src/test/java/com/baeldung/string/formatter/DateToStringFormatterUnitTest.java @@ -1,7 +1,6 @@ package com.baeldung.string.formatter; -import org.junit.BeforeClass; -import org.junit.Test; +import static org.junit.Assert.assertEquals; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -11,9 +10,11 @@ import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; +import java.util.Locale; import java.util.TimeZone; -import static org.junit.Assert.assertEquals; +import org.junit.BeforeClass; +import org.junit.Test; public class DateToStringFormatterUnitTest { @@ -40,7 +41,7 @@ public class DateToStringFormatterUnitTest { @Test public void whenDateConvertedUsingDateFormatToString_thenCorrect() { String formattedDate = DateFormat - .getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT) + .getDateTimeInstance(DateFormat.MEDIUM, DateFormat.SHORT, Locale.US) .format(date); assertEquals(EXPECTED_STRING_DATE, formattedDate); From de80339a2a03ce98ba1b0c189a3e953d03ad4686 Mon Sep 17 00:00:00 2001 From: Emily Cheyne Date: Sun, 30 Dec 2018 09:12:21 -0700 Subject: [PATCH 423/429] BAEL-2090 update readme --- persistence-modules/spring-data-jpa/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/persistence-modules/spring-data-jpa/README.md b/persistence-modules/spring-data-jpa/README.md index e240ae6d33..3c71600565 100644 --- a/persistence-modules/spring-data-jpa/README.md +++ b/persistence-modules/spring-data-jpa/README.md @@ -17,6 +17,7 @@ - [Spring Data – CrudRepository save() Method](https://www.baeldung.com/spring-data-crud-repository-save) - [Limiting Query Results with JPA and Spring Data JPA](https://www.baeldung.com/jpa-limit-query-results) - [Sorting Query Results with Spring Data](https://www.baeldung.com/spring-data-sorting) +- [INSERT Statement in JPA](https://www.baeldung.com/jpa-insert) ### Eclipse Config After importing the project into Eclipse, you may see the following error: From 1ed8fcf9dcbed1aa5424715c0207bbeaf669773a Mon Sep 17 00:00:00 2001 From: Urvy Agrawal Date: Tue, 1 Jan 2019 02:56:19 +0530 Subject: [PATCH 424/429] BAEL-2323 Java Native Keyword (#6038) -Moved files to core-java-lang module --- .../native/nativedatetimeutils.dll | Bin .../com/baeldung/nativekeyword/DateTimeUtils.java | 0 .../com/baeldung/nativekeyword/NativeMainApp.java | 0 .../nativekeyword/DateTimeUtilsManualTest.java | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename {core-java => core-java-lang}/native/nativedatetimeutils.dll (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java (100%) rename {core-java => core-java-lang}/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java (100%) rename {core-java => core-java-lang}/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java (100%) diff --git a/core-java/native/nativedatetimeutils.dll b/core-java-lang/native/nativedatetimeutils.dll similarity index 100% rename from core-java/native/nativedatetimeutils.dll rename to core-java-lang/native/nativedatetimeutils.dll diff --git a/core-java/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java b/core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java similarity index 100% rename from core-java/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java rename to core-java-lang/src/main/java/com/baeldung/nativekeyword/DateTimeUtils.java diff --git a/core-java/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java b/core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java similarity index 100% rename from core-java/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java rename to core-java-lang/src/main/java/com/baeldung/nativekeyword/NativeMainApp.java diff --git a/core-java/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java b/core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java similarity index 100% rename from core-java/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java rename to core-java-lang/src/test/java/com/baeldung/nativekeyword/DateTimeUtilsManualTest.java From c560a37b70907834f90d73eca63c612e27cd1826 Mon Sep 17 00:00:00 2001 From: Loredana Date: Tue, 1 Jan 2019 22:44:53 +0200 Subject: [PATCH 425/429] add start class --- spring-boot-security/pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/spring-boot-security/pom.xml b/spring-boot-security/pom.xml index d5c7976ba2..b87189757a 100644 --- a/spring-boot-security/pom.xml +++ b/spring-boot-security/pom.xml @@ -66,4 +66,8 @@ + + com.baeldung.springbootsecurity.basic_auth.SpringBootSecurityApplication + + From 0d5483e1bf74b0d00aa314d7f8a84f5feb710e81 Mon Sep 17 00:00:00 2001 From: rahusriv Date: Wed, 2 Jan 2019 08:26:43 +0530 Subject: [PATCH 426/429] Rahul/multidimensional/pr3 (#6040) * Making examples simple * Changing variable names * Modificatons in naming * Giving extra spaces --- .../ArrayListOfArrayList.java | 21 ++++++++++--------- .../ThreeDimensionalArrayList.java | 10 ++++----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java index 2c3da7b1fc..e11f8e8ba0 100644 --- a/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java +++ b/core-java-collections-list/src/main/java/com/baeldung/list/multidimensional/ArrayListOfArrayList.java @@ -6,11 +6,11 @@ public class ArrayListOfArrayList { public static void main(String args[]) { - int numVertices = 3; - ArrayList> graph = new ArrayList<>(numVertices); + int vertexCount = 3; + ArrayList> graph = new ArrayList<>(vertexCount); //Initializing each element of ArrayList with ArrayList - for(int i=0; i< numVertices; i++) { + for(int i = 0; i< vertexCount; i++) { graph.add(new ArrayList()); } @@ -21,13 +21,14 @@ public class ArrayListOfArrayList { graph.get(1).add(0); graph.get(2).add(1); graph.get(0).add(2); - - //Printing all the edges - for(int vertexNo=0; vertexNo listOfVertices = graph.get(vertexNo); - for(int i=0; i > > space = new ArrayList<>(x_axis_length); //Initializing each element of ArrayList with ArrayList< ArrayList > - for(int i=0; i< x_axis_length; i++) { + for(int i = 0; i < x_axis_length; i++) { space.add(new ArrayList< ArrayList >(y_axis_length)); - for(int j =0; j< y_axis_length; j++) { + for(int j = 0; j < y_axis_length; j++) { space.get(i).add(new ArrayList(z_axis_length)); } } @@ -33,9 +33,9 @@ public class ThreeDimensionalArrayList { space.get(1).get(1).add(1,"Yellow"); //Printing colors for all the points - for(int i=0; i Date: Wed, 2 Jan 2019 13:36:50 +0200 Subject: [PATCH 427/429] Update README.md --- core-java/README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/core-java/README.md b/core-java/README.md index 3c5d1941d6..03b77186b0 100644 --- a/core-java/README.md +++ b/core-java/README.md @@ -22,7 +22,6 @@ - [Difference between URL and URI](http://www.baeldung.com/java-url-vs-uri) - [Creating a Java Compiler Plugin](http://www.baeldung.com/java-build-compiler-plugin) - [Quick Guide to Java Stack](http://www.baeldung.com/java-stack) -- [Guide to java.util.Formatter](http://www.baeldung.com/java-string-formatter) - [Compiling Java *.class Files with javac](http://www.baeldung.com/javac) - [Introduction to Javadoc](http://www.baeldung.com/javadoc) - [Guide to the Externalizable Interface in Java](http://www.baeldung.com/java-externalizable) @@ -40,13 +39,7 @@ - [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) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [Add a Character to a String at a Given Position](https://www.baeldung.com/java-add-character-to-string) -- [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) -- [ZoneOffset in Java](https://www.baeldung.com/java-zone-offset) - [Merging java.util.Properties Objects](https://www.baeldung.com/java-merging-properties) -- [A Guide to SimpleDateFormat](https://www.baeldung.com/java-simple-date-format) -- [Changing the Order in a Sum Operation Can Produce Different Results?](https://www.baeldung.com/java-floating-point-sum-order) - [Java – Try with Resources](https://www.baeldung.com/java-try-with-resources) - [Abstract Classes in Java](https://www.baeldung.com/java-abstract-class) - [Guide to Character Encoding](https://www.baeldung.com/java-char-encoding) From e464591902afaa61de6035486a8240a87e046b38 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 14:39:01 +0200 Subject: [PATCH 428/429] Update README.md --- core-java-collections/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core-java-collections/README.md b/core-java-collections/README.md index 71d4e6b614..1a90d01a82 100644 --- a/core-java-collections/README.md +++ b/core-java-collections/README.md @@ -29,4 +29,4 @@ - [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) \ No newline at end of file +- [A Guide to Iterator in Java](http://www.baeldung.com/java-iterator) From 1db24b5c06076b85d4a2c3ab4b3caddd74df8154 Mon Sep 17 00:00:00 2001 From: Loredana Crusoveanu Date: Wed, 2 Jan 2019 15:45:28 +0200 Subject: [PATCH 429/429] Update README.md --- core-java-8/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/core-java-8/README.md b/core-java-8/README.md index e5fa953cc7..f9af585ab3 100644 --- a/core-java-8/README.md +++ b/core-java-8/README.md @@ -33,3 +33,7 @@ - [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)